Keepalived 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 keepalived是什么 keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单节点故障。 keepalived工作原理 keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。 虚拟路由冗余协议,可以认为是实现高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。 keepalived主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。 ============================================================================ 脑裂(裂脑): Keepalived的BACKUP主机在收到不MASTER主机报文后就会切换成为master,如果是它们之间的通信线路出现问题,无法接收到彼此的组播通知,但是两个节点实际都处于正常工作状态,这时两个节点均为master强行绑定虚拟IP,导致不可预料的后果,这就是脑裂。 解决方式: 1、添加更多的检测手段,比如冗余的心跳线(两块网卡做健康监测),ping对方等等。尽量减少"裂脑"发生机会。(治标不治本,只是提高了检测到的概率); 2、做好对裂脑的监控报警(如邮件及手机短信等或值班).在问题发生时人为第一时间介入仲裁,降低损失。例如,百度的监控报警短倍就有上行和下行的区别。报警消息发送到管理员手机上,管理员可以通过手机回复对应数字或简单的字符串操作返回给服务器.让服务器根据指令自动处理相应故障,这样解决故障的时间更短; 3、爆头,将master停掉。然后检查机器之间的防火墙。网络之间的通信;
实现nginx的反向代理 1 2 3 4 反向代理代理的是服务端,正向代理代理的是客户端。 proxy:反向代理 agent:正向代理 反向代理服务器自己本身并不存放页面,当有用户申请访问时,反向代理服务器会向下面的真实服务器转发,从而提供页面,转发前会先确认是否"活着"。如果没有服务器“活着”,那么就无法提供页面,从而用户访问不到。
配置安装nginx 所有的机器,关闭防火墙和selinux
1 2 3 4 5 6 7 8 [root@zabbix-agent-node2 ~]# cd /etc/yum.repos.d/ [root@zabbix-agent-node2 yum.repos.d]# vim nginx.repo [nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=0 enabled=1 [root@zabbix-agent-node2 yum.repos.d]# yum install nginx -y
此处将Alan游戏网站拖到了root目录下,因为想要展示的页面文件后缀名为htm。所以要想优先展示可以修改nginx的配置文件,让htm文件优先展示。
1 2 [root@zabbix-agent-node2 ~]# mv /root/alan游戏网站/* /usr/share/nginx/html/ [root@zabbix-agent-node2 ~]# vi /etc/nginx/conf.d/default.conf
想让htm文件优先展示就让index.html文件在前,反之一样。
修改过后nginx的配置文件记得重启nginx服务。
1 [root@zabbix-server yum.repos.d]# systemctl restart nginx
浏览器访问:http://192.168.100.40成功显示
下面在node1节点再次安装nginx服务也作为真实服务器端。具体操作同上,页面方面可以换成别的页面,两节点不一样方便最后对照显示。此处node1节点使用的页面是nginx默认显示的页面。
配置反向代理服务器端 同上一样,配置安装nginx,关闭防火墙和selinux。因为此节点的80端口被其他服务占用了,所以此节点的nginx服务需要额外修改一下端口,具体配置如下,此处是将upstream index和server放在了一个文件当中,笔记中是分了两个文件。两种都是可以的。
1 # 子配置文件不管怎么写最终其实也都是放到了主配置文件当中,以.conf结尾的一般都是主配置文件,一般都放在 /etc/服务名 目录下,conf.d一般都是子配置文件目录。
配置完成后重启nginx服务
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 [root@zabbix-server ~]# vi /etc/nginx/conf.d/default.conf upstream index { server 192.168.100.30:80 weight=1 max_fails=2 fail_timeout=2; server 192.168.100.40:80 weight=2 max_fails=2 fail_timeout=2; } # weight意为优先级,此处相当于找30一次,找40两次,由此往复,不写默认都是1 # max_fails意为最大失败次数,也就是询问该节点2次如果都无回应则不会再询问该节点。 # fail_timeout意为失败后的再次询问时间间隔,也就是询问后2秒无回应再询问下一次 server { listen 81;#80端口被占用,启用81端口 server_name localhost; access_log /var/log/nginx/host.access.log main; location / { proxy_pass http://index; #此处http://后的内容要与第一行upstream后的内容一致 proxy_redirect default; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } [root@zabbix-server ~]# systemctl restart nginx
此时可以去浏览器访问:http://192.168.100.20:81,可以发现第一次是node1节点的nginx页面,刷新后是node2节点的设置的游戏页面,至此反向代理服务器设置成功。
上述情况为高并发集群,当keepalived介入后,有了backup,就成了高可用集群,高可用集群是建立在高并发集群的基础上的。
Keepalived实现调度器HA
主/备调度器安装软件
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 [root@nginx-proxy-master ~]# yum install -y keepalived [root@nginx-proxy-slave ~]# yum install -y keepalived [root@nginx-proxy-slave ~]# cd /etc/nginx/conf.d/ [root@nginx-proxy-slave conf.d]# mv default.conf default.conf.bak [root@nginx-proxy-master ~]# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak # 为了防止后续会用到原配置文件,所以将其加了后缀名封印了,重新创了新的进行编写 [root@nginx-proxy-master ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id directory1 #辅助改为directory2,相当于是组内的主机名 } vrrp_instance VI_1 { #组名 state MASTER #定义主还是备 interface ens33 #VIP绑定接口 virtual_router_id 80 #整个集群的调度器一致 priority 100 #优先级,backup改为50 advert_int 1 #心跳检测的时间间隔1s authentication { auth_type PASS #认证方式,可以是PASS或AH两种认证方式 auth_pass 1111 #认证密码,组内须一致 } virtual_ipaddress { 192.168.100.100/24 #VIP } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 [root@nginx-proxy-slave ~]# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak [root@nginx-proxy-slave ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id directory2 } vrrp_instance VI_1 { state BACKUP #设置为backup interface ens33 nopreempt #设置到back上面,不抢占资源(VIP) virtual_router_id 80 priority 50 #辅助改为50 advert_int 1 #检测间隔1s authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.100.100/24 } }
2.启动KeepAlived(主备均启动)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [root@nginx-proxy-master ~]# systemctl start keepalived [root@nginx-proxy-master ~]# systemctl enable keepalived [root@nginx-porxy-slave ~]# systemctl start keepalived [root@nginx-porxy-slave ~]# systemctl enable keepalived [root@nginx-proxy-master ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:8c:41:88 brd ff:ff:ff:ff:ff:ff inet 192.168.100.20/24 brd 192.168.100.255 scope global ens33 valid_lft forever preferred_lft forever inet 192.168.100.100/24 scope global secondary ens33 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe8c:4188/64 scope link valid_lft forever preferred_lft forever
测试: 浏览器访问:http://192.168.100.100 如能正常访问,将keepalived主节点关机,测试vip是否漂移
测试后发现VIP漂移到了从节点,并且浏览器访问:http://192.168.100.100依旧可以正常访问。
加入检测服务脚本 到此: 可以解决心跳故障keepalived 不能解决Nginx服务故障,也就是心跳检测,加入检测服务脚本的目的也就是要让主从反向代理服务器上的nginx服务和keepalived服务绑定在一起。
正常情况来讲,机器的keepalived服务挂掉了VIP才会进行漂移,但是在工作当中除了机器直接关机或者没了才会出现这种情况,大多数的情况是nginx挂掉而keepalived服务仍然正常,所以就会导致一种结果,nginx服务挂掉网页无法正常访问,但keepalived服务仍正常运行所以VIP并不会漂移到从节点。
所以加入检测脚本就是让脚本不断检测nginx服务是否挂掉,当确定挂掉时,脚本会关掉keepalived服务,使得VIP自动漂移到从节点。从而用户可以正常访问。
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 思路: 让Keepalived以一定时间间隔执行一个外部脚本,脚本的功能是当Nginx失败,则关闭本机的Keepalived (1) script [root@nginx-proxy-master ~]# vim /etc/keepalived/check_nginx_status.sh # !/bin/bash /usr/bin/curl -I http://localhost &>/dev/null if [ $? -ne 0 ];then # /etc/init.d/keepalived stop systemctl stop keepalived fi [root@nginx-proxy-master ~]# chmod a+x /etc/keepalived/check_nginx_status.sh # 赋予文件执行权限 (2). keepalived使用script [root@nginx-proxy-master ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id directory1 } vrrp_script check_nginx { #check_nginx相当于文件的别名 script "/etc/keepalived/check_nginx_status.sh" #文件路径 interval 5 #间隔时间,就是如果无回应多久进行下一次访问 } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 80 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.100.100/24 } track_script { check_nginx #文件别名,需与上方的一致 } } 注:必须先启动Nginx,再启动keepalived 测试访问: 将keepalived集群的主节点的Nginx服务关闭,查看vip是否漂移,如果漂移,即成功。 VIP成功漂移后再次启动主节点nginx服务,VIP会自动漂移回来主节点,原因是主节点优先级高。 正常工作中不论主从节点都需要安装检测服务,此处只是为了展示实验结果所以只在主节点进行了配置。
1 2 面试题:高可用时,你的备份机器(从机)是否存在可用性? 是存在的,只不过是没有流量分发到备份机器,VIP不在从机。
Keepalived邮箱报警配置 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 30 31 32 33 34 35 # 主备都配置 [root@keepalived-1 keepalived]# cat /etc/keepalived/notify.sh # !/bin/bash contact='ldq20000603@163.com' notify() { local mailsubject="$(hostname) to be $1, vip floating" local mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1" echo "$mailbody" | mail -s "$mailsubject" $contact } # contack为全局变量,local 为局部变量,$0 为脚本文件,$1 为执行命令后定义的变量,$2 即为执行命令后定义的第二个变量(根据顺序排队确定第几个变量) # [root@zabbix-server ~]# cat $$$.sh echo "$1 你好呀" [root@zabbix-server ~]# bash $$$.sh 刘 李 刘 你好呀 [root@zabbix-server ~]# bash $$$.sh 李 李 李 你好呀 # case $1 in master) notify master ;; backup) notify backup ;; fault) notify fault ;; *) echo "Usage: $(basename $0) {master|backup|fault}" exit 1 ;; esac [root@keepalived-1 keepalived]# chmod 777 /etc/keepalived/notify.sh
配置发送邮件的设置: 1 2 3 4 5 6 7 8 9 10 主备都操作 [root@keepalived-1 ~]# yum -y install mailx [root@keepalived-1 ~]# vim /etc/mail.rc #在文件最后面添加 set from=ldq20000603@163.com set smtp=smtp.163.com set smtp-auth-user=ldq20000603@163.com set smtp-auth-password=IKMQRYSVCTALDYNT #邮箱需要开启POP3/SMTP服务并设置密钥 set smtp-auth=login set ssl-verify=ignore [root@keepalived-1 ~]# echo test mail| mail -s "testa" ldq20000603@163.com
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 [root@zabbix-server ~]# vi /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { # router_id directory1 notification_email { ldq20000603@163.com # 报警邮件地址,也就是接收者 } notification_email_from Alexandre.Cassen@firewall.loc #发送者的邮箱,指定发件人 smtp_server smtp.163.com smtp_connect_timeout 30 router_id directory1 #辅助改为directory2 vrrp_garp_interval 0 # ARP报文发送延迟时间,可以精确到毫秒级。默认是0. vrrp_gna_interval 0 # 信息发送延迟时间 } vrrp_script check_nginx { script "/etc/keepalived/check_nginx.sh" interval 5 } vrrp_instance VI_1 { state MASTER #定义主还是备 interface ens33 #VIP绑定接口 virtual_router_id 80 #整个集群的调度器一致 priority 100 #优先级,backup改为50 advert_int 1 #心跳检测的时间间隔1s #nopreempt notify_master "/etc/keepalived/notify.sh master" #当前节点成为master时,通知脚本执行任务 notify_backup "/etc/keepalived/notify.sh backup" #当前节点成为backup时,通知脚本执行任务 notify_fault "/etc/keepalived/notify.sh fault" #当当前节点出现故障,执行的任务 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.100.100/24 } track_script { check_nginx } } # 参数解释: notification_email {...}:该指令用于应用一段邮件接收者的一个配置段,用大括号括起来,里面可以配置多个邮件接收者; notification_email_from:该指令用于指定邮件发出者的邮箱; smtp_server:该指令用于指定邮件服务器地址; smtp_connect_timeout:该指令用于指定连接邮件服务器的超时时长,默认30秒; notify_master:配置节点成为master角色的触发的动作;通常为执行一个脚本; notify_backup:配置节点角色转换为backup触发的动作; notify_fault:配置节点为失败状态触发的动作;
正常来讲主从节点机器都需要进行以上邮件报警设置操作,这里为了展示实验结果只在主节点进行了上述操作。自己操作时需要主从节点机器都进行操作。主从节点基本配置没有什么区别,注意一些组内主机机器名和主从设备的定义。
测试:
1 [root@test-1 keepalived]# systemctl start keepalived
1 [root@test-1 keepalived]# systemctl stop keepalived
keepalived的vip不漂移问题 详细看参考链接:https://blog.csdn.net/Laymany/article/details/122978075
LVS_Director + KeepAlived
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 实施步骤: 1. 主/备调度器安装软件 [root@lvs-keepalived-master ~]# yum -y install ipvsadm keepalived [root@lvs-keepalived-slave ~]# yum -y install ipvsadm keepalived 2. Keepalived lvs-master [root@lvs-keepalived-master ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id directory1 } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 80 priority 100 advert_int 1 #nopreempt authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.100.100/24 } } virtual_server 192.168.100.100 80 { delay_loop 3 lb_algo rr lb_kind DR nat_mask 255.255.255.0 protocol TCP real_server 192.168.100.30 80 { weight 1 inhibit_on_failure TCP_CHECK { connect_port 80 connect_timeout 3 } } real_server 192.168.100.40 80 { weight 1 inhibit_on_failure TCP_CHECK { connect_timeout 3 connect_port 80 } } } [root@lvs-keepalived-slave ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id lvs-keepalived-slave } vrrp_instance VI_1 { state BACKUP interface ens33 nopreempt #不抢占资源 virtual_router_id 80 priority 50 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.100.100/24 } } virtual_server 192.168.100.100 80 { delay_loop 3 lb_algo rr lb_kind DR nat_mask 255.255.255.0 protocol TCP real_server 192.168.100.30 80 { weight 1 inhibit_on_failure TCP_CHECK { connect_port 80 connect_timeout 3 } } real_server 192.168.100.40 80 { weight 1 inhibit_on_failure TCP_CHECK { connect_timeout 3 connect_port 80 } } } 3. 启动KeepAlived(主备均启动) [root@lvs-keepalived-master ~]# systemctl start keepalived [root@lvs-keepalived-master ~]# systemctl enable keepalived
1 2 3 4 5 6 7 8 9 10 11 12 13 14 所有RS配置(nginx1,nginx2) 配置好网站服务器,测试所有RS [root@test-nginx1 ~]# yum install -y nginx [root@test-nginx2 ~]# yum install -y nginx [root@test-nginx1 ~]# ip addr add dev lo 192.168.246.110/32 [root@test-nginx2 ~]# ip addr add dev lo 192.168.246.110/32 [root@test-nginx1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore #忽略arp广播 [root@test-nginx1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce #匹配精确ip地址回包 [root@test-nginx2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore #忽略arp广播 [root@test-nginx2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce #匹配精确ip地 [root@test-nginx1 ~]# systemctl restart nginx
测试 所有分发器和Real Server都正常。访问LVS的VIP可以访问到页面,关闭master节点的keepalived后,VIP漂移到slave节点。仍然可以访问到页面,master节点keepalived再次启动后,VIP飘回仍正常访问。
LVS_NAT + Keepalived 四台机器(网络模式都设置为NAT模式): 两台做lvs-nat模式的keepalived集群 两台做RS(Nginx提供静态页面即可)
两台lvs操作 都添加一块桥接的网卡
lvs的master节点配置文件
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 [root@lvs-master ~]# yum -y install ipvsadm keepalived [root@lvs-master ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id directory1 } vrrp_instance VI_1 { state MASTER interface ens37 #桥接网卡名称 virtual_router_id 80 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.8.153.200/24 #注意自己的网段 } } virtual_server 10.8.153.200 80 { delay_loop 3 lb_algo rr lb_kind NAT nat_mask 255.255.255.0 protocol TCP real_server 192.168.100.30 80 { weight 1 inhibit_on_failure TCP_CHECK { connect_port 80 connect_timeout 3 } } real_server 192.168.100.40 80 { weight 1 inhibit_on_failure TCP_CHECK { connect_timeout 3 connect_port 80 } } } vrrp_instance VI_2 { state MASTER interface ens33 #NAT模式网卡名称 virtual_router_id 100 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 2222 } virtual_ipaddress { 192.168.100.100/24 } }
lvs的slave节点配置文件
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 [root@lvs-slave ~]# yum -y install ipvsadm keepalived [root@lvs-slave ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id directory2 } vrrp_instance VI_1 { state BACKUP interface ens37 nopreempt virtual_router_id 80 priority 50 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.8.153.200/24 } } virtual_server 10.8.153.200 80 { delay_loop 3 lb_algo rr lb_kind NAT nat_mask 255.255.255.0 protocol TCP real_server 192.168.100.30 80 { weight 1 inhibit_on_failure TCP_CHECK { connect_port 80 connect_timeout 3 } } real_server 192.168.100.40 80 { weight 1 inhibit_on_failure TCP_CHECK { connect_timeout 3 connect_port 80 } } } vrrp_instance VI_2 { state BACKUP interface ens33 nopreempt virtual_router_id 100 priority 50 advert_int 1 authentication { auth_type PASS auth_pass 2222 } virtual_ipaddress { 192.168.100.100/24 } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 注意开启路由转发 [root@lvs-master ~]# vim /etc/sysctl.conf net.ipv4.ip_forward = 1 [root@lvs-master ~]# sysctl -p [root@lvs-slave ~]# vim /etc/sysctl.conf net.ipv4.ip_forward = 1 [root@lvs-slave ~]# sysctl -p 安装nginx服务器,配置不同的静态页面过程:略 [root@test-nginx1 ~]# route add default gw 192.168.100.100 dev ens33 [root@test-nginx2 ~]# route add default gw 192.168.100.100 dev ens33 提示:由于临时添加的方式,网关有可能会消失。也可以直接去网卡配置文件中修改网关,保存退出后记得重启网络。重启网络命令:systemctl restart network ==================================================================================== 启动Keepalived服务 [root@lvs-master ~]# systemctl start keepalived [root@lvs-slave ~]# systemctl start keepalived
访问测试 当两个vip在master节点上时,访问浏览器
把master节点的keepalived服务停止,两个vip会漂移到backup节点,再次用浏览器访问
总结:如果ip漂移之后,访问不到, 1.查看backup节点是否开启了路由转发 2.查看RS上面的网关有没有消失