5分鍾教你看大神操作keepalived服務


11 高可用服務(keepalived)的配置

11.1 高可用服務的概念

11.1.1 高可用服務總體概念

  • 為了解決單點故障
  • 減輕服務器的壓力

11.1.2 高可用keepalived的概念

  • 為了管理lvs服務
  • 由於lvs沒有健康檢查功能,keepalived可以進行健康檢查
  • keepalived路由冗余協議

11.1.3 路由冗余協議

  • 利用vrrp協議進行相互之間的通信
  • 利用vrrp協議進行主備競選
  • 發送組播包來告訴其他服務器我還正常的
  • 發送的時候使用的明文發送

11.2 安裝高可用服務(172.16.1.5,172.16.1.6)

[root@lb01 conf.d] # yum -y install keepalived

11.3 高可用服務的原理

11.3.1 圖示講解

11.3.2 文字講解

11.4 編輯配置文件

11.4.1 主配置文件編輯(172.16.1.5)

[root@lb01 ~] # cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived

 

global_defs {

notification_email {

router_id lb01                    定義一個高可用的集群名稱

}

}

 

vrrp_instance oldboy {                    設置一個實例(可以說是創建一個家族)

state MASTER                    指定這台服務器在家族的身份

interface eth0                    指定vip地址出現在哪台服務器的網卡上

virtual_router_id 66                指定家族的標識

priority 150                        指定服務器的優先級(優先級越高,越有可能是主服務器)

advert_int 1                        主服務器發送組播包的間隔

authentication {

auth_type PASS

auth_pass 1234                指定認證密碼信息

}

virtual_ipaddress {

10.0.0.3                    指定vip地址信息

}

}

11.4.2 副配置文件編輯(172.16.1.6)

[root@lb02 ~] # cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

notification_email {

router_id lb02                    定義一個高可用集群名稱

}

}

 

vrrp_instance oldboy {                    定義一個實例(家族)

state BACKUP                    定義這台服務器在家族中的身份地位

interface eth0                    定義vip出現哪個網卡上

virtual_router_id 66                家族的標識

priority 100                        定義服務器的級別信息

advert_int 1                        接收主服務器發送的組播信息間隔時間

authentication {

auth_type PASS

auth_pass 1234                定義指證密碼信息

}

virtual_ipaddress {

10.0.0.3                    定義vip地址信息

}

}

11.5 重啟keepalived服務(172.16.1.5,6都需要)

systemctl restart keepalived.service

11.6 測試是否搭建成功

11.6.1 將主服務器的高可用服務停止

[root@lb01 ~] # systemctl stop keepalived.service

11.6.2 在其他高可用服務器上查看vip地址是否已經切換成功

[root@lb02 ~] # ip a s eth0

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000

link/ether 00:0c:29:35:bd:57 brd ff:ff:ff:ff:ff:ff

inet 10.0.0.6/24 brd 10.0.0.255 scope global noprefixroute eth0

valid_lft forever preferred_lft forever

inet 10.0.0.3/32 scope global eth0                    切換成功

valid_lft forever preferred_lft forever

inet6 fe80::69eb:971b:2ae0:23cc/64 scope link tentative noprefixroute dadfailed

valid_lft forever preferred_lft forever

11.7 高可用服務企業常見的問題說明

11.7.1 腦裂問題

11.7.1.1 啥叫腦裂問題

簡單的說就是其他服務器在主服務器正常的時候出現了vip地址信息

11.7.1.2 腦裂問題出現的原因

11.7.1.2.1 物理原因
  • 主和其他服務器連接的網線不通了,導致接收不到主發送的組播信息
  • 去往其他服務器的防火牆可能已經打開了,導致主服務器發送的信息不能正常的發送給其他服務器
11.7.1.2.2 邏輯原因

服務器的配置出現了問題

11.7.1.3 腦裂問題出現怎么解決

  • 寫腳本進行監控,當出現了腦裂問題就進行發送郵件來進行解決
11.7.1.3.1 腳本的編寫
  • 判斷其他服務器是不是出現了vip地址信息

ip a s eth0 | grep -c "10.0.0.3" !=0 && 就進行發送郵件給運維人員

  • 開始編寫(在其他服務器使用定時任務+腳本)

[root@lb02 scripts] # vim monitor_vip.sh

#!/bin/bash

 

VIP_COUNT=`ip a s eth0 | grep -c "10.0.0.3"`                驗證vip地址是否存在

if [ "$VIP_COUNT" != 0 ]                        上面匹配的個數是不是大於0

then

echo "check vip addr" | mail -s "move vip" 460523471@qq.com                發送郵件信息

fi

11.7.2 實現監控nginx的服務狀態進行主備切換

11.7.2.1 在主服務器上面進行監控

11.7.2.1.1 在主服務器上編寫監控腳本
  • 思路:nginx服務停止以后,就將keepalived服務也給停止掉

netstat -anptu | grep -c nginx ==0 && systemctl stop keepalived

  • 腳本開始編寫

[root@lb01 scripts] # vim monitor_nginx.sh

#!/bin/bash

count_nginx=`netstat -anptu | grep -c nginx`            判斷nginx進程有幾行

if [ "$count_nginx" == 0 ]                        如果為0行,則將keepalived服務停止

then

systemctl stop keepalived

else

exit 0

fi

 

[root@lb01 scripts] # sh -x monitor_nginx.sh             腳本執行過程

++ grep -c nginx

++ netstat -anptu

+ count_nginx=0

+ '[' 0 == 0 ']'

+ systemctl stop keepalived

 

[root@lb01 scripts] # systemctl is-active keepalived.service     發現keepalived服務已經停止

inactive

[root@lb01 scripts] #

  • 實時監控,一旦nginx掛了,立馬將keepalived服務停止
  • 使用while死循環做

[root@lb01 scripts] # vim monitor_nginx.sh

#!/bin/bash

count_nginx=`netstat -anptu | grep -c nginx`

when true                     當為真的時候,進行下面的查看

do

if [ "$count_nginx" == 0 ]

then

systemctl stop keepalived

fi

sleep 1;                        每隔1秒進行一次循環判斷

done

  • 使用主配置文件進行編輯(確認你的腳本有執行權限)

[root@lb01 scripts] # vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

 

global_defs {

notification_email {

router_id lb01

}

}

vrrp_script check_web {                    設置腳本的項目名稱

script "/server/scripts/monitor_nginx.sh"        指定你要監控的腳本

interval 2                            指定2秒進行一次監控

#weight 2

}

 

vrrp_instance oldboy {

state MASTER

interface eth0

virtual_router_id 66

priority 150

advert_int 1

authentication {

auth_type PASS

auth_pass 1234

}

virtual_ipaddress {

10.0.0.3

}

track_script {                        調用上面的項目名稱信息函數

check_web

}

 

}

11.7.2.2 在其他服務器上面進行監控

11.7.2.2.1 使用權重值來進行vip地址的切換
  • 使用停止keepalived的方式雖然可以成功,但是是一次性的,可能nginx恢復以后,keepalived不會進行恢復,為了解決這個問題,我們可以使用權重值來進行解決
  • 權重值的概念
  • 權重值為正數的時候
  1. 返回為0的時候,實際值為權重值+默認優先級,權重值會進行增加操作
  2. 返回為非0的時候,實際值等於默認優先級
  • 權重值為負數的時候
  1. 返回為0的時候,實際值等於默認優先級
  2. 返回為非0的時候,實際值等於默認優先級+權重值
  • 編寫腳本
  • 判斷你訪問的網站是不是200,如果是返回為真,如果不是返回為假
  • 使用curl -I -w "%{http_code}\n" -o /dev/null -s www.oldboy.com
  • 具體編寫

[root@lb02 scripts] # vim monitor_nginx.sh

#!/bin/bash

code_info="$(curl -I -w "%{http_code}\n" -o /dev/null -s www.oldboy.com)"

if [ $code_info -ne 200 ]

then

exit 0

else

exit 1

fi

 

[root@lb02 scripts] # vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

 

global_defs {

notification_email {

router_id lb02

}

}

vrrp_script check_web {

script "/server/scripts/monitor_nginx.sh"

interval 2

weight 60

 

}

vrrp_instance oldboy {

state BACKUP

interface eth0

virtual_router_id 66

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1234

}

virtual_ipaddress {

10.0.0.3

}

track_script {

check_web

}

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM