Soul 学习笔记 --- 使用 zookeeper 实现数据同步(六)
今天看下 zookeeper 怎么实现数据同步的。
首先查下 zookeeper 是什么,网上看了一些资料,大概明白了它的用处。
分布式系统有个 CAP 理论:
一致性:在分布式环境中,一致性是指数据在多个副本之间是否能够保持一致的特性,等同于所有节点访问同一份最新的数据副本。在一致性的需求下,当一个系统在数据一致的状态下执行更新操作后,应该保证系统的数据仍然处于一致的状态。
可用性:每次请求都能获取到正确的响应,但是不保证获取的数据为最新数据。
分区容错性:分布式系统在遇到任何网络分区故障的时候,仍然需要能够保证对外提供满足一致性和可用性的服务,除非是整个网络环境都发生了故障。
一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项。分布式系统中,P 是必须的,因此只能在 CP 和 AP 中选择,zookeeper 保证的是 CP,对比 spring cloud 系统中的注册中心 eruka 实现的是 AP。
zookeeper 保证了分布式环境下数据的一致性。我觉得 zookeeper 和 redis 很像,虽然底层实现机制不一样,但他们主要就是为了存储数据,不过 zookeeper 有一个 watch 机制,类似于观察者模式,watch 流程是客户端向服务端某个节点路径上注册一个 watcher,同时客户端也会存储特定的 watcher,当节点数据或子节点发生变化时,服务端通知客户端,客户端进行回调处理。soul 网关使用 zookeeper 进行数据同步,就利用的这个机制。
soul-admin 和 soul-bootstrap 项目的 application-local.yml 文件设置使用 zookeeper 进行同步。
启动 soul-admin 时,会返回一个ZookeeperDataChangedListener 和 ZookeeperDataInit 实例。
ZookeeperDataInit 就是在启动时,把 selector 和 rule 等数据写入 zookeeper,每当有数据变更,就会更新 zookeeper 节点。
soul-bootstrap 启动时,会去加载类 ZookeeperSyncDataConfiguration ,它会新建一个 ZookeeperSyncDataService 实例。
可以看到这个类会监听 selector,rule 等数据,如果它们在 soul-admin 发生变化,这里就能接收到,从而更新内存中的数据。
参考资料











评论