菜单

高可用架构

下载

主备架构-双机热备

前置条件

双机热备需求:

AM版本需一致;系统时间一致;AM之间网络(TCP(8080,8443,33306))互通。

keepalived需求:

两台服务器地址和虚地址要属于同一网段;对接AC的话服务器地址和虚地址不能和AC对接地址同段。

AM双机热备备机配置

备机进到设置--双击热备--备机里,点击停机准备,提示可以开启热备时进入到主机操作。

Image

AM双机热备主机配置

主机进到设置--双击热备--主机里,填写备机IP地址和对应端口,点击开始同步,直到提示热备完成时为止。

Image
Image

确认双机热备完成

服务器列表里显示两台设备,且主备两台AM系统信息里服务号一致。

Image
Image

通过虚地址对接portal认证时,需要把服务器地址改为虚地址的IP。

Image

Keepalived配置

安装keepalived 软件

Linux系统可与外网通信,并已配置好yum源情况下,输入 yum install keepalived 安装对应软件。

注:若无法通过yum命令安装keepalived,请自行百度下载keepalived rpm文件(https://opsx.alibaba.com/mirror/search?q=rpm&lang=zh-CN;并搜索keepalive进行下载),上传/etc目录下,解压安装。

修改相关配置文件

主机文件配置

  1. 切换至root账号:sudo -i

  2. vi /etc/keepalived/keepalived.conf

Bash 复制代码
! 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                                     #检查执行脚本
    }
}

备机文件配置

  1. 切换至root账号:sudo -i

  2. vi /etc/keepalived/keepalived.conf

Bash 复制代码
! 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不需要)。

Bash 复制代码
#!/bin/sh
#
/opt/amhome/startup.sh                               #AM服务开机自启动
/opt/uchome/startup.sh                               #UC服务开机自启动
/opt/amhome/supports/heartbeat-default-route.sh {虚IP} {实IP}        #更改回包路由

exit 0

检测脚本check_run配置

注意一下,AM和UC的不一样

  1. 需要在/etc/keepalived/目录下有check_run.sh文件。可以从宁盾AM安装包路径(/opt/amhome/supports/check_run.sh)中复制过来,也可以手动生成:

  2. 如果是检测AM的服务状态,则以下内容:

Bash 复制代码
#!/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
  1. 如果是检测UC的服务状态,则以下内容:
Bash 复制代码
#!/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
  1. 授予check_run.sh执行权限及相关配置
Bash 复制代码
chmod 0755 /etc/keepalived/check_run.sh

启动或停止Keepalived

Bash 复制代码
#启动keepalived服务并设置开机自启
systemctl start keepalived.service    #启动服务
systemctl enable keepalived.service    #设置开机自启

#查看keepalived服务状态
systemctl status keepalived.service    #查看服务状态

#centos7以上的启动和停止keeplived:
systemctl start keepalived.service    #启动服务
systemctl stop keepalived.service    #停止服务

检查是否生效

配置完成后测试双机切换功能

主机AM或UC关闭

  1. 将主服务器关机,同时长ping虚ip,观察主备切换时丢包情况;

  2. 通过虚ip登录控制台能否成功登录;测试双因素认证能否正常使用,将主机开启后,检查登录日志是否成功同步。

Image

主机关掉后,业务可以正常进行,双因素认证没有受到影响:

主机开启后,认证日志等信息正常同步:

备机AM或UC关闭

  1. 将备服务器关机,同时长ping虚ip;

  2. 通过虚ip登录控制台能否成功登录;

  3. 测试双因素认证能否正常使用,将主机开启后,检查登录日志是否成功同步。

  4. 在备机关机状态下,测试双因素认证并查看日志:

排错技巧

查看虚IP在哪台机器

分别进入到AM服务器执行命令:ip a

Image

查看系统日志

Ubuntu系统: /var/log/syslog

CentOS系统: /var/log/messages

查看Keepalived 状态及执行日志

查看启动是否正常

systemctl status keepalived.service

Image

如果看到有以上报错信息,说明checkrun脚本无执行权限,请参考本文2.2.4中授予执行权限

集群架构-异地多活

AM异地多活技术文档

架构

集群架构:AM异地多活采用【一中心节点多普通节点】模式

A. 正常情况下:普通节点只与中心节点通讯、普通节点之间不通讯,中心节点与普通节点之间数据双向同步;

B. 每个节点都可以进行“读写”操作;

C. 中心节点如果有数据变更,会直接同步到所有的普通节点;

D. 普通节点如果有数据变更,会先同步到中心节点,再通过中心节点同步到其他所有的普通节点。

节点说明

A. 集群中的节点共有三种模式:Leader(领导者,中心节点)、Follower(跟随者,普通节点)、Candidate(候选者,普通节点)

B. 集群中的每个节点只能处于一种模式,不可能同时多种模式;

C. 正常情况下,集群中只有一个 Leader,其它节点都是 Follower。

集群维持:集群的状态维持使用Raft算法,什么是Raft算法?

a1. 集群中每个节点的初始状态都是Follower,同时启动心跳超时定时器,监听来自Leader的心跳;

a2. Follower在规定时间内没有收到心跳:

  • 增加节点本地的 current term ,切换到candidate状态

  • 投自己一票

  • 并行给其他所有节点发送 RequestVote

  • 等待其他节点的回复

a3. 投票者如何决定是否给一个选举请求投票呢,有以下约束:

  • 只能是Candidate才有投票资格

  • 在任一选举周期(任期)内,单个节点最多只能投一票

  • first-come-first-served 先来先得投票原则

  • 如果某个Candidate已经投票过了,就不能再投票了(包括投票给自己),但仍然可以发起投票请求

a4. 在这个过程中,根据来自其他节点的消息,可能出现三种情况

  1. 任何Candidate在选举周期内收到的投票(含自己的一票)大于节点集群的一半,则赢得选举,成为leader

  2. 被告知别人已当选(收到新的Leader的心跳),那么自行切换到follower

  3. 一段时间内没有收到超过一半的投票,则保持candidate状态,等待新一轮的选举

节点状态转换:状态机

Image

集群创建

配置 --> 异地多活 --> 集群配置,点击【创建集群】

Image

在弹出框中填写“集群配置”和“本节点信息”

Image

集群配置详细说明

  • Leader节点心跳周期:默认值5秒,表示Leader节点每隔5秒,向集群中其他所有节点各发送一个心跳。

  • Follower节点心跳超时:默认30秒,Follower节点如果在30秒内没有收到来自Leader节点的心跳,Follower节点将会变成Candidate节点;如果收到了心跳,那么会重置心跳超时定时器。

  • Candidate节点选举超时:默认30秒,每一轮选举的最大持续时长,如果在30内没有选举出Leader,那么会开启新一轮选举,同时重置节点选票、投票信息、收到投票信息。

  • Leader节点选举策略:选择不同的选举策略,Raft算法会实行相对于的选举方式;默认选择【优先级高优先】,各种选举策略详细说明:

  1. 优先级高优先:节点心跳超时后,优先级高的节点会率先发起投票请求,当选Leader的概率更高;

  2. 随机:公平的选举策略,节点心跳超时后,会随机延迟一小段时间发起投票,当选Leader全凭天意;

  3. 最全同步优先:事件表最近一条事件距离当前时间越近,心跳超时后,发起投票延迟时间越短

  • 集群事件同步方式:Leader节点与Follower节点之间的数据同步方式,目前支持3种方式:
  1. RPC:使用“alipay rpc”,默认端口“12345”,支持自设端口,同步方式“同步”,推荐使用

优点:同步速度快、占用内存小、无额外的磁盘空间占用

缺点:额外开启一个端口

  1. MQ:使用“rocketmq”,需要开启两个端口【server port】、【broker port】,同步方式“异步”

优点:同步速度快,吞吐量大

缺点:需要额外的内存和磁盘占用,开启端口多,会有冗余消息异步导致的消息重复发送

  1. HTTP:使用传统的“http”,同步方式“同步”,不建议使用

优点:使用简单,无需开启额外的端口

缺点:同步速度慢、同步事件量大时容易造成端口耗尽导致系统不可用

本节点信息详细说明

  • 地址:本节点的真实IP地址,务必要填写正确

  • 端口:本节点的HTTP通信端口,务必要填写正确

  • 优先级:选举优先级,当【Leader节点选举策略】选择“优先级高优先”时生效,共有5级

H-High:超高优先级,延迟时间2s

High:高优先级,延迟时间4s

Middle:中优先级,延迟时间6s

Low:低优先级,延迟时间8s

L-Low:超低优先级,延迟时间10s

  • 名称:本节点的名称,用于识别区分

  • 描写:本节点详细说明

确定“集群配置”和“本节点信息”填写无误后,点击【确定创建】

加入集群

入口:配置 --> 异地多活 --> 集群配置,点击【加入集群】

Image

第一步:在弹出框中填写“中心节点地址”和“中心节点端口” --> 点击【测试连接】--> 测试连接成功后,点击【下一步】

Image
Image

第二步:仔细阅读注意事项,点击【清空本机数据】--> 在二次确认弹框内输入本节点的“超级管理员账号”“超级管理员密码” --> 确认无误后,点击【确认清空】--> 等待本机数据库数据清空完成 --> 清空完成后,点击【下一步】

Image
Image
Image
Image

第三步:选择集群中一个节点,从该节点全量同步数据,选择好后,点击【确认同步】--> 在二次确认弹框内输入选中节点的“超级管理员账号”“超级管理员密码” --> 确认无误后,点击【确认同步】--> 等待全量同步数据完成,在此过程中不要做其他操作 --> 全量同步完成后,点击【下一步】

Image
Image
Image
Image

第四步:选择本节点优先级 --> 填写本节点名称、描述 --> 填写中心节点的“超级管理员账号”“超级管理员密码” --> 确认无误后,点击【确认加入】--> 加入集群成功后,点击【加入成功】--> 加入集群流程完毕

Image
Image

退出集群

入口:配置 --> 异地多活 --> 集群配置,点击【退出集群】

退出详细说明:

A. 选择【安全退出】,会先去Leader节点校验,填写Leader节点的“超级管理员账号”“超级管理员密码”,Leader校验通过后才会退出集群,并由Leader节点通知到其他所有节点

B. 选择【强制退出】,不会通知Leader节点,填写自身节点的“超级管理员账号”“超级管理员密码”

Image

集群节点管理

集群节点列表:配置 --> 异地多活 --> 节点管理

详细说明:

模式:节点模式,有三种:【Leader】、【Follower】、【Candaidate】

连接状态:Leader节点与其他Follower节点之间的网络连接状态,有两种状态【Fine】、【Error】

时间差:Leader节点与其他Follower节点之间的时间差异(受网络延迟影响),时间差过大,会影响到数据同步、冲突事件的合并

下图是Leader(领导者、中心节点)所看到的节点管理界面视图:

Image

下图是Follower(跟随者、普通节点)所看到的节点管理界面视图:

Image

下图是Candidate(候选者、普通节点)所看到的节点管理界面视图:

Image

集群配置和本节点详细信息状态:配置 --> 异地多活 --> 集群配置

详细说明:

模式:本节点模式,有三种:【Leader】、【Follower】、【Candaidate】

连接状态:本节点与Leader(中心节点)之间的网络连接状态

健康状态:本节点与Leader(中心节点)之间事件同步模块的运行状态

任期:集群Leader当选届

Image

更改集群配置:配置 --> 异地多活 --> 集群配置

详细说明:

  1. 只有Leader节点才允许更改集群配置;

  2. 不能更改集群事件同步方式;

Image

更新节点配置:配置 --> 异地多活 --> 节点管理 --> 编辑

详细说明:

  1. 只有Leader节点才能够允许编辑节点信息;

  2. 只能更改节点优先级、名称、描述;

  3. 不能更改节点IP地址和端口,IP地址如果有改变,集群节点会自动纠正;

  4. 编辑成功后,由Leader节点通知到集群中其他所有的节点

Image

移除普通节点:配置 --> 异地多活 --> 节点管理 --> 移除

详细说明:

  1. 只有Leader节点才能够允许移除Follower节点;

  2. Leader节点不能移除自己;

  3. 安全移除会先通知到被移除的节点,对方同意且返回成功后,才会真正移除;

  4. 强制移除不会通知到被移除的节点,仅仅只是在Leader节点上面的删除;

  5. 移除成功后,由Leader节点通知到集群中其他所有的节点

Image

Leader节点禅让:配置 --> 异地多活 --> 节点管理 --> 禅让

详细说明:

  1. 只有Leader节点才有禅让功能;

  2. 只能禅让给连接状态为Fine的Follower节点;

  3. 需要验证本节点Leader节点的“超级管理员账号”“超级管理员密码”;

  4. 禅让成功后,本节点会变为Follower节点

Image

集群消息详细说明

通用消息:配置 --> 异地多活 --> 集群消息 --> 通用消息

详细说明:

  1. 记录集群启动、停止、初始化信息

  2. 记录集群中节点变化(非节点管理的变化),添加节点、删除节点、更新节点

Image

选举消息:配置 --> 异地多活 --> 集群消息 --> 选举消息

详细说明:

  1. 记录Candidate节点主动发起的投票选举消息;

  2. 记录每一轮选举的开始时间,选举策略,Raft选举延迟;

  3. 记录选举届,选举轮次;

  4. 记录投票统计结果;

Image

投票消息:配置 --> 异地多活 --> 集群消息 --> 投票消息

详细说明:

  1. 节点在任何模式(Leader、Follower、Candidate)下,都有可能收到其他Candidate节点的投票请求;

  2. Leader节点不能投票;

  3. Follower、Candidate节点收到投票请求后,如果手中有票且满足投票条件,必须投票;

  4. 不能投票的条件:

A. 正在处理其他节点的投票请求;

B. 请求投票的节点不在本节点能够看到的集群中;

C. 本节点是Follower节点,但是有活跃的Leader节点;

D. 本节点已经投过票了;

E. 请求投票的节点的任期term小于本节点的任期

Image

心跳消息:配置 --> 异地多活 --> 集群消息 --> 心跳消息

详细说明:

  1. 只有Leader节点才能发送心跳,心跳用于维持集群状态的稳定;

  2. Leader节点每一轮心跳,有效心跳数不小于集群总节点数的一半,集群运行正常;

  3. Leader节点每一轮心跳,有效心跳数小于集群总节点数的一半,本轮心跳异常,如果连续超过3次,Leader节点将降级成为Follower节点

Image

接收心跳消息:配置 --> 异地多活 --> 集群消息 --> 接收心跳消息

详细说明:

  1. 所有节点都有可能收到来自Leader节点的心跳;

  2. Leader节点接收到了来自其他Leader节点的心跳,说明集群发生了脑裂,需要合并脑裂集群;

  3. Follower节点接收到Leader节点的心跳,重置心跳超时定时器,返回成功;

  4. Candidate节点接收到Leader节点的心跳,本节点变更为Follower节点,创建心跳超时定时器,返回成功;

Image

集群同步事件详细说明

接收事件:配置 --> 异地多活 --> 同步事件 --> 接收事件

详细说明:

  1. Follower节点只能接收到来自Leader节点的消息;

  2. Leader节点可以接收到来自其他所有Follower节点的消息;

  3. 节点接收到消息后,初始化消息:状态state设置成【未执行】,序列时间SequenceTime设置为当前时间,其他字段不变,然后保存到数据库;

  4. 后端定时轮巡从数据库获取状态为【未执行】的事件,执行,根据执行结果更新消息状态;

  5. 接收到的消息共有如下几种状态:【未执行】状态码:0、【成功】状态码:1、【成功&冲突合并】状态码:2、【失败】状态码:\-1、【拒绝执行】状态码:\-2;

  6. 接收事件列表支持按类型、来源、模块、动作、结果搜索,执行失败的任务可以手动重新执行。

Image

发送事件:配置 --> 异地多活 --> 同步事件 --> 发送事件

详细说明:

  1. Leader节点本地操作成功后,生成的发送事件记录会直接置为【成功】,然后保存到数据库(Leader发送事件到Follower节点,不从发送事件列表里面取,而是从集群事件列表里面取);

  2. Follower节点本地操作成功后,初始化事件:状态state设置成【未发送】,序列时间SequenceTime设置为当前时间,然后保存到数据库;

  3. Follower节点后端定时轮巡从数据库获取状态为【未发生】的事件,发送到Leader节点,根据发送结果更新事件状态;

  4. 发送事件共有如下几种状态:【未发送】状态码:0、【成功】状态码:1【失败】状态码:\-1;

  5. 发送事件列表支持按类型、来源、模块、动作、结果搜索,发送失败的任务可以手动再次发送。

Image

发送事件:配置 --> 异地多活 --> 同步事件 --> 集群事件

详细说明:

  1. 集群事件,是所有节点都要维护的!每一个操作,最终都会记录到集群事件里面;

  2. Leader节点本地操作成功后,生成的发送事件记录会直接置为【成功】,同时会生成一条集群事件记录;

  3. Leader维护了与每一个Follower节点的事件位置,Leader根据事件位置从集群事件里面取得要发送的消息,发送到相对应的Follower节点;

  4. 集群事件列表支持按类型、来源、模块、动作搜索,不会存在发送失败的事件。

Image

冲突日志:配置 --> 异地多活 --> 同步事件 --> 冲突日志

详细说明:

  1. 冲突日志记录的是对冲突事件的解决方案;
Image

其他注意事项

选举策略:按优先级高优先

如果集群【Leader节点选举策略】选择的是“优先级高优先”,集群中的每一个节点的优先级尽量不要重复。

大批量的操作

对于大批量操作,如"excel导入用户"、“外部用户源同步用户”、“批量删除用户”、“删除用户组”、“删除用户源”、“导入用户终端列表”、“...”等操作,最好在Leader节点上面进行,这样能够尽量减少集群压力,达到最快的数据同步,原因如下:

A. 在Leader上面进行的操作,会直接同步到所有的Follower节点;

B. 在Follower上面进行的操作,会先同步到Leader节点,Leader节点执行成功后,再同步到所有的Follower节点。

减少冲突

尽量避免如下操作:

  1. 节点A正在批量导入用户,用户正在导入过程中,在节点B上面删除相对应的用户组或者用户源;

  2. 节点A正在删除用户组或者用户源,在节点B上面相同的用户组或用户源下面添加或修改用户;

  3. 节点A正在被全量同步数据,在节点A上面进行大批量操作;

  4. 节点A断开了集群连接,在节点A上面进行大批量操作;

如果节点做了双机热备,尽量不要在备机上面操作

节点加入

如果集群中有新节点加入,在新节点加入过程中,其他所有节点最好不要进行大批量操作!

节点退出

建议使用【安全退出】!

状态重置

集群节点有时候状态不正确,可以在浏览器调用下面接口,重置节点状态

http://IP:8080/am/api/admin/deployment/msha/cluster/preJoin/reset

最近修改: 2026-10-22Powered by