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来去重,从而保证不会重复扫描。

  • 由于调度库只是存储调度任务的信息的,不太会和其他库表联合查询, 所以我们的这种分库方式是可以的

猜你喜欢

转载自blog.csdn.net/leisurelen/article/details/105946011