需求
我們項目的瓶頸目前是在調度任務上, 調度任務每隔10秒掃一下數據庫,找到需要執行的調度計劃。目前出現的瓶頸是在掃數據庫上。
解決辦法
計劃使用分庫的方式, 將任務分配到多個數據庫中。調度應用啓動多臺機器,每個機器應用掃描不同的幾個庫。
要求
動態的新增和減少調度應用的機器都能智能的分配庫。
使用Zookeeper的EPHEMERAL_SEQUENTIAL(臨時有序節點)
比如: 分10個庫編號從0到9. 五臺調度應用機器編號a到e。 五臺機器都是臨時節點,會自然在zk中排序。
按照順序分配, 每臺機器可以拿到兩庫,
A: 0-1
B: 2-3
C: 4-5
D: 6-7
E: 8-9
- 如果此時新增一臺機器F. zk臨時順序節點的第一個節點A應用來重新分配庫, A可以把E中的9分配個F.
- 如果此時C掛了。 zk順序節點的第一個節點A來重新分配。 A可以把4分配個A, 5分配給B
- 如果A掛了, 則B自動成爲第一個節點, 此時B來分配, B可以把0分配B, 1分配給C
這種方式其實是默認第一個節點作爲重新分配者,當出現機器數量的變化時候, 由分配者來重新分配,
分配的原則是:分配庫的變動儘量最小,不要大範圍的重新分配庫。
問題
-
在出現機器變動的時候可能會出現4號庫被D機器掃了一半後,重新分配個E機器了。 E機器又會從頭開始掃描4號庫的情況, 此時可以通過zk來存儲4號庫的處理進度,E機器根據這個進度來接着掃描四號庫。 也可以使用redis來去重,從而保證不會重複掃描。
-
由於調度庫只是存儲調度任務的信息的,不太會和其他庫表聯合查詢, 所以我們的這種分庫方式是可以的