1. 程式人生 > >mysql雙機熱備以及使用keepalived實現mysql雙主高可用

mysql雙機熱備以及使用keepalived實現mysql雙主高可用

根據蒐集的資料安裝測試並在安裝測試過程中整理的文件,部分參考文件在相應位置有標記。如有不足希望不吝賜教。

mysql雙機熱備的方式有兩種:

  • 主-從伺服器雙機熱備
  • 主-主伺服器雙機熱備

下文以主-主伺服器雙機熱備為例,主-從配置類似。

兩臺centos7,ip分別為:

172.17.1.136

172.17.3.134

目錄

四、驗證

3.測試

4.其他

一、安裝mysql

本步驟兩臺主機都要執行一遍。兩臺主機都要安裝,mysql安裝見《CentOS7安裝mysql8.0.12》或自行搜尋。

安裝完成後使用命令登入,密碼為自己配置的密碼:

mysql -uroot -p

建立一個測試資料庫:

CREATE DATABASE `test`;

使用test庫(use test;)建立一個測試空表:

create table tb_mobile( mobile VARCHAR(20) comment'手機號碼', time timestamp DEFAULT now() comment'時間' );

注意:網上資料中提到 配置之前要保證兩個mysql資料一致,但因為本次配置兩臺mysql都為全新安裝,因此未測試。

二、伺服器配置

1.建立同步使用者

使用mysql庫,

use mysql

然後分別為另一主機建立一個連結使用者,該帳戶必須授予REPLICATION SLAVE許可權,因為mysql8在授權語句中不能出現IDENTIFIED BY ‘password’;,因此建立使用者和授予許可權需要分開執行:

1) 在136上執行建立使用者並賦權:

CREATE USER 'replicate'@'172.17.3.134' IDENTIFIED WITH 'mysql_native_password' BY '[email protected]';

因為mysql8的許可權驗證機制改變,因此在使用下面的命令建立使用者時會有異常提示

create user 'replicate'@'172.17.3.134' identified by '[email protected]';

GRANT REPLICATION SLAVE ON *.* TO 'replicate'@'172.17.3.134';

2) 在134上執行:

CREATE USER 'replicate'@'172.17.1.136' IDENTIFIED WITH 'mysql_native_password' BY '[email protected]';
GRANT REPLICATION SLAVE ON *.* TO 'replicate'@'172.17.1.136';

【注意】對使用者做了許可權變更之後,一定記得重新載入一下許可權,將許可權資訊從記憶體中寫入資料庫。

flush privileges;

建立完成後我們可以通過使用對方主機對本機資料庫進行訪問,看下是否能連結成功【注意:連結對方主機時需要先退出本機mysql或者開啟新的終端】:

mysql -h172.17.3.134 -ureplicate [email protected]
mysql -h172.17.1.136 -ureplicate [email protected]

如果登入成功,則可以對兩臺伺服器進行雙機熱備操作。

2.修改mysql配置檔案

安裝mysql後會在/etc/目錄下生成一個my.cnf配置檔案(如果沒有可以從/usr/share/mysql目錄下複製一份:cp /usr/share/mysql/my-medium.cnf /etc/my.cnf),找到配置檔案後編輯(vim /etc/my.cnf),在[mysqld]中新增(修改)如下內容:

1)172.17.1.136主機

server-id=1 # 唯一id

innodb_flush_log_at_trx_commit=2 # 預設為1

log-bin=mysql-bin-1 #binlog日誌檔名(可以任意命名)

#binlog-do-db=test # 記錄日誌的資料庫(如果沒有此項,表示同步所有的庫)

binlog-ignore-db=mysql,information_schema,performance_schema,sys # 不記錄日誌的資料庫

sync_binlog=1 #開啟binlog日誌同步功能

slave_skip_errors=1146 # 跳過1146錯誤

2)172.17.3.134主機

server-id=2 # 唯一id

innodb_flush_log_at_trx_commit=2 # 預設為1

log-bin=mysql-bin-2 #binlog日誌檔名(可以任意命名)

#binlog-do-db=test # 記錄日誌的資料庫

binlog-ignore-db=mysql,information_schema,performance_schema,sys # 不記錄日誌的資料庫

sync_binlog=1 #開啟binlog日誌同步功能

slave_skip_errors=1146 # 跳過1146錯誤

三、重啟並配置同步

1.重啟兩臺主機上的mysql

兩臺主機分別執行:

systemctl restart mysqld
或者
service mysqld restart

2.檢視兩個伺服器作為主伺服器的狀態

show master status\G

3.用change mster 語句指定同步位置

進入mysql操作介面(mysql -uroot -p),先執行如下指令:

unlock tables;

否則在執行stop slave;時會報如下異常:ERROR 1192 (HY000): Can't execute the given command because you have active locked tables or an active transaction。

1)172.17.1.136主機

先停步slave服務執行緒,這個是很重要的,如果不這樣做會造成以下操作不成功。

stop slave;

然後:

change master to
master_host='172.17.3.134',master_user='replicate',master_password='[email protected]',
master_log_file='mysql-bin-2.000001',master_log_pos=749;

分別在伺服器上重啟從服務執行緒:

start slave;

2)172.17.3.134主機

先停步slave服務執行緒,這個是很重要的,如果不這樣做會造成以下操作不成功。

stop slave;

然後:

change master to
master_host='172.17.1.136',master_user='replicate',master_password='[email protected]',
master_log_file='mysql-bin-1.000001',master_log_pos=749;

分別在伺服器上重啟從服務執行緒:

start slave;

4.檢視從伺服器狀態

show slave status\G

如果如下兩項狀態為yes則說明配置成功:

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

四、驗證

在兩臺主機的mysql中插入/刪除資料等操作,另一臺會自動將操作同步。

五、配置keepalived實現mysql雙主高可用

上面的配置已經可以實現mysql雙擊熱備,兩臺主機分別對外提供服務,如果服務連結某一臺主機mysql故障,不能自動切換到另一臺主機實現高可用,如果此可以滿足需要或者不用切換,則可以不繼續進行配置。下面將配置keepalived實現其高可用。

1.下載安裝keepalived

安裝位置:/usr/local/    cd /usr/local/

使用下面命令下載並解壓:

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

tar -xzvf keepalived-2.0.6.tar.gz -C keepalived

在安裝之前需要使用下面命令安裝相關依賴:

yum -y install curl gcc openssl-devel libnl3-devel net-snmp-devel
yum -y install libnfnetlink-devel
yum -y install ipvsadm

然後安裝keepalived:

cd keepalived
./configure
make && make install

PS:編譯時出現問題(異常),根據異常資訊進行相應的修改,如果出現缺少xx-devel等資訊,安裝xx-devel即可,其他請根據異常資訊決定如果操作。

編譯安裝後,會根據系統環境,生成啟動指令碼,如下:

cat /usr/lib/systemd/system/keepalived.service

將keepalved加進系統服務並且在/etc/sysconfig/寫入配置檔案以及將keepalived命令加進/usr/bin 和 /usr/sbin(下面命令中註釋在使用中忽略):

cp /usr/local/keepalived/keepalived/etc/init.d/keepalived /etc/init.d/keepalived  #最好檢視下keeplaived是否有執行許可權
mkdir /etc/keepalived/
cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/sbin/keepalived /usr/bin/  #方便以後檢視keepalived的版本,用keepalived  -v可以檢視
cp /usr/local/sbin/keepalived /usr/sbin/

拷貝完成後修改配置檔案:

vim /etc/keepalived/keepalived.conf

以下是配置的內容,根據實際修改,不可直接複製

1)172.17.1.136主機

! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    nopreempt #不搶佔模式,只有優先順序高的機器上設定即可,優先順序低的機器可不設定
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.17.3.210
    }
}

virtual_server 172.17.3.210 3306 {
    delay_loop 2
    lb_algo wrr
    lb_kind DR
    persistence_timeout 60 #會話保持時間
    protocol TCP

    real_server 172.17.1.136 3306 {
        weight 3
        notify_down /root/shutdown.sh #檢測到服務down後執行的指令碼
        TCP_CHECK {
            nb_get_retry 3    #重連次數
            connect_timeout 10 #連線超時時間
            delay_before_retry 3 #重連間隔時間
            connect_port 3306 #健康檢查埠
        }
    }
}

2)172.17.3.134主機

! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL # 標識本節點的字條串,通常為hostname
   vrrp_skip_check_adv_addr
   #vrrp_strict #這個最好註釋掉,否則可能造成物理機的瀏覽器無法訪問應用
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    #state MASTER
    state BACKUP
    interface eno16777736
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress { # Block limited to 20 IP addresses @IP
        172.17.3.210
    }
}

#虛擬伺服器定義塊
virtual_server 172.17.3.210 3306 {
    delay_loop 2
    lb_algo wrr
    lb_kind DR
    persistence_timeout 60
    protocol TCP

    real_server 172.17.3.134 {
        weight 3
        notify_down /root/shutdown.sh
        TCP_CHECK {
            nb_get_retry 3    #重連次數
            connect_timeout 10 #連線超時時間
            delay_before_retry 3 #重連間隔時間
            connect_port 3306 #健康檢查埠
        }
    }
}

編寫檢測服務down後所要執行的指令碼shutdown.sh:

vim /root/shtdown.sh

內容為

#!/bin/bash

killall keepalive

注:此指令碼是上面配置檔案notify_down選項所用到的,keepalived使用notify_down選項來檢查real_server的服務狀態,當發現real_server服務故障時,便觸發此指令碼;我們可以看到,指令碼就一個命令,通過killall keepalived強制殺死keepalived程序,從而實現了MySQL故障自動轉移。另外,我們不用擔心兩個MySQL會同時提供資料更新操作,因為每臺MySQL上的keepalived的配置裡面只有本機MySQL的IP+VIP,而不是兩臺MySQL的IP+VIP

2.啟動keepalived並檢視日誌

chkconfig keepalived on
service keepalived start	#啟動服務
service keepalived stop		#停止服務
service keepalived restart	#重啟服務

systemctl enable keepalived.service		#設定開機啟動

啟動後檢視日誌:

tail -f /var/log/messages

3.測試

在遠端客戶端通過vip登陸測試

mysql -h 172.17.3.210 -uroot -p

4.其他

1)修改日誌位置

修改日誌檔案存放位置/var/log/keepalived/keepalived.log

echo 'local0.* /var/log/keepalived/keepalived.log' >>/etc/rsyslog.conf

重啟日誌服務

systemctl restart rsyslog

2)keepalived配置引數

全域性定義塊

1、email通知(notification_email、smtp_server、smtp_connect_timeout):用於服務有故障時傳送郵件報警,可選項,不建議用。需要系統開啟sendmail服務,建議用第三獨立監控服務,如用nagios全面監控代替。

2、lvs_id:lvs負載均衡器標識,在一個網路內,它的值應該是唯一的。

3、router_id:使用者標識本節點的名稱,通常為hostname

4、花括號{}:用來分隔定義塊,必須成對出現。如果寫漏了,keepalived執行時不會得到預期的結果。由於定義塊存在巢狀關係,因此很容易遺漏結尾處的花括號,這點需要特別注意。

VRRP例項定義塊

vrrp_sync_group:同步vrrp級,用於確定失敗切換(FailOver)包含的路由例項個數。即在有2個負載均衡器的場景,一旦某個負載均衡器失效,需要自動切換到另外一個負載均衡器的例項是哪

group:至少要包含一個vrrp例項,vrrp例項名稱必須和vrrp_instance定義的一致

vrrp_instance:vrrp例項名

1> state:例項狀態,只有MASTER 和 BACKUP兩種狀態,並且需要全部大寫。搶佔模式下,其中MASTER為工作狀態,BACKUP為備用狀態。當MASTER所在的伺服器失效時,BACKUP所在的服務會自動把它的狀態由BACKUP切換到MASTER狀態。當失效的MASTER所在的服務恢復時,BACKUP從MASTER恢復到BACKUP狀態。

2> interface:對外提供服務的網絡卡介面,即VIP繫結的網絡卡介面。如:eth0,eth1。當前主流的伺服器都有2個或2個以上的介面(分別對應外網和內網),在選擇網絡卡介面時,一定要核實清楚。

3> mcast_src_ip:本機IP地址

4> virtual_router_id:虛擬路由的ID號,每個節點設定必須一樣,可選擇IP最後一段使用,相同的 VRID 為一個組,他將決定多播的 MAC 地址。

5> priority:節點優先順序,取值範圍0~254,MASTER要比BACKUP高

6> advert_int:MASTER與BACKUP節點間同步檢查的時間間隔,單位為秒

7> lvs_sync_daemon_inteface:負載均衡器之間的監控介面,類似於 HA HeartBeat 的心跳線。但它的機制優於 Heartbeat,因為它沒有“裂腦”這個問題,它是以優先順序這個機制來規避這個麻煩的。在 DR 模式中,lvs_sync_daemon_inteface與服務介面interface使用同一個網路介面

8> authentication:驗證型別和驗證密碼。型別主要有 PASS、AH 兩種,通常使用PASS型別,據說AH使用時有問題。驗證密碼為明文,同一vrrp 例項MASTER與BACKUP使用相同的密碼才能正常通訊。

9> smtp_alert:有故障時是否啟用郵件通知

10> nopreempt:禁止搶佔服務。預設情況,當MASTER服務掛掉之後,BACKUP自動升級為MASTER並接替它的任務,當MASTER服務恢復後,升級為MASTER的BACKUP服務又自動降為BACKUP,把工作權交給原MASTER。當配置了nopreempt,MASTER從掛掉到恢復,不再將服務搶佔過來。

11> virtual_ipaddress:虛擬IP地址池,可以有多個IP,每個IP佔一行,不需要指定子網掩碼。注意:這個IP必須與我們的設定的vip保持一致。

 虛擬伺服器virtual_server定義塊

virtual_server:定義一個虛擬伺服器,這個ip是virtual_ipaddress中定義的其中一個,後面一個空格,然後加上虛擬服務的埠號。

1> delay_loop:健康檢查時間間隔,單位:秒

2> lb_algo:負載均衡排程演算法,網際網路應用常用方式為wlc或rr

3> lb_kind:負載均衡轉發規則。包括DR、NAT、TUN 3種,一般使用路由(DR)轉發規則。

4> persistence_timeout:http服務會話保持時間,單位:秒

5> protocol:轉發協議,分為TCP和UDP兩種

real_server:真實伺服器IP和埠,可以定義多個

1> weight:負載權重,值越大,轉發的優先順序越高

2> notify_down:服務停止後執行的指令碼

3> TCP_CHECK:服務有效性檢測

* connect_port:服務連線埠

* connect_timeout:服務連線超時時長,單位:秒

* nb_get_retry:服務連線失敗重試次數

* delay_before_retry:重試連線間隔,單位:秒