[toc]html
擴展 heartbeat和keepalived比較http://blog.csdn.net/yunhua_lee/article/details/9788433 DRBD工做原理和配置 http://502245466.blog.51cto.com/7559397/1298945 mysql+keepalived http://lizhenliang.blog.51cto.com/7876557/1362313mysql
根據功能劃分爲兩大類:高可用和負載均衡;linux
高可用集羣一般爲兩臺服務器,一臺工做,另一臺做爲冗餘,當提供服務的機器宕機,冗餘將接替繼續提供服務;nginx
實現高可用的開源軟件有:heartbeat、keepalived; 負載均衡集羣,須要有一臺服務器做爲分發器,它負責把用戶的請求分發給後端的服務器處理,在這個集羣裏,除了分發器外,就是給用戶提供服務的服務器,這些服務器數量至少爲2;web
實現負載均衡的開源軟件有LVS、keepalived、haproxy、nginx,商業的有F五、Netscaler。算法
在這裏咱們使用keepalived來實現高可用集羣,由於heartbeat在centos6上有一個問題,影響實驗效果sql
keepalived經過VRRP(Virtual Router Redundancy Protocl)來實現高可用。vim
在這個協議裏會將多臺功能相同的路由器組成一個小組,這個小組裏會有1個master角色和N(N>=1)個backup角色。後端
master會經過組播的形式向各個backup發送VRRP協議的數據包,當backup收不到master發來的VRRP數據包時,就會認爲master宕機了。此時就須要根據各個backup的優先級來決定誰成爲新的mater。centos
keepalived要有三個模塊,分別是core、check和vrrp。其中core模塊爲keepalived的核心,負責主進程的啓動、維護以及全局配置文件的加載和解析,check模塊負責健康檢查,vrrp模塊是來實現VRRP協議的。
keepalived 負載均衡的框架是依賴於著名的而且被普遍使用的 Linux Virtual Server(LVS 的 ipvs)內核模塊提供的 Layer 4(OSI 參考模型的第四層,傳輸層)上的負載均衡。keepalived 實現了一套經過對服務器池(也就是Real Server 池,Server pool)健康狀態來動態地、自動維護的管理被負載均衡的服務器池的 checker。
而 keepalived 高可用(High-available)是經過 VRRP 協議來實現的,VRRP 在路由器的故障轉移中是很是基礎、經常使用的,而 keepalived 實現了一套 hooks 爲 VRRP finite state machine 提供底層,高速的協議互動。
keepalived 框架能夠被用於獨立的亦或者是所有一塊兒使用來提供彈性服務的基礎設施,而且是一個免費,開源的軟件。總的來講它能爲咱們提供這樣一些功能:
經過結構圖咱們瞭解到 keepalived 涉及到內核空間的兩個網絡功能,分別是:
在用戶空間主要分爲4個部分,分別是Scheduler I/O Multiplexer、Memory Mangement、Control Plane 和Core components。
而其中就會有這樣的一些模塊:
經過上訴咱們瞭解到 keepalived 主要功能實現仍是依賴於 LVS 與 VRRP。LVS 咱們已經知道是什麼了。可是 VRRP 又是什麼?
最先的 VRRP 是由 IETF 提出的解決局域網中配置靜態網關出現單點失效現象的路由協議,使得在發生故障而進行設備功能切換時能夠不影響內外數據通訊,不須要再修改內部網絡的網絡參數。VRRP 協議須要具備IP地址備份,優先路由選擇,減小沒必要要的路由器間通訊等功能。
VRRP 協議的功能實現是將兩臺或多臺路由器設備虛擬成一個設備,對外提供虛擬路由器IP,而在路由器組內部,經過算法多角度的選舉此時的 MASTER 機器做爲這個對外 IP 的擁有者,也就是 ARP 的解析,MASTER 的 MAC 地址與 IP 相互對應,其餘設備不擁有該 IP,狀態是 BACKUP,而 BACKUP 除了接收 MASTER 的 VRRP 狀態通告信息外,不執行對外的網絡功能。當主機失效時,BACKUP 將當即接管原先 MASTER 的網絡功能。從而達到了無縫的切換,而用戶並不會知道網絡設備出現了故障。
簡單來講,vrrp 就是讓外界認爲只有一個網關在工做(在邏輯結構上將兩臺虛擬成一臺設備),當通常狀況下,全部的網絡功能都經過 Master 來處理,而其忽然出問題的時候,有一個備胎可以立馬接替他的工做,而不用用戶手動修改本身的電腦配置
而上文所說的 Master,也就是咱們的主路由(也就是當前工做的路由)是經過主備路由之間相互通訊,經過其 route_id、優先級等來綜合斷定從而選舉出來的,
主路由會每隔 1 秒(這個值能夠修改配置)發送 vrrp 包通知 Backup 路由本身仍是健康的存活着,而 Backup 路由如果3秒(這個值能夠修改)沒有收到主路由的 vrrp 包,便會將本身切換成主路由來接替工做。
而如果原主路由忽然復活了,在接收到當前主路由發來的 vrrp 包是會從中解析其優先級的值,如果本身的優先級較高便會將本身切換成主路由,並告知當前的主路由,而後開始工做。而當前的路由便會將本身切換成 Backup。
若是優先級相等的話,將比較路由器的實際IP,IP值較大的優先權高;
不過若是對外的虛擬路由器IP就是路由器自己的IP的話,該路由器始終將是MASTER,這時的優先級值爲255。
當咱們瞭解了 VRRP 的工做原理以後,咱們會發現其實它與 LVS 的工做原理彷佛差很少呀,都是虛擬出一個 IP 出來給別人,而後本身在內部經過某種機制來進行切換,這應該即是爲何它們有這麼高的契合度的緣由.
可是它們仍是有區別的:
LVS 在後面的Server Pool 中每臺均可以同時工做,而 VRRP 同時工做的機器只有一臺,只有當一臺出問題以後纔會啓用另一臺。
因此咱們換着方式讓兩個工具相互結合,讓 keepalived 工做在 Load Balancer 上,作好出口路由的高可用,LVS 在後端作好負載均衡,這樣大大地提升了咱們的服務質量,特別是在忽然的大流量衝擊下。
用keepalived配置高可用集羣
準備兩臺機器130和133,130做爲master,133做爲backup
兩臺機器都執行yum install -y keepalived
兩臺機器都安裝nginx,其中130上已經編譯安裝過nginx,133上須要yum安裝nginx
設定VIP爲100(虛擬IP或者叫浮動IP),服務器靠這個VIP對外提供服務
準備階段:先在backup上安裝nginx
wget nginx安裝包 nginx-1.12.1.tar.gz tar zxvf nginx-1.12.1.tar.gz cd nginx-1.12.1/ ./configure --prefix=/usr/local/nginx make&make install vim /etc/init.d/nginx chmod 755 /etc/init.d/nginx chkconfig -add nginx chkconfig nginx on vim /usr/local/nginx/conf/nginx.conf /usr/local/nginx/sbin/nginx -t /etc/init.d/nginx start
[root@xavi ~]# > /etc/keepalived/keepalived.conf [root@xavi ~]# 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 vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 }
[root@xavi ~]# vim /etc/keepalived/keepalived.conf #出現問題時發送郵件 global_defs { notification_email { xavi@xavilinux.com //定義接收郵件人 } notification_email_from root@xavilinux.com //定義發郵件的地址 smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_script chk_nginx { script "/usr/local/sbin/check_ng.sh" # 自定義腳本,該腳本爲監控Nginx服務的腳本 interval 3 #檢測腳本,檢測時間3s一次 } vrrp_instance VI_1 { state MASTER //定義角色爲master interface ens33 #vrrp協議使用的網卡是ens33 virtual_router_id 51 priority 100 // 權重100,此數值要大於backup advert_int 1 authentication { auth_type PASS auth_pass xavilinux //定義密碼 } virtual_ipaddress { 192.168.72.100 # 定義VIP,主從都要用到 } track_script { chk_nginx #加載檢查腳本,這裏和上面的vrr_script後面的字符串保持一致 }
[root@xavi ~]# vim /usr/local/sbin/check_ng.sh #!/bin/bash #時間變量,用於記錄日誌 d=`date --date today +%Y%m%d_%H:%M:%S` #計算nginx進程數量 n=`ps -C nginx --no-heading|wc -l` #若是進程爲0,則啓動nginx,而且再次檢測nginx進程數量, #若是還爲0,說明nginx沒法啓動,此時須要關閉keepalived if [ $n -eq "0" ]; then /etc/init.d/nginx start n2=`ps -C nginx --no-heading|wc -l` if [ $n2 -eq "0" ]; then echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log systemctl stop keepalived fi fi
腦裂」,在高可用(HA)系統中,當聯繫2個節點的「心跳線」斷開時, 原本爲一總體、動做協調的HA系統,就分裂成爲2個獨立的個體。 因爲相互失去了聯繫,都覺得是對方出了故障。兩個節點上的HA軟件 像「裂腦人」同樣,爭搶「共享資源」、爭起「應用服務」,就會發生嚴重 後果——或者共享資源被瓜分、2邊「服務」都起不來了;或者2邊「服務」 都起來了,但同時讀寫「共享存儲」,致使數據損壞 如何判斷腦裂? 分別在兩臺機查看當前服務器是否擁有虛擬IP,若是兩臺服務器 都擁有,則說明發生了腦裂,證實目前雙機通訊出現問題,產生 此問題的原有在於 兩臺服務器都探測不到組內其餘服務器的狀態 (心跳請求沒法正常響應),私自斷定另外一臺服務器掛起,則搶 佔虛擬IP,腦裂的出現是不被容許的,解決此問題的方法爲檢查 防火牆設置(關閉防火牆)或者使用串口通訊。
[root@xavi ~]# chmod 755 /usr/local/sbin/check_ng.sh [root@xavi ~]# systemctl start keepalived
查看
[root@xavi ~]# ps aux |grep keep root 3037 0.0 0.0 120740 1404 ? Ss 22:07 0:00 /usr/sbin/keepalived -D root 3038 0.0 0.1 127480 3284 ? S 22:07 0:00 /usr/sbin/keepalived -D root 3039 0.0 0.1 131676 3028 ? S 22:07 0:01 /usr/sbin/keepalived -D root 5195 0.0 0.0 112684 976 pts/1 S+ 22:44 0:00 grep --color=auto keep [root@xavi ~]# ps aux |grep nginx root 5239 0.0 0.0 112680 972 pts/1 S+ 22:45 0:00 grep --color=auto nginx [root@xavi ~]# /etc/init.d/nginx start Starting nginx (via systemctl): [ 肯定 ] [root@xavi ~]# ps aux |grep nginx root 5287 0.0 0.0 46004 1276 ? Ss 22:46 0:00 nginx: master process /usr/local/ngin/sbin/nginx -c /usr/local/nginx/conf/nginx.conf nobody 5288 0.0 0.2 50576 4252 ? S 22:46 0:00 nginx: worker process nobody 5289 0.0 0.2 50576 4252 ? S 22:46 0:00 nginx: worker process root 5301 0.0 0.0 112684 972 pts/1 S+ 22:46 0:00 grep --color=auto nginx
[root@ying01 ~]# systemctl stop firewalld [root@ying01 ~]# getenforce Disabled [root@ying01 ~]# iptables -nvL Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination [root@xavi ~]# iptables -F [root@xavi ~]# iptables -nvL Chain INPUT (policy ACCEPT 9 packets, 616 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 5 packets, 556 bytes) pkts bytes target prot opt in out source destination
[root@xavi-002 ~]# vim /etc/keepalived/keepalived.conf [root@xavi-002 ~]# cat /etc/keepalived/keepalived.conf global_defs { notification_email { xavi@xavilinux.com } #出現問題時發送郵件 notification_email_from root@xavilinux.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL } #上述自定義參數 vrrp_script chk_nginx { script "/usr/local/sbin/check_ng.sh" # 自定義腳本,該腳本爲監控Nginx服務的腳本 interval 3 } #檢測腳本,檢測時間3s一次 vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 51 priority 90 # 權重90,此數值要大於backup advert_int 1 authentication { auth_type PASS auth_pass xavilinux>com } virtual_ipaddress { 192.168.72.100 } # 定義VIP track_script { chk_nginx } # 定義監控chk_nginx }
[root@xavi-002 ~]# vim /usr/local/sbin/check_ng.sh #時間變量,用於記錄日誌 d=`date --date today +%Y%m%d_%H:%M:%S` #計算nginx進程數量 n=`ps -C nginx --no-heading|wc -l` #若是進程爲0,則啓動nginx,而且再次檢測nginx進程數量, #若是還爲0,說明nginx沒法啓動,此時須要關閉keepalived if [ $n -eq "0" ]; then systemctl start nginx /etc/init.d/nginx start if [ $n2 -eq "0" ]; then echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log systemctl stop keepalived fi fi
[root@xavi-002 ~]# chmod 755 /usr/local/sbin/check_ng.sh [root@xavi-002 ~]# systemctl start keepalived
[root@xavi nginx-1.12.1]# systemctl stop firewalld [root@xavi nginx-1.12.1]# getenforce Disabled [root@xavi nginx-1.12.1]# iptables -nvL Chain INPUT (policy ACCEPT 56032 packets, 27M bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53 0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53 0 0 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:67 0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:67 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- * virbr0 0.0.0.0/0 192.168.122.0/24 ctstate RELATED,ESTABLISHED 0 0 ACCEPT all -- virbr0 * 192.168.122.0/24 0.0.0.0/0 0 0 ACCEPT all -- virbr0 virbr0 0.0.0.0/0 0.0.0.0/0 0 0 REJECT all -- * virbr0 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable 0 0 REJECT all -- virbr0 * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable Chain OUTPUT (policy ACCEPT 42392 packets, 46M bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT udp -- * virbr0 0.0.0.0/0 0.0.0.0/0 udp dpt:68 [root@xavi nginx-1.12.1]# iptables -F [root@xavi nginx-1.12.1]# iptables -nvL Chain INPUT (policy ACCEPT 7 packets, 468 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 5 packets, 572 bytes) pkts bytes target prot opt in out source destination
[root@xavi ~]# systemctl start keepalived [root@xavi ~]# ip add 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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:ea:14:79 brd ff:ff:ff:ff:ff:ff inet 192.168.72.130/24 brd 192.168.72.255 scope global ens33 valid_lft forever preferred_lft forever inet 192.168.72.100/32 scope global ens33 //以顯示VIP地址 valid_lft forever preferred_lft forever inet6 fe80::1d7a:ffe8:8235:a2a5/64 scope link valid_lft forever preferred_lft forever
[root@xavi ~]# ps aux|grep nginx root 2694 0.0 0.0 20500 608 ? Ss 22:21 0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf nobody 2695 0.0 0.1 25028 3232 ? S 22:21 0:00 nginx: worker process nobody 2696 0.0 0.1 25028 3232 ? S 22:21 0:00 nginx: worker process root 5837 0.0 0.0 112684 976 pts/0 S+ 22:45 0:00 grep --color=auto nginx
[root@xavi ~]# mv /usr/local/nginx/html/index.html /usr/local/nginx/html/index.html.bak [root@xavi ~]# vim /usr/local/nginx/html/index.html This is the Master site!
[root@xavi-002 ~]# mv /usr/local/nginx/html/index.html /usr/local/nginx/html/index.html.bak [root@xavi-002 ~]# vim /usr/local/nginx/html/index.html This is for Backup website!
訪問master主頁
訪問VIP主頁
[root@xavi ~]# systemctl stop keepalived [root@xavi ~]# ip add 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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:ea:14:79 brd ff:ff:ff:ff:ff:ff inet 192.168.72.130/24 brd 192.168.72.255 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::1d7a:ffe8:8235:a2a5/64 scope link valid_lft forever preferred_lft forever
查看backup機器上的VIP信息:
[root@xavi-002 ~]# ip add 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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:66:d4:59 brd ff:ff:ff:ff:ff:ff inet 192.168.72.133/24 brd 192.168.72.255 scope global ens33 valid_lft forever preferred_lft forever inet 192.168.72.100/32 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::7276:ecaf:14ca:5827/64 scope link valid_lft forever preferred_lft forever
[root@xavi-002 ~]# curl -I 192.168.72.100 HTTP/1.1 200 OK Server: nginx/1.12.2 Date: Wed, 12 Sep 2018 15:51:09 GMT Content-Type: text/html Content-Length: 3700 Last-Modified: Tue, 06 Mar 2018 09:26:21 GMT Connection: keep-alive ETag: "5a9e5ebd-e74" Accept-Ranges: bytes [root@xavi-002 ~]# curl -I 192.168.72.133 HTTP/1.1 200 OK Server: nginx/1.12.2 Date: Wed, 12 Sep 2018 15:51:43 GMT Content-Type: text/html Content-Length: 3700 Last-Modified: Tue, 06 Mar 2018 09:26:21 GMT Connection: keep-alive ETag: "5a9e5ebd-e74" Accept-Ranges: bytes [root@xavi-002 ~]# curl -I 192.168.72.130 curl: (7) Failed connect to 192.168.72.130:80; 拒絕鏈接
在生產環境中,可能會用到2-3臺backup角色, vim /etc/keepalived/keepalived.conf 這裏面的權重調成不通級別,權重越高優先級越高!除了nginx服務的話,還能夠作MySQL的高可用集羣服務。(作mysql的高可用,必定要保證兩邊的數據一致)