zookeeper在分庫中的一種應用

需求

我們項目的瓶頸目前是在調度任務上, 調度任務每隔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來去重,從而保證不會重複掃描。

  • 由於調度庫只是存儲調度任務的信息的,不太會和其他庫表聯合查詢, 所以我們的這種分庫方式是可以的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章