2017-09-25 31 views
0

給這個IO隨着回調設置數據庫狀態

public void do(RequestObject request, Callback<RequestObject> callback); 

凡在處理請求Callback被調用。一個客戶端必須將請求的狀態設置爲數據庫。客戶端獲取一些項目將它們傳遞給上述方法,並且回調設置狀態。

對於少量的項目和較慢的IO,它工作正常。但是現在,IO正在加速並且寫入數據庫的狀態經常變化。這導致我的數據庫(MySQL)進行如此多的磁盤讀寫調用。我的磁盤使用率通過了屋頂。

我在考慮將狀態設置聚合在一起,但功率不可靠,這不是合理的解決方案。應該如何重新設計呢?

編輯

當過程開始我插入一個值,當有更新,我取的項目並更新項目。 @ user2612030你的問題讓我相信,使用hibernate可能會導致更多的讀取,而不是必要的。

我可以將我的磁盤驅動器升級到SSD,但這隻會做很多。我想要一個可擴展的解決方案。

+0

存儲後狀態的用例是什麼?您需要多久才能查詢? – yegodm

+0

我查詢它來檢查操作的狀態。這是一項批量操作,客戶需要檢查狀態。 –

+1

可以改變狀態值最終一致嗎?我的意思是可以這樣處理 - 客戶端設置狀態,但不會立即保存到數據庫,而是保存到一些快速持久的存儲中,例如持久的磁盤隊列。您可以在實例運行時在內存中緩存和提供狀態,同時從隊列中批量更新後臺數據庫。重新啓動後,您必須通過重播隊列中的事件來同步數據庫和緩存。 – yegodm

回答

1

SSD是一個很好的起點,更多的RAM給MySQL也應該有所幫助。它不能擺脫寫入,但有足夠的RAM(並配置了MySQL使用它!)應該有很少的物理讀取。如果您正在使用默認配置,請對其進行調整。例如,請參閱https://www.percona.com/blog/2016/10/12/mysql-5-7-performance-tuning-immediately-after-installation/或只搜索MySQL內存配置。

您也可以添加磁盤並將寫入分散到多個控制器的多個磁盤。這也應該有所幫助。

如果不知道如何記錄狀態值,很難給出好的建議。插入或更新?有多少條記錄?數據模型?但是,要真正擴展,需要以某種方式分割數據。這樣一臺服務器可以處理一個範圍內的數據和另一個範圍內的另一個服務器數據等等。

對於寫入繁重的應用程序而言,除非您在應用程序代碼中執行分片,否則這些應用程序不能用MySQL設置。大多數使用複製的解決方案最適用於主要讀取應用程序您可能希望查看NoSQL數據庫,例如MongoDB,該數據庫專門用於從一開始就分發寫入數據。 MongoDB有其他挑戰(最終一致性),但它可以提供可擴展的寫入。