高可用叢集說明
高可用叢集架構圖![]()
高可用叢集
Keepalived原理
專為LVS和HA設計的一款健康檢查工具
支援故障自動切換
支援節點監控狀态檢查
Keepalived相關檔案
keepalived # 軟體包名
/usr/sbin/keepalived # 主程式檔案
/etc/keepalived/keepalived.conf # 主配置檔案
/usr/share/doc/keepalived # 配置檔案示例
/lib/systemd/system/keepalived.service # Unit File
/etc/sysconfig/keepalived # Unit File的環境配置檔案
功能
(1)基于VRRP協定完成位址流動
(2)為VIP位址所在的節點生成ipvs規則(在配置檔案中預先定義)
(3)為ipvs叢集的各RS做健康狀态檢測
(4)基于腳本調用接口完成腳本中定義的功能,進而影響叢集事務,以此支援nginx、haproxy等服務
元件
1.使用者空間核心元件
vrrp stack # VIP消息通告
checkers # 檢測real server
system call # 标記real server權重
smtp # 郵件元件
ipvs wrapper # 生成ipvs規則
netlink reflector # 網絡接口
watchdog # 監控程序
2.控制元件: 配置檔案解析器
3.IO複用器
4.記憶體管理元件
Keepalived 的熱備方案
VRRP虛拟路由備援協定
一主 + 多備,共用同一個IP位址,但優先級不同
LVS-DR + Keepalived
建構過程
LVS - DR 搭建
#R-M:
eth0:0 10.0.0.100 ; eth0 10.0.0.11
#R-S:
eth0:0 10.0.0.100 ; eth0 10.0.0.12
#RS1:
lo:0 10.0.0.100 ; eth0 10.0.0.13
#RS2:
lo:0 10.0.0.100 ; eth0 10.0.0.14
#R-M 負載排程器搭建:
#關閉網卡守護程序
service NetworkManager stop
chkconfig NetworkManager off
#拷貝eth0網卡子接口充當叢集入口接口
cd /etc/sysconfig/network-scripts/
cp -a ifcfg-eth0 ifcfg-eth0:0
vim !$
#删除mac/uuid和網卡類型
DEVICE=eth0:0
IPADDR=10.10.10.100
NETMASK=255.255.255.0
ifup eth0:0 #開啟子接口
#關閉網卡重定向功能(優化)
vim /etc/sysctl.conf
#添加:
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
sysctl -p #重新整理
#重載ipvs模式
modprobe ip_vs
#安裝ipvsadm指令行工具
yum -y install ipvsadm
ipvsadm -v #檢視目前ipvs叢集内容
ipvsadm -A -t 虛拟IP:80 -s rr 添加ipvs TCP叢集
ipvsadm -a -t 虛拟IP:80 -r 網站:80 -g #添加ipvsadm叢集子節點
# -a 添加節點
# -r 指定真實伺服器
# -g 代表的是DR模式
#執行指令:
ipvsadm -A -t 10.10.10.100:80 -s rr #rr輪詢算法,
ipvsadm -a -t 10.10.10.100:80 -r 10.10.10.13:80 -g
ipvsadm -a -t 10.10.10.100:80 -r 10.10.10.14:80 -g
#儲存ipvs叢集内容至檔案,進行持久化存儲
service ipvsadm save
#設定為開機自啟
chkconfig ipvsadm on
#apache伺服器 RS1 RS2 搭建
#關閉網卡守護程序
service NetworkManager stop && chkconfig NetworkManager off
#拷貝環回接口的子接口
cd /etc/sysconfig/network-scripts
cp -a ifcfg-lo ifcfg-lo:0
vim !$
DEVICE=lo:0
IPADDR=10.10.10.100
NETMASK=255.255.255.255
#關閉對應ARP響應及公告功能
vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
sysctl -p #重新整理
#開啟環回網卡子接口
ipup lo:0
#添加路由記錄,當通路虛拟iP(vip)時交給lo:0網卡
route add -host 10.10.10.100 dev lo:0
#添加到開機自啟
echo "route add -host 10.10.10.100 dev lo:0" >> /etc/rc.local
#建立html測試頁面,實驗中使用不同的頁面,生産環境應是相同網頁
echo "this is server 1" >> /var/www/html/index.html
echo "this is server 2" >> /var/www/html/index.html
#開啟httpd服務
service httpd start
#通路測試
[root@011 ~]# curl 10.10.10.100
this is server 2
[root@011 ~]# curl 10.10.10.100
this is server 1
Keepalived 搭建
負載排程器1 (D-M)搭建
#安裝Keepalived 的依賴
yum -y install kernel-devel openssl-devel popt-devel gcc*
#将軟體包上傳到D-M負載排程器
#連結:https://pan.baidu.com/s/154EgDqAoN4lt32raGhZXGA 提取碼:5vdh
#挂載iso檔案
mkdir /mnt/iso1
mount -o loop Keepalived.iso /mnt/iso1/
cp -a /mnt/iso1/* ./ #拷貝軟體包到目前目錄
#解壓軟體包編譯安裝
tar -zxvf keepalived-1.2.2.tar.gz && cd keepalived-1.2.2
./configure --prefix=/ --with-kernel-dir=/usr/src/kernels/2.6.32...../
make && make install
#設定keepalived開機自啟
chkconfig --add keepalived
chkconfig keepalived on
#修改keepalived的配置檔案
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id R1
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.10.10.100
}
}
virtual_server 10.10.10.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 10.10.10.13 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 4
}
}
real_server 10.10.10.14 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 4
}
}
}
負載排程器2 (D-S)搭建
#安裝Keepalived 的依賴
yum -y install kernel-devel openssl-devel popt-devel gcc*
#将軟體包上傳到D-M負載排程器
#連結:https://pan.baidu.com/s/154EgDqAoN4lt32raGhZXGA 提取碼:5vdh
#挂載iso檔案
mkdir /mnt/iso1
mount -o loop Keepalived.iso /mnt/iso1/
cp -a /mnt/iso1/* ./ #拷貝軟體包到目前目錄
#解壓軟體包編譯安裝
tar -zxvf keepalived-1.2.2.tar.gz && cd keepalived-1.2.2
./configure --prefix=/ --with-kernel-dir=/usr/src/kernels/2.6.32...../
make && make install
#設定keepalived開機自啟
chkconfig --add keepalived
chkconfig keepalived on
#将負載排程器1的keepalived配置檔案複制到目前伺服器
scp /etc/keepalived/keepalived.conf [email protected]:/etc/keepalived/keepalived.conf
#編輯配置檔案
state SLAVE
priority 30
#關閉網卡守護程序
service NetworkManager stop && chkconfig NetworkManager off
#拷貝網卡檔案
cd /etc/sysconfig/network-scripts/
cp ifcfg-eth0 ifcfg-eth0:0
#vim ifcfg-eth0:0
DEVICE=eth0:0
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=10.10.10.100
NETMASK=255.255.255.0
#啟動網卡
ifup eth0:0
#如果報錯`Determining if ip address 10.10.10.100 is already in use for device eth0...
Error, some other host (00:0C:29:8F:96:CE) already uses address 10.10.10.100.`
#修改配置檔案
vi /etc/sysconfig/network-script/ifup-eth
#注釋掉255-259:
#if ! ARPING=$(/sbin/arping -c 2 -w ${ARPING_WAIT:-3} -D -I ${REALDEVICE} ${ipaddr[$idx]}) ; then ARPINGMAC=$(echo $ARPING | sed -ne 's/.*\[\(.*\)\].*/\1/p')
#net_log $"Error, some other host ($ARPINGMAC) already uses address ${ipaddr[$idx]}."
#exit 1
#fi
#編輯核心檔案,防止相同網絡位址廣播沖突
#vim /etc/sysctl.conf
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
sysctl -p #重新整理核心參數
modprobe ip_vs #加載核心
#安裝ipvsadm管理工具
yum -y install ipvsadm
#開啟keepalived
service keepalived start
#檢視ipvsadm的叢集内容
[root@011 network-scripts]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.10.10.100:80 rr persistent 50
-> 10.10.10.13:80 Route 1 0 0
-> 10.10.10.14:80 Route 1 0 0
#驗證
#此時假設負載排程器1,也就是D-M節點當機,通路網站10.10.10.100;在負載排程器2上檢視ipvsadm的狀态
HeartBeat + Nginx
說明
軟體包:軟體包版本為CentOS6系列,如果使用其他版本可以配置eperl源下載下傳安裝
環境準備
配置時間同步服務
配置主機名解析
安裝nginx服務,編寫nginx測試頁面(實驗中為了驗證效果可用不同的頁面)
#配置時間同步
#服務端 10.10.10.15
yum install -y ntp
# vim /etc/ntp.conf
restrict 10.10.10.0 mask 255.255.255.0 nomodify notrap
#注釋掉原有的server 伺服器位址,添加:
server 127.127.1.0
fudge 127.127.1.0 stratum 10
#開啟ntpd服務,并設為開機自啟
service ntpd start
chkconfig ntpd on
#用戶端 10.10.10.16
yum -y install ntpdate
ntpdate -u 10.10.10.15
# 配置主機名解析 heartbeat 配置中需要用到主機名,主機名需要能使用 `uname -n` 擷取到的
# 10.10.10.15
hostname nginx1
# vim /etc/sysconfig/network
HOSTNAME=nginx1
# vim /etc/hosts,添加:
10.10.10.15 nginx1
10.10.10.16 nginx2
# 10.10.10.16
hostname nginx2
# vim /etc/sysconfig/network
HOSTNAME=nginx2
# 安裝nginx
# 将軟體包上傳到兩個節點上
tar -zxvf nginx-1.17.10.tar.gz #解壓縮
cd nginx-1.17.10
# 安裝依賴
yum -y install pcre pcre-devel zlib zlib-devel gcc*
# 添加使用者
useradd -r -s /sbin/nologin -M nginx
# 安裝
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
make && make install
# 編寫測試頁面
rm -rf /usr/local/nginx/html/*
vim /usr/local/nginx/html/index.html
this is nginx 1 #nginx1
this is nginx 2 #nginx2
# 啟動nginx
/usr/local/nginx/sbin/nginx
實驗步驟
1.基礎準備,兩個節點執行
# 将hearbeat上傳到伺服器
# 解壓縮,安裝軟體,拷貝配置檔案
tar -zxvf heartbeat.tar.gz
cd heartbeat
yum -y install *
cd /usr/share/doc/heartbeat-3.0.4/
cp ha.cf authkeys haresources /etc/ha.d/
2.認證服務,節點之間的認證配置
# 主節點:
# 生成密鑰随機數
dd if=/dev/random bs=512 count=1 |openssl md5
# 拷貝md5密鑰到authkeys檔案中
vim authkeys
auth 3
1 crc
2 sha1 HI!
3 md5 cfca93ad58c6f9cae732b40ef8b07310
# 修改權限
chmod 600 authkeys
# 修改主配置檔案ha.cf
vim ha.cf
bcast eth0 #取消注釋
# 添加一主一備節點,需要能被兩台主機解析
node nginx1
node nginx2
# 配置haresources檔案
vim haresourecs
nginx1 IPaddr::10.10.10.100/24/eth0:0
# 将主節點上的三個配置檔案拷貝到從節點上
scp ha.cf authkeys haresources root@nginx2:/etc/ha.d/
chmod 600 /etc/ha.d/authkeys #從節點修改權限
# 啟動服務并進行驗證
# 主節點:
service heartbeat start
# 從節點
service heartbeat start
驗證:
使用浏覽器通路10.10.10.100,檢視網頁内容
此時,模拟主節點當機(斷開主節點的網絡),等待一會,通路網頁
但是這種模式的高可用有一問題,我們先将主節點進行恢複并重新啟動HeartBeat
此時,我們隻将主節點的nginx服務關閉
pkill nginx
,驗證heartbeat是否能完成切換
由此可見,nginx服務當機heartbeat并不能自動的切換為從節點。
我們可以結合腳本應用和定時任務來監控nginx服務,nginx服務當機後自動停止heartbeat服務完成主從切換
#!/bin/env bash
#name:nginx.sh
#date:2020-09-06
PWD=/server/scripts
URL="http://10.10.10.15/index.html"
HTTP_CODE=`curl -o /dev/null -s -w "%{http_code}" "${URL}"`
if [ $HTTP_CODE != 200 ];then service heartbeat stop;fi