• 根據功能劃分爲兩大類:高可用和負載均衡php
• 高可用集羣一般爲兩臺服務器,一臺工做,另一臺做爲冗餘,當提供服務的機器宕機,冗餘將接替繼續提供服務html
• 實現高可用的開源軟件有:heartbeat、keepalivedlinux
• 負載均衡集羣,須要有一臺服務器做爲分發器,它負責把用戶的請求分發給後端的服務器處理,在這個集羣裏,除了分發器外,就是給用戶提供服務的服務器了,這些服務器數量至少爲2nginx
• 實現負載均衡的開源軟件有LVS、keepalived、haproxy、nginx,商業的有F五、Netscaler git
• 在這裏咱們使用keepalived來實現高可用集羣,由於heartbeat在centos6上有一些問題,影響實驗效果vim
• keepalived經過VRRP(Virtual Router Redundancy Protocl)來實現高可用。後端
• 在這個協議裏會將多臺功能相同的路由器組成一個小組,這個小組裏會有1個master角色和N(N>=1)個backup角色。centos
• master會經過組播的形式向各個backup發送VRRP協議的數據包,當backup收不到master發來的VRRP數據包時,就會認爲master宕機了。此時就須要根據各個backup的優先級來決定誰成爲新的mater。瀏覽器
• Keepalived要有三個模塊,分別是core、check和vrrp。其中core模塊爲keepalived的核心,負責主進程的啓動、維護以及全局配置文件的加載和解析,check模塊負責健康檢查,vrrp模塊是來實現VRRP協議的。bash
• 準備兩臺機器130和132,130做爲master,132做爲backup
• 兩臺機器都執行yum install -y keepalived
• 兩臺機器都安裝nginx,其中130上已經編譯安裝過nginx,132上須要yum安裝nginx: yum install -y nginx
• 設定vip爲100
• 編輯130上keepalived配置文件,內容從https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/master_keepalived.conf獲取
• 130編輯監控腳本,內容從https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/master_check_ng.sh獲取
• 給腳本755權限
• systemctl start keepalived 130啓動服務
• 132上編輯配置文件,內容從https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/backup_keepalived.conf獲取
• 132上編輯監控腳本,內容從https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/backup_check_ng.sh獲取
• 給腳本755權限
• 132上也啓動服務 systemctl start keepalived
實例:
130(01)做爲master,132(02)做爲backup
[root@localhost 01]# yum install -y keepalived
[root@localhost 02]# yum install -y keepalived
兩臺機器都安裝nginx,其中130上已經編譯安裝過nginx,132上須要yum安裝nginx: yum install -y nginx
[root@localhost 01]# ps aux | grep nginx #查看nginx進程
[root@localhost 02]# rpm -qa | grep nginx #查看nginx服務有沒有安裝
[root@localhost 02]# yum install -y nginx
[root@localhost 01]# ls /etc/keepalived/keepalived.conf #查看配置文件
/etc/keepalived/keepalived.conf
[root@localhost 01]# cat !$
[root@localhost 01]# > !$ #清空配置文件內容,而後複製進去
拷貝keepalived配置文件,內容從https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/master_keepalived.conf獲取
[root@localhost 01]# 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 MASTER
interface ens33 #發廣播的ID
virtual_router_id 51
priority 100
advert_int 1
authentication { #認證相關信息
auth_type PASS
auth_pass aminglinux>com
}
virtual_ipaddress { #定義vip
192.168.188.100
}
track_script {
chk_nginx
}
}
檢測nginx是否正常的腳本
[root@localhost 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
fi
fi
[root@localhost 01]# cat /usr/local/sbin/check_ng.sh
[root@localhost 01]# chmod 755 /usr/local/sbin/check_ng.sh
[root@localhost 01]# systemctl start keepalived #啓動keepalived 服務
[root@localhost 01]# ps aux | grep keep #查看進程有沒有啓動
[root@localhost 01]# ps aux | grep nginx
停掉nginx服務
[root@localhost 01]# /etc/init.d/nginx stop
[root@localhost 01]# !ps
[root@localhost 01]# less /var/log/messages #查看日誌
[root@localhost 01]# ip addr #查看配置文件中的IP地址
[root@localhost 01]# iptables -nvL #查看規則
[root@localhost 01]# getenforce
Disabled
在132上面操做
[root@localhost 02]# iptables -nvL #查看規則
[root@localhost 02]# systemctl stop firewalld #關閉防火牆
[root@localhost 02]# setenforce 0 #關閉防火牆
[root@localhost 02]# > /etc/keepalived/keepalived.conf
[root@localhost 02]# vi !$ #編輯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 MASTER
interface ens33 #發廣播的ID
virtual_router_id 51
priority 100
advert_int 1
authentication { #認證相關信息
auth_type PASS
auth_pass aminglinux>com
}
virtual_ipaddress { #定義vip
192.168.133.100 #修改爲跟主同樣
}
track_script {
chk_nginx
}
}
檢測nginx是否正常的腳本
[root@localhost 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@localhost 02]# chmod 755 !$
chmod 755 /usr/local/sbin/check_ng.sh
[root@localhost 02]# systemctl start keepalived #啓動keepalived 服務
[root@localhost 02]# ps aux | grep keep #查看進程有沒有啓動
[root@localhost 02]# systemctl restart keepalived
[root@localhost 01]# ifconfig #查看IP,在瀏覽器輸入顯示出來的IP
在瀏覽器輸入IP
在01上面
[root@localhost 01]# cat /usr/local/nginx/conf/vhost #查看配置文件
aaa.com.conf ld.conf proxy.conf ssl.conf test.com.conf
[root@localhost 01]# cat /usr/local/nginx/vhost/aaa.com.conf
server
{
listen 80 default_server;
server_name aaa.com;
index index.html index.html index.php;
root /data/wwwroot/default;
location ~\.php$
{
include fastcgi_params;
fastcgi_pass unix:/tmp/aming.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/wwwroot/default$fastcgi_script_name
}
}
[root@localhost 01]# cat /data/wwwroot/default/index.html
master master .This is the default site.
由於02虛擬機是yum安裝nginx的,因此master所在的位置不一樣
[root@localhost 02]# cat /usr/share/nginx/html/index.html
backup backup.
[root@localhost 02]#ifconfig #查看IP,在瀏覽器輸入顯示出來的IP
在瀏覽器輸入IP
[root@localhost 02]# ps aux | grep nginx #開啓keepalived,就在自動開啓nginx服務
[root@localhost 02]# systemctl stop nginx
問題nginx關不掉,緣由:keepalived服務自帶的nginx,須要關閉keepalived服務。
•
測試高可用
• 先肯定好兩臺機器上nginx差別,好比能夠經過curl -I 來查看nginx版本
• 測試1:關閉master上的nginx服務
• 測試2:在master上增長iptabls規則
• iptables -I OUTPUT -p vrrp -j DROP
• 測試3:關閉master上的keepalived服務
• 測試4:啓動master上的keepalived服務
實例:
把協議中的APP包分掉
[root@localhost 01]# iptables -I OUTPUT -p vrrp -j DROP
[root@localhost 01]# iptables -nvL #查看規則
[root@localhost 01]# tail /var/log/messages #查看日誌
[root@localhost 01]# lesss !$
[root@localhost 01]# ip add
在02從機器上
[root@localhost 02]# ip addr
[root@localhost 02]# less /var/log/messages #查看日誌
[root@localhost 02]# iptables -nvL #查看規則
在主虛擬機上
[root@localhost 01]# iptables -F
[root@localhost 01]# systemctl stop keepalived #中止keepalived 服務
[root@localhost 01]# ip add
在從虛擬機上
[root@localhost 02]# ip addr
[root@localhost 02]# tail /var/log/messages #查看日誌
說明VIP已經到從機器上了
在主虛擬機上
[root@localhost 01]# systemctl starp keepalived #啓動keepalived 服務
[root@localhost 01]# ip add
在從虛擬機上
[root@localhost 02]# tail /var/log/messages
注意:keeplived 配置文件裏面vip指定的網卡須要用ip add查看後,把配置文件裏面的interface 改爲本機上的網卡名字,我就是照搬複製沒改網卡名字,因此就報錯了
Keepalived_vrrp[17516]: VRRP_Instance(VI_1) Unknown interface !
改完以後就ok了
常見問題:
備用keepalived起來的前提就是主的keepalived停掉了(宕機、或者nginx起不來等 致使主keepalived服務停掉 vrrp協議不可達),又怎麼會出現主和備的keepalived同時存在 並爭搶vip資源呢?
能不能舉例說明一下 主備的keepalived哪些狀況會同時存在呀?
答:這個就是腦裂。 主認爲從宕機,從認爲主宕機就會出現腦裂。 若是兩臺機器直接網絡異常,好比網卡通訊有問題,或者配置了iptables策略,就會出現腦裂。
二、keepalived核心服務沒啓動,是哪一個模塊喚起的nginx
監測的那個
三、在生產環境中是否是要保證NGINX服務要一致,這樣高可用性纔有意義吧。
怎麼保證NGINX服務是一致的啊。。
答:固然要一致。 你兩臺機器配置文件保持同步就是了。每次改完一個,另外的也要同步過去。
四、master和backup的keepalived的配置文件中的網卡名字是同一個,這個沒有影響嗎?backup主機上要是沒有那個網卡,keepalived是怎麼處理的。
答本身配置本身的,若是master上叫eth0,backup上叫eth1,在配置文件中指定便可。