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: <LOOPBACK,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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}