keepalived 高可用集權

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秒內完成。

原理圖:

image

當主服務器出現問題的時候:

image

Keepalived 高可用搭建

安裝Keepalived 環境說明

架構圖image

部署基本環境

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 instanceVRRP實例區塊

默認配置文檔:

[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

image

模擬測試、當MASTER出現故障的時候、是否會自動切換

當停掉MASTER服務的時候、查看ip變化

image

當主服務器恢復後、會再次接管IP、提供服務

image

小結

主備之間的配置文件的差異

配置參數主服務器備份服務器
router_id(唯一標識)router_id LV01router_id LV02
state(角色)state MASTERstate BACKUP
priority(競選優先級)priority 150priority 100

image

至此Keepalived高可用搭建完成

keepaliced 高可用服務器的的“腦裂”問題

什麼是“腦裂”

由於突發原因、導致兩臺高可用服務器的指定時間內、無法檢測到對方狀態。然後各自取得資源及服務器的所有權,而此時兩臺高可用服務器都存活並運行,這樣就導致一個IP在兩端同時存在,而發生衝突。最嚴重兩臺服務器佔用一個VIP,當用戶寫入數據的時候可能會分別寫入兩端,導致服務器數據不一致。

“腦裂”發生的原因

一般有以下幾種情況:

1、線路故障

  • 心跳線故障

  • 網卡故障

  • 網絡傳輸設備故障

防火牆攔截(開啓防火牆後、不配置放行規則會自動攔截心跳檢測廣播包) 配置文件錯誤 廣播衝突、軟件bug

解決“腦裂”的常見方案

  • 採用雙線檢測方式、避免單線故障

  • 做好監控、報警

  • 測試環境測試好了在上線上環境、不要輕易修改線上環境配置

Keepalived雙實例雙主模式配置

keepalived 多實例雙主模式是指:A業務是LB01上的主模式、在LB02上面是備模式。B業務在LB01上面是備模式、在LB02上面是主模式。

image

將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"

image

相關參數說明:

  • -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}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章