Mysql系列:高可用(HA)-keeplived

轉自:曉嘆星沉 https://my.oschina.net/blueSky4Java/blog/1572905mysql

摘要: 隨着項目的發展,爲了提升程序的性能,數據庫層面或多或少的會用到HA、讀寫分離、集羣等功能,在選型時能夠考慮使用現成的雲服務,或者一些高可用軟件,亦或是利用一些開源軟件實現上述功能。這次將針對上述功能分篇幅進行整理,內容涉及HA、讀寫分離、集羣,以期使用時達到快速部署之效果。web

1、keepalived簡介

Keepalived的做用是檢測服務器的狀態,若是有一臺web服務器宕機,或工做出現故障,Keepalived將檢測到,並將有故障的服務器從系統中剔除。其使用 VRRP(Virtual Router Redundancy Protocol)虛擬路由冗餘協議,能夠經過在一個路由器組(一個VRRP組)之間共享一個虛擬IP(VIP), 即將N臺提供相同功能的路由器組成一個路由器組,這個組裏面有一個MASTER和多個BACKUP 。當master宕掉後, 根據VRRP的優先級來選舉一個BACKUP當MASTER,及時將業務切換到其它設備,從而保持通信的連續性和可靠性 。sql

    Mysql HA的實現原理(此處以兩臺爲例),兩臺Mysql主主複製,使數據時刻保持一致,同時使用兩個keepalived監聽各自機器上的Mysql,當Mysql服務停掉後,執行腳本關掉keepalived服務,由另外一臺機器的keepalived接替。數據庫

實現此功能須要兩個步驟:服務器

  1. 配置Mysql主主複製
  2. keepalived安裝配置

環境信息:網絡

    master:192.168.102.129(CentOS6.8,hostname爲master)oop

    slave:192.168.102.130(CentOS6.8,hostname爲salve)性能

    VIP:192.168.102.128測試

2、Mysql主主複製

(1)修改mysql配置文件,開啓二進制文件.net

    master的my.cnf

[mysqld]
server_id = 1  #服務id,保證兩臺mysql惟一,不重複便可
log-bin = mysql-bin  #開啓二進制日誌
relay-log = mysql-relay-bin  
replicate-wild-ignore-table=mysql.%  #配置不須要複製的庫
replicate-wild-ignore-table=test.%  
replicate-wild-ignore-table=information_schema.%

    slave的my.cnf

[mysqld]
server_id = 2  
log-bin = mysql-bin  
relay-log = mysql-relay-bin  
replicate-wild-ignore-table=mysql.%  
replicate-wild-ignore-table=test.%  
replicate-wild-ignore-table=information_schema.%

    配置完成後,重啓兩個mysql。

(2)配置主主複製

鏈接mysql,使用show master status查看master和slave兩個mysql的二進制文件名稱和位置

master(192.168.102.129)以下:

slave(192.168.102.130)以下:

根據上述file和position互相配置主從

master(192.168.102.129)以下:

change master to master_host='192.168.102.130', 
master_user='root',master_password='123456',master_port=3306,master_log_file='mysql-
bin.000002',master_log_pos=472;
start slave;

slave(192.168.102.130)以下:

change master to  master_host='192.168.102.129', 
master_user='root',master_password='123456',master_port=3306,master_log_file='mysql-
bin.000002',master_log_pos=724;  
start slave;

(3)測試驗證是否同步

鏈接master,在jz.test中添加記錄m1

鏈接salve,在jz.test中添加記錄s1,結果以下

3、keepalived安裝配置

(1)keepalived安裝

使用yum能夠直接安裝yum install keepalived

網絡不容許的狀況下能夠下載tar或rpm進行離線安裝。本文使用yum直接安裝,安裝過程再也不贅述。

(2)keepalived配置

配置keepalived.conf文件

[root@master ~]# vi /etc/keepalived/keepalived.conf

master配置

! Configuration File for keepalived
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state BACKUP   #master和slave都設置爲BACKUP,
    interface eth0
    virtual_router_id 51
    priority 100  #master和slave設置不一樣值,啓動時會將priority大的設置爲master
    advert_int 1
    nopreempt  #設置爲不搶佔模式,僅master配置。當master掛掉後,slave當選爲master,恢復後再也不切換                 
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.102.128 #虛擬ip
    }
}

virtual_server 192.168.102.128 3306 {
    delay_loop 2  #輪訓real_server時間間隔,此處設爲2秒
    lb_algo rr
    lb_kind NAT
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP

    real_server 192.168.102.129 3306 {
        weight 1
	notify_down /usr/local/mysql/checkMysql.sh #mysql掛掉時執行的腳本,需具有執行權限
        TCP_CHECK {  
	    connect_timeout 10
	    bingto 192.168.102.128  
            nb_get_retry 3  
            delay_before_retry 3  
            connect_port 3306  
        }
    }
}

slave配置

! Configuration File for keepalived
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.102.128
    }
}

virtual_server 192.168.102.128 3306 {
    delay_loop 2
    lb_algo rr
    lb_kind NAT
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP

    real_server 192.168.102.130 3306 {
        weight 1
        notify_down /usr/local/mysql/checkMysql.sh  
        TCP_CHECK {  
            connect_timeout 10  
            bingto 192.168.102.128              
            nb_get_retry 3  
            delay_before_retry 3  
            connect_port 3306  
        }  
    }
}

在/usr/local/mysql/下增長checkMysql.sh,腳本以下(留意腳本權限,需具有執行權限):

pkill keepalived

keepalived加入開機啓動

chkconfig keepalived on

(3)測試keepalived是否生效

啓動master和slave的mysql、keepalived,

鏈接192.168.102.128的數據庫,查詢hostname,此時vip在master機器上

停掉master的mysql服務(service mysql stop)後,vip飄到了slave上。

4、總結

    經過上述配置可初步實現數據庫的高可用性,在Mysql服務出問題時實現自動切換,但在實際應用中應考慮服務宕掉時,應實現郵件通知功能,文中還沒有涉及,後期實現後再作更新。此外Mysql之間出現數據不一樣步問題,也要謹慎處理,暫停數據同步功能,將數據處理後,方可從新開啓同步。

© 著做權歸做者全部

相關文章
相關標籤/搜索