一、keepalived服務
-
keepalived 是什么?
-
Keepalived 一方面具有配置管理LVS的功能,同時還具有對LVS下面節點進行健康檢查的功能,另一方面也可實現系統網絡服務的高可用功能,用來防止單點故障。
- keepalived 工作原理
keepalived 是以 VRRP 協議為實現基礎,VRRP全稱Virtual Router Redundancy Protocol,即虛擬路由冗余協議。
虛擬路由冗余協議,可以認為是實現路由器高可用的協議,即將N台提供相同功能的路由器組成一個路由器組,這個組里面有一個master和多個backup,master上面有一個對外提供服務的vip(該路由器所在局域網內其他機器的默認路由為該vip),master會發組播vrrp包,用於高速backup自己還活着,當backup收不到vrrp包時就認為master宕掉了,這時就需要根據VRRP的優先級來選舉一個backup當master。這樣的話就可以保證路由器的高可用了。保證業務的連續性,接管速度最快可以小於1秒。

keepalived主要有三個模塊,分別是core、check和vrrp。
-
-
core模塊為keepalived的核心,負責主進程的啟動、維護以及全局配置文件的加載和解析。
-
check負責健康檢查,包括常見的各種檢查方式。
-
vrrp模塊是來實現VRRP協議的。
-
- keepalived 與 zookeeper 高可用性區別
- Keepalived:
優點:簡單,基本不需要業務層面做任何事情,就可以實現高可用,主備容災。而且容災的宕機時間也比較短。
缺點:也是簡單,因為VRRP、主備切換都沒有什么復雜的邏輯,所以無法應對某些特殊場景,比如主備通信鏈路出問題,會導致腦裂。同時keepalived也不容易做負載均衡。 - Zookeeper:優點:可以支持高可用,負載均衡。本身是個分布式的服務。缺點:跟業務結合的比較緊密。需要在業務代碼中寫好ZK使用的邏輯,比如注冊名字。拉取名字對應的服務地址等。
- Keepalived:
二、keepalived 軟件使用
- keepalived 安裝
[root@etcd1 ~]# yum install keepalived -y
/etc/keepalived /etc/keepalived/keepalived.conf #keepalived服務主配置文件 /etc/rc.d/init.d/keepalived #服務啟動腳本(centos 7 之前的用init.d 腳本啟動,之后的systemd啟動) /etc/sysconfig/keepalived /usr/bin/genhash /usr/libexec/keepalived /usr/sbin/keepalived
- 配置說明
[root@etcd1 kubernetes]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { # 全局配置 notification_email { # 定義報警郵件地址 acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc # 定義發送郵件的地址 smtp_server 192.168.200.1 # 郵箱服務器 smtp_connect_timeout 30 # 定義超時時間 router_id LVS_DEVEL # 定義路由器標識信息,相同的局域網唯一,標識本節點的字條串,通常為hostname vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 }
# 虛擬 IP 配置 vrrp vrrp_instance VI_1 { # 定義實例 state MASTER # 狀態參數 master/backup 僅表示說明,主節點為 MASTER, 對應的備份節點為 BACKUP interface eth0 # 綁定虛擬 IP 的網絡接口,與本機 IP 地址所在的網絡接口相同, 我的是 eth0 virtual_router_id 51 # 虛擬路由的 ID 號, 兩個節點設置必須一樣, 可選 IP 最后一段使用, 相同的 VRID 為一個組,他將決定多播的 MAC 地址
mcast_src_ip 192.168.10.50 ## 本機 IP 地址 priority 100 # 優先級決定是主還是備 --> 越大越優先,節點優先級, 值范圍 0-254, MASTER 要比 BACKUP 高
nopreempt # 優先級高的設置 nopreempt 解決異常恢復后再次搶占的問題 advert_int 1 # 主備心跳通訊時間間隔,組播信息發送間隔,兩個節點設置必須一樣, 默認 1s authentication { # 認證授權,設置驗證信息,兩個節點必須一致 auth_type PASS auth_pass 1111 }
## 將 track_script 塊加入 instance 配置塊
track_script {
chk_nginx ## 執行 Nginx 監控的服務
} virtual_ipaddress { # vip,設備之間使用的虛擬ip地址,可以定義多個
192.168.200.16 192.168.200.17 192.168.200.18 } } .... - 使用配置
主負載均衡服務器配置[root@etcd1 vagrant]# vi /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id lvs-01 } ## keepalived 會定時執行腳本並對腳本執行的結果進行分析,動態調整 vrrp_instance 的優先級。 # 如果腳本執行結果為 0,並且 weight 配置的值大於 0,則優先級相應的增加。 # 如果腳本執行結果非 0,並且 weight配置的值小於 0,則優先級相應的減少。 # 其他情況,維持原本配置的優先級,即配置文件中 priority 對應的值。 vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" ## 檢測 nginx 狀態的腳本路徑 interval 2 ## 檢測時間間隔 weight -20 ## 如果條件成立,權重-20 } vrrp_instance VI_1 { state MASTER interface eth1 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } ## 將 track_script 塊加入 instance 配置塊 track_script { chk_nginx ## 執行 Nginx 監控的服務 } virtual_ipaddress { 192.168.10.99 } } ... - 備負載均衡服務器配置
[root@etcd2 vagrant]# vi /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id lvs-02 } vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" interval 3 weight -20 } vrrp_instance VI_1 { state MASTER interface eth1 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } ## 將 track_script 塊加入 instance 配置塊 track_script { chk_nginx ## 執行 Nginx 監控的服務 } virtual_ipaddress { 192.168.10.99 } } ... - 啟動
查看啟動文件:
[root@etcd2 init.d]# cat /usr/lib/systemd/system/keepalived.service [Unit] Description=LVS and VRRP High Availability Monitor After=syslog.target network-online.target [Service] Type=forking PIDFile=/var/run/keepalived.pid KillMode=process EnvironmentFile=-/etc/sysconfig/keepalived ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS ExecReload=/bin/kill -HUP $MAINPID [Install] WantedBy=multi-user.target
相關操作命令如下:
chkconfig keepalived on #keepalived服務開機啟動 service keepalived start #啟動服務 service keepalived stop #停止服務 service keepalived restart #重啟服務
keepalived正常運行后,會啟動3個進程,其中一個是父進程,負責監控其子進程。一個是vrrp子進程,另外一個是checkers子進程。
[root@etcd2 init.d]# ps -ef | grep keepalived root 3626 1 0 08:59 ? 00:00:00 /usr/sbin/keepalived -D root 3627 3626 0 08:59 ? 00:00:00 /usr/sbin/keepalived -D root 3628 3626 0 08:59 ? 00:00:00 /usr/sbin/keepalived -D root 3656 3322 0 09:03 pts/0 00:00:00 grep --color=auto keepalived
- nginx 安裝與配置
- 安裝(略)
- 配置,默認配置
- nginx 默認文件index.html配置
機器10.50,配置為:
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx! test keepalived 1</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
機器10.51,配置為:
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx! test keepalived 2</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
三、測試
- 編寫 nginx 檢測腳本
在所有的節點上面編寫 Nginx 狀態檢測腳本 /etc/keepalived/nginx_check.sh (已在 keepalived.conf 中配置)腳本要求:如果 nginx 停止運行,嘗試啟動,如果無法啟動則殺死本機的 keepalived 進程, keepalied將虛擬 ip 綁定到 BACKUP 機器上。
內容如下:
[root@etcd1 keepalived]# vi nginx_check.sh #!/bin/bash set -x A=`ps -C nginx --no-header |wc -l` if [ $A -eq 0 ];then echo `date`': nginx is not healthy, try to killall keepalived' >> /etc/keepalived/keepalived.log killall keepalived fi
- 啟動所有節點上的nginx和keepalived
- 192.168.10.50 機器查看ip信息
[root@etcd1 html]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 52:54:00:47:46:52 brd ff:ff:ff:ff:ff:ff inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic eth0 valid_lft 60191sec preferred_lft 60191sec inet6 fe80::5054:ff:fe47:4652/64 scope link valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 08:00:27:c4:c3:0e brd ff:ff:ff:ff:ff:ff inet 192.168.10.50/24 brd 192.168.10.255 scope global eth1 valid_lft forever preferred_lft forever inet 192.168.10.99/32 scope global eth1 valid_lft forever preferred_lft forever inet6 fe80::a00:27ff:fec4:c30e/64 scope link tentative dadfailed valid_lft forever preferred_lft forever 4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN link/ether 02:42:22:bd:9b:38 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 scope global docker0 valid_lft forever preferred_lft forever - 192.168.10.51 查看 ip 信息
[root@etcd2 vagrant]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 52:54:00:ca:e4:8b brd ff:ff:ff:ff:ff:ff inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic eth0 valid_lft 82271sec preferred_lft 82271sec inet6 fe80::5054:ff:feca:e48b/64 scope link valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 08:00:27:ee:7d:7d brd ff:ff:ff:ff:ff:ff inet 192.168.10.51/24 brd 192.168.10.255 scope global eth1 valid_lft forever preferred_lft forever inet6 fe80::a00:27ff:feee:7d7d/64 scope link tentative dadfailed valid_lft forever preferred_lft forever 4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN link/ether 02:42:fa:84:71:b0 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 scope global docker0 valid_lft forever preferred_lft forever
以上可以看到,vip生效是在機器192.168.10.50上面。 - 通過VIP(192.168.10.99)來訪問nginx,結果如下
以上可知,現在生效的nginx代理機器是10.50;我們停掉機器10.50上面的keepalived [root@etcd1 html]# systemctl stop keepalived.service 。
再使用VIP(192.168.10.99)訪問nginx服務,結果如下:
以上可知,現在生效的nginx代理機器是10.51;我們重新機器10.50上面的keepalived [root@etcd1 html]# systemctl start keepalived.service
再使用VIP(192.168.10.99)訪問nginx服務,結果如下:
至此,Keepalived + Nginx 實現高可用 Web 負載均衡搭建完畢。
