【高性能网关soul学习】12. soul admin集群配置下的数据同步一致性
本文目标:
- 分析 soul 在admin集群模式下如何确保各个节点间的数据同步一致性
soul-bootstrap 的数据只是soul-admin中数据的缓存,因此我们主要来看 soul-admin 中的数据如何保证数据一致性
soul-admin端间的数据同步保证
启动两个服务:9094和9095端口的 soul-admin 服务,然后启动一个 soul-bootstrap 服务和两个http测试服务
- 两个 http 测试服务都注册到9095端口
启动完毕之后,我们打开 9094 端口的soul-admin 页面,依次进入 PluginList>>divide >> SelectorList >> Modify 可以看到9094服务上注册了我们刚才启动的两个http测试服务,同样我们打开9095端口的admin服务,也可以看到同样的现象
查看选择器相关的更新接口查询的接口,
- 查询接口:
SelectorController#detailSelector
方法是直接对数据库进行查询的,并没有走缓存,而 - 更新接口:
SelectorController#updateSelector
方法是直接对数据库进行更新,并发送一个DataChangedEvent
触发缓存数据的更新等操作,该事件只会更新当前admin服务,及所有的soul-bootstrap
UpstreamCheckService
该方法负责检测注册到 soul-admin 服务的被代理服务与soul-admin 服务之间的状态
我们在UpstreamCheckService 的 scheduled 方法中增加打印日志,检查不同admin内存中的数据是否一致
private void scheduled() {
log.info("UpstreamCacheManager check " + UPSTREAM_MAP);
if (UPSTREAM_MAP.size() > 0) {
UPSTREAM_MAP.forEach(this::check);
}
}
我们去9095的admin服务的selectorList 页面 修改其中的一个的权重为52
#9095
UpstreamCacheManager check {/http=[DivideUpstream(upstreamHost=localhost, protocol=http://, upstreamUrl=192.168.31.21:8188, weight=50, status=true, timestamp=0, warmup=0), DivideUpstream(upstreamHost=localhost, protocol=http://, upstreamUrl=192.168.31.21:8189, weight=52, status=true, timestamp=1611768183701, warmup=0)]}
#9094
UpstreamCacheManager check {/http=[DivideUpstream(upstreamHost=localhost, protocol=http://, upstreamUrl=192.168.31.21:8188, weight=50, status=true, timestamp=0, warmup=0), DivideUpstream(upstreamHost=localhost, protocol=http://, upstreamUrl=192.168.31.21:8189, weight=50, status=true, timestamp=0, warmup=0)]}
然后查看打印日志(如上),可以发现 9094端口admin服务的内存数据的权重值就不一致了。
总结
- soul-admin 之间是没有交互的,对数据的crdu都是直接以数据库为准。soul-admin并不需要实际的缓存来保证高性能,高性能由soul-bootstrap来确保,soul-admin 本身并没有很大的压力,因此可以由数据库来维护数据的一致性