@yanglt7
2018-10-21T15:58:02.000000Z
字数 11305
阅读 891
Web集群实战
Keepalived 高可用服务队之间的故障切换转移,是通过 VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议)来实现的。
VRRP 通过竞选机制来实现虚拟路由器的功能,所有的协议报文都是通过 IP 多播(Muiticast)包(默认的多播地址 224.0.0.18)形式发送的。虚拟路由器由 VRID(范围 0-255)和一组 IP 地址组成,对外表现为一个周知的 MAC 地址:00-00-5E-00-01-{VRID}。所以,在一个虚拟路由器中,不管谁是 Master,对外都是相同的 MAC 和 IP(称之为 VIP)。客户端主机并不需要因 Master 的改变而修改自己的路由配置。对它们来说,这种切换是透明的。
| HOSTNAME | IP | 说明 |
|---|---|---|
| lb001 | 192.168.2.129 | Keepalived 主服务器(Nginx 主负载均衡器) |
| lb002 | 192.168.2.130 | Keepalived 辅服务器(Nginx 辅负载均衡器) |
| web001 | 192.168.2.146 | web001 服务器 |
| web002 | 192.168.2.131 | web002 服务器 |
- 开始安装 keepalived 软件
[root@lb001 ~]# yum install keepalived -y[root@lb002 ~]# yum install keepalived -y
[root@lb001 ~]# systemctl stop firewalld
[root@lb001 ~]# cd /etc/keepalived/[root@lb001 keepalived]# vim keepalived.conf[root@lb001 keepalived]# cat keepalived.conf! Configuration File for keepalivedglobal_defs {notification_email {1622320046@qq.com}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 127.0.0.1smtp_connect_timeout 30router_id lb001 # <-- 局域网内应唯一}vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 55 # <-- 虚拟路由 ID 标识,在一个 keepalived.conf 中是唯一的。MASTER 和 BACKUP 配置中相同实例又必须是一致的。priority 150advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.2.188/24 dev ens33 label ens33:1}}
[root@lb001 keepalived]# systemctl start keepalived.service[root@lb001 keepalived]# ps -ef|grep keepalivedroot 1258 1 0 16:30 ? 00:00:00 /usr/sbin/keepalived -Droot 1259 1258 0 16:30 ? 00:00:00 /usr/sbin/keepalived -Droot 1260 1258 0 16:30 ? 00:00:00 /usr/sbin/keepalived -Droot 1298 1165 0 16:33 pts/0 00:00:00 grep --color=auto keepalived[root@lb001 keepalived]# ip addr|grep 192.168.2.188inet 192.168.2.188/24 scope global secondary ens33:1
[root@lb002 ~]# systemctl stop firewalld
[root@lb002 ~]# cd /etc/keepalived/[root@lb002 keepalived]# vim keepalived.conf[root@lb002 keepalived]# cat keepalived.conf! Configuration File for keepalivedglobal_defs {notification_email {1622320046@qq.com}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 127.0.0.1smtp_connect_timeout 30router_id lb002 # <-- 局域网内应唯一}vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 55 # <-- 虚拟路由 ID 标识,在一个 keepalived.conf 中是唯一的。MASTER 和 BACKUP 配置中相同实例又必须是一致的。priority 100 # <-- 优先级需低于主节点至少50advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.2.188/24 dev ens33 label ens33:1}}
[root@lb002 keepalived]# systemctl start keepalived.service[root@lb002 keepalived]# ps -ef|grep keepalivedroot 1298 1 0 16:43 ? 00:00:00 /usr/sbin/keepalived -Droot 1299 1298 0 16:43 ? 00:00:00 /usr/sbin/keepalived -Droot 1300 1298 0 16:43 ? 00:00:00 /usr/sbin/keepalived -Droot 1306 1192 0 16:43 pts/0 00:00:00 grep --color=auto keepalived[root@lb002 keepalived]# ip addr|grep 192.168.2.188[root@lb002 keepalived]## 此时应无返回
[root@lb001 ~]# systemctl stop keepalived.service[root@lb002 keepalived]# ip addr|grep 192.168.2.188inet 192.168.2.188/24 scope global ens33:1[root@lb001 ~]# systemctl start keepalived.service[root@lb001 ~]# ip addr|grep 192.168.2.188inet 192.168.2.188/24 scope global eth33:1[root@lb002 keepalived]# ip addr|grep 192.168.2.188[root@lb002 keepalived]#
Keepalived 双实例双主模式的 IP 及 VIP 规划表
| HOSTNAME | IP | 说明 |
|---|---|---|
| lb001 | 192.168.2.129 | VIP:192.168.2.188(用于绑定 A 服务 www.yangyangyang.org 域名) |
| lb002 | 192.168.2.130 | VIP:192.168.2.189(用于绑定 B 服务 bbs.yangyangyang.org 域名) |
[root@lb001 keepalived]# cat keepalived.conf! Configuration File for keepalivedglobal_defs {notification_email {1622320046@qq.com}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 127.0.0.1smtp_connect_timeout 30router_id lb001}vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 55priority 150advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.2.188/24 dev ens33 label ens33:1}}vrrp_instance VI_2 {state BACKUPinterface ens33virtual_router_id 56priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.2.189/24 dev ens33 label ens33:2}}
[root@lb002 keepalived]# cat keepalived.conf! Configuration File for keepalivedglobal_defs {notification_email {1622320046@qq.com}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 127.0.0.1smtp_connect_timeout 30router_id lb002}vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 55priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.2.188/24 dev ens33 label ens33:1}}vrrp_instance VI_2 {state MASTERinterface ens33virtual_router_id 56priority 150advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.2.189/24 dev ens33 label ens33:2}}
[root@lb001 keepalived]# systemctl restart keepalived.service[root@lb001 keepalived]# ip addr|egrep "192.168.2.188|192.168.2.189"inet 192.168.2.188/24 scope global ens33:1[root@lb002 keepalived]# systemctl restart keepalived.service[root@lb002 keepalived]# ip addr|egrep "192.168.2.188|192.168.2.189"inet 192.168.2.189/24 scope global ens33:2
[root@lb002 keepalived]# systemctl stop keepalived.service[root@lb001 keepalived]# ip addr|egrep "192.168.2.188|192.168.2.189"inet 192.168.2.188/24 scope global ens33:1inet 192.168.2.189/24 scope global secondary ens33:2[root@lb002 keepalived]# systemctl start keepalived.service[root@lb002 keepalived]# ip addr|egrep "192.168.2.188|192.168.2.189"inet 192.168.2.189/24 scope global ens33:2[root@lb001 keepalived]# ip addr|egrep "192.168.2.188|192.168.2.189"inet 192.168.2.188/24 scope global ens33:1
[root@lb001 keepalived]# systemctl stop keepalived.service[root@lb002 keepalived]# ip addr|egrep "192.168.2.188|192.168.2.189"inet 192.168.2.189/24 scope global ens33:2inet 192.168.2.188/24 scope global secondary ens33:1[root@lb001 keepalived]# systemctl start keepalived.service[root@lb001 keepalived]# ip addr|egrep "192.168.2.188|192.168.2.189"inet 192.168.2.188/24 scope global ens33:1[root@lb002 keepalived]# ip addr|egrep "192.168.2.188|192.168.2.189"inet 192.168.2.189/24 scope global ens33:2
[root@lb001 keepalived]# cat /application/nginx/conf/nginx.confworker_processes 1;error_log logs/error.log;events {worker_connections 1024;}http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;upstream www_server_pools {server 192.168.2.131:80 weight=1;server 192.168.2.146:80 weight=1;}server {listen 192.168.2.188:80;server_name www.yangyangyang.org;location / {proxy_pass http://www_server_pools;include proxy.conf;}}}
[root@lb002 keepalived]# cat /application/nginx/conf/nginx.confworker_processes 1;error_log logs/error.log;events {worker_connections 1024;}http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;upstream www_server_pools {server 192.168.2.131:80 weight=1;server 192.168.2.146:80 weight=1;}server {listen 192.168.2.188:80;server_name www.yangyangyang.org;location / {proxy_pass http://www_server_pools;include proxy.conf;}}}
[root@lb001 keepalived]# cat keepalived.conf! Configuration File for keepalivedglobal_defs {notification_email {1622320046@qq.com}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 127.0.0.1smtp_connect_timeout 30router_id lb001}vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 55priority 150advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.2.188/24 dev ens33 label ens33:1}}
[root@lb002 keepalived]# cat keepalived.conf! Configuration File for keepalivedglobal_defs {notification_email {1622320046@qq.com}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 127.0.0.1smtp_connect_timeout 30router_id lb002}vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 55priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.2.188/24 dev ens33 label ens33:1}}
[root@lb001 keepalived]# echo 'net.ipv4.ip_nonlocal_bind = 1' >> /etc/sysctl.conf[root@lb001 keepalived]# tail -1 /etc/sysctl.confnet.ipv4.ip_nonlocal_bind = 1[root@lb001 keepalived]# sysctl -pnet.ipv4.ip_nonlocal_bind = 1
[root@lb002 keepalived]# echo 'net.ipv4.ip_nonlocal_bind = 1' >> /etc/sysctl.conf[root@lb002 keepalived]# tail -1 /etc/sysctl.confnet.ipv4.ip_nonlocal_bind = 1[root@lb002 keepalived]# sysctl -pnet.ipv4.ip_nonlocal_bind = 1
p.s. 上述部分均由桥接模式完成,由于用户模拟访问时桥接模式无法访问外网,于是改成NAT模式的DHCP方式上网,以下测试均为NAT模式。篇首的IP地址为NAT模式的地址。
(1)在客户端 hosts 文件里把 www.yangyangyang.org 域名解析到 VIP 192.168.2.188 上,正式场景需要通过 DNS 解析。
192.168.2.188 www.yangyangyang.org
(2)两台 web 服务器开启 Nginx 服务,并配置首页文件
[root@web001 ~]# /application/nginx/sbin/nginx[root@web001 ~]# cat /application/nginx/html/www/index.html192.168.2.146 www.yangyangyang.org[root@web002 ~]# /application/nginx/sbin/nginx[root@web002 ~]# cat /application/nginx/html/www/index.html192.168.2.131 www.yangyangyang.org
(3)两台负载均衡服务器配好 Nginx 服务,并确保后面代理的 Web 节点可以测试访问
[root@lb001 keepalived]# /application/nginx/sbin/nginx[root@lb001 keepalived]# lsof -i:80COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEnginx 1151 root 6u IPv4 20341 0t0 TCP www.yangyangyang.org:http (LISTEN)nginx 1215 nginx 6u IPv4 20341 0t0 TCP www.yangyangyang.org:http (LISTEN)[root@lb001 keepalived]# ip addr|grep 192.168.2.188inet 192.168.2.188/24 scope global secondary ens33:1
(4)模拟访问

[root@lb001 keepalived]# systemctl stop keepalived.service
[root@lb002 keepalived]# ip addr|grep 192.168.2.188inet 192.168.2.188/24 scope global secondary ens33:1
再次在客户端浏览器输入 www.yangyangyang.org 测试访问,刷新几次,出现和切换 lb002 前相同的访问结果
开启 lb001 的 Keepalived 服务,VIP 又接管回来了。
(1)编辑配置文件 /etc/sysconfig/keepalived ,将 14 行的 KEEPALIVED_OPTIONS="-D" 修改为 KEEPALIVED_OPTIONS="-D -d -S 0"
[root@lb001 ~]# sed -i '14 s#KEEPALIVED_OPTIONS="-D"#KEEPALIVED_OPTIONS="-D -d -S 0"#g' /etc/sysconfig/keepalived[root@lb001 ~]# sed -n '14p' /etc/sysconfig/keepalivedKEEPALIVED_OPTIONS="-D -d -S 0"
(2)修改 rsyslog 的配置文件 vim /etc/rsyslog.conf ,在结尾处加上如下两行内容
[root@lb001 ~]# tail -2 /etc/rsyslog.conf#keepalivedlocal0.* /var/log/keepalived.log
上述配置表示来自 local0 设备的所有日志信息都记录到 /var/log/keepalived.log 文件。
(3)修改 rsyslog 的配置文件 vim /etc/rsyslog.conf,将 54 行改成
*.info;mail.none;authpriv.none;cron.none;local0.none /var/log/messages
(4)配置完成后,重启 rsyslog 服务
[root@lb001 ~]# systemctl restart rsyslog.service
(5)关闭 keepalived 服务,测试 Keepalived 日志记录结果。
[root@lb001 ~]# tail /var/log/keepalived.logOct 10 20:07:15 localhost Keepalived_vrrp[1252]: Sending gratuitous ARP on ens33 for 192.168.2.188Oct 10 20:07:15 localhost Keepalived_vrrp[1252]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.2.188Oct 10 20:07:15 localhost Keepalived_vrrp[1252]: Sending gratuitous ARP on ens33 for 192.168.2.188Oct 10 20:07:15 localhost Keepalived_vrrp[1252]: Sending gratuitous ARP on ens33 for 192.168.2.188Oct 10 20:07:15 localhost Keepalived_vrrp[1252]: Sending gratuitous ARP on ens33 for 192.168.2.188Oct 10 20:07:15 localhost Keepalived_vrrp[1252]: Sending gratuitous ARP on ens33 for 192.168.2.188Oct 10 20:07:33 localhost Keepalived[1250]: StoppingOct 10 20:07:33 localhost Keepalived_vrrp[1252]: VRRP_Instance(VI_1) sent 0 priorityOct 10 20:07:33 localhost Keepalived_vrrp[1252]: VRRP_Instance(VI_1) removing protocol VIPs.Oct 10 20:07:33 localhost Keepalived_healthcheckers[1251]: Stopped