keepalive配置mysql自動故障轉移

zping發表於2017-11-30

本文先配置了一個雙master環境,互為主從,然後通過Keepalive配置了一個虛擬IP,客戶端通過虛擬IP連線master1,當master1當機,自動切換到master2。一次只能連線其中一個master進行讀寫,所以是active-passive模式。

一 Mysql主主複製搭建

 

1.1 實驗環境

 

兩臺機器事先都已經裝好了mysql單例項。 


二者的埠號需要保持一致,否則在最後用vip連線的時候,不能使用相同埠號連線。 

 

1.2 實驗步驟

 

1.2.1 修改配置檔案

修改master1:

在[mysqld]下面新增:

server-id =  1

relay-log=/data/server/mysql_3307/binlog/ZabbixServer-relay-bin

relay-log-index=/data/server/mysql_3307/binlog/ZabbixServer-relay-bin.index

auto-increment-offset = 1    

auto-increment-increment = 2 

log-slave-updates=true

 

修改master2:

在[mysqld]下面新增:

server-id =  3

relay-log =/data/server/mysql/binlog/single-relay-bin

relay-log-index=/data/server/mysql/binlog/single-relay-bin.index

auto-increment-offset = 2   

auto-increment-increment = 2 

log-slave-updates=true

 

新增auto-increment-offset那兩項,是為了避免在MySQL INSERT時主鍵衝突。

 

修改完後記得重啟mysql

 

1.2.2 建複製使用者

分別在兩臺mysql上執行

GRANT REPLICATION SLAVE ON *.* TO 'RepUser'@'%'identified by 'beijing';

1.2.3 指向master

兩臺伺服器均為新建立,且無其它寫入操作,各伺服器只需記錄當前自己二進位制日誌檔案及事件位置,以之作為另外的伺服器複製起始位置即可。否則,需要先備份主庫,在備庫進行恢復,從而保持資料一致,然後再指向master。

Master1:

mysql> show master status;

+------------------+----------+--------------+------------------+-------------------+

| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+------------------+----------+--------------+------------------+-------------------+

| mysql-bin.000001 |      302|              |                  |                   |

+------------------+----------+--------------+------------------+-------------------+

1 row in set (0.00 sec)

Master2:

mysql> show master status;

+------------------+----------+--------------+------------------+-------------------+

| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+------------------+----------+--------------+------------------+-------------------+

| mysql-bin.000001 |      120 |              |                  |                   |

+------------------+----------+--------------+------------------+-------------------+

1 row in set (0.00 sec)

#Master1指向Master2

 

[sql] view plain copy
 
  1. CHANGE MASTER TO MASTER_USER='RepUser',MASTER_HOST='192.168.1.21',MASTER_PASSWORD='beijing',MASTER_PORT=3307,MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=120;  


#Master2指向Master1

 

 

[sql] view plain copy
 
  1. CHANGE MASTER TO MASTER_USER='RepUser',MASTER_HOST='192.168.1.22',MASTER_PASSWORD='beijing', MASTER_PORT=3307,MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=302;  



 

1.2.4 分別啟動slave

start slave ;

確保show slave status

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

測試兩邊是否同步,略。

 

二:配置keepalived

 

1 keepalive安裝

分別在master1,master2上安裝keepalive

 

[plain] view plain copy
 
  1. yum install -y popt-devel  
  2. cd /usr/local/src  
  3. wget http://www.keepalived.org/software/keepalived-1.2.2.tar.gz  
  4. tar zxvf keepalived-1.2.2.tar.gz  
  5. cd keepalived-1.2.2  
  6. ./configure --prefix=/  
  7. make  
  8. make install  

#假如在執行./configure --prefix=/時報錯: OpenSSL is not properly installed on your system !!!Can notinclude OpenSSL headers files,則yum install openssl-devel -y

2 分別在master1,master2上新建檢查mysql指令碼

vi /root/check_mysql.sh

內容如下

 

[plain] view plain copy
 
MYSQL=/usr/local/mysql/bin/mysql  
MYSQL_HOST=localhost  
MYSQL_USER=root  
MYSQL_PASSWORD=cc.123  
  
  
$MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "show status;" >/dev/null 2>&1  
#$mysqlclient --host=$host --port=$port --user=$user --password=$password  -e "show databases;" > /dev/null 2>&1  
if [ $? == 0 ]  
then  
    echo " $host mysql login successfully "  
    exit 0  
else  
    #echo " $host mysql login faild"  
    /etc/init.d/keepalived stop  
    exit 2  
fi 

  

 

chmod +x /root/check_mysql.sh

 

3 修改配置檔案

vi /etc/keepalived/keepalived.conf

master1和master2配置檔案內容相同。

內容:

 

global_defs {
     router_id HA_MySQL
}

vrrp_script check_mysql {                   ######定義監控mysql的指令碼  
     script "/root/check_mysql.sh"  
     interval 2                             ######監控時間間隔  
     weight 2                               ######負載引數  
     }  
vrrp_instance VI_1 {
     state BACKUP
     interface eth0
     virtual_router_id 51
     priority 100
     advert_int 1
     nopreempt
     authentication {
         auth_type PASS
         auth_pass 1111
     }
     virtual_ipaddress {
            192.168.60.251
     }
}

track_script {                              ######執行監控mysql程式的指令碼  
     check_mysql  
}  

virtual_server 192.168.60.251 3306 {
     delay_loop 2
     lb_algo wrr
     lb_kind DR
     persistence_timeout 60
     protocol TCP
     real_server 192.168.60.168 3306 {
         weight 3
         notify_down /root/shutdown.sh
         TCP_CHECK {
             connect_timeout 10
             nb_get_retry 3
             delay_before_retry 3
             connect_port 3306
         } 
     }
}

  

 

這裡state不配置MASTER,且優先順序一樣,是期望在MASTER1當機後再恢復時,不主動將MASTER狀態搶過來,避免MySQL服務的波動。

由於不存在使用lvs進行負載均衡,不需要配置虛擬伺服器virtual server,下同。 

 

vi /etc/sysconfig/iptables

 

#注意,在兩臺機器上都要修改。

新增:

-A INPUT -d 192.168.1.60/32 -j ACCEPT

-A INPUT -d 224.0.0.18 -j ACCEPT #新增VRRP通訊支援

注意:第一行中的192.168.1.60需要改成你自己的vip。

service iptables restart

 

5 啟動keepalived

在master1、master2上分別啟動:
service keepalived start

分別執行ip addr命令,可以在其中一臺機器上看到虛擬IP.如:

[root@slave1 keepalived]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_faststate UP qlen 1000
    link/ether 08:00:27:04:05:16 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.22/24 brd 192.168.1.255 scope global eth0
    inet 192.168.1.60/32 scope global eth0
    inet6 fe80::a00:27ff:fe04:516/64 scope link tentativedadfailed 
       valid_lft forever preferred_lft forever

說明虛擬vip連在了master1這臺機器上。

如果自動只連線到了master2,關閉master2的keepalived,再啟動,自動就連線到master1了。

現在都可以ping通虛擬ip了。

 

 

6 測試

停止master1伺服器keepalived,檢查VIP是否切換到master2伺服器(用ip addr命令驗證即可);
 

三 測試高可用環境是否配置成功

 

3.1 建允許遠端訪問的使用者

在master1,master2建立允許遠端訪問的使用者:

grant select,update,delete,insert on *.* to 'dandan' identified by 'dandan';

 

3.2 訪問虛擬IP

用一臺同網段的機器訪問通過vip訪問資料庫:

mysql -u dandan-pdandan -h 192.168.1.60 --port 3307

停止master1伺服器的mysql,VIP切換到了master2伺服器。

在master2上檢視:

 

[plain] view plain copy
 
  1. mysql> showprocesslist;  
  2. +----+-------------+--------------------+------+---------+------+-----------------------------------------------------------------------------+------------------+  
  3. | Id | User        | Host               | db   | Command | Time | State                                                                      | Info             |  
  4. +----+-------------+--------------------+------+---------+------+-----------------------------------------------------------------------------+------------------+  
  5. |  3 | root        | localhost          | dba | Query   |    0 | init                                                                       | show processlist |  
  6. | 14 | systemuser |                    | NULL |Connect |  247 | Reconnecting after afailed master event read                               | NULL             |  
  7. | 15 | systemuser |                    | NULL |Connect |  207 | Slave has read all relaylog; waiting for the slave I/O thread to update it | NULL             |  
  8. | 90 |dandan      | 192.168.1.60:39995 |dba  | Sleep   |    8|                                                                            | NULL             |  
  9. +----+-------------+--------------------+------+---------+------+-----------------------------------------------------------------------------+------------------+  


看到了dandan的連線資訊。

相關文章