• Linux集羣根據功能劃分爲兩大類:高可用和負載均衡html
• 高可用集羣一般爲兩臺服務器,一臺工做,另一臺做爲冗餘,當提供服務的機器宕機,冗餘將接替繼續提供服務mysql
• 實現高可用的開源軟件有:heartbeat、keepalivedlinux
• 負載均衡集羣,須要有一臺服務器做爲分發器,它負責把用戶的請求分發給後端的服務器處理,在這個集羣裏,除了分發器外,就是給用戶提供服務的服務器了,這些服務器數量至少爲2nginx
• 實現負載均衡的開源軟件有LVS、keepalived、haproxy、nginx,商業的有F五、Netscalerweb
• 使用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協議的。bash
準備兩臺服務器,一臺做爲master,另外一臺做爲backup。
keepalived,實際是包含一個服務的,也能夠說這個服務用來實現高可用
兩臺機器都執行yum install -y keepalived
使用 nginx ,把它做爲一個高可用的對象——>使用nginx做爲演示對象的緣由,由於nginx在工做中,在生產環境中,不少企業把nginx作一個負載均衡器 ,假設nginx一旦掛掉,那麼後端全部的web,即便說是正常的,那也沒法訪問到
yum安裝nginx
yum install -y nginx
######################## 清除原有配置 ####################### [root@linux-5 ~]# vim /etc/keepalived/keepalived.conf [root@linux-5 ~]# > !$ > /etc/keepalived/keepalived.conf [root@linux-5 ~]# vim /etc/keepalived/keepalived.conf ######################## 全局配置 ####################### global_defs { //global_defs 全局配置標識 notification_email { //notification_email用於設置報警郵件地址 lem@qq.com //能夠設置多個,每行一個 } notification_email_from root@lem.com //設置郵件發送地址 smtp_server 127.0.0.1 //設置郵件的smtp server地址 smtp_connect_timeout 30 //設置鏈接smtp sever超時時間 router_id LVS_DEVEL } ####################### check模塊配置 ###################### vrrp_script chk_nginx { script "/usr/local/sbin/check_ng.sh" //檢查服務是否正常,經過寫腳本實現,腳本檢查服務健康狀態 interval 3 //檢查的時間間斷是3秒 } ####################### vrrp模塊配置 ###################### vrrp_instance VI_1 { //VRRP配置標識 VI_1是實例名稱 state MASTER //定義master相關 interface ens33 //經過vrrp協議去通訊、去發廣播。配置時,需注意本身的網卡名稱 virtual_router_id 51 //定義路由器ID ,配置的時候和從機器一致 priority 100 //權重,主角色和從角色的權重是不一樣的 advert_int 1 //設定MASTER與BACKUP主機質檢同步檢查的時間間隔,單位爲秒 authentication { //認證相關信息 auth_type PASS //這裏認證的類型是PASS auth_pass 123456 //密碼的形式是一個字符串 } virtual_ipaddress { //設置虛擬IP地址 (VIP),又叫作漂移IP地址 192.168.88.100 //更改成192.168.88.100 } track_script { //加載腳本 chk_nginx } }
漂移IP地址是一個共有地址,當主機宕機後,備機Nginx啓動,若是備機Nginx解析地址依然爲源主機IP,則依舊沒法正常訪問(源主機宕機,IP地址失效)。爲解決上述問題,主機和備機都解析到一個公共IP地址,在主機宕機後備機Nginx服務啓動便可解析到正常能夠訪問的IP地址。
主機器配置監控腳本 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 systemctl start nginx 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
若是不中止keepalived服務,則容易使服務器發生腦裂,在高可用(HA)系統中,當聯繫2個節點的「心跳線」斷開時,原本爲一總體、動做協調的HA系統,就分裂成爲2個獨立的個體。因爲相互失去了聯繫,都覺得是對方出了故障。兩個節點上的HA軟件像「裂腦人」同樣,爭搶「共享資源」、爭起「應用服務」,就會發生嚴重後果——或者共享資源被瓜分、2邊「服務」都起不來了;或者2邊「服務」都起來了,但同時讀寫「共享存儲」,致使數據損壞。
如何判斷腦裂?
分別在兩臺機查看當前服務器是否擁有虛擬IP,若是兩臺服務器都擁有,則說明發生了腦裂,證實目前雙機通訊出現問題,產生此問題的原有在於 兩臺服務器都探測不到組內其餘服務器的狀態(心跳請求沒法正常響應),私自斷定另外一臺服務器掛起,則搶佔虛擬IP,腦裂的出現是不被容許的,解決此問題的方法爲檢查防火牆設置(關閉防火牆)或者使用串口通訊。
注:因爲主上的Nginx服務是經過yum安裝的,所以腳本啓動Nginx的命令要使用systemctl start Nginx,不然沒法正常啓動。若是是經過源碼包編譯安裝的,則使用/etc/init.d/nginx start
chmod 755 /usr/local/sbin/check_ng.sh
主機和備機啓動keepalived服務前都要先檢查selinux以及防火牆是否關閉
[root@linux-5 ~]# systemctl start keepalived.service [root@linux-5 ~]# ps aux |grep keepalived root 4572 0.0 0.0 118608 1384 ? Ss 23:00 0:00 /usr/sbin/keepalived -D root 4573 0.0 0.1 122804 2364 ? S 23:00 0:00 /usr/sbin/keepalived -D root 4574 0.0 0.1 122804 2408 ? S 23:00 0:00 /usr/sbin/keepalived -D root 4576 0.0 0.0 112676 984 pts/0 S+ 23:00 0:00 grep --color=auto keepalived
注:啓動keepalived服務前須要先啓動Nginx服務,不然會被斷定爲Nginx服務宕機,沒法啓動keepalived服務。
[root@linux-5 ~]# ps aux |grep nginx root 1448 0.0 0.1 120752 2096 ? Ss 16:41 0:00 nginx: master process /usr/sbin/nginx nginx 1449 0.0 0.1 121136 3124 ? S 16:41 0:00 nginx: worker process root 1519 0.0 0.0 112676 980 pts/0 R+ 16:42 0:00 grep --color=auto nginx [root@linux-5 ~]# systemctl stop nginx [root@linux-5 ~]# ps aux |grep nginx root 1568 0.0 0.1 120752 2092 ? Ss 16:42 0:00 nginx: master process /usr/sbin/nginx nginx 1569 0.0 0.1 121136 3120 ? S 16:42 0:00 nginx: worker process root 1586 0.0 0.0 112676 984 pts/0 R+ 16:42 0:00 grep --color=auto nginx
能夠發現,當keepalived服務檢測到Nginx服務中止後,會經過監控腳本從新拉起Nginx。
keepalived的日誌位於/var/log/messages下
[root@linux-5 ~]# less /var/log/messages
[root@linux-5 ~]# 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:58:d2:aa brd ff:ff:ff:ff:ff:ff inet 192.168.88.5/24 brd 192.168.88.255 scope global ens33 valid_lft forever preferred_lft forever inet 192.168.88.100/32 scope global ens33 valid_lft forever preferred_lft forever inet 192.168.88.50/24 brd 192.168.88.255 scope global secondary ens33:0 valid_lft forever preferred_lft forever inet6 fe80::531b:14ea:3a75:f113/64 scope link valid_lft forever preferred_lft forever 3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:58:d2:b4 brd ff:ff:ff:ff:ff:ff inet6 fe80::97b3:ed:1e9b:98c8/64 scope link valid_lft forever preferred_lft forever
能夠發如今配置文件中設定的VIP(192.168.88.100)已處於監聽狀態
注:漂移IP只能經過ip add命令查看
配置以前確保系統防火牆以及selinux均已關閉
global_defs { notification_email { lem@lemlinux.com } notification_email_from root@lemlinux.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" interval 3 } vrrp_instance VI_1 { state BACKUP //從機的類型爲BACKUP interface ens33 virtual_router_id 51 priority 90 //從機的權重要低於主機 advert_int 1 authentication { auth_type PASS auth_pass 123456 } virtual_ipaddress { 192.168.88.100 //漂移IP地址與主機保持一致 } track_script { chk_nginx } }
[root@linux-10 ~]# 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 //從機Nginx爲編譯安裝 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
chmod 755 /usr/local/sbin/check_ng.sh
[root@linux-10 ~]# systemctl start keepalived [root@linux-10 ~]# ps aux|grep keep root 1790 0.0 0.0 118652 1396 ? Ss 23:01 0:00 /usr/sbin/keepalived -D root 1791 0.0 0.1 127516 3292 ? S 23:01 0:00 /usr/sbin/keepalived -D root 1792 0.0 0.1 127456 2836 ? S 23:01 0:00 /usr/sbin/keepalived -D root 1818 0.0 0.0 112720 972 pts/0 R+ 23:01 0:00 grep --color=auto keep
[root@linux-5 ~]# vim /usr/share/nginx/html/index.html master master
[root@linux-10 ~]# cat /data/wwwroot/default/index.html This is a default site.
訪問VIP會跳轉至主機的Nginx服務。
在以前配置master服務器仍是backup服務器,均已成功啓動(經過keepalived服務從新拉起)。
iptables -I OUTPUT -p vrrp -j DROP //封禁主服務器發出的vrrp協議包
[root@linux-5 ~]# iptables -nvL Chain INPUT (policy ACCEPT 44 packets, 3284 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 30 packets, 3224 bytes) pkts bytes target prot opt in out source destination 12 480 DROP 112 -- * * 0.0.0.0/0 0.0.0.0/0
測試發現封堵vrrp協議包並不能達到主從切換的目的。
systemctl stop keepalived
[root@linux-5 ~]# systemctl stop keepalived.service [root@linux-5 ~]# 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:58:d2:aa brd ff:ff:ff:ff:ff:ff inet 192.168.88.5/24 brd 192.168.88.255 scope global ens33 valid_lft forever preferred_lft forever inet 192.168.88.50/24 brd 192.168.88.255 scope global secondary ens33:0 valid_lft forever preferred_lft forever inet6 fe80::531b:14ea:3a75:f113/64 scope link valid_lft forever preferred_lft forever 3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:58:d2:b4 brd ff:ff:ff:ff:ff:ff
主機已再也不監聽192.168.88.100(VIP)。
[root@linux-10 ~]# 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:22:58 brd ff:ff:ff:ff:ff:ff inet 192.168.88.10/24 brd 192.168.88.255 scope global ens33 valid_lft forever preferred_lft forever inet 192.168.88.100/32 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::b1af:cd92:adf1:4329/64 scope link valid_lft forever preferred_lft forever 3: ens37: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000 link/ether 00:0c:29:66:22:62 brd ff:ff:ff:ff:ff:ff
從機已開始監聽192.168.88.100(VIP)。
[root@linux-10 ~]# tail /var/log/messages Jul 8 00:24:53 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100 Jul 8 00:24:53 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100 Jul 8 00:24:53 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100 Jul 8 00:24:53 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100 Jul 8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100 Jul 8 00:24:58 linux-10 Keepalived_vrrp[1792]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.88.100 Jul 8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100 Jul 8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100 Jul 8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100 Jul 8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100
測試發現keepalived服務已生效,VIP成功在從機監聽。
systemctl start keepalived.service
[root@linux-5 ~]# systemctl start keepalived.service [root@linux-5 ~]# 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:58:d2:aa brd ff:ff:ff:ff:ff:ff inet 192.168.88.5/24 brd 192.168.88.255 scope global ens33 valid_lft forever preferred_lft forever inet 192.168.88.100/32 scope global ens33 valid_lft forever preferred_lft forever inet 192.168.88.50/24 brd 192.168.88.255 scope global secondary ens33:0 valid_lft forever preferred_lft forever inet6 fe80::531b:14ea:3a75:f113/64 scope link valid_lft forever preferred_lft forever 3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:58:d2:b4 brd ff:ff:ff:ff:ff:ff inet6 fe80::97b3:ed:1e9b:98c8/64 scope link valid_lft forever preferred_lft forever
[root@linux-10 ~]# 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:22:58 brd ff:ff:ff:ff:ff:ff inet 192.168.88.10/24 brd 192.168.88.255 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::b1af:cd92:adf1:4329/64 scope link valid_lft forever preferred_lft forever 3: ens37: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000 link/ether 00:0c:29:66:22:62 brd ff:ff:ff:ff:ff:ff
[root@linux-10 ~]# tail /var/log/messages Jul 8 00:24:53 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100 Jul 8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100 Jul 8 00:24:58 linux-10 Keepalived_vrrp[1792]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.88.100 Jul 8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100 Jul 8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100 Jul 8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100 Jul 8 00:24:58 linux-10 Keepalived_vrrp[1792]: Sending gratuitous ARP on ens33 for 192.168.88.100 Jul 8 00:28:39 linux-10 Keepalived_vrrp[1792]: VRRP_Instance(VI_1) Received advert with higher priority 100, ours 90 Jul 8 00:28:39 linux-10 Keepalived_vrrp[1792]: VRRP_Instance(VI_1) Entering BACKUP STATE Jul 8 00:28:39 linux-10 Keepalived_vrrp[1792]: VRRP_Instance(VI_1) removing protocol VIPs.
從日誌能夠看出,VIP已在從機上被清除了
測試發現主機keepalived服務從新使主機Nginx服務運行。
注:在生產環境中,可能會用到2-3臺backup角色, vim /etc/keepalived/keepalived.conf 這裏面的權重調成不通級別,權重越高優先級越高!除了nginx服務的話,還能夠作MySQL的高可用集羣服務。(作mysql的高可用,必定要保證兩邊的數據一致)