【akka】 种子节点配置对集群的影响
背景知识:
- 种子节点:负责启动集群,并组成集群。是集群的初始成员。
● 在集群启动时,seed-nodes
列表第一个节点必须启动。负责将其他节点join集群。
若新来一个节点,会给所有的种子节点发送消息,新节点给 种子节点中第一个响应的节点发送join命令。若种子节点中无节点应答,则重试。直至成功/失败。
问题
根据背景知识,种子节点的第一个必须启动。但没有明确说明:其他非种子节点 或 非第一个种子节点 先启动会出现什么结果。(存在歧义)
- 若其含义为 种子节点的第一个必须先启动,在k8s中,可能存在情况: s与g的两个akka节点组成集群,此时为种子节点的s挂掉,就需要:先把 g节点停掉,重新依次启动 s和g。(操作麻烦)
- 期望操作:s挂掉后,重启s即可。
测试
测试路径
akka集群存在3个节点:2个server节点、1个gateway节点(下面用s1、s2、g说明)。
在k8s环境下akka集群,并不一定都是使用种子节点去组建集群,那怎么在现有环境模拟?
- 将s和g都配置为种子节点(控制变量)
- s设为第一个节点:
- 先启动g;
- 先启动s;
- g设为第一个节点:
- 先启动s;
- 先启动g;
- s设为第一个节点:
随后,还测试了其他情况(熟悉下集群的机制):
- 只有s是种子节点
- 先启动g
- 先启动s
- 只有g是种子节点
- 先启动s
- 先启动g
具体测试方式:
通过修改nacos
配置(用来修改谁是种子节点);及启动脚本顺序(即server、gateway akka
节点启动顺序),根据输出的日志判断 不同的情况下 集群是否可以正常组建:
环境说明及的nacos配置顺序:
gateway | server |
---|---|
akka://appka132@10.246.155.132:9519 | akka://appka132@10.246.155.132:9518 |
akka://appka132@10.246.155.131:9518 |
Only server (server132,server131) | nodes :“akka://appka132@10.246.155.132:9518,akka://appka132@10.246.155.131:9518” |
---|---|
Only gateway | nodes: “akka://appka132@10.246.155.132:9519” |
server+gateway :s1g2 (server在前,gateway在后) | nodes: “akka://appka132@10.246.155.132:9518,akka://appka132@10.246.155.131:9518,akka://appka132@10.246.155.132:9519” |
server+gateway:g1s2 | nodes: “akka://appka132@10.246.155.132:9519,akka://appka132@10.246.155.132:9518,akka://appka132@10.246.155.131:9518” |
不同情况的测试结果:
种子节点 | 第一个种子节点 | 启动顺序 | 运行结果 |
---|---|---|---|
gateway+server | server | gateway先启动,server后启动 | akka配置![]() ![]() |
server先启动,gateway后启动 | 结果:![]() | ||
gateway+server | gateway | gateway先启动,server后启动 | akka配置:![]() ![]() |
server先启动,gateway后启动 | 结果: ![]() | ||
仅gateway | gateway先启动 | akka配置:![]() ![]() | |
server 先启动 | 结果:![]() | ||
仅server | gateway先启动,server后启动 | akka配置:![]() ![]() | |
server先启动,gateway后启动 | 项目之前就是如此,可以组成集群 |
总结
不论哪种情况,最先启动的种子节点会 负责 后面节点 加入集群。
若是非种子节点最先启动时,会等待 种子节点中最先启动的节点(无论是否设置为第一个)启动后,发现没有集群,组建集群后,由种子节点将非种子节点加入集群。
其他存在的问题
akka放在k8s可能还存在其他问题:
-
集群节点发现方式若两者其中有一个挂掉(如:s挂掉),s重新加入后,是否产生新的集群?
-
【脑裂】akka cluster split-brain-resolver(SBR)_lease-majority-CSDN博客
-
k8s 不同的pod ip不一样。若其中一个节点挂掉,重启pod会改变ip,但akka 集群会继续连接该ip
-
解决方式:配置相关策略
-