Linux集羣根據功能劃分爲兩大類:高可用和負載均衡。linux
高可用集羣一般爲2臺服務器,一臺工做,另外一臺做爲冗餘,當提供服務的機器宕機時,冗餘將接替繼續提供服務。
實現高可用的開源軟件有:heartbeat、Keepalived,其中heartbeat已無人維護,因此從此使用Keepalived來搭建高可用集羣。nginx
負載均衡集羣,須要有1臺服務器做爲分發器,它負責把用戶的請求分發給後端的服務器處理,在這個集羣裏,除了分發器外就是給用戶提供服務的服務器了,這些服務器數量至少爲2臺,因此負載均衡集羣至少要3臺服務器。
實現負載均衡的開源軟件有:LVS、Keepalived、haproxy、nginx;商業軟件有:F五、Netscaler。vim
Keepalived經過VRRP(virtual router redundancy protocol)虛擬路由冗餘協議來實現高可用。
在這個協議裏會將多臺功能相同的路由器組成一個小組,這個小組會有1個master角色和N(N≥1)個backup角色。
Keepalived有三個模塊:core、check、vrrp。其中core模塊爲Keepalived的核心,負責主進程的啓動、維護以及全局配置文件的加載和解析;check模塊負責健康檢查,vrrp負責實現vrrp協議。後端
兩臺虛擬機:
系統:centos 7.3_64位
master:192.168.8.131;編譯安裝nginx;yum install -y keepalived
backup:192.168.8.130;yum install -y nginx;yum install -y keepalived
VIP:192.168.8.100
注: VIP(virtual IP)虛擬IP,由Keepalived設置,用於服務器對外提供服務。centos
master:瀏覽器
安裝Keepalived: [root@adailinux ~]# yum install -y keepalived 查看nginx版本: [root@adailinux ~]# /usr/local/nginx/sbin/nginx -v nginx version: nginx/1.12.1
backup:bash
安裝Keepalived: [root@localhost ~]# yum install -y keepalived 安裝nginx: [root@localhost ~]# yum install -y nginx 查看nginx版本: [root@localhost ~]# nginx -v nginx version: nginx/1.10.2
配置Keepalived:
在此使用自定義的Keepalived配置文件腳本(先清空或刪除自帶配置文件腳本)。服務器
[root@adailinux ~]# vim /etc/keepalived/keepalived.conf global_defs { notification_email { aming@aminglinux.com } #定義故障提醒郵件接收地址(本實驗用不到) notification_email_from root@aminglinux.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL ##運行keepalived的機器的一個標識,多個節點標識能夠相同,也能夠不一樣 } vrrp_script chk_nginx { #定義監控腳本 script "/usr/local/sbin/check_ng.sh" #指定服務健康檢測(check)腳本 interval 3 #檢測時間間隔 } vrrp_instance VI_1 { state MASTER #定義該服務的角色 interface ens33 #定義在本機中監聽VIP的網卡 virtual_router_id 51 #虛擬路由id(同組中的服務器保持該id一致) priority 100 #指定本機權重(決定優先級) advert_int 1 #vrrp Multicast廣播週期秒數 authentication { #定義認證相關信息 auth_type PASS #認證類型爲密碼形式 auth_pass 123456 #定義認證密碼 } virtual_ipaddress { #定義VIP 192.168.188.100 } track_script { #加載監控服務(腳本) chk_nginx #注意此處服務名稱要與上面監控腳本名稱一致 } }
建立監控腳本:負載均衡
[root@adailinux ~]# 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 #在此中止Keepalived服務是爲了不發生腦裂 fi fi 更改腳本權限: [root@adailinux ~]# chmod 755 /usr/local/sbin/check_ng.sh 啓動Keepalived服務: [root@adailinux ~]# systemctl start keepalived 檢測服務狀態: [root@adailinux ~]# ps aux |grep keep root 4586 0.0 0.1 111708 1308 ? Ss 15:44 0:00 /usr/sbin/keepalived -D root 4587 0.1 0.2 111708 2556 ? S 15:44 0:00 /usr/sbin/keepalived -D root 4588 0.6 0.1 111708 1620 ? S 15:44 0:00 /usr/sbin/keepalived -D root 4682 0.0 0.0 112664 972 pts/1 S+ 15:45 0:00 grep --color=auto keep [root@adailinux ~]# ps aux |grep nginx root 3380 0.0 0.1 45352 1164 ? Ss 14:15 0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf nobody 3381 0.0 0.4 47840 4064 ? S 14:15 0:00 nginx: worker process nobody 3382 0.0 0.3 47840 3804 ? S 14:15 0:00 nginx: worker process root 4696 0.0 0.0 112664 976 pts/1 R+ 15:45 0:00 grep --color=auto nginx [root@adailinux ~]# /etc/init.d/nginx stop Stopping nginx (via systemctl): [ 肯定 ] [root@adailinux ~]# ps aux |grep nginx root 4814 0.0 0.1 45352 1184 ? Ss 15:46 0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf nobody 4816 0.0 0.3 47840 3820 ? S 15:46 0:00 nginx: worker process nobody 4817 5.0 0.3 47840 3820 ? S 15:46 0:00 nginx: worker process root 4827 0.0 0.0 112664 976 pts/1 S+ 15:46 0:00 grep --color=auto nginx 注:由以上檢測狀態可知關閉nginx服務以後Keepalived會再次自動啓動nginx服務
說明: 「腦裂」,即當master宕機後仍然未釋放VIP,同時backup接替master提供服務要使用同一VIP,於是致使兩臺機器爭佔同一VIP致使服務紊亂,因此當master宕機後須要關閉其Keepalived服務來避免腦裂現象發生。Keepalived服務的日誌位置:/var/log/messages。
查看網卡信息:測試
[root@adailinux ~]# ip add 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:8a:1b:5c brd ff:ff:ff:ff:ff:ff inet 192.168.8.131/24 brd 192.168.8.255 scope global ens33 valid_lft forever preferred_lft forever inet 192.168.8.100/32 scope global ens33 valid_lft forever preferred_lft forever
說明: 在此不能使用ifconfig查看,ens33中增長了一個IP:192.168.8.100/32。
配置Keepalived:
一樣使用自定義腳本。
[root@localhost ~]# vim /etc/keepalived/keepalived.conf global_defs { notification_email { aming@aminglinux.com } notification_email_from root@aminglinux.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 { #只有該部分與master有區別 state BACKUP #角色 interface ens33 virtual_router_id 51 priority 90 #權重 advert_int 1 authentication { auth_type PASS auth_pass 123456 } virtual_ipaddress { 192.168.8.100 } track_script { chk_nginx } }
說明: 若是是多臺服務器,權重決定了master宕機後,backup接管master角色的順序。
建立監控腳本:
[root@localhost ~]# 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 更改腳本權限: [root@localhost ~]# chmod 755 /usr/local/sbin/check_ng.sh 啓動Keepalived服務: [root@localhost ~]# systemctl start keepalived.service
說明: 該檢測腳本中與master檢測腳本的區別在於:systemctl start nginx,即nginx的啓動方式,由於在backup服務器中是使用yum安裝的nginx,默認添加到系統服務中。
master:
backup:
使用VIP訪問:
此時默認訪問到master服務器。
master宕機後該機器上的Keepalived服務必將關閉,此處模擬master服務器上的Keepalived關閉後的情景:
關閉Keepalived服務: [root@adailinux ~]# systemctl stop keepalived.service
查看master上IP狀態:
[root@adailinux ~]# ip add 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:8a:1b:5c brd ff:ff:ff:ff:ff:ff inet 192.168.8.131/24 brd 192.168.8.255 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::65d2:adc:20d3:8c74/64 scope link valid_lft forever preferred_lft forever
說明: ens33上已經沒有了VIP。
查看back上IP狀態:
[root@localhost ~]# ip add 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:40:9f:e7 brd ff:ff:ff:ff:ff:ff inet 192.168.8.130/24 brd 192.168.8.255 scope global ens33 valid_lft forever preferred_lft forever inet 192.168.8.100/32 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::b61a:f99d:bfc0:e0b5/64 scope link valid_lft forever preferred_lft forever
說明: VIP轉移到backup的ens33網卡上。而後使用瀏覽器訪問VIP。
即,master宕機後由backup繼續提供服務。
注: 恢復master上的Keepalived服務後,會由master服務器爲該集羣提供服務。以下:
在master上操做: [root@adailinux ~]# systemctl start keepalived.service [root@adailinux ~]# ip add 2: ens33: inet 192.168.8.131/24 brd 192.168.8.255 scope global ens33 valid_lft forever preferred_lft forever inet 192.168.8.100/32 scope global ens33 valid_lft forever preferred_lft forever 在backup上: [root@localhost ~]# ip add 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:40:9f:e7 brd ff:ff:ff:ff:ff:ff inet 192.168.8.130/24 brd 192.168.8.255 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::b61a:f99d:bfc0:e0b5/64 scope link valid_lft forever preferred_lft forever
再次使用瀏覽器訪問VIP:
即,Keepalived——Nginx高可用集羣搭建完成!!!