mysql keepalived

兩臺服務器, 已經作好了主主複製, 現再用keepalived保證高可用性.mysql

閒話少說, 先在兩臺服務器都安裝keepalived:linux

yum install keepalived -y

安裝成功.sql

keepalived默認會使用這個配置文件: /etc/keepalived/keepalived.confvim

安裝好以後會有一個默認的, 咱們能夠備份一下, 其實不備份也沒事bash

keepalived.conf 使用如下配置:服務器

[root@master1 ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@master1 ~]# vim /etc/keepalived/keepalived.conf       #清空默認內容,直接採用下面配置:
! Configuration File for keepalived
       
global_defs {  
  router_id mysql1
}
       
vrrp_script chk_mysql_port {     #檢測mysql服務是否在運行。有不少方式,好比進程,用腳本檢測等等
    script "/opt/chk_mysql.sh"   #這裏經過腳本監測
    interval 2                   #腳本執行間隔,每2s檢測一次
    weight -5                    #腳本結果致使的優先級變動,檢測失敗(腳本返回非0)則優先級 -5
    fall 2                      #檢測連續2次失敗纔算肯定是真失敗。會用weight減小優先級(1-255之間)
    rise 1                      #檢測1次成功就算成功。但不修改優先級
}
       
vrrp_instance VI_1 {
    state BACKUP    
    interface enp0s3         #指定虛擬ip的網卡接口
    virtual_router_id 100    #路由器標識,MASTER和BACKUP必須是一致的
    priority 101             #定義優先級,數字越大,優先級越高,在同一個vrrp_instance下,MASTER的優先級必須大於BACKUP的優先級。這樣MASTER故障恢復後,就能夠將VIP資源再次搶回來 
    advert_int 1         
    authentication {   
        auth_type PASS 
        auth_pass 1111     
    }
    virtual_ipaddress {    
        192.168.1.222        #設置虛擬IP
    }
      
    track_script {               
       chk_mysql_port             
    }
}
global_defs 是全局配置, 主要用來在這臺機器上的mysql掛了以後發郵件通知, 不過這裏先不用郵件通知的機制. 主要要配置的是router_id, 其實就是一個標識服務器的id, 兩臺服務器的這個值要不一樣
vrrp_script 是配置檢查mysql是否正常的腳本, 腳本下面會給出
vrrp_instance 是實例, 須要注意的點:
state配成BACKUP表示能夠結合nopreemt設置非搶佔式, 就是A上的mysql掛了, 則vip會漂到B上去, 等A上的mysql再好了, vip也仍是在B上, 要等到B上的mysql掛了, 纔會把vip漂到A上去. 認爲這種方式比較合理, 沒啥好搶的嘛, 都是爲用戶服務嘛, 搶啥.
interface要配成當前機器的真實ip使用的那個網卡, 好比有時候是eth0, 可是我看了我服務器上的是enp0s3:
virtual_router_id
路由器標識,MASTER和BACKUP必須是一致的.
nopreempt設置成非搶佔模式, 這個仍是不要用的好, 下面解釋.

下面給出第二臺機器的keepalived配置:
[root@localhost opt]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
    router_id mysql2
}

vrrp_script chk_mysql_port {
    script "/opt/chk_mysql.sh"
    interval 2
    weight -5
    fall 2
    rise 1
}

vrrp_instance VI_1 {
    state BACKUP
    interface enp0s3
    virtual_router_id 100
    priority 97
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.222
    }
    track_script {               
        chk_mysql_port             
    }
}

能夠看到, 兩臺機器只有router_id和priority不一樣. 並且兩臺都設置成了BACKUP, 沒有nopreempt.spa

/opt/chk_mysql.sh腳本:
#!/bin/bash
MYSQL=/usr/bin/mysql
MYSQL_HOST=localhost
MYSQL_USER=c1551
MYSQL_PASSWORD=1qaz@WSX3edc
CHECK_TIME=3
  
#mysql  is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0
  
MYSQL_OK=1
  
function check_mysql_helth (){
    $MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p${MYSQL_PASSWORD} -e "show status;" >/dev/null 2>&1
    if [ $? = 0 ] ;then
    MYSQL_OK=1
    else
    MYSQL_OK=0
    fi
    echo $MYSQL_OK
    return $MYSQL_OK
}
while [ $CHECK_TIME -ne 0 ]
do
    let "CHECK_TIME -= 1"
    check_mysql_helth
if [ $MYSQL_OK = 1 ] ; then
    CHECK_TIME=0
    exit 0
fi
if [ $MYSQL_OK -eq 0 ] &&  [ $CHECK_TIME -eq 0 ]
then
    echo 'killing keepalived...'
    pkill keepalived
    exit 1
else
    echo 'not killing keepalived...'
fi
sleep 1
done
對於搶佔和非搶佔, 有人是這麼說的:
keepalive是基於vrrp協議在linux主機上以守護進程方式,根據配置文件實現健康檢查。
VRRP是一種選擇協議,它能夠把一個虛擬路由器的責任動態分配到局域網上的VRRP路由器中的一臺。
控制虛擬路由器IP地址的VRRP路由器稱爲主路由器,它負責轉發數據包到這些虛擬IP地址。
一旦主路由器不可用,這種選擇過程就提供了動態的故障轉移機制,這就容許虛擬路由器的IP地址能夠做爲終端主機的默認第一跳路由器。 
keepalive經過組播,單播等方式(自定義),實現keepalive主備推選。工做模式分爲搶佔和非搶佔(經過參數nopreempt來控制)。
1)搶佔模式:
主服務正常工做時,虛擬IP會在主上,備不提供服務,當主服務優先級低於備的時候,備會自動搶佔虛擬IP,這時,主不提供服務,備提供服務。
也就是說,工做在搶佔模式下,不分主備,只管優先級。 
如上配置,無論keepalived.conf裏的state配置成master仍是backup,只看誰的priority優先級高(通常而言,state爲MASTER的優先級要高於BACKUP)。
priority優先級高的那一個在故障恢復後,會自動將VIP資源再次搶佔回來!! 
2)非搶佔模式:
這種方式經過參數nopreempt(通常設置在advert_int的那一行下面)來控制。無論priority優先級,只要MASTER機器發生故障,VIP資源就會被切換到BACKUP上。
而且當MASTER機器恢復後,也不會去將VIP資源搶佔回來,直至BACKUP機器發生故障時,才能自動切換回來。 
千萬注意:
nopreempt這個參數只能用於state爲backup的狀況,因此在配置的時候要把master和backup的state都設置成backup,這樣纔會實現keepalived的非搶佔模式! 

也就是說:
a)當state狀態一個爲master,一個爲backup的時候,加不加nopreempt這個參數都是同樣的效果。即都是根據priority優先級來決定誰搶佔vip資源的,是搶佔模式!
b)當state狀態都設置成backup,若是不配置nopreempt參數,那麼也是看priority優先級決定誰搶佔vip資源,即也是搶佔模式。
c)當state狀態都設置成backup,若是配置nopreempt參數,那麼就不會去考慮priority優先級了,是非搶佔模式!即只有vip當前所在機器發生故障,另外一臺機器才能接管vip。即便優先級高的那一臺機器恢復  後也不會主動搶回vip,只能等到對方發生故障,纔會將vip切回來。


然而我發現, 若是我兩個都設置成BACKUP並且啓用nopreempt, 並且使用上面的健康檢查腳本, 那麼, 若是一臺機器上的mysql掛了, 雖然健康檢查沒過, 這臺機器上keepalived的priority下降了, 可是, vip仍是在這臺機器上. 由於上面也說了, 並不會主動搶加vip, 只有這臺機器上的keepalived掛了或者直接這臺機器掛了, vip纔會漂到另一臺機器上!!! WTF!!! 就是說這臺機器上的mysql雖然掛了, 但這臺機器上的keepalived仍是在一邊等mysql起來, 同時仍是佔用了vip的!! 這顯然不是我想要的. 因此, 仍是不配置nopreempt好了, 讓priority下降的機器自動釋放vip.

以上.code

相關文章
相關標籤/搜索