天天看點

高可用叢集

高可用叢集說明

高可用叢集架構圖
高可用叢集

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           

繼續閱讀