MySQL 雙主 + keepalived

參考:http://www.javashuo.com/article/p-calmawvn-k.htmlhtml

 

MySQL雙主複製 + keepalived 能夠實現數據高可用。雙主即互爲master-slave,其中任意一個改變,另一個會跟着改變(與主從不一樣,主從是單向);能夠實現數據庫服務器的熱備,可是一個Master宕機後不能實現動態切換。使用Keepalived,能夠經過虛擬IP,實現雙主對外的統一接口以及自動檢查、失敗切換機制,從而實現MySQL數據庫的高可用方案。mysql

 

1、雙主配置linux

一、服務器規劃sql

master1:192.168.116.128數據庫

master2:192.168.116.130vim

vip:192.168.116.129bash

 

二、mysql 配置服務器

(1) master1(192.168.116.128) mysql服務器配置ide

進入mysql配置文件:測試

cd /etc/my.cnf

log-bin=mysql-bin
binlog_format=mixed
server-id=128

auto-increment-increment=2
auto-increment-offset=1
log-slave-updates
sync-binlog=1

黑色的是以前主從複製配置信息,紅色的是主主配置須要新增的配置信息。

 

(2) master2(192.168.116.130) mysql服務器配置

進入mysql配置文件:

cd /etc/my.cnf

log-bin=mysql-bin
binlog_format=mixed
server-id=130

auto-increment-increment=2
auto-increment-offset=2
log-slave-updates
sync-binlog=1

黑色的是以前主從複製配置信息,紅色的是主主配置須要新增的配置信息

 

(3) master1,master2 分別建立複製帳號

master1 執行下列語句:

grant replication slave on *.* to 'latiny130'@'192.168.116.130' identified by '123456'; 

建立的帳號是給做爲從服務器master2使用

 

master2 執行下列語句:

grant replication slave on *.* to 'latiny128'@'192.168.116.128' identified by '123456'; 

建立的帳號是給做爲從服務器master1使用

 

(4) 登陸到命令行分別查看master1,master2做爲主數據庫的狀態

master1

File爲mysql-bin.000001,Position爲154纔是初始狀態,若是不是這兩個值,最好重置一下,輸入reset master便可。

 

master2

 

 (5)  配置並啓動master一、master2從服務器線程信息
① master1
登陸到命令行,重置從服務器線程狀態
stop slave;
reset slave;
 
配置從服務器訪問主服務器的信息,注意這裏配置的master1做爲從服務器配置的信息對應的應該是master2服務器信息

change master to master_host='192.168.116.130',master_user='latiny130',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=154;

啓動master1的slave線程

start slave;

 

② master2
登陸到命令行,重置從服務器線程狀態
stop slave;
reset slave;
 
配置從服務器訪問主服務器的信息,注意這裏配置的master2做爲從服務器配置的信息對應的應該是master1服務器信息

change master to master_host='192.168.116.128',master_user='latiny128',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=154;

啓動master2的slave線程

start slave;

 

至此,master1 與 master2 互爲主從的配置完成,能夠進行測試,分別修改master1與master2上mysql的數據,檢查另一個庫會不會一塊兒改變。
 
2、配置mysql + keepalived 高可用環境
 
一、安裝keepalived 並將其配置成系統服務,master1和master2兩臺機器上一樣進行以下操做
 
[root@master1 ~]# yum install -y openssl-devel
[root@master1 ~]# cd /usr/local/src/
[root@master1 src]# wget http://www.keepalived.org/software/keepalived-1.3.5.tar.gz
[root@master1 src]# tar -zvxf keepalived-1.3.5.tar.gz
[root@master1 src]# cd keepalived-1.3.5
[root@master1 keepalived-1.3.5]# ./configure --prefix=/usr/local/keepalived
[root@master1 keepalived-1.3.5]# make && make install
     
[root@master1 keepalived-1.3.5]# cp /usr/local/src/keepalived-1.3.5/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/
[root@master1 keepalived-1.3.5]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@master1 keepalived-1.3.5]# mkdir /etc/keepalived/
[root@master1 keepalived-1.3.5]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
[root@master1 keepalived-1.3.5]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
[root@master1 keepalived-1.3.5]# echo "/etc/init.d/keepalived start" >> /etc/rc.local

 

 二、master1 對keeplived.conf 進行修改
vim /etc/keepalived/keepalived.conf
清空默認內容,採用以下配置:
bal_defs {
    notification_email {
    ops@wangshibo.cn
    tech@wangshibo.cn
    }
           
    notification_email_from ops@wangshibo.cn
    smtp_server 127.0.0.1 
    smtp_connect_timeout 30
    router_id MASTER-HA
}

#檢測mysql服務是否在運行。有不少方式,好比進程,用腳本檢測等等
vrrp_script chk_mysql_port {
    #這裏經過腳本監測
    script "/opt/chk_mysql.sh"
    #腳本執行間隔,每2s檢測一次
    interval 2
    #腳本結果致使的優先級變動,檢測失敗(腳本返回非0)則優先級 -5
    weight -5
    #檢測連續2次失敗纔算肯定是真失敗。會用weight減小優先級(1-255之間)
    fall 2
    #檢測1次成功就算成功。但不修改優先級
    rise 1   
}
       
vrrp_instance VI_1 {
    state MASTER
    #指定虛擬ip的網卡接口
    interface eth0
    mcast_src_ip 192.168.116.128
    #路由器標識,MASTER和BACKUP必須是一致的    
    virtual_router_id 51 #定義優先級,數字越大,優先級越高,在同一個vrrp_instance下,MASTER的優先級必須大於BACKUP
    priority 101
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.116.129
    }
      
    track_script { 
        chk_mysql_port
    }
}
View Code

 

編寫切換腳本 vim /opt/chk_mysql.sh

MYSQL=/usr/bin/mysql
MYSQL_HOST=localhost
MYSQL_USER=root
MYSQL_PASSWORD=123456
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
    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
    pkill keepalived
    exit 1
fi
sleep 1
done
View Code

對腳本受權:chmod 755 /opt/chk_mysql.sh

啓動keepalived:/etc/init.d/keepalived start

 

三、master2 對keeplived.conf 進行修改
bal_defs {
    notification_email {
    ops@wangshibo.cn
    tech@wangshibo.cn
    }
           
    notification_email_from ops@wangshibo.cn
    smtp_server 127.0.0.1 
    smtp_connect_timeout 30
    router_id MASTER-HA
}
       
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 eth0    
    mcast_src_ip 191.168.116.130
    virtual_router_id 51    
    priority 99          
    advert_int 1         
    authentication {   
        auth_type PASS 
        auth_pass 1111     
    }
    virtual_ipaddress {    
        192.168.116.129
    }
      
    track_script {               
        chk_mysql_port             
    }
}
View Code

 

編寫切換腳本 vim /opt/chk_mysql.sh

MYSQL=/usr/bin/mysql
MYSQL_HOST=localhost
MYSQL_USER=root
MYSQL_PASSWORD=123456
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
    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
    pkill keepalived
    exit 1
fi
sleep 1
done
View Code

對腳本受權:chmod 755 /opt/chk_mysql.sh

啓動keepalived:/etc/init.d/keepalived start

 

四、兩臺服務器受權容許root用戶或者其用戶(chk_mysql.sh裏配置的),用戶在客戶端登陸測試

登陸命令行:grant all on *.* to root@'192.168.116.129' identified by "123456";

 
 
五、兩臺服務器的防火牆配置,關閉防火牆或者打開mysql的端口,默認爲3306
 
 
六、測試
(1) 遠程客戶端登陸vip 服務器192.168.116.129,對數據庫進行操做,會同步到master1與master2;
(2) 關閉master1,vip會自動切到master2;恢復master1,vip會切回maseter1;

 

 3、keepalived  的搶佔和非搶佔模式
 
keepalive 是基於vrrp 協議在linux主機上以守護進程方式,根據配置文件實現健康檢查。vrrp 是一種選擇協議,它能夠把一個虛擬路由器的責任動態分配到局域網上的VRRP路由器中的一臺。控制虛擬路由器IP地址的VRRP路由器稱爲主路由器,它負責轉發數據包到這些虛擬IP地址。一旦主路由器不可用,這種選擇過程就提供了動態的故障轉移機制,這就容許虛擬路由器的IP地址能夠做爲終端主機的默認第一跳路由器。
 
keepalive經過組播,單播等方式(自定義),實現keepalive主備推選。工做模式分爲搶佔和非搶佔(經過參數nopreempt來控制)。
 
一、搶佔模式
 
主服務正常工做時,虛擬IP會在主上,備不提供服務,當主服務優先級低於備的時候,備會自動搶佔虛擬IP,這時,主不提供服務,備提供服務。也就是說,工做在搶佔模式下,不分主備,只管優先級。
 
如上配置,無論keepalived.conf裏的state配置成master仍是backup,只看誰的priority 優先級高(通常而言,state爲master的優先級要高於backup)。priority 優先級高的那一個在故障恢復後,會自動將VIP資源再次搶佔回來!!
 
二、非搶佔模式
這種方式經過參數nopreempt(通常設置在advert_int的那一行下面)來控制。無論priority優先級,只要master 機器發生故障,vip 資源就會被切換到backup上。而且當master 機器恢復後,也不會去將vip 資源搶佔回來,直至backup機器發生故障時,才能自動切換回來。
 

千萬注意:
nopreempt這個參數只能用於state爲backup的狀況,因此在配置的時候要把master和backup的state都設置成backup,這樣纔會實現keepalived的非搶佔模式!

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

相關文章
相關標籤/搜索