Linux 叢集 Keepalived+nginx
搭建高可用叢集
高可用叢集,即“HA叢集”,也常稱作“雙機熱備”,用於關鍵業務。常見實現高可用的開源軟體有heartbeat和keepalived,其中keepalived還有負載均衡的功能。這兩個軟體類似,核心原理都是通過心跳線連線兩臺伺服器,正常情況下由一臺伺服器提供服務,當這臺伺服器宕機,備用伺服器頂替。
nginx安裝
nginx官網地址:nginx: download
這兩個隨便下載一個,傳到你的伺服器上
[root@nginx ~]# yum -y install pcre-devel openssl openssl-devel gcc gcc-c++
開啟nginx:
複製程式碼
[root@nginx ~]# ll
總用量 1056
-rw-------. 1 root root 1311 12月 20 22:36 anaconda-ks.cfg
-rw-r--r-- 1 root root 1073364 2月 28 17:32 nginx-1.21.6.tar.gz
[root@nginx ~]# tar -zxvf nginx-1.21.6.tar.gz
[root@nginx ~]# cd nginx-1.21.6
[root@nginx nginx-1.21.6]# ./configure
[root@nginx nginx-1.21.6]# make && make install
[root@nginx nginx -1.21.6]# cd /usr/local/nginx/sbin/
[root@nginx sbin]# ./nginx
[root@nginx sbin]# netstat -lntp |grep nginx (或者用 yum install -y net-tools)
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 4539/nginx: master
複製程式碼
訪問伺服器:
1.安裝keepalived
VRRP協議有1個master角色和至少1個backup角色,所以做本實驗需要準備至少兩臺Linux機器。
master:192.168.200.52 安裝keepalived+Nginx
backup:192.168.200.25 安裝keepalived+Nginx
VIP:192.168.200.100
分別在兩臺機器上執行如下操作:
# yum install -y keepalived
CentOS預設的yum源裡就有keepalived包,安裝keepalived很簡單,但重點在於配置,下面我們拿一個實際案例來闡述 keepalived的高可用功能。
2.Keepalived配置檔案:
編輯master(192.168.200.52)的keepalived配置檔案:
[root@master ~]# vim /etc/keepalived/keepalived.conf //內容如下
global_defs { #全域性配置標識,表明這個區域{}是全域性配置
notification_email {
131917381@qq.com #表示傳送通知郵件時郵件源地址是誰
}
notification_email_from [email protected] #表示keepalived在發生諸如切換操作時需要傳送email通知,以及email傳送給哪些郵件地址,郵件地址可以多個,每行一個
smtp_server 127.0.0.1 #表示傳送email時使用的smtp伺服器地址,這裡可以用本地的sendmail來實現
smtp_connect_timeout 30 #連線smtp連線超時時間
router_id LVS_DEVEL #機器標識
}
vrrp_script chk_nginx {
script "/usr/local/sbin/check_ng.sh" #檢查服務是否正常,通過寫指令碼實現,指令碼檢查服務健康狀態
interval 3 #檢查時間間斷是3秒
}
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 #認證型別
auth_pass 5201314>g #密碼的形式是一個字串
}
virtual_ipaddress { #設定虛擬IP地址 (VIP),又叫做漂移IP地址
192.168.200.100
}
track_script { #載入指令碼
chk_nginx
}
}
【小技巧】全部刪除下面的時候:按123然後接著按dd後面的就全刪除了
3.keepalived要實現高可用,監控Nginx服務是必不可少的,它本身沒有這個功能,需要藉助自定義指令碼實現,所以接下來我們還需要定義一個監控Nginx服務的指令碼,如下:
[root@master ~]# 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程序數量
if [ $n -eq "0" ]; then
/etc/init.d/nginx start
n2=`ps -C nginx --no-heading|wc -l`
#如果還為0,說明nginx無法啟動,此時需要關閉keepalived
if [ $n2 -eq "0" ]; then
echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
systemctl stop keepalived
fi
fi
4.編輯完監控Nginx服務的指令碼,還需要給它x許可權,否則無法被keepalived呼叫,命令如下:
[root@master ~]# chmod a+x /usr/local/sbin/check_ng.sh
5.完成以上操作,就可以啟動master上的keepalived了,如果沒有啟動Nginx服務,它會幫我們自動拉動起來,並監聽VIP:
[root@master ~]# systemctl start keepalived
[root@master ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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 group default qlen 1000
link/ether 00:0c:29:f8:e3:b9 brd ff:ff:ff:ff:ff:ff
inet 192.168.200.52/24 brd 192.168.200.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.200.100/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::a709:f89:6e2d:666a/64 scope link noprefixroute
valid_lft forever preferred_lft forever
inet6 fe80::f47a:43ff:375e:c80/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
可以看到master上已經自動配置了192.168.200.100這個IP。再來看看Nginx服務是否已經啟動:
[root@master ~]# ps aux |grep nginx
6.配置backup:
[root@backup ~]# vim /etc/keepalived/keepalived.conf //內容如下
global_defs {
notification_email {
131917381@qq.com
}
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 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 5201314>g
}
virtual_ipaddress {
192.168.200.100
}
track_script {
chk_nginx
}
}
!!!下面的也要刪掉
7.編輯監控指令碼,如下:
[root@backup ~]# vim /usr/local/sbin/check_ng.sh //內容如下
d=`date --date today +%Y%m%d_%H:%M:%S`
n=`ps -C nginx --no-heading|wc -l`
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
8.編輯完監控Nginx服務的指令碼,還需要給它x許可權,否則無法被keepalived呼叫:
[root@backup ~]# chmod a+x /usr/local/sbin/check_ng.sh //新增許可權
9.啟動nginx跟keepalived
[root@backup ~]# nginx
[root@backup ~]# systemctl start keepalived
[root@backup ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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 group default qlen 1000
link/ether 00:0c:29:58:3f:62 brd ff:ff:ff:ff:ff:ff
inet 192.168.200.25/24 brd 192.168.200.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.200.100/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::af2f:833c:2874:5380/64 scope link noprefixroute
valid_lft forever preferred_lft forever
10.測試: