Keepalive介绍
Keepalived主要功能是用来防止单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用)的发生,从而实现高可用性和热备。它诞生之初的目的是能够自主调用ipvsadm来生成规则,并且能够自动实现将用户访问的地址转移到其他节点上进行实现的。
Keepalived:核心包含一个core模块和2个checkers和VRRP协议。Core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。checkers:检查服务检查reserved的健康状况的,基于脚本也可检查服务本身的健康状况。这里是实现ipvs后端健康状况的检测的。VRRP (Virtual Router Redundancy Protocol,即虚拟路由冗余协议):是一种容错协议,它保证当主机的下一跳路由器出现故障时,由另一台路由器来代替出现故障的路由器进行工作,从而保持网络通信的连续性和可靠性。VRRP中每个节点之间都有优先级的一般为0-255(0,255有特殊用法)数字越大优先级越高。
keepalived是以VRRP协议为实现基础的,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master节点和多个backup节点。Master节点上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当 backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
理论到此结束
1.硬件环境规划
3台机器 1台宿主机,其实都是虚拟机,我用的docker, 懒得去装虚拟机
搭建
#在node1,node2,node3和nfs节点上均选择mini方式安装CentOS 7 64-bit,并按照规划配置IP地址。 我用的docker启动的,比较方便。
#nfs为当前宿主机,也就是说数据我完了要存到我宿主机,不会放到docker虚拟机中,这样也保险一些 nfs搭建自行解决,本篇不涉及 或者看这篇 传送门
1. 在节点 node1,node2,node3 上安装Nginx 和Keepalive 1.3.5
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
yum install nginx[你也可以源码安装nginx] 2. 源码安装keepalived #第一步,安装基础库 yum -y install openssl-devel libnl3-develipset-devel iptables-devel libnfnetlink-devel net-snmp-devel #第二步,下载源码安装 wget http://www.keepalived.org/software/keepalived-1.2.13.tar.gz tar zxvf keepalived-1.2.13.tar.gz cd keepalived-1.2.13 ./configure --prefix=/usr/local/keepalived/ make make install cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/keepalived cp /usr/local/keepalived/sbin/keepalived /usr/sbin/ cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ mkdir -p /etc/keepalived/ cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf #将keepalived添加到开机启动服务中,并进行测试 chkconfig keepalived on chkconfig --list | grep keepalived #启动 /etc/init.d/keepalived start 或者 /usr/local/keepalived/sbin/keepalived -f /etc/keepalived/keepalived.conf-D |
2. 将Nginx数据的存储路径配置在节点NFS上(这个等keepalive这块配置完再设置,否则现在设置都挂载同一个目录,对keepalive测试不好区分)
2.1配置keepalive nginx检测脚本
1 2 3 4 5 6 7 8 9 10 11 |
#!/bin/sh PATH=/bin:/sbin:/usr/bin:/usr/sbin A=`ps -C nginx --no-header |wc -l` if [ $A -eq 0 ] then echo 'nginx server is died' killall keepalived fi |
配置在/opt/.local/check_nginx_alive.sh 下(这个看个人喜好)
chmod +x /opt/.local/check_nginx_alive.sh #添加执行权限,下面keepalived配置文件要用到
3.配置node1上的keepalive
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
! Configuration File for keepalived vrrp_script check_nginx_alive { script "/opt/.local/check_nginx_alive.sh" #运行脚本,脚本内容上面有,就是起到一个nginx宕机以后,自动结束掉keepalived服务, interval 3 #检测时间间隔 weight -10 #如果条件成立的话,则权重 -10 } global_defs { router_id LVS_DEVEL } vrrp_instance VI_1 {##定义虚拟路由, VI_1 为虚拟路由的标示符,自己定义名称 state MASTER ##设置节点node1为master 主分支 角色 interface eth0 ##绑定虚拟 IP 的网络接口,与本机IP地址所在的网络接口相同 mcast_src_ip 172.18.0.2 ## 本机 IP 地址 virtual_router_id 51 #虚拟路由的ID号,两个节点设置必须一样 priority 100 ##节点优先级,值范围 0-254, MASTER 要比 BACKUP 高 advert_int 1 ## 组播信息发送间隔,两个节点设置必须一样, 默认 1s authentication { ### 设置验证信息,两个节点必须一致 auth_type PASS auth_pass 1111 } #将 track_script 块加入 instance 配置块 track_script { check_nginx_alive #执行 Nginx 监控的服务 } virtual_ipaddress { ##提供给Tomcat应用的虚拟服务地址 172.18.0.7/24 ## 虚拟 ip,可以定义多个 } } |
4.配置node2 keepalive
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
vrrp_script check_nginx_alive { script "/opt/.local/check_nginx_alive.sh" interval 3 weight -10 } global_defs { router_id LVS_DEVEL } vrrp_instance VI_2 {##定义虚拟路由, VI_1 为虚拟路由的标示符,自己定义名称 state BACKUP ##设置节点node1为master 主分支 角色 interface eth0 ##绑定虚拟 IP 的网络接口,与本机IP地址所在的网络接口相同 mcast_src_ip 172.18.0.3 ## 本机 IP 地址 virtual_router_id 51 #虚拟路由的ID号,两个节点设置必须一样 priority 50 ##节点优先级,值范围 0-254, MASTER 要比 BACKUP 高 advert_int 1 ## 组播信息发送间隔,两个节点设置必须一样, 默认 1s authentication { ### 设置验证信息,两个节点必须一致 auth_type PASS auth_pass 1111 } track_script { check_nginx_alive } virtual_ipaddress { ##提供给Tomcat应用的虚拟服务地址 172.18.0.7/24 ## 虚拟 ip,可以定义多个 } } |
5. 配置node3 keepalive
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
! Configuration File for keepalived vrrp_script check_nginx_alive { script "/opt/.local/check_nginx_alive.sh" interval 3 weight -10 } global_defs { router_id LVS_DEVEL } vrrp_instance VI_3 {##定义虚拟路由, VI_1 为虚拟路由的标示符,自己定义名称 state BACKUP ##设置节点node1为master 主分支 角色 interface eth0 ##绑定虚拟 IP 的网络接口,与本机IP地址所在的网络接口相同 mcast_src_ip 172.18.0.4 ## 本机 IP 地址 virtual_router_id 51 #虚拟路由的ID号,两个节点设置必须一样 priority 30 ##节点优先级,值范围 0-254, MASTER 要比 BACKUP 高 advert_int 1 ## 组播信息发送间隔,两个节点设置必须一样, 默认 1s authentication { ### 设置验证信息,两个节点必须一致 auth_type PASS auth_pass 1111 } track_script { check_nginx_alive } virtual_ipaddress { ##提供给Tomcat应用的虚拟服务地址 172.18.0.7/24 ## 虚拟 ip,可以定义多个 } } 配置好后重新启动 |
1 2 |
systemctl daemon-reload #重新加载keepalived配置文件 systemctl restart keepalived.service #重新启动 |
6. 多种启动方法 启动 keepalive
systemctl start keepalived
systemctl enable keepalived #设置开机自启动
/etc/init.d/keepalived start
/usr/local/keepalived/sbin/keepalived -f /etc/keepalived/keepalived.conf-D
7. 验证keepalive服务
1 |
ps -ef | grep keepalived |
8.查看三个容器中的keepalived状态
1 |
systemctl status keepalived.service |
9.查看虚拟ip 是否已经绑定到eth0
1 |
ip addr |
10.验证访问
1 |
curl 172.18.0.7 |
<1>.我们分别在 node1 node2 node3机器上 访问curl 172.18.0.7
可以看见,此时3个节点容器通过虚拟vip : 172.18.0.7 访问nginx数据,请求返回的数据都是master容器中nginx配置的 “我是Master-000000…1” 内容
<2.>继续验证 关闭node1 主节点的nginx 或 keepalived
因为前面有个脚本,内容是如果检测不到nginx服务就kill掉keepalived服务,所以我们停止nginx 也就相当于停止了 keepalived
现在我们再node1 node2 node3节点访问 curl 172.18.0.7
可以看到当master节点模拟故障关闭,依据我们原先配置的优先级,node2被暂时推举为maser来提供访问,当前访问数据来源由node2来提供。
<3.>再次启动主节点 node1 master 看看会有什么变化
可以看到,当node1 master容器中的nginx 和 keepalived服务开启后,请求返回的数据会再次转到master中。
11. 然后将3台机器的nginx数据目录都指向 挂载nfs机器的挂载点。这样3台机器都统一访问web服务,即使有1台故障,其他2台也同样提供web访问
Keepalived服务命令
- systemctl daemon-reload 重新加载
- systemctl enable keepalived.service 设置开机自动启动
- systemctl disable keepalived.service 取消开机自动启动
- systemctl start keepalived.service 启动
- systemctl stop keepalived.service停止
- systemctl status keepalived.service 查看服务状态
- 本文固定链接: https://www.yoyoask.com/?p=469
- 转载请注明: shooter 于 SHOOTER 发表