集羣介紹
Linux集羣根據功能劃分爲兩大類:高可用和負載均衡。
高可用集羣
高可用集羣通常爲2臺服務器,一臺工作,另一臺作爲冗餘,當提供服務的機器宕機時,冗餘將接替繼續提供服務。
實現高可用的開源軟件有:heartbeat、Keepalived,其中heartbeat已無人維護,基本上使用Keepalived來搭建高可用集羣。
負載均衡集羣
負載均衡集羣,需要有1臺服務器作爲分發器,它負責把用戶的請求分發給後端的服務器處理,在這個集羣裏,除了分發器外就是給用戶提供服務的服務器了,這些服務器數量至少爲2臺,所以負載均衡集羣至少要3臺服務器。
實現負載均衡的開源軟件有:LVS、Keepalived、haproxy、nginx;商業軟件有:F5、Netscaler。
Keepalived介紹
在這裏我們使用keepalived來實現高可用集羣,因爲heartbeat在centos6上有一些問題,影響實驗效果
keepalived通過VRRP(Virtual Router Redundancy Protocl)來實現高可用。
在這個協議裏會將多臺功能相同的路由器組成一個小組,這個小組裏會有1個master角色和N(N>=1)個backup角色。
master會通過組播的形式向各個backup發送VRRP協議的數據包,當backup收不到master發來的VRRP數據包時,就會認爲master宕機了。此時就需要根據各個backup的優先級來決定誰成爲新的mater。
Keepalived要有三個模塊,分別是core、check和vrrp。其中core模塊爲keepalived的核心,負責主進程的啓動、維護以及全局配置文件的加載和解析,check模塊負責健康檢查,vrrp模塊是來實現VRRP協議的。
用keepalived配置高可用集羣
兩臺機器,都要安裝keepalived.
master: ip:192.168.176.135 編譯安裝Nginx
backup: ip : 192.168.176.134 yum安裝Nginx
master:
安裝keepalived
[root@shuai-01 ~]# yum install -y keepalived
查看Nginx的版本:
[root@shuai-01 ~]# /usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.12.2
backup:
安裝keepalived
[root@shuai-02 ~]# yum install -y keepalived
yum 安裝Nginx
[root@shuai-02 ~]# yum install -y nginx
問題:
[root@shuai-02 ~]# yum install -y nginx
已加載插件:fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.163.com
* extras: mirrors.cqu.edu.cn
* updates: mirrors.cqu.edu.cn
沒有可用軟件包 nginx。
錯誤:無須任何處理
[root@shuai-02 ~]# vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/x86_64/
gpgcheck=0
enabled=1
處理方式在這片博文上
http://blog.csdn.net/lnboxue/article/details/74783885
配置keepalived
master:
將下面的配置文件寫入/etc/keepalived/keepalived.conf的空文件中
global_defs {
notification_email {
[email protected]
} #定義故障提醒郵件接收地址
notification_email_from [email protected]
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" #指定服務健康檢測(check)腳本
interval 3 #檢測時間間隔
}
vrrp_instance VI_1 {
state MASTER #定義該服務的角色
interface ens33 #定義在本機中監聽VIP的網卡
virtual_router_id 51 #虛擬路由id(同組中的服務器保持該id一致)
priority 100 #指定本機權重(決定優先級)
advert_int 1
authentication { #定義認證相關信息
auth_type PASS #認證類型爲密碼形式
auth_pass 111111 #定義認證密碼
}
virtual_ipaddress { #定義VIP
192.168.176.100
}
track_script { #加載監控服務(腳本)
chk_nginx #注意此處服務名稱要與上面監控腳本名稱一致
}
}
創建監控腳本(腳本名,自己在配置文件中定義了):
[root@shuai-01 ~]# 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
保存退出
“腦裂”,即當master宕機後仍然未釋放VIP,同時backup接替master提供服務要使用同一VIP,因而導致兩臺機器爭佔同一VIP導致服務紊亂,所以當master宕機後需要關閉其Keepalived服務來避免腦裂現象發生。Keepalived服務的日誌位置:/var/log/messages。
寫完腳本之後,還要給腳本變更權限
[root@shuai-01 ~]# chmod 755 /usr/local/sbin/check_ng.sh
啓動keepalived服務:
[root@shuai-01 ~]# systemctl start keepalived
[root@shuai-01 ~]# ps aux |grep keep
root 5114 0.0 0.1 120720 1484 ? Ss 21:23 0:00 /usr/sbin/keepalived -D
root 5115 0.3 0.3 127460 3292 ? S 21:23 0:00 /usr/sbin/keepalived -D
root 5126 0.0 0.0 112680 976 pts/0 R+ 21:23 0:00 grep --color=auto keep
查看Nginx服務
[root@shuai-01 ~]# ps aux |grep nginx
root 1846 0.0 0.1 45996 1272 ? Ss 13:07 0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody 1854 0.0 0.3 48484 3920 ? S 13:07 0:00 nginx: worker process
nobody 1855 0.0 0.3 48484 3920 ? S 13:07 0:00 nginx: worker process
root 5159 0.0 0.0 112684 972 pts/0 R+ 21:26 0:00 grep --color=auto nginx
將Nginx停掉
[root@shuai-01 ~]# /etc/init.d/nginx stop
Stopping nginx (via systemctl): [ 確定 ]
[root@shuai-01 ~]# ps aux |grep nginx
root 5190 0.0 0.0 112680 976 pts/0 R+ 21:27 0:00 grep --color=auto nginx
[root@shuai-01 ~]# ps aux |grep nginx
root 5193 0.0 0.0 112680 976 pts/0 R+ 21:27 0:00 grep --color=auto nginx
[root@shuai-01 ~]# ps aux |grep nginx
root 5198 0.0 0.0 112680 976 pts/0 R+ 21:27 0:00 grep --color=auto nginx
[root@shuai-01 ~]# ps aux |grep nginx
root 5202 0.0 0.0 112680 976 pts/0 R+ 21:27 0:00 grep --color=auto nginx
停掉Nginx服務後,keepalived會自動啓動Nginx服務
vip只能用ip add 查看
問題:
開啓keepalived後 ,用ip add 查看發現VIP沒有。查看配置文件,沒錯,查看腳本,沒錯。看日誌,就是沒啓動起來,像這樣
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:a1:0e:2c brd ff:ff:ff:ff:ff:ff
inet 192.168.176.135/24 brd 192.168.176.255 scope global dynamic ens33
valid_lft 1131sec preferred_lft 1131sec
inet 192.168.176.150/24 brd 192.168.176.255 scope global secondary ens33:0
valid_lft forever preferred_lft forever
inet6 fe80::4f59:7251:18f1:8716/64 scope link
valid_lft forever preferred_lft forever
解決方法:
查看iptables規則,關閉。
[root@shuai-01 ~]# 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
查看selinux,
[root@shuai-01 ~]# getenforce
Enforcing
關閉後,VIP出來了。
[root@shuai-01 ~]# setenforce 0
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:a1:0e:2c brd ff:ff:ff:ff:ff:ff
inet 192.168.176.135/24 brd 192.168.176.255 scope global dynamic ens33
valid_lft 1048sec preferred_lft 1048sec
inet 192.168.176.100/32 scope global ens33
valid_lft forever preferred_lft forever
backup:
關掉防火牆
[root@shuai-02 ~]# systemctl stop firewalld
[root@shuai-02 ~]# setenforce 0
keepalived配置:
[root@shuai-02 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
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 111111
}
virtual_ipaddress {
192.168.176.100
}
track_script {
chk_nginx
}
}
保存退出
創建監控腳本
[root@shuai-02 ~]# 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@shuai-02 ~]# chmod 755 !$
chmod 755 /usr/local/sbin/check_ng.sh
啓動keepalived
[root@shuai-02 ~]# systemctl start keepalived
測試:
master宕機前
訪問master的ip:
訪問backup的ip:
訪問VIP:
master宕機後:
[root@shuai-01 ~]# systemctl stop keepalived
master的ip:
backup的ip:
VIP的ip:
這時,查看ip addr ,VIP在backup下。