linux覆盤:keepalived+mysql雙主構建高可用數據庫

關於MySQL-HA,目前有多種解決方案,好比heartbeat、drbd、mmm、共享存儲,可是它們各有優缺點。heartbeat、drbd配置較爲複雜,須要本身寫腳本才能實現MySQL自動切換,對於不會腳本語言的人來講,這無疑是一種腦裂問題;對於mmm,生產環境中不多有人用,且mmm管理端須要單獨運行一臺服務器上,要是想實現高可用,就得對mmm管理端作HA,這樣無疑又增長了硬件開支;對於共享存儲,MySQL數據仍是放在本地較爲安全,存儲設備畢竟存在單點隱患。mysql

使用MySQL雙master+keepalived是一種很是好的解決方案,在MySQL-HA環境 中,MySQL互爲主從關係,這樣就保證了兩臺MySQL數據的一致性,而後用keepalived實現虛擬IP,經過keepalived自帶的服務監 控功能來實現MySQL故障時自動切換。linux

機器ip及版本:

MySQL-VIP	    192.168.230.200
MySQL-master1	192.168.230.130
MySQL-master2	192.168.230.152

OS版本:CentOS 7.3    
MySQL版本:5.6    
Keepalived版本:1.2.7

 第一步關閉防火牆:nginx

selinux永久關閉 vi /etc/selinux/config selinux修改此處爲disabled,reboot重啓生效

關閉firewalld:
systemctl disable firewalled 先暫停,不讓開機啓動

systemctl stop firewalld 關閉服務

關閉iptables:
systemctl disable iptables

systemctl stop iptables

第二步mysql雙主配置:算法

兩臺MySQL均如要開啓binlog日誌功能,開啓方法:在MySQL配置文件[MySQLd]段中加上log-bin=MySQL-bin選項 兩臺MySQL的server-ID不能同樣,默認狀況下兩臺MySQL的serverID都是1,需將其中一臺修改成2便可sql

Master1配置:

vim /etc/my.cnf

[mysqld]
datadir = /data/mysql
socket = /tmp/mysql.sock
server_id = 1                 #指定server-id,必須保證主從服務器的server-id不一樣
auto_increment_increment = 2  #設置主鍵單次增量
auto_increment_offset = 1     #設置單次增量中主鍵的偏移量
log-bin = mysql-bin           #建立主從須要開啓log-bin日誌文件
log-slave-updates             #把更新的日誌寫到二進制文件(binlog)中
master2配置:

vim /etc/my.cnf

[mysqld]
datadir = /data/mysql
socket = /tmp/mysql.sock
server_id = 2                 #指定server-id,必須保證主從服務器的server-id不一樣
auto_increment_increment = 2  #設置主鍵單次增量
auto_increment_offset = 2     #設置單次增量中主鍵的偏移量
log-bin = mysql-bin           #建立主從須要開啓log-bin日誌文件
log-slave-updates             #把更新的日誌寫到二進制文件(binlog)中

重要參數:vim

log-slave-updates = true #將複製事件寫入binlog,一臺服務器作主庫又作從庫此選項必需要開啓安全

重啓兩臺server的mysql服務:bash

/etc/init.d/mysqld restart

 將192.168.230.130設爲192.168.230.152的主服務器:服務器

mysql -uroot

mysql> grant replication slave on *.* to 'repl'@'192.168.230.152' identified by 'zhangduanya';

mysql> flush privileges;

將192.168.230.152設爲192.168.230.130的主服務器:socket

mysql -uroot

mysql> grant replication slave on *.* to 'repl'@'192.168.230.130' identified by 'zhangduanya';

mysql> flush privileges;

在Mysql-Master1上操做:

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |      421 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> change master to master_host='192.168.230.152',master_port=3306,master_user='repl',master_password='zhangduanya',master_log_file='mysql-bin.000002',master_log_pos=120;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

mysql>  show slave status\G
yes
yes

在Mysql-Master2上操做:

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 |      120 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> change master to master_host='192.168.230.130',master_port=3306,master_user='repl',master_password='zhangduanya',master_log_file='mysql-bin.000003',master_log_poos=421;
Query OK, 0 rows affected, 2 warnings (0.06 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

mysql>  show slave status\G
yes
yes

##注意若是開始就啓動了start slave,在操做同步的時候須要先中止它,stop slave

以上把雙主作完了下來搞keepalived:

192.168.230.130服務器上keepalived安裝及配置 安裝keepalived

固然安裝推薦源碼包安裝,或者懶了就yum直接安裝

yum install -y keepalived

或者

yum install -y pcre-devel openssl-devel popt-devel   #安裝依賴包

cd /usr/local/src

wget http://www.keepalived.org/software/keepalived-1.2.7.tar.gz

tar -zxvf keepalived-1.2.7.tar.gz

cd ./keepalived-1.2.7

./configure --prefix=/usr/local/keepalived

make  &&  make install

echo $?

cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/

chmod +x /etc/init.d/keepalived  

chkconfig --add keepalived  

chkconfig keepalived on  

cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

mkdir /etc/keepalived/

cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

而後配置130的keepalived:

vi /etc/keepalived/keepalived.conf

vi /etc/keepalived/keepalived.conf
#寫入如下內容
! Configuration File forkeepalived
global_defs {
notification_email {
test@sina.com
 }
notification_email_from  admin@admin.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id MYSQL_HA      #標識,雙主相同
 }
vrrp_instance VI_1 {
 state BACKUP           #兩臺都設置BACKUP
 interface ens33
 virtual_router_id 51       #主備相同
 priority 100   #優先級,另外一臺改成90    
 advert_int 1    
 nopreempt  #不搶佔,只在優先級高的機器上設置便可,優先級低的機器不設置    
 authentication {
 auth_type PASS
 auth_pass 1111
 }
 virtual_ipaddress {
 192.168.230.200
 }
}

virtual_server 192.168.230.200 3306 {    
     delay_loop 2   #每一個2秒檢查一次real_server狀態    
     lb_algo wrr   #LVS算法    
     lb_kind DR    #LVS模式    
     persistence_timeout 60   #會話保持時間    
     protocol TCP    
     real_server 192.168.230.130 3306 {    
         weight 3    
         notify_down /usr/local/keepalived/mysql.sh  #檢測到服務down後執行的腳本    
         TCP_CHECK {    
             connect_timeout 10    #鏈接超時時間    
             nb_get_retry 3       #重連次數  
             delay_before_retry 3   #重連間隔時間    
             connect_port 3306   #健康檢查端口  
         }  
     }    
}

編寫檢測服務down後所要執行的腳本(添加/usr/local/keepalived/mysql.sh)

vim  /usr/local/keepalived/mysql.sh

#!/bin/bash
pkill keepalived
sleep  10
/etc/init.d/keepalived start  >/dev/null

----------
# chmod +x /usr/local/keepalived/mysql.sh

注:此腳本是上面配置文件notify_down選項所用到的,keepalived使用notify_down選項來檢查real_server 的服務狀態,當發現real_server服務故障時,便觸發此腳本;咱們能夠看到,腳本就一個命令,經過pkill keepalived強制殺死keepalived進程,從而實現了MySQL故障自動轉移。另外,咱們不用擔憂兩個MySQL會同時提供數據更新操做, 由於每臺MySQL上的keepalived的配置裏面只有本機MySQL的IP+VIP,而不是兩臺MySQL的IP+VIP。

啓動keepalived

/etc/init.d/keepalived start

192.168.230.152上keepalived安裝及配置 安裝keepalived,安裝方法參照192.168.230.130的安裝方法 配置keepalived 這臺配置和上面基本同樣,但有三個地方不一樣:優先級爲90、無搶佔設置、real_server爲本機IP

vi /etc/keepalived/keepalived.conf

vi /etc/keepalived/keepalived.conf
#寫入如下內容
! Configuration File forkeepalived
global_defs {
notification_email {
test@sina.com
 }
notification_email_from  admin@admin.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id MYSQL_HA      #標識,雙主相同
 }
vrrp_instance VI_1 {
 state BACKUP           #兩臺都設置BACKUP
 interface ens33
 virtual_router_id 51       #主備相同
 priority 90   #優先級,此處應改成90    
 advert_int 1    
 authentication {
 auth_type PASS
 auth_pass 1111
 }
 virtual_ipaddress {
 192.168.230.200
 }
}

virtual_server 192.168.230.200 3306 {    
     delay_loop 2   #每一個2秒檢查一次real_server狀態    
     lb_algo wrr   #LVS算法    
     lb_kind DR    #LVS模式    
     persistence_timeout 60   #會話保持時間    
     protocol TCP    
     real_server 192.168.230.152 3306 {    
         weight 3    
         notify_down /usr/local/keepalived/mysql.sh  #檢測到服務down後執行的腳本    
         TCP_CHECK {    
             connect_timeout 10    #鏈接超時時間    
             nb_get_retry 3       #重連次數  
             delay_before_retry 3   #重連間隔時間    
             connect_port 3306   #健康檢查端口  
         }  
     }    
}

編寫檢測服務down後所要執行的腳本(添加/usr/local/keepalived/mysql.sh) 

而後仍是殺掉mysql的腳本:

vim  /usr/local/keepalived/mysql.sh

#!/bin/bash
pkill keepalived
sleep  10
/etc/init.d/keepalived start  >/dev/null

----------
# chmod +x /usr/local/keepalived/mysql.sh

啓動keepalived

/etc/init.d/keepalived start

 好了配置完了,測試

若是服務器宕機,Keepalived服務確定回中止工做,因此在此經過開/關Keepalived來模擬宕機狀態:

宕機前:

查看master服務器IP狀態:
ip add
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:8a:1b:5c brd ff:ff:ff:ff:ff:ff
    inet 192.168.230.130/24 brd 192.168.8.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.230.200/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::65d2:adc:20d3:8c74/64 scope link 
       valid_lft forever preferred_lft forever

查看backup服務器IP狀態:  
ip add
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:af:b7:9f brd ff:ff:ff:ff:ff:ff
    inet 192.168.230.152/24 brd 192.168.8.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::76c1:b882:4f26:608c/64 scope link 
       valid_lft forever preferred_lft forever

說明: 此時VIP在master服務器上,說明有master對外提供服務。
vip也綁定在master這臺機器上

master服務器宕機後:

此時vip到了152機器上,此時有backup服務器接管master服務器對外提供服務。

恢復master服務器Keepalived服務,此時VIP並無回到master服務器上,緣由是master在進行Keepalived的時候加入了參數nopreemt。

注意:緣由是nopreemt不搶佔,只在優先級高的機器上設置便可,優先級低的機器不設置 ,我們給130這個優先級高的設置不搶佔資源,因此vip停留在152上提供服務

相關文章
相關標籤/搜索