[关闭]
@yanglt7 2018-10-21T15:58:02.000000Z 字数 11305 阅读 810

【Web 集群实战】20_Keepalived 高可用集群

Web集群实战


1. Keepalived 高可用故障切换原理

2. Keepalived 高可用服务搭建准备

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 软件

  1. [root@lb001 ~]# yum install keepalived -y
  2. [root@lb002 ~]# yum install keepalived -y

3. 配置 Keepalived 实现单实例单 IP 自动漂移接管

3.1 配置 Keepalived 主服务器 lb001 MASTER

  1. [root@lb001 ~]# systemctl stop firewalld
  1. [root@lb001 ~]# cd /etc/keepalived/
  2. [root@lb001 keepalived]# vim keepalived.conf
  3. [root@lb001 keepalived]# cat keepalived.conf
  4. ! Configuration File for keepalived
  5. global_defs {
  6. notification_email {
  7. 1622320046@qq.com
  8. }
  9. notification_email_from Alexandre.Cassen@firewall.loc
  10. smtp_server 127.0.0.1
  11. smtp_connect_timeout 30
  12. router_id lb001 # <-- 局域网内应唯一
  13. }
  14. vrrp_instance VI_1 {
  15. state MASTER
  16. interface ens33
  17. virtual_router_id 55 # <-- 虚拟路由 ID 标识,在一个 keepalived.conf 中是唯一的。MASTER 和 BACKUP 配置中相同实例又必须是一致的。
  18. priority 150
  19. advert_int 1
  20. authentication {
  21. auth_type PASS
  22. auth_pass 1111
  23. }
  24. virtual_ipaddress {
  25. 192.168.2.188/24 dev ens33 label ens33:1
  26. }
  27. }
  1. [root@lb001 keepalived]# systemctl start keepalived.service
  2. [root@lb001 keepalived]# ps -ef|grep keepalived
  3. root 1258 1 0 16:30 ? 00:00:00 /usr/sbin/keepalived -D
  4. root 1259 1258 0 16:30 ? 00:00:00 /usr/sbin/keepalived -D
  5. root 1260 1258 0 16:30 ? 00:00:00 /usr/sbin/keepalived -D
  6. root 1298 1165 0 16:33 pts/0 00:00:00 grep --color=auto keepalived
  7. [root@lb001 keepalived]# ip addr|grep 192.168.2.188
  8. inet 192.168.2.188/24 scope global secondary ens33:1

3.1 配置 Keepalived 主服务器 lb0012 BACKUP

  1. [root@lb002 ~]# systemctl stop firewalld
  1. [root@lb002 ~]# cd /etc/keepalived/
  2. [root@lb002 keepalived]# vim keepalived.conf
  3. [root@lb002 keepalived]# cat keepalived.conf
  4. ! Configuration File for keepalived
  5. global_defs {
  6. notification_email {
  7. 1622320046@qq.com
  8. }
  9. notification_email_from Alexandre.Cassen@firewall.loc
  10. smtp_server 127.0.0.1
  11. smtp_connect_timeout 30
  12. router_id lb002 # <-- 局域网内应唯一
  13. }
  14. vrrp_instance VI_1 {
  15. state BACKUP
  16. interface ens33
  17. virtual_router_id 55 # <-- 虚拟路由 ID 标识,在一个 keepalived.conf 中是唯一的。MASTER 和 BACKUP 配置中相同实例又必须是一致的。
  18. priority 100 # <-- 优先级需低于主节点至少50
  19. advert_int 1
  20. authentication {
  21. auth_type PASS
  22. auth_pass 1111
  23. }
  24. virtual_ipaddress {
  25. 192.168.2.188/24 dev ens33 label ens33:1
  26. }
  27. }
  1. [root@lb002 keepalived]# systemctl start keepalived.service
  2. [root@lb002 keepalived]# ps -ef|grep keepalived
  3. root 1298 1 0 16:43 ? 00:00:00 /usr/sbin/keepalived -D
  4. root 1299 1298 0 16:43 ? 00:00:00 /usr/sbin/keepalived -D
  5. root 1300 1298 0 16:43 ? 00:00:00 /usr/sbin/keepalived -D
  6. root 1306 1192 0 16:43 pts/0 00:00:00 grep --color=auto keepalived
  7. [root@lb002 keepalived]# ip addr|grep 192.168.2.188
  8. [root@lb002 keepalived]#
  9. # 此时应无返回

3.3 高可用主备服务器切换实验

  1. [root@lb001 ~]# systemctl stop keepalived.service
  2. [root@lb002 keepalived]# ip addr|grep 192.168.2.188
  3. inet 192.168.2.188/24 scope global ens33:1
  4. [root@lb001 ~]# systemctl start keepalived.service
  5. [root@lb001 ~]# ip addr|grep 192.168.2.188
  6. inet 192.168.2.188/24 scope global eth33:1
  7. [root@lb002 keepalived]# ip addr|grep 192.168.2.188
  8. [root@lb002 keepalived]#

4. 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 域名)

4.1 配置服务器 lb001

  1. [root@lb001 keepalived]# cat keepalived.conf
  2. ! Configuration File for keepalived
  3. global_defs {
  4. notification_email {
  5. 1622320046@qq.com
  6. }
  7. notification_email_from Alexandre.Cassen@firewall.loc
  8. smtp_server 127.0.0.1
  9. smtp_connect_timeout 30
  10. router_id lb001
  11. }
  12. vrrp_instance VI_1 {
  13. state MASTER
  14. interface ens33
  15. virtual_router_id 55
  16. priority 150
  17. advert_int 1
  18. authentication {
  19. auth_type PASS
  20. auth_pass 1111
  21. }
  22. virtual_ipaddress {
  23. 192.168.2.188/24 dev ens33 label ens33:1
  24. }
  25. }
  26. vrrp_instance VI_2 {
  27. state BACKUP
  28. interface ens33
  29. virtual_router_id 56
  30. priority 100
  31. advert_int 1
  32. authentication {
  33. auth_type PASS
  34. auth_pass 1111
  35. }
  36. virtual_ipaddress {
  37. 192.168.2.189/24 dev ens33 label ens33:2
  38. }
  39. }

4.2 配置服务器 lb002

  1. [root@lb002 keepalived]# cat keepalived.conf
  2. ! Configuration File for keepalived
  3. global_defs {
  4. notification_email {
  5. 1622320046@qq.com
  6. }
  7. notification_email_from Alexandre.Cassen@firewall.loc
  8. smtp_server 127.0.0.1
  9. smtp_connect_timeout 30
  10. router_id lb002
  11. }
  12. vrrp_instance VI_1 {
  13. state BACKUP
  14. interface ens33
  15. virtual_router_id 55
  16. priority 100
  17. advert_int 1
  18. authentication {
  19. auth_type PASS
  20. auth_pass 1111
  21. }
  22. virtual_ipaddress {
  23. 192.168.2.188/24 dev ens33 label ens33:1
  24. }
  25. }
  26. vrrp_instance VI_2 {
  27. state MASTER
  28. interface ens33
  29. virtual_router_id 56
  30. priority 150
  31. advert_int 1
  32. authentication {
  33. auth_type PASS
  34. auth_pass 1111
  35. }
  36. virtual_ipaddress {
  37. 192.168.2.189/24 dev ens33 label ens33:2
  38. }
  39. }

4.3 高可用切换测试

  1. [root@lb001 keepalived]# systemctl restart keepalived.service
  2. [root@lb001 keepalived]# ip addr|egrep "192.168.2.188|192.168.2.189"
  3. inet 192.168.2.188/24 scope global ens33:1
  4. [root@lb002 keepalived]# systemctl restart keepalived.service
  5. [root@lb002 keepalived]# ip addr|egrep "192.168.2.188|192.168.2.189"
  6. inet 192.168.2.189/24 scope global ens33:2
  1. [root@lb002 keepalived]# systemctl stop keepalived.service
  2. [root@lb001 keepalived]# ip addr|egrep "192.168.2.188|192.168.2.189"
  3. inet 192.168.2.188/24 scope global ens33:1
  4. inet 192.168.2.189/24 scope global secondary ens33:2
  5. [root@lb002 keepalived]# systemctl start keepalived.service
  6. [root@lb002 keepalived]# ip addr|egrep "192.168.2.188|192.168.2.189"
  7. inet 192.168.2.189/24 scope global ens33:2
  8. [root@lb001 keepalived]# ip addr|egrep "192.168.2.188|192.168.2.189"
  9. inet 192.168.2.188/24 scope global ens33:1
  1. [root@lb001 keepalived]# systemctl stop keepalived.service
  2. [root@lb002 keepalived]# ip addr|egrep "192.168.2.188|192.168.2.189"
  3. inet 192.168.2.189/24 scope global ens33:2
  4. inet 192.168.2.188/24 scope global secondary ens33:1
  5. [root@lb001 keepalived]# systemctl start keepalived.service
  6. [root@lb001 keepalived]# ip addr|egrep "192.168.2.188|192.168.2.189"
  7. inet 192.168.2.188/24 scope global ens33:1
  8. [root@lb002 keepalived]# ip addr|egrep "192.168.2.188|192.168.2.189"
  9. inet 192.168.2.189/24 scope global ens33:2

5. Nginx 负载均衡配合 Keepalived 服务

5.1 在 lb001 和 lb002 上配置 Nginx 负载均衡

  1. [root@lb001 keepalived]# cat /application/nginx/conf/nginx.conf
  2. worker_processes 1;
  3. error_log logs/error.log;
  4. events {
  5. worker_connections 1024;
  6. }
  7. http {
  8. include mime.types;
  9. default_type application/octet-stream;
  10. sendfile on;
  11. keepalive_timeout 65;
  12. upstream www_server_pools {
  13. server 192.168.2.131:80 weight=1;
  14. server 192.168.2.146:80 weight=1;
  15. }
  16. server {
  17. listen 192.168.2.188:80;
  18. server_name www.yangyangyang.org;
  19. location / {
  20. proxy_pass http://www_server_pools;
  21. include proxy.conf;
  22. }
  23. }
  24. }
  1. [root@lb002 keepalived]# cat /application/nginx/conf/nginx.conf
  2. worker_processes 1;
  3. error_log logs/error.log;
  4. events {
  5. worker_connections 1024;
  6. }
  7. http {
  8. include mime.types;
  9. default_type application/octet-stream;
  10. sendfile on;
  11. keepalive_timeout 65;
  12. upstream www_server_pools {
  13. server 192.168.2.131:80 weight=1;
  14. server 192.168.2.146:80 weight=1;
  15. }
  16. server {
  17. listen 192.168.2.188:80;
  18. server_name www.yangyangyang.org;
  19. location / {
  20. proxy_pass http://www_server_pools;
  21. include proxy.conf;
  22. }
  23. }
  24. }

5.2 在 lb001 和 lb002 上配置 Keepalived 服务

  1. [root@lb001 keepalived]# cat keepalived.conf
  2. ! Configuration File for keepalived
  3. global_defs {
  4. notification_email {
  5. 1622320046@qq.com
  6. }
  7. notification_email_from Alexandre.Cassen@firewall.loc
  8. smtp_server 127.0.0.1
  9. smtp_connect_timeout 30
  10. router_id lb001
  11. }
  12. vrrp_instance VI_1 {
  13. state MASTER
  14. interface ens33
  15. virtual_router_id 55
  16. priority 150
  17. advert_int 1
  18. authentication {
  19. auth_type PASS
  20. auth_pass 1111
  21. }
  22. virtual_ipaddress {
  23. 192.168.2.188/24 dev ens33 label ens33:1
  24. }
  25. }
  1. [root@lb002 keepalived]# cat keepalived.conf
  2. ! Configuration File for keepalived
  3. global_defs {
  4. notification_email {
  5. 1622320046@qq.com
  6. }
  7. notification_email_from Alexandre.Cassen@firewall.loc
  8. smtp_server 127.0.0.1
  9. smtp_connect_timeout 30
  10. router_id lb002
  11. }
  12. vrrp_instance VI_1 {
  13. state BACKUP
  14. interface ens33
  15. virtual_router_id 55
  16. priority 100
  17. advert_int 1
  18. authentication {
  19. auth_type PASS
  20. auth_pass 1111
  21. }
  22. virtual_ipaddress {
  23. 192.168.2.188/24 dev ens33 label ens33:1
  24. }
  25. }

5.3 解决服务监听的网卡上不存在 IP 地址问题

  1. [root@lb001 keepalived]# echo 'net.ipv4.ip_nonlocal_bind = 1' >> /etc/sysctl.conf
  2. [root@lb001 keepalived]# tail -1 /etc/sysctl.conf
  3. net.ipv4.ip_nonlocal_bind = 1
  4. [root@lb001 keepalived]# sysctl -p
  5. net.ipv4.ip_nonlocal_bind = 1
  1. [root@lb002 keepalived]# echo 'net.ipv4.ip_nonlocal_bind = 1' >> /etc/sysctl.conf
  2. [root@lb002 keepalived]# tail -1 /etc/sysctl.conf
  3. net.ipv4.ip_nonlocal_bind = 1
  4. [root@lb002 keepalived]# sysctl -p
  5. net.ipv4.ip_nonlocal_bind = 1

p.s. 上述部分均由桥接模式完成,由于用户模拟访问时桥接模式无法访问外网,于是改成NAT模式的DHCP方式上网,以下测试均为NAT模式。篇首的IP地址为NAT模式的地址。

5.4 用户访问准备及模拟实际访问

(1)在客户端 hosts 文件里把 www.yangyangyang.org 域名解析到 VIP 192.168.2.188 上,正式场景需要通过 DNS 解析。

  1. 192.168.2.188 www.yangyangyang.org

(2)两台 web 服务器开启 Nginx 服务,并配置首页文件

  1. [root@web001 ~]# /application/nginx/sbin/nginx
  2. [root@web001 ~]# cat /application/nginx/html/www/index.html
  3. 192.168.2.146 www.yangyangyang.org
  4. [root@web002 ~]# /application/nginx/sbin/nginx
  5. [root@web002 ~]# cat /application/nginx/html/www/index.html
  6. 192.168.2.131 www.yangyangyang.org

(3)两台负载均衡服务器配好 Nginx 服务,并确保后面代理的 Web 节点可以测试访问

  1. [root@lb001 keepalived]# /application/nginx/sbin/nginx
  2. [root@lb001 keepalived]# lsof -i:80
  3. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  4. nginx 1151 root 6u IPv4 20341 0t0 TCP www.yangyangyang.org:http (LISTEN)
  5. nginx 1215 nginx 6u IPv4 20341 0t0 TCP www.yangyangyang.org:http (LISTEN)
  6. [root@lb001 keepalived]# ip addr|grep 192.168.2.188
  7. inet 192.168.2.188/24 scope global secondary ens33:1

(4)模拟访问

192.168.2.131
192.168.2.146

  1. [root@lb001 keepalived]# systemctl stop keepalived.service
  1. [root@lb002 keepalived]# ip addr|grep 192.168.2.188
  2. inet 192.168.2.188/24 scope global secondary ens33:1

6. 配置指定文件接收 Keepalived 服务日志

(1)编辑配置文件 /etc/sysconfig/keepalived ,将 14 行的 KEEPALIVED_OPTIONS="-D" 修改为 KEEPALIVED_OPTIONS="-D -d -S 0"

  1. [root@lb001 ~]# sed -i '14 s#KEEPALIVED_OPTIONS="-D"#KEEPALIVED_OPTIONS="-D -d -S 0"#g' /etc/sysconfig/keepalived
  2. [root@lb001 ~]# sed -n '14p' /etc/sysconfig/keepalived
  3. KEEPALIVED_OPTIONS="-D -d -S 0"

(2)修改 rsyslog 的配置文件 vim /etc/rsyslog.conf ,在结尾处加上如下两行内容

  1. [root@lb001 ~]# tail -2 /etc/rsyslog.conf
  2. #keepalived
  3. local0.* /var/log/keepalived.log

上述配置表示来自 local0 设备的所有日志信息都记录到 /var/log/keepalived.log 文件。

(3)修改 rsyslog 的配置文件 vim /etc/rsyslog.conf,将 54 行改成

  1. *.info;mail.none;authpriv.none;cron.none;local0.none /var/log/messages

(4)配置完成后,重启 rsyslog 服务

  1. [root@lb001 ~]# systemctl restart rsyslog.service

(5)关闭 keepalived 服务,测试 Keepalived 日志记录结果。

  1. [root@lb001 ~]# tail /var/log/keepalived.log
  2. Oct 10 20:07:15 localhost Keepalived_vrrp[1252]: Sending gratuitous ARP on ens33 for 192.168.2.188
  3. Oct 10 20:07:15 localhost Keepalived_vrrp[1252]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.2.188
  4. Oct 10 20:07:15 localhost Keepalived_vrrp[1252]: Sending gratuitous ARP on ens33 for 192.168.2.188
  5. Oct 10 20:07:15 localhost Keepalived_vrrp[1252]: Sending gratuitous ARP on ens33 for 192.168.2.188
  6. Oct 10 20:07:15 localhost Keepalived_vrrp[1252]: Sending gratuitous ARP on ens33 for 192.168.2.188
  7. Oct 10 20:07:15 localhost Keepalived_vrrp[1252]: Sending gratuitous ARP on ens33 for 192.168.2.188
  8. Oct 10 20:07:33 localhost Keepalived[1250]: Stopping
  9. Oct 10 20:07:33 localhost Keepalived_vrrp[1252]: VRRP_Instance(VI_1) sent 0 priority
  10. Oct 10 20:07:33 localhost Keepalived_vrrp[1252]: VRRP_Instance(VI_1) removing protocol VIPs.
  11. Oct 10 20:07:33 localhost Keepalived_healthcheckers[1251]: Stopped
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注