常见SEO海南差分服务器云服务器keepalived nginx实现高可用实战全(双机主备,双主热备)
阿里云服务器ecs使用教程
Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
下面这里我们就用keepalived+nginx来测试下。
一、环境
这里准备两台机器,一台是主一台是备
nginx11192.168.192.11MASTERnginx02192.168.192.12BACKUP然后keepalive用的虚拟ip是 192.168.192.13我们的目的就是通过访问192.168.192.13,会去到192.168.192.11,当192.168.192.11挂了后就会去到192.168.192.12
nginx环境搭建可以参考Nginx实战
虚拟机的安装和克隆可以参考一个Java程序员从事网站开发要了解和掌握的基本技术中的Linux服务器准备
二、keepalived+nginx实现高可用实战
1、官网下载
https://www.keepalived.org/download.html这里下载Release版本:keepalived-2.0.6.tar.gz
注:开始我用keepalived-2.1.0.tar.gz版本,报如下错误,找不到解决办法,就只能换低一点的版本了,望知道的说下!
make[1]: Entering directory `/usr/local/keepalived-2.1.0/keepalivedMaking all in coremake[2]: Entering directory `/usr/local/keepalived-2.1.0/keepalived/coreCC namespaces.o In file included from /usr/include/netlink/handlers.h:19:0, from /usr/include/netlink/socket.h:16, from namespaces.c:171:/usr/include/netlink/netlink-kernel.h:193:2: error: unknown type name ‘__u32’__u32 group; ^make[2]: *** [namespaces.o] Error 1make[2]: Leaving directory `/usr/local/keepalived-2.1.0/keepalived/coremake[1]: *** [all-recursive] Error 1make[1]: Leaving directory `/usr/local/keepalived-2.1.0/keepalivedmake: *** [all-recursive] Error 12、解压
上传到/usr/local目录下面解压
tar-zxvfkeepalived-2.1.0.tar.gz3、configure配置
cd/usr/local/keepalived-2.1.0 ./configure --prefix=/usr/local/keepalived --sysconf=/etcprefix:keepalived安装的位置sysconf:keepalived核心配置文件所在位置,固定位置,改成其他位置则keepalived启动不了,/var/log/messages中会报错执行完后会有警告
阿里云邮箱服务器类型
*** WARNING -thisbuild will not support IPVSwithIPv6. Please install libnl/libnl-3dev libraries to support IPv6withIPVS.安装 libnl/libnl-3 依赖
yum-y install libnl libnl-devel重新执行
./configure --prefix=/usr/local/keepalived --sysconf=/etc发现没有警告了。
4、安装
make&&makeinstall5、Keepalived 配置
cd/etc/keepalived[root@localhostkeepalived]ipaddr1: lo:mtu65536qdiscnoqueuestateUNKNOWNgroupdefaultqlen1000link/loopback00:00:00:00:00:00brd00:00:00:00:00:00inet127.0.0.1/8scopehostlovalid_lftforeverpreferred_lftforeverinet6::1/128scopehostvalid_lftforeverpreferred_lftforever2: ens33:mtu1500qdiscpfifo_faststateUPgroupdefaultqlen1000link/ether00:50:56:36:1a:25brdff:ff:ff:ff:ff:ffinet192.168.192.11/24brd192.168.192.255scopeglobalnoprefixrouteens33valid_lftforeverpreferred_lftforeverinet6fe80::a4ce:6997:d06a:d685/64scopelinknoprefixroutevalid_lftforeverpreferred_lftforever我们用的网卡是ens33
修改配置文件,假设我们这里的VIP为192.168.192.13,并且这台节点为MASTER,配置文件为
global_defs{路由id:当前安装keepalived的节点主机标识符,保证全局唯一router_idkeep_11}vrrp_instanceVI_1 {表示状态是MASTER主机还是备用机BACKUPstateMASTER该实例绑定的网卡名称interfaceens33保证主备节点一致即可virtual_router_id13权重,master权重一般高于backup,如果有多个,那就是选举,谁的权重高,谁就当选priority100主备之间同步检查时间间隔,单位秒advert_int2认证权限密码,防止非法节点进入authentication{auth_typePASSauth_pass1111}虚拟出来的ip,可以有多个(vip)virtual_ipaddress{192.168.192.13}}然后我们克隆一台机器,修改另一台机器的配置文件为BACKUP
global_defs{路由id:当前安装keepalived的节点主机标识符,保证全局唯一router_idkeep_12}vrrp_instanceVI_1 {表示状态是MASTER主机还是备用机BACKUPstateBACKUP该实例绑定的网卡名称interfaceens33保证主备节点一致即可virtual_router_id13权重,master权重一般高于backup,如果有多个,那就是选举,谁的权重高,谁就当选priority80主备之间同步检查时间间隔,单位秒advert_int2认证权限密码,防止非法节点进入authentication{auth_typePASSauth_pass1111}虚拟出来的ip,可以有多个(vip)virtual_ipaddress{192.168.192.13}}6、启动MASTER
cd/usr/local/keepalived/sbin ./keepalived[root@localhostsbin]ipaddr1: lo:mtu65536qdiscnoqueuestateUNKNOWNgroupdefaultqlen1000link/loopback00:00:00:00:00:00brd00:00:00:00:00:00inet127.0.0.1/8scopehostlovalid_lftforeverpreferred_lftforeverinet6::1/128scopehostvalid_lftforeverpreferred_lftforever2: ens33:mtu1500qdiscpfifo_faststateUPgroupdefaultqlen1000link/ether00:50:56:36:1a:25brdff:ff:ff:ff:ff:ffinet192.168.192.11/24brd192.168.192.255scopeglobalnoprefixrouteens33valid_lftforeverpreferred_lftforeverinet192.168.192.13/32scopeglobalens33valid_lftforeverpreferred_lftforeverinet6fe80::a4ce:6997:d06a:d685/64scopelinknoprefixroutevalid_lftforeverpreferred_lftforever[root@localhostsbin]可以看到ens33多了一个192.168.192.13
7、启动BACKUP
cd/usr/local/keepalived/sbin ./keepalived[root@localhostsbin]ipaddr1: lo:mtu65536qdiscnoqueuestateUNKNOWNgroupdefaultqlen1000link/loopback00:00:00:00:00:00brd00:00:00:00:00:00inet127.0.0.1/8scopehostlovalid_lftforeverpreferred_lftforeverinet6::1/128scopehostvalid_lftforeverpreferred_lftforever2: ens33:mtu1500qdiscpfifo_faststateUPgroupdefaultqlen1000link/ether00:50:56:3c:89:c3brdff:ff:ff:ff:ff:ffinet192.168.192.12/24brd192.168.192.255scopeglobalnoprefixrouteens33valid_lftforeverpreferred_lftforeverinet192.168.192.13/32scopeglobalens33valid_lftforeverpreferred_lftforeverinet6fe80::a4ce:6997:d06a:d685/64scopelinktentativenoprefixroutedadfailedvalid_lftforeverpreferred_lftforeverinet6fe80::137c:d64d:c120:b79e/64scopelinknoprefixroutevalid_lftforeverpreferred_lftforever[root@localhostsbin]可以看到ens33也多了一个192.168.192.13
8、访问
我们访问192.168.192.13,会发现
Welcometo nginx MASTER11!页面显示这个,表面目前是在MASTER的
9、模拟服务中断正常我们定义某个节点有故障了,就是keepalived的进程都不在了,所以我们可以在MASTER执行
killallkeepalived要是没有这命令可以先安装
yum-y install psmisckill后我们发现
[root@localhosthtml]ipaddr1: lo:mtu65536qdiscnoqueuestateUNKNOWNgroupdefaultqlen1000link/loopback00:00:00:00:00:00brd00:00:00:00:00:00inet127.0.0.1/8scopehostlovalid_lftforeverpreferred_lftforeverinet6::1/128scopehostvalid_lftforeverpreferred_lftforever2: ens33:mtu1500qdiscpfifo_faststateUPgroupdefaultqlen1000link/ether00:50:56:36:1a:25brdff:ff:ff:ff:ff:ffinet192.168.192.11/24brd192.168.192.255scopeglobalnoprefixrouteens33valid_lftforeverpreferred_lftforeverinet6fe80::a4ce:6997:d06a:d685/64scopelinknoprefixroutevalid_lftforeverpreferred_lftforever[root@localhosthtml]192.168.192.13就不见了。
再访问192.168.192.13
Welcometo nginx BACKUP12!成功切到了备用机!
我们再启动MASTER的keepalived后,再访问192.168.192.13
Welcometo nginx MASTER11!10、那我们监控的好像都是keepalived?不是nginx啊?
正常我们都会在keepalived配置中配置一个检查脚本,定时检查nginx进程是否存在,若是不存在则同时killall keepalived,这样就相当于监控了nginx.
11、keepalived相关命令
启动keepalivedsystemctlstart keepalived停止keepalivedsystemctlstop keepalived重启keepalivedsystemctlrestart keepalived12、Keepalived 配置 Nginx 自动重启
在云服务器安装sql server
1、增加Nginx重启检测脚本
vim/etc/keepalived/check_nginx_alive_or_not.sh!/bin/bashA=`ps -C nginx --no-header |wc -l`判断nginx是否宕机,如果宕机了,尝试重启if[$A-eq 0 ];then/usr/local/nginx/sbin/nginx等待一小会再次检查nginx,如果没有启动成功,则停止keepalived,使其启动备用机sleep 3if[ `ps -C nginx --no-header |wc -l` -eq 0 ];thenkillall keepalivedfifi增加运行权限
chmod+x /etc/keepalived/check_nginx_alive_or_not.sh2、在 keepalived.conf 配置定时监听 nginx 状态脚本
vrrp_scriptcheck_nginx_alive {script"/etc/keepalived/check_nginx_alive_or_not.sh"interval2每隔两秒运行上一行脚本weight10如果脚本运行成功,则升级权重+10weight -10 如果脚本运行失败,则升级权重-10}3、在vrrp_instance中新增监控的脚本
track_script{check_nginx_alive追踪 nginx 脚本}4、重启Keepalived使得配置文件生效
systemctlrestart keepalived5、测试Nginx是否会自动重启
cd/usr/local/nginx/sbin停止./nginx -s stop查看进程是否存在ps -ef|grep nginx这里我们配置脚本是每隔两秒运行一次,所以手速要快,当然如果你手速不快的话,可以把运行时间加长,就会看到效果。我们已停止nginx,马上查进程是查不到的,过一会再查又有了。
6、加上监控的配置文件
global_defs{路由id:当前安装keepalived的节点主机标识符,保证全局唯一router_idkeep_11}vrrp_scriptcheck_nginx_alive {script"/etc/keepalived/check_nginx_alive_or_not.sh"interval2 每隔两秒运行上一行脚本weight10 如果脚本运行成功,则升级权重+10weight -10 如果脚本运行失败,则升级权重-10}vrrp_instanceVI_1 {表示状态是MASTER主机还是备用机BACKUPstateMASTER该实例绑定的网卡名称interfaceens33保证主备节点一致即可virtual_router_id13权重,master权重一般高于backup,如果有多个,那就是选举,谁的权重高,谁就当选priority100主备之间同步检查时间间隔,单位秒advert_int2认证权限密码,防止非法节点进入authentication{auth_typePASSauth_pass1111}虚拟出来的ip,可以有多个(vip)virtual_ipaddress{192.168.192.13}track_script{check_nginx_alive追踪 nginx 脚本}}13、脑裂问题
我们上面可以看到,MASTER和BACKUP上执行ip addr都可以看到VIP,很明显是有问题的。
数据包抓取看看
安装tcpdump命令(没有的话)
yuminstall tcpdump[root@localhost sbin]tcpdump-iens33vrrp-ntcpdump:verboseoutputsuppressed,use-vor-vvforfullprotocoldecodelisteningonens33,link-typeEN10MB(Ethernet),capturesize262144bytes04:13:38.770655IP192.168.192.12> 224.0.0.18:VRRPv2,Advertisement,vrid13,prio80,authtypesimple,intvl2s,length20 04:13:39.484837IP192.168.192.11> 224.0.0.18:VRRPv2,Advertisement,vrid13,prio110,authtypesimple,intvl2s,length检查发现 11和12都在对224.0.0.18发送消息。Keepalived使用vrrp组播,默认地址是224.0.0.18.但是在正常情况下,备节点如果收到主节点的心跳消息时,优先级高于自己,就不会主动对外发送消息。
考虑到,该主机启用了firewalld防火墙,因此要防火墙配置放过vrrp协议。
firewall-cmd--direct--permanent--add-ruleipv4filterINPUT0--destination224.0.0.18--protocolvrrp-jACCEPTfirewall-cmd--direct--permanent--add-ruleipv4filterOUTPUT0--destination224.0.0.18--protocolvrrp-jACCEPTfirewall-cmd--reload完成后再用ip addr查看,集群已经正常了,只有主节点绑定虚拟IP,备份节点不会绑定了。
tcpdump-i ens33 vrrp -n[root@localhostsbin]tcpdump-iens33vrrp-ntcpdump:verboseoutputsuppressed,use-vor-vvforfullprotocoldecodelisteningonens33,link-typeEN10MB(Ethernet),capturesize262144bytes04:25:26.669848IP192.168.192.11>224.0.0.18:VRRPv2,Advertisement,vrid13,prio110,authtypesimple,intvl2s,length2004:25:28.679560IP192.168.192.11>224.0.0.18:VRRPv2,Advertisement,vrid13,prio110,authtypesimple,intvl2s,length20发现12就不会对224.0.0.18发送消息了。
再看ip addr 发现只有11Master才有虚拟IP 13了。
三、实现双主热备
上面实现的是双机主备,也就是有一台备用机其实是浪费了的,所以正常情况下我们会实现双主热备,什么意思呢?就是两台服务器互为主备,也就是有两个vip。然后我们再DNS中配置两个vip即可,DNS会根据轮训策略选取一个vip进行访问,这样就都不会浪费资源啦。
话说配置DNS轮训貌似只有云服务可以配置。比如腾讯云或者阿里云,在配置域名解析的时候,配置两个ip即可。
下面我们在上面双机主备的环境下继续搭建双主热备,这里规划下ip:
nginx11192.168.192.11MASTERnginx02192.168.192.12BACKUP然后keepalive用的虚拟ip是192.168.192.13/192.168.192.14vip192.168.192.13中我们配置192.168.192.11 MASTER,192.168.192.12 BACKUP,vip192.168.192.14中我们配置192.168.192.11 BACKUP,192.168.192.12 MASTER.
1、192.168.192.11配置文件
global_defs{路由id:当前安装keepalived的节点主机标识符,保证全局唯一router_idkeep_11}vrrp_scriptcheck_nginx_alive {script"/etc/keepalived/check_nginx_alive_or_not.sh"interval2 每隔两秒运行上一行脚本weight10 如果脚本运行成功,则升级权重+10weight -10 如果脚本运行失败,则升级权重-10}vrrp_instanceVI_1 {表示状态是MASTER主机还是备用机BACKUPstateMASTER该实例绑定的网卡名称interfaceens33保证主备节点一致即可virtual_router_id13权重,master权重一般高于backup,如果有多个,那就是选举,谁的权重高,谁就当选priority100主备之间同步检查时间间隔,单位秒advert_int2认证权限密码,防止非法节点进入authentication{auth_typePASSauth_pass1111}虚拟出来的ip,可以有多个(vip)virtual_ipaddress{192.168.192.13}track_script{check_nginx_alive追踪 nginx 脚本}}vrrp_instanceVI_2 {表示状态是MASTER主机还是备用机BACKUP:这里是BACKUPstateBACKUP该实例绑定的网卡名称interfaceens33保证主备节点一致即可:第二个vipvirtual_router_id14权重:这里是backuppriority80主备之间同步检查时间间隔,单位秒advert_int2认证权限密码,防止非法节点进入authentication{auth_typePASSauth_pass1111}虚拟出来的ip,可以有多个(vip):这里是第二个vip,用户14virtual_ipaddress{192.168.192.14}track_script{check_nginx_alive追踪 nginx 脚本}}可以看到有了两个vrrp_instance VI_1和vrrp_instance VI_2,其中 VI_1 对应vip192.168.192.13,该节点为MASTER, VI_2对应vip192.168.192.13,该节点为BACKUP.
2、192.168.192.12配置文件
global_defs{路由id:当前安装keepalived的节点主机标识符,保证全局唯一router_idkeep_12}vrrp_scriptcheck_nginx_alive {script"/etc/keepalived/check_nginx_alive_or_not.sh"interval2 每隔两秒运行上一行脚本weight10 如果脚本运行成功,则升级权重+10weight -10 如果脚本运行失败,则升级权重-10}vrrp_instanceVI_1 {表示状态是MASTER主机还是备用机BACKUPstateBACKUP该实例绑定的网卡名称interfaceens33保证主备节点一致即可virtual_router_id13权重,master权重一般高于backup,如果有多个,那就是选举,谁的权重高,谁就当选priority80主备之间同步检查时间间隔,单位秒advert_int2认证权限密码,防止非法节点进入authentication{auth_typePASSauth_pass1111}虚拟出来的ip,可以有多个(vip)virtual_ipaddress{192.168.192.13}track_script{check_nginx_alive追踪 nginx 脚本}}vrrp_instanceVI_2 {表示状态是MASTER主机还是备用机BACKUPstateMASTER该实例绑定的网卡名称interfaceens33保证主备节点一致即可virtual_router_id14权重:这里是MASTER用100priority100主备之间同步检查时间间隔,单位秒advert_int2认证权限密码,防止非法节点进入authentication{auth_typePASSauth_pass1111}虚拟出来的ip,可以有多个(vip):这里是另一个vipvirtual_ipaddress{192.168.192.14}track_script{check_nginx_alive追踪 nginx 脚本}}可以看到有了两个vrrp_instance VI_1和vrrp_instance VI_2,其中 VI_1 对应vip192.168.192.13,该节点为BACKUP, VI_2对应vip192.168.192.14,该节点为MASTER.配置刚好跟另一个节点相反。
3、重启
systemctlrestart keepalived注:这里我安装好keepalived并没有将系统配置文件拷贝至系统 etc文件依然可以直接用这个命令,可能是我这个版本比较高的原因,如果发现用不了这个命令,建议拷贝下
cpinit.d/keepalived /etc/init.d/cpsysconfig/keepalived /etc/sysconfig/刷新系统服务systemctldaemon-reload4、检查
重启后,通过ip addr查看ens33中的ip,根据上面的配置,理论上11上会有11和13,12上会有12和14.
192.168.192.11
inet192.168.192.11/24brd192.168.192.255scopeglobalnoprefixrouteens33valid_lftforeverpreferred_lftforeverinet192.168.192.13/32scopeglobalens33valid_lftforeverpreferred_lftforever192.168.192.12
inet192.168.192.12/24brd192.168.192.255scopeglobalnoprefixrouteens33valid_lftforeverpreferred_lftforeverinet192.168.192.14/32scopeglobalens33valid_lftforeverpreferred_lftforever跟预期一样,接下来我们直接在浏览器访问192.168.192.13和192.168.192.14(这里假设已经通过DNS轮训获取了对应的ip)
看结果是跟预期一样的,毕竟配置的13对应11是MASTER,14对应的12是MASTER
5、模拟异常
我们有做健康检测脚本,只要nginx挂了,keepalived会尝试去拉取,拉取失败会kill掉自己,这里就不搞那么复杂,直接把11的keepalived给关了
systemctlstop keepalived我们再看12的ip,肯定会发现13,14都在
inet192.168.192.12/24brd192.168.192.255scopeglobalnoprefixrouteens33valid_lftforeverpreferred_lftforeverinet192.168.192.14/32scopeglobalens33valid_lftforeverpreferred_lftforeverinet192.168.192.13/32scopeglobalens33valid_lftforeverpreferred_lftforever浏览器访问也会发现只剩下12了。
完结!
阿里云服务器cpu型号
推荐阅读
- 千云服务器Windows硬盘分区:通过命令行进行Diskpart磁盘管理 2025-12-21 02:21:52
- 云服务器 tcp云手机IP是一样的吗?如何做到一机一IP 2025-12-21 02:11:49
- 云计算云服务器阿里云正式发布区块链服务只做基础设施,不做应用 2025-12-21 02:01:42
- 阿里云服务器带宽选择别再传文件到云端了!这个开源工具让你实现秒传级P2P直连 2025-12-21 01:51:38
- 服务器云票百年传承三十向新福建联通:奋进八闽联通未来 2025-12-21 01:41:31

