双机热备需求:
AM版本需一致;系统时间一致;AM之间网络(TCP(8080,8443,33306))互通。
keepalived需求:
两台服务器地址和虚地址要属于同一网段;对接AC的话服务器地址和虚地址不能和AC对接地址同段。
备机进到设置--双击热备--备机里,点击停机准备,提示可以开启热备时进入到主机操作。
主机进到设置--双击热备--主机里,填写备机IP地址和对应端口,点击开始同步,直到提示热备完成时为止。
服务器列表里显示两台设备,且主备两台AM系统信息里服务号一致。
通过虚地址对接portal认证时,需要把服务器地址改为虚地址的IP。
Linux系统可与外网通信,并已配置好yum源情况下,输入 yum install keepalived 安装对应软件。
注:若无法通过yum命令安装keepalived,请自行百度下载keepalived rpm文件(https://opsx.alibaba.com/mirror/search?q=rpm&lang=zh-CN;并搜索keepalive进行下载),上传/etc目录下,解压安装。
切换至root账号:sudo -i
vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_script check_run {
script "/etc/keepalived/check_run.sh" #脚本存放目录
interval 5 #5秒检测一次
}
vrrp_instance VI_1 {
state MASTER #主机 MASTER
interface eth0 #服务网卡
virtual_router_id 51 #主备机一致
# nopreempt #服务恢复ip地址抢占,按需开启
priority 100 #优先级主机大于备机
advert_int 1
authentication {
auth_type PASS
auth_pass admin@123 #共享秘钥需一致
}
unicast_src_ip 192.168.200.12 #本机地址
unicast_peer {
192.168.200.13 #备机地址(邻居)
}
virtual_ipaddress {
192.168.200.11 #虚ip地址
}
garp_master_delay 1
garp_master_refresh 5
track_interface {
eth0 #检查网卡
}
track_script {
check_run #检查执行脚本
}
}
切换至root账号:sudo -i
vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_script check_run {
script "/etc/keepalived/check_run.sh" #脚本存放目录
interval 5 #5秒检测一次
}
vrrp_instance VI_1 {
state BACKUP #备机 BACKUP
interface eth0 #服务网卡
virtual_router_id 51 #主备机一致
nopreempt #服务恢复ip地址抢占,按需开启
priority 90 #主机优先级高于备机
advert_int 1
authentication {
auth_type PASS
auth_pass admin@123 #共享秘钥一致
}
unicast_src_ip 192.168.200.13 #本机ip地址
unicast_peer {
192.168.200.12 #另一台服务器ip地址
}
virtual_ipaddress {
192.168.200.11 #虚ip地址
}
garp_master_delay 1
garp_master_refresh 5
track_interface {
eth0 #检查网卡
}
track_script {
check_run #脚本执行检查
}
}
由于UDP回包路由问题,认证系统在使用Radius协议对接时需要对系统路由进行更改,并配置到/etc/rc.local启动脚本设置开机自启,(AM需要,UC不需要)。
#!/bin/sh
#
/opt/amhome/startup.sh #AM服务开机自启动
/opt/uchome/startup.sh #UC服务开机自启动
/opt/amhome/supports/heartbeat-default-route.sh {虚IP} {实IP} #更改回包路由
exit 0
注意一下,AM和UC的不一样
需要在/etc/keepalived/目录下有check_run.sh文件。可以从宁盾AM安装包路径(/opt/amhome/supports/check_run.sh)中复制过来,也可以手动生成:
如果是检测AM的服务状态,则以下内容:
#!/bin/bash
# 这里有可能需要改一下,最好是am服务正常时,执行命令(ps auxw | grep "amhome"| grep -v "grep" |wc -l)看一下数字是几,下一行 -ge 后边就配置几;假设是2,那么下一行也需要配置成2,如果是1,则下一行要配置成1
HaproxyMaster=`ps auxw | grep "amhome"| grep -v "grep" |wc -l`
if [ $HaproxyMaster -ge 3 ];then
exit 0 #正常
else
exit 1 #异常
fi
#!/bin/bash
# 这里有可能需要改一下,最好是uc服务正常时,执行命令(ps auxw | grep "uchome"| grep -v "grep" |wc -l)看一下数字是几,下一行 -ge 后边就配置几;假设是2,那么下一行也需要配置成2,如果是1,则下一行要配置成1
HaproxyMaster=`ps auxw | grep "uchome"| grep -v "grep" |wc -l`
if [ $HaproxyMaster -ge 2 ];then
exit 0 #正常
else
exit 1 #异常
fi
chmod 0755 /etc/keepalived/check_run.sh
#启动keepalived服务并设置开机自启
systemctl start keepalived.service #启动服务
systemctl enable keepalived.service #设置开机自启
#查看keepalived服务状态
systemctl status keepalived.service #查看服务状态
#centos7以上的启动和停止keeplived:
systemctl start keepalived.service #启动服务
systemctl stop keepalived.service #停止服务
配置完成后测试双机切换功能
将主服务器关机,同时长ping虚ip,观察主备切换时丢包情况;
通过虚ip登录控制台能否成功登录;测试双因素认证能否正常使用,将主机开启后,检查登录日志是否成功同步。
主机关掉后,业务可以正常进行,双因素认证没有受到影响:
主机开启后,认证日志等信息正常同步:
将备服务器关机,同时长ping虚ip;
通过虚ip登录控制台能否成功登录;
测试双因素认证能否正常使用,将主机开启后,检查登录日志是否成功同步。
在备机关机状态下,测试双因素认证并查看日志:
分别进入到AM服务器执行命令:ip a
Ubuntu系统: /var/log/syslog
CentOS系统: /var/log/messages
查看启动是否正常
systemctl status keepalived.service
如果看到有以上报错信息,说明checkrun脚本无执行权限,请参考本文2.2.4中授予执行权限
AM异地多活技术文档
A. 正常情况下:普通节点只与中心节点通讯、普通节点之间不通讯,中心节点与普通节点之间数据双向同步;
B. 每个节点都可以进行“读写”操作;
C. 中心节点如果有数据变更,会直接同步到所有的普通节点;
D. 普通节点如果有数据变更,会先同步到中心节点,再通过中心节点同步到其他所有的普通节点。
A. 集群中的节点共有三种模式:Leader(领导者,中心节点)、Follower(跟随者,普通节点)、Candidate(候选者,普通节点)
B. 集群中的每个节点只能处于一种模式,不可能同时多种模式;
C. 正常情况下,集群中只有一个 Leader,其它节点都是 Follower。
a1. 集群中每个节点的初始状态都是Follower,同时启动心跳超时定时器,监听来自Leader的心跳;
a2. Follower在规定时间内没有收到心跳:
增加节点本地的 current term ,切换到candidate状态
投自己一票
并行给其他所有节点发送 RequestVote
等待其他节点的回复
a3. 投票者如何决定是否给一个选举请求投票呢,有以下约束:
只能是Candidate才有投票资格
在任一选举周期(任期)内,单个节点最多只能投一票
first-come-first-served 先来先得投票原则
如果某个Candidate已经投票过了,就不能再投票了(包括投票给自己),但仍然可以发起投票请求
a4. 在这个过程中,根据来自其他节点的消息,可能出现三种情况
任何Candidate在选举周期内收到的投票(含自己的一票)大于节点集群的一半,则赢得选举,成为leader
被告知别人已当选(收到新的Leader的心跳),那么自行切换到follower
一段时间内没有收到超过一半的投票,则保持candidate状态,等待新一轮的选举
Leader节点心跳周期:默认值5秒,表示Leader节点每隔5秒,向集群中其他所有节点各发送一个心跳。
Follower节点心跳超时:默认30秒,Follower节点如果在30秒内没有收到来自Leader节点的心跳,Follower节点将会变成Candidate节点;如果收到了心跳,那么会重置心跳超时定时器。
Candidate节点选举超时:默认30秒,每一轮选举的最大持续时长,如果在30内没有选举出Leader,那么会开启新一轮选举,同时重置节点选票、投票信息、收到投票信息。
Leader节点选举策略:选择不同的选举策略,Raft算法会实行相对于的选举方式;默认选择【优先级高优先】,各种选举策略详细说明:
优先级高优先:节点心跳超时后,优先级高的节点会率先发起投票请求,当选Leader的概率更高;
随机:公平的选举策略,节点心跳超时后,会随机延迟一小段时间发起投票,当选Leader全凭天意;
最全同步优先:事件表最近一条事件距离当前时间越近,心跳超时后,发起投票延迟时间越短
优点:同步速度快、占用内存小、无额外的磁盘空间占用
缺点:额外开启一个端口
优点:同步速度快,吞吐量大
缺点:需要额外的内存和磁盘占用,开启端口多,会有冗余消息异步导致的消息重复发送
优点:使用简单,无需开启额外的端口
缺点:同步速度慢、同步事件量大时容易造成端口耗尽导致系统不可用
地址:本节点的真实IP地址,务必要填写正确
端口:本节点的HTTP通信端口,务必要填写正确
优先级:选举优先级,当【Leader节点选举策略】选择“优先级高优先”时生效,共有5级
H-High:超高优先级,延迟时间2s
High:高优先级,延迟时间4s
Middle:中优先级,延迟时间6s
Low:低优先级,延迟时间8s
L-Low:超低优先级,延迟时间10s
名称:本节点的名称,用于识别区分
描写:本节点详细说明
A. 选择【安全退出】,会先去Leader节点校验,填写Leader节点的“超级管理员账号”“超级管理员密码”,Leader校验通过后才会退出集群,并由Leader节点通知到其他所有节点
B. 选择【强制退出】,不会通知Leader节点,填写自身节点的“超级管理员账号”“超级管理员密码”
详细说明:
模式:节点模式,有三种:【Leader】、【Follower】、【Candaidate】
连接状态:Leader节点与其他Follower节点之间的网络连接状态,有两种状态【Fine】、【Error】
时间差:Leader节点与其他Follower节点之间的时间差异(受网络延迟影响),时间差过大,会影响到数据同步、冲突事件的合并
下图是Leader(领导者、中心节点)所看到的节点管理界面视图:
下图是Follower(跟随者、普通节点)所看到的节点管理界面视图:
下图是Candidate(候选者、普通节点)所看到的节点管理界面视图:
详细说明:
模式:本节点模式,有三种:【Leader】、【Follower】、【Candaidate】
连接状态:本节点与Leader(中心节点)之间的网络连接状态
健康状态:本节点与Leader(中心节点)之间事件同步模块的运行状态
任期:集群Leader当选届
详细说明:
只有Leader节点才允许更改集群配置;
不能更改集群事件同步方式;
详细说明:
只有Leader节点才能够允许编辑节点信息;
只能更改节点优先级、名称、描述;
不能更改节点IP地址和端口,IP地址如果有改变,集群节点会自动纠正;
编辑成功后,由Leader节点通知到集群中其他所有的节点
详细说明:
只有Leader节点才能够允许移除Follower节点;
Leader节点不能移除自己;
安全移除会先通知到被移除的节点,对方同意且返回成功后,才会真正移除;
强制移除不会通知到被移除的节点,仅仅只是在Leader节点上面的删除;
移除成功后,由Leader节点通知到集群中其他所有的节点
详细说明:
只有Leader节点才有禅让功能;
只能禅让给连接状态为Fine的Follower节点;
需要验证本节点Leader节点的“超级管理员账号”“超级管理员密码”;
禅让成功后,本节点会变为Follower节点
详细说明:
记录集群启动、停止、初始化信息
记录集群中节点变化(非节点管理的变化),添加节点、删除节点、更新节点
详细说明:
记录Candidate节点主动发起的投票选举消息;
记录每一轮选举的开始时间,选举策略,Raft选举延迟;
记录选举届,选举轮次;
记录投票统计结果;
详细说明:
节点在任何模式(Leader、Follower、Candidate)下,都有可能收到其他Candidate节点的投票请求;
Leader节点不能投票;
Follower、Candidate节点收到投票请求后,如果手中有票且满足投票条件,必须投票;
不能投票的条件:
A. 正在处理其他节点的投票请求;
B. 请求投票的节点不在本节点能够看到的集群中;
C. 本节点是Follower节点,但是有活跃的Leader节点;
D. 本节点已经投过票了;
E. 请求投票的节点的任期term小于本节点的任期
详细说明:
只有Leader节点才能发送心跳,心跳用于维持集群状态的稳定;
Leader节点每一轮心跳,有效心跳数不小于集群总节点数的一半,集群运行正常;
Leader节点每一轮心跳,有效心跳数小于集群总节点数的一半,本轮心跳异常,如果连续超过3次,Leader节点将降级成为Follower节点
详细说明:
所有节点都有可能收到来自Leader节点的心跳;
Leader节点接收到了来自其他Leader节点的心跳,说明集群发生了脑裂,需要合并脑裂集群;
Follower节点接收到Leader节点的心跳,重置心跳超时定时器,返回成功;
Candidate节点接收到Leader节点的心跳,本节点变更为Follower节点,创建心跳超时定时器,返回成功;
详细说明:
Follower节点只能接收到来自Leader节点的消息;
Leader节点可以接收到来自其他所有Follower节点的消息;
节点接收到消息后,初始化消息:状态state设置成【未执行】,序列时间SequenceTime设置为当前时间,其他字段不变,然后保存到数据库;
后端定时轮巡从数据库获取状态为【未执行】的事件,执行,根据执行结果更新消息状态;
接收到的消息共有如下几种状态:【未执行】状态码:0、【成功】状态码:1、【成功&冲突合并】状态码:2、【失败】状态码:\-1、【拒绝执行】状态码:\-2;
接收事件列表支持按类型、来源、模块、动作、结果搜索,执行失败的任务可以手动重新执行。
详细说明:
Leader节点本地操作成功后,生成的发送事件记录会直接置为【成功】,然后保存到数据库(Leader发送事件到Follower节点,不从发送事件列表里面取,而是从集群事件列表里面取);
Follower节点本地操作成功后,初始化事件:状态state设置成【未发送】,序列时间SequenceTime设置为当前时间,然后保存到数据库;
Follower节点后端定时轮巡从数据库获取状态为【未发生】的事件,发送到Leader节点,根据发送结果更新事件状态;
发送事件共有如下几种状态:【未发送】状态码:0、【成功】状态码:1【失败】状态码:\-1;
发送事件列表支持按类型、来源、模块、动作、结果搜索,发送失败的任务可以手动再次发送。
详细说明:
集群事件,是所有节点都要维护的!每一个操作,最终都会记录到集群事件里面;
Leader节点本地操作成功后,生成的发送事件记录会直接置为【成功】,同时会生成一条集群事件记录;
Leader维护了与每一个Follower节点的事件位置,Leader根据事件位置从集群事件里面取得要发送的消息,发送到相对应的Follower节点;
集群事件列表支持按类型、来源、模块、动作搜索,不会存在发送失败的事件。
详细说明:
如果集群【Leader节点选举策略】选择的是“优先级高优先”,集群中的每一个节点的优先级尽量不要重复。
对于大批量操作,如"excel导入用户"、“外部用户源同步用户”、“批量删除用户”、“删除用户组”、“删除用户源”、“导入用户终端列表”、“...”等操作,最好在Leader节点上面进行,这样能够尽量减少集群压力,达到最快的数据同步,原因如下:
A. 在Leader上面进行的操作,会直接同步到所有的Follower节点;
B. 在Follower上面进行的操作,会先同步到Leader节点,Leader节点执行成功后,再同步到所有的Follower节点。
尽量避免如下操作:
节点A正在批量导入用户,用户正在导入过程中,在节点B上面删除相对应的用户组或者用户源;
节点A正在删除用户组或者用户源,在节点B上面相同的用户组或用户源下面添加或修改用户;
节点A正在被全量同步数据,在节点A上面进行大批量操作;
节点A断开了集群连接,在节点A上面进行大批量操作;
如果集群中有新节点加入,在新节点加入过程中,其他所有节点最好不要进行大批量操作!
建议使用【安全退出】!
集群节点有时候状态不正确,可以在浏览器调用下面接口,重置节点状态
http://IP:8080/am/api/admin/deployment/msha/cluster/preJoin/reset