keepalived 高可用软件
keepalived 介绍
keepalived 软件期初是专为LVS负载均衡软件而设计的、用来管理并监控LVS集群系统中各个服务器的节点状态、后来加入的VRRP功能。现在除了可以管理LVS之外也可以做成Nginx,Haproxy,mysql等
keepalived 软件主要通过VRRP协议来实现高可用(思科的虚拟路由冗余协议)
Keepalived 服务的三个重要功能
1、管理LVS负载均衡软件 早期的LVS软件、需要通过命令和脚本来实现管理,并没有针对的LVS节点的健康检查功能。为了解决这和问题keepalived诞生了
2、实现对LVS节点的健康检查
3、作为网络服务的高可用功能
Keepalived 高可用原理
Keepalived 高可用服务之所以能在服务器之间完成故障切换转移是通过VRRP协议来实现的。
VRRP协议(虚拟路由冗余协议),是生成一个虚拟的可以随意切换的虚拟ip,正常请求访问这个虚拟IP,这个虚拟IP附着的服务器则提供服务,其他服务器作为备份。当服务器出现故障的时候,虚拟IP自动切换到另外一台服务器上继续提供服务。主服务器一直发送ip多播的广播包来宣告自己的“主权”,备份服务器接收这写广播包。当不在收到广播包的、更换“角色”1秒内完成。
原理图:
当主服务器出现问题的时候:
Keepalived 高可用搭建
安装Keepalived 环境说明
部署基本环境
web节点服务器已经搭建好
LB01--负载均衡已经搭建完毕
上述搭建过程参考《NGINX反向代理与负载均衡应用实战》
搭建LB02的负载均衡
第一步:搭建nginx环境
过程略[root@LB02 tools]# /application/nginx/sbin/nginx -Vnginx version: nginx/1.10.3 built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC) built with OpenSSL 1.0.1e-fips 11 Feb 2013 TLS SNI support enabled configure arguments: --user=nginx --group=nginx --prefix=/application/nginx-1.10.3 --with-http_stub_status_module --with-http_ssl_module[root@LB02 tools]#
第二步:配置nginx 负载均衡
拷贝LB01的配置文件到LB02上在做微调、就可以使用[root@LB02 tools]# cat /application/nginx/conf/nginx.confworker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream static_pools { server 10.0.0.8:80 weight=1; server 10.0.0.9:80 weight=1; #check interval=3000 rise=2 fall=5 timeout=1000 type=http; } upstream default_pools { server 10.0.0.9:80 weight=1; } server { listen 80; server_name www.peng.com; location / { proxy_pass http://default_pools; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; } location ~ .*.(gif|jpg|jpeg|png|swf|css|js|html|htm)$ { proxy_pass http://static_pools; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; } #location /status { # check_status; # access_log off; #} } } [root@LB02 tools]# [root@LB02 tools]# nginx -t nginx: the configuration file /application/nginx-1.10.3/conf/nginx.conf syntax is ok nginx: configuration file /application/nginx-1.10.3/conf/nginx.conf test is successful [root@LB02 tools]# nginx -s reload
第三部:测试访问
[root@LB02 tools]# curl www.peng.com/web.htmlthe is web_nginx02 IE,www.peng.com /application/nginx/html/www/default/default.html [root@LB02 tools]# curl www.peng.com/web.htmlthe is web_nginx01 chrome,www.peng.com#the fine is [root@LB02 tools]#
搭建Keepalived高可用环境
安装Keepalived软件--使用yum安装
LB01 TO LB02
[root@LB01 conf]# yum -y install keepalived...Installed: keepalived.x86_64 0:1.2.13-5.el6_6 Dependency Installed: lm_sensors-libs.x86_64 0:3.1.1-17.el6 net-snmp-libs.x86_64 1:5.5-60.el6 Complete!
启动Keepalived服务
[root@LB01 /]# /etc/init.d/keepalived startStarting keepalived: [ OK ] [root@LB01 /]# ------------------------------------------------------------------------------ [root@LB02 /]# /etc/init.d/keepalived startStarting keepalived: [ OK ] [root@LB02 /]#
查看网卡是否都多出一个虚拟网卡
[root@LB02 /]# ip add1: lo:mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:b2:3a:f4 brd ff:ff:ff:ff:ff:ff inet 10.0.0.101/24 brd 10.0.0.255 scope global eth0 inet 192.168.200.16/32 scope global eth0 inet 192.168.200.17/32 scope global eth0 inet 192.168.200.18/32 scope global eth0 inet6 fe80::20c:29ff:feb2:3af4/64 scope link valid_lft forever preferred_lft forever
配置文件说明
路径:/etc/keepalived/keepalived.conf
配置文件分为三个区块
行号 | 介绍 |
---|---|
Global Definitions | 全局定义部分 |
VRRP instance | VRRP实例区块 |
默认配置文档:
[root@LB01 etc]# cat -n /etc/keepalived/keepalived.conf 1 ! Configuration File for keepalived #注释 2 3 global_defs { #定义报警Email地址信息,在服务器发生切换的时候发送报警邮件。该模块可以有多个 4 notification_email { 5 [email protected] 6 [email protected] 7 [email protected] 8 } 9 notification_email_from [email protected] #指定发件人,明确使用哪个模块 10 smtp_server 192.168.200.1 #指定smtp地址 11 smtp_connect_timeout 30 #smtp超时时间 12 router_id LVS_DEVEL #唯一路由标识 13 } 14 15 vrrp_instance VI_1 { #VRRP实例定义区块,表示定义一个vrrp实例名称为V1_1 16 state MASTER #定义实例的状态,MASTER(工作状态)、BACKUP(备用状态) 17 interface eth0 #定义通讯接口(网卡名称) 18 virtual_router_id 51 #定义虚拟路由ID标识、最好为数字且全网唯一(与备份的vrrp实例的ID一样) 19 priority 100 #优先级、数值越大优先级越高 20 advert_int 1 #MASTER 与 BACKUP之间通讯检查时间间隔、单位秒 21 authentication { #权限认证模块、包含认证类型和认证口令(官网建议使用类型PASS、口令为明文,建议使用4位)主备实例中通过口令来验证,才能互相通讯 22 auth_type PASS 23 auth_pass 1111 24 } 25 virtual_ipaddress { #定义虚拟IP地址,可以配置多个IP。每个ip占一行。 26 192.168.200.16 27 192.168.200.17 28 192.168.200.18 29 } 30 } 31 32 virtual_server 192.168.200.100 443 { #以下的内容均为、实例模板了,可供参考。 33 delay_loop 6 34 lb_algo rr 35 lb_kind NAT 36 nat_mask 255.255.255.0 37 persistence_timeout 50 38 protocol TCP 39 40 real_server 192.168.201.100 443 { 41 weight 1 42 SSL_GET { 43 url { 44 path / 45 digest ff20ad2481f97b1754ef3e12ecd3a9cc 46 } 47 url { 48 path /mrtg/ 49 digest 9b3a0c85a887a256d6939da88aabd8cd 50 } 51 connect_timeout 3 52 nb_get_retry 3 53 delay_before_retry 3 54 } 55 } 56 } 57 58 virtual_server 10.10.10.2 1358 { 59 delay_loop 6 60 lb_algo rr 61 lb_kind NAT 62 persistence_timeout 50 63 protocol TCP 64 65 sorry_server 192.168.200.200 1358 66 67 real_server 192.168.200.2 1358 { 68 weight 1 69 HTTP_GET { 70 url { 71 path /testurl/test.jsp 72 digest 640205b7b0fc66c1ea91c463fac6334d 73 } 74 url { 75 path /testurl2/test.jsp 76 digest 640205b7b0fc66c1ea91c463fac6334d 77 } 78 url { 79 path /testurl3/test.jsp 80 digest 640205b7b0fc66c1ea91c463fac6334d 81 } 82 connect_timeout 3 83 nb_get_retry 3 84 delay_before_retry 3 85 } 86 } 87 88 real_server 192.168.200.3 1358 { 89 weight 1 90 HTTP_GET { 91 url { 92 path /testurl/test.jsp 93 digest 640205b7b0fc66c1ea91c463fac6334c 94 } 95 url { 96 path /testurl2/test.jsp 97 digest 640205b7b0fc66c1ea91c463fac6334c 98 } 99 connect_timeout 3 100 nb_get_retry 3 101 delay_before_retry 3 102 } 103 } 104 } 105 106 virtual_server 10.10.10.3 1358 { 107 delay_loop 3 108 lb_algo rr 109 lb_kind NAT 110 nat_mask 255.255.255.0 111 persistence_timeout 50 112 protocol TCP 113 114 real_server 192.168.200.4 1358 { 115 weight 1 116 HTTP_GET { 117 url { 118 path /testurl/test.jsp 119 digest 640205b7b0fc66c1ea91c463fac6334d 120 } 121 url { 122 path /testurl2/test.jsp 123 digest 640205b7b0fc66c1ea91c463fac6334d 124 } 125 url { 126 path /testurl3/test.jsp 127 digest 640205b7b0fc66c1ea91c463fac6334d 128 } 129 connect_timeout 3 130 nb_get_retry 3 131 delay_before_retry 3 132 } 133 } 134 135 real_server 192.168.200.5 1358 { 136 weight 1 137 HTTP_GET { 138 url { 139 path /testurl/test.jsp 140 digest 640205b7b0fc66c1ea91c463fac6334d 141 } 142 url { 143 path /testurl2/test.jsp 144 digest 640205b7b0fc66c1ea91c463fac6334d 145 } 146 url { 147 path /testurl3/test.jsp 148 digest 640205b7b0fc66c1ea91c463fac6334d 149 } 150 connect_timeout 3 151 nb_get_retry 3 152 delay_before_retry 3 153 } 154 } 155 }
Keepalived单实例服务高可用实战
第一步 配置keeplived实现主服务器LB01 MASTER
第一步:修改Keepalived的配置文件 使用简易版的Keepalived配置文件
[root@LB01 keepalived]# cat keepalived.conf! keepalived 2018.09.12global_defs { router_id LVS_01 #ID为LVS_01 } vrrp_instance VI_1 { state MASTER #设定为主服务器 interface eth0 #通讯接口为eth0 virtual_router_id 50 #实例ID为50 priority 150 #优先级为150 advert_int 1 #检查时间为1秒 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3/24 broadcast 10.0.0.255 dev eth0 label eth0:1 } } [root@LB01 keepalived]#
第二步配置LB02的配置文件 backup
使用简易版模板
[root@LB02 keepalived]# cat keepalived.conf ! keepalived 2018.09.12 global_defs { router_id LVS_02 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 50 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3/24 broadcast 10.0.0.255 dev eth0 label eth0:1 } }
第三步检查IP
模拟测试、当MASTER出现故障的时候、是否会自动切换
当停掉MASTER服务的时候、查看ip变化
当主服务器恢复后、会再次接管IP、提供服务
小结
主备之间的配置文件的差异
配置参数 | 主服务器 | 备份服务器 |
---|---|---|
router_id(唯一标识) | router_id LV01 | router_id LV02 |
state(角色) | state MASTER | state BACKUP |
priority(竞选优先级) | priority 150 | priority 100 |
至此Keepalived高可用搭建完成
keepaliced 高可用服务器的的“脑裂”问题
什么是“脑裂”
由于突发原因、导致两台高可用服务器的指定时间内、无法检测到对方状态。然后各自取得资源及服务器的所有权,而此时两台高可用服务器都存活并运行,这样就导致一个IP在两端同时存在,而发生冲突。最严重两台服务器占用一个VIP,当用户写入数据的时候可能会分别写入两端,导致服务器数据不一致。
“脑裂”发生的原因
一般有以下几种情况:
1、线路故障
心跳线故障
网卡故障
网络传输设备故障
防火墙拦截(开启防火墙后、不配置放行规则会自动拦截心跳检测广播包) 配置文件错误 广播冲突、软件bug
解决“脑裂”的常见方案
采用双线检测方式、避免单线故障
做好监控、报警
测试环境测试好了在上线上环境、不要轻易修改线上环境配置
Keepalived双实例双主模式配置
keepalived 多实例双主模式是指:A业务是LB01上的主模式、在LB02上面是备模式。B业务在LB01上面是备模式、在LB02上面是主模式。
将LB01上增加一个 bbs.peng.com 的备模式、在LB02上增加一个bbs.peng.com的主模式
LB01的配置
[root@LB01 keepalived]# cat keepalived.conf ! keepalived 2018.09.12 global_defs { router_id LVS_01 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 50 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3/24 broadcast 10.0.0.255 dev eth0 label eth0:1 } } vrrp_instance VI_2 { state BACKUP interface eth0 virtual_router_id 100 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.5/24 broadcast 10.0.0.255 dev eth0 label eth0:2 } [root@LB01 keepalived]#
LB02上配置
[root@LB02 keepalived]# cat keepalived.conf ! keepalived 2018.09.12 global_defs { router_id LVS_02 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 50 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3/24 broadcast 10.0.0.255 dev eth0 label eth0:1 } } vrrp_instance VI_2 { state MASTER interface eth0 virtual_router_id 100 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.5/24 broadcast 10.0.0.255 dev eth0 label eth0:2 } [root@LB02 keepalived]#
测试过程、停掉任意一端的Keepalived服务、VIP地址会自动漂移到另外一端,不会影响访问。
配置指定文件接受 keepalived 服务日志
默认Keepalived 的服务日志会输出/var/log/messages,和其他信息混合在一起。将其调整成独立的文件记录Keepalived服务日志。
第一步:编辑配置文件/etc/sysconfig/keepalived,将第14行的“KEEPALIVED_OPTIONS="-D"”修改为 KEEPALIVED_OPTIONS="-D -d -S 0"
相关参数说明:
-d --dump-conf 导出备份配置数据
-D --log-detail 详细日志
-S --log-facility 设置本地的syslog设备,编号0-7
-S 0 表示指定为local0设备
第二步:修改rsyslog的配置文件/etc/rsyslog.conf,追加以下内容:
在文件行尾追加
local0.* /var/log/keepalived.log
在文件第42行、末尾加入“;local0.none”
42 *.info;mail.none;authpriv.none;cron.none;local0.none /var/log/messages
第三步:重启Keepalived服务、检查日志输出
[root@LB01 log]# /etc/init.d/keepalived restart Stopping keepalived: [ OK ] Starting keepalived: [ OK ] [root@LB01 log]# tail -f keepalived.log Sep 12 02:50:22 LB01 Keepalived_healthcheckers[33491]: SNMP Trap disabled Sep 12 02:50:22 LB01 Keepalived_healthcheckers[33491]: ------< SSL definitions >------ Sep 12 02:50:22 LB01 Keepalived_healthcheckers[33491]: Using autogen SSL context Sep 12 02:50:22 LB01 Keepalived_healthcheckers[33491]: Using LinkWatch kernel netlink reflector... Sep 12 02:50:23 LB01 Keepalived_vrrp[33492]: VRRP_Instance(VI_1) Transition to MASTER STATE
解决多组Keepalived服务器在一个局域网的广播冲突问题
当一个局域网中部署多组Keepalived服务器的时候,各自在发送付广播包的时候会造成IP广播地址冲突,造成接管错乱。Keepalived默认使用的广播地址就是224.0.0.18作为多播地址。
解决方案: 不同的Keepalived组之间使用不用的多播地址、同组之间使用相同的多播地址
配置如下:
global_defs { router_id LVS_01 vrrp_mcast_group4 224.0.0.19}