MYSQL5.6主從+keepalive高可用自動切換

germany006發表於2019-11-13

前言

之前自己寫了好多主從搭建,主主搭建的總結,一直沒有去寫keepalived高可用的筆記總結,這次因為有一個小專案

需要搭建,就順便寫下來總結方便自己今後使用。


一、MySQL主從複製搭建

MySQL主從複製搭建主要步驟有:安裝mysql軟體、Master端配置部署、Slave端配置部署、建立主從同步 
安裝作業系統環境:REDHAT6.5


1、安裝MYSQL

a、環境準備及軟體安裝


安裝環境:

NODE1 主機名 master      IP地址 192.168.159.128

NODE2 主機名 slave       IP地址 192.168.159.129

 

b、安裝MYSQL 主從都要進行安裝

#tar zxvf mysql-5.6.38-linux-glibc2.12-x86_64.tar.gz -C  /usr/local/

# cd /usr/local/

# mv mysql-5.6.38-linux-glibc2.12-x86_64 mysql

# cd mysql

# groupadd mysql

# useradd -g mysql mysql

# passwd mysql 
      # cd  /usr/local/

#  chown -R mysql.mysql mysql

# ./script/mysql_install_db --user=mysql 
      # cd /usr/local/mysql 
      # chown -R root:root ./ 
      # chown -R mysql:mysql data

# cp support-files/mysql.server /etc/rc.d/init.d/mysqld

# chmod u+x /etc/rc.d/init.d/mysqld

# chkconfig --add mysqld

# /etc/rc.d/init.d/mysqld start

  
在這裡是採用的簡易安裝,如果想要在生產環境使用,想自己指定需要的引數,建議還是使用原始碼安裝


注:主從都使用yum install 的方式安裝系統自帶的mysql也可以使用,親測搭建成功,只是版本會比較低

2、Master端配置部署

a、在主伺服器上的my.cnf配置檔案中的[mysqld]節點下新增以下配置

黃色部分為新新增

vi /etc/my.cnf

[mysqld]

server-id=101

log-bin=/var/lib/mysql/mysql-bin.log

log-bin-index=/var/lib/mysql/mysql-bin.index

expire_logs_days=30

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

user=mysql

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

 

[mysqld_safe]

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid

說明:

log-bin :給出二進位制日誌的所有檔案基礎名

log-bin-index :給出二進位制日誌檔案的檔名,通常以000001開始,順序遞增。全名:master-bin.000001

server-id :mysql伺服器唯一ID,在主從複製的所有伺服器中必須唯一。

 

b、建立使用者,並賦予許可權:

create user repl_user;

GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY PASSWORD '******';

設定密碼時會遇到報錯:

ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal number

解決辦法:用select password('你想輸入的密碼');查詢出你的密碼對應的字串

select password('123456');

查出的是*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9

GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9';

2、Slave端配置部署

、配置引數: [mysqld]

黃色部分為新新增

vi /etc/my.cnf

[mysqld]

server-id=102

log-bin=/var/lib/mysql/mysql-relay-bin.log

log-bin-index=/var/lib/mysql/mysql-relay-bin.index

relay_log_purge=on

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

user=mysql

# Disabling symbolic-links is  recommended to prevent assorted security risks

symbolic-links=0

 

[mysqld_safe]

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid

 

3、建立主從同步

(重建備庫使用該方法,備庫和主庫是正常資料同步狀態)

建立主從同步可以從主庫上匯出資料,也可以從已有的從庫上匯出資料,然後再匯入到新的從庫中,change master to建立同步。


3.1 、匯出資料

在主庫上匯出資料:

mysqldump -u***-p***-S /data/mysql6001/mysql.sock        --default-character-set=utf8 –q --single-transaction --master-data-A >  /tmp/all_database.sql

(重建備庫時)也可在從庫上匯出資料:(我這裡是測試環境,所以對於我來說都是新建的資料庫,所以無所謂啦)

mysqldump -u***-p***-S /data/mysql6001/mysql.sock --default-character-set=utf8 -q --single-transaction --dump-slave-A  >  /tmp/all_database.sql

NOTES 

--master-data和--dump-slave匯出的備份中,會包含master_log_file和master_log_pos資訊。

--master-data選項的作用,是將二進位制的資訊寫入到輸出檔案中,在這裡是寫入到備份的sql檔案中。

--dump-slave選項的作用,是使用者在slave端dump資料,建立新的slave,至少是第2個slave,也就是已經有A-->B,現在從B上匯出資料建立A-->C的複製,  這個不但可以用於建立slave,還可用於備份中,用於讀binlog進行roll forward的起點

例子:(實際直接主庫全庫匯出即可)

mysqldump -uroot --events --all-databases > /opt/mysql.dump


 

3.2、從庫匯入資料

mysql -u*** -p*** --default-character-set=utf8< all_database.sql

 

例子:

mysql -uroot <mysql.dump </mysql.dump

 

3.3、從庫與主機建立同步

以下為建立主從同步最基本的 個項: change master to

master_host='xxx.xxx.xxx.xxx',    #  主庫 IP

master_port=6001,              #  主庫 mysqld  的埠

master_user='repl',             #  主庫中建立的有 REPLICATION SLAVE 許可權的使用者

master_password='xxxxxxxx',      #  該使用者的密碼

master_log_file='mysql-bin.000xxx',  #  已在匯入時指定了

master_log_pos=xxxxxx;       #  已在匯入時指定了

start slave;

 

例子:

master_log_file和master_log_pos通過在主庫上使用命令獲得:

show master status \G;

在從庫上執行:

change master  to

master_host='192.168.159.128',

master_port=3306,

master_user='repl_user',

master_password='123456',

master_log_file='mysql-bin.000001',

master_log_pos=1071;

start  slave; 

 

二、主從複製狀態檢查及異常處理


1、MYSQL啟動報錯

(1)  MYSQL啟動時報錯:

Another MySQL daemon already running with the same unix socket


原因多個Mysql程式使用了同一個socket。

兩個方法解決:

第一個是立即關機 使用命令 shutdown -h now 關機,關機後在啟動,程式就停止了。

第二個直接把mysql.sock檔案改名即可。也可以刪除,推薦改名。

然後就可以啟動mysql了。 

(2) 在REDHAT7.0版本安裝MYSQL5.6.38時遇到以下啟動報錯 
service mysql start 
Starting MySQL.180424 22:21:31 mysqld_safe error: log-error set to '/var/log/mariadb/mariadb.log', however file don't exists. Create writable for user 'mysql'. 
 ERROR! The server quit without updating PID file (/var/lib/mysql/REDHAT70.pid).



解決方法: 
mkdir -p /var/log/mariadb/ 
cd /var/log/mariadb/ 
touch mariadb.log 
chmod -R 775 mariadb.log 
chown -R mysql:mysql mariadb.log


 

2、ERROR-2013報錯

ERROR-2013報錯程式碼,可能造成的原因是

[ERROR] Slave I/O: error connecting to master 'repl_user@192.168.159.128:3306' - retry-time: 60  retries: 86400, Error_code: 2013


iptables -F

setenforce 0

 

 

3、ERROR-1045報錯

Last_IO_Errno: 1045

Last_IO_Error: error connecting to master 'repl_user@192.168.159.128:3306' - retry-time: 60  retries: 86400


必須使用以下方法授權

select password('123456');


GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9'; 


4、登陸MYSQL報錯ERROR-2002

登陸MYSQL時如果報錯:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock'

 解決方法:

ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock 




上面的MYSQL主從搭建,實際上就是從我自己很久以前寫的部落格裡拷貝過來的,也沒修改,以後再次搭建有遇到錯誤再修正吧,主從搭建還是很容易的

http://blog.itpub.net/28371090/viewspace-2152860/



三、KEEPALIVED安裝

安裝包:

keepalived-1.4.2.tar.gz

libnfnetlink-1.0.0-1.el6.x86_64.rpm

libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm

libnl-devel-1.1.4-2.el6.x86_64.rpm


安裝包下載地址:

http://www.keepalived.org/software/ keepalived-1.4.2.tar.gz

https://centos.pkgs.org/6/centos-x86_64/libnfnetlink-1.0.0-1.el6.i686.rpm.html

http://rpmfind.net/linux/RPM/centos/6.10/x86_64/Packages/libnfnetlink-devel-1.0.0-1.el6.x86_64.html

http://rpmfind.net/linux/RPM/centos/6.10/x86_64/Packages/libnl-devel-1.1.4-2.el6.x86_64.html



安裝keepalived

tar zxvf  keepalived-1.4.2.tar.gz

cd  keepalived-1.4.2

./configure

遇到以下報錯

 !!! OpenSSL is not properly installed on your system. !!!

  !!! Can not include OpenSSL headers files. 

解決方法:

 yum -y install openssl-devel


make

make install

mkdir /etc/keepalived

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

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


master的keepalived配置檔案如下:

vi /etc/keepalived/keepalived.conf

global_defs {

   router_id MySQL-HA


vrrp_script check_run {

script "/home/mysql/mysql_check.sh"

interval 60

}


vrrp_sync_group VG1 {

group {

VI_1

}

}


vrrp_instance VI_1 {

    state BACKUP

    interface eth1 

    virtual_router_id 51

    priority 100  

    advert_int 1

    nopreempt

    authentication {

        auth_type PASS

        auth_pass 1234

    }

    track_script {

    check_run

    }

    notify_master /home/mysql/master.sh

    notify_stop /home/mysql/stop.sh


    virtual_ipaddress {

        192.168.159.100

    }

}





  slave的keepalived配置檔案如下:

mkdir /etc/keepalived

vi /etc/keepalived/keepalived.conf

global_defs {

   router_id MySQL-HA


vrrp_script check_run {

script "/home/mysql/mysql_check.sh"

interval 60

}


vrrp_sync_group VG1 {

group {

VI_1

}

}


vrrp_instance VI_1 {

    state BACKUP

    interface eth1  

    virtual_router_id 51

    priority 90  

    advert_int 1

    nopreempt

    authentication {

        auth_type PASS

        auth_pass 1234

    }

    track_script {

    check_run

    }

    notify_master /home/mysql/master.sh

    notify_stop /home/mysql/stop.sh


    virtual_ipaddress {

        192.168.159.100

    }

}



說明:

1、

master與slave的keepalived配置檔案中只有priority設定不同,master為100,slave為90,其它一樣。

配置檔案是以塊形式組織的,每個塊都在{}包圍的範圍內,#和!開頭的行都是註釋。

2、

global_defs為全域性定義,對整個Keepalived起作用,而不管是否使用LVS。

3、

router_id:執行Keepalived的機器的一個標識。

4、

vrrp_script配置業務程式監控指令碼。

5、

script:設定指令碼檔名。

6、

interval:設定指令碼執行的時間間隔,這裡為每60秒執行一次。

7、

/home/mysql/mysql_check.sh用以檢測MySQL服務是否正常,

當發現連線不上mysql,自動把keepalived程式殺掉,讓VIP進行漂移。檔案內容如下。


這個指令碼可以放在2個節點上

注意,一般情況,資料庫的root使用者都會設定密碼,且要登陸資料庫要輸入密碼登入,所以

下面的指令碼也是要這麼登陸

vi /home/mysql/mysql_check.sh

#!/bin/bash

. /home/mysql/.bashrc

count=1


while true

do


mysql -uroot -p123456 -h192.168.159.128 -e "show status;" > /dev/null 2>&1

i=$?

ps aux | grep mysqld | grep -v grep > /dev/null 2>&1

j=$?

if [ $i = 0 ] && [ $j = 0 ]

then

   exit 0

else

   if [ $i = 1 ] && [ $j = 0 ]

   then

       exit 0

   else

        if [ $count -gt 5 ]

        then

              break

        fi

   let count++

   continue

   fi

fi


done


/etc/init.d/keepalived stop



說明:

1、

vrrp_sync_group配置VRRP同步組。

不使用Sync Group的話,如果機器有兩個網段, 一個內網一個外網,每個網段開啟一個VRRP例項。

假設VRRP配置為檢查內網,那麼當外網出現問題時,VRRPD認為自己仍然健康,

那麼不會觸發Master和Backup的切換,從而導致問題。Sync Group解決這個問題,

可以把兩個例項都放進一個Sync Group,這樣的話,Sync Group裡面任何一個例項出現問題都會發生切換。

2、

group:設定同一組中的VRRP例項名,這裡只有一個例項VI_1。

3、

vrrp_instance配置VRRP例項。VRRP例項表示在上面開啟了VRRP協議。

這個例項說明了VRRP的一些特性,比如主從、VRID等等。

可以在每個網路卡上開啟一個例項。VRRP例項主要定義vrrp_sync_group裡面的每個組的漂移IP等。

4、

state:指定例項的初始狀態。在兩臺路由都啟動後,馬上會發生競爭,高priority的會競選為Master,

所以這裡的state並不表示這臺就一直是Backup。

5、

interface:例項繫結的網路卡。

6、

virtual_router_id:VRID標記,值為0..255,這裡使用預設的51。

7、

priority:高優先順序競選為Master,Master要高於Backup至少50。

這裡MySQL主從庫兩個優先順序分別設定為100和90,因此當Keepalived啟動後,MySQL主庫會被選為Master。

8、

advert_int:檢查間隔,這裡設定為預設的1秒。

9、

nopreempt:設定為不搶佔,注意這個配置只能設定在state為BACKUP的主機上。

當MASTER出現問題後,BACKUP會競選為新的MASTER,那麼當之前的MASTER重新線上後,

是繼續成為MASTER還是變成BACKUP呢?預設不設定不搶佔,那麼之前的MASTER起來後會繼續搶佔成為MASTER。

這樣的頻繁切換對於業務是不能容忍的,我們希望MASTER起來後成為BACKUP,所以要設定不搶佔。

又因為nopreempt配置只能用在state為BACKUP的主機上,因此MASTER的state也得設定為BACKUP,

也就是說172.16.1.126和172.16.1.127都要將state設定為BACKUP。通過在兩臺BACKUP上面設定不同的priority,

讓它們一起來就搶佔,高priority的172.16.1.126成為最初的MASTER。

10、

authentication:設定認證型別和認證密碼。 

11、

auth_type:認證型別,支援PASS、AH兩種,通常使用PASS型別。

12、

auth_pass:明文認證密碼。同一VRRP例項的MASTER與BACKUP使用相同的密碼才能正常通訊。

13、

track_script:設定追蹤指令碼,這裡為check_run,即呼叫vrrp_script中定義的指令碼。 

14、

notify_master:指定當切換到MASTER時執行的指令碼。

15、

notify_stop:VRRP停止以後執行的指令碼。

16、

virtual_ipaddress:指定漂移地址(VIP),也就是切換到MASTER時,這些IP或被新增,

切換到BACKUP時,這些IP會被刪除。因此每臺伺服器上可以不繫結任何虛擬地址,

而都把它們放到virtual_ipaddress裡面,可以都多個。Keepalived會自動使用ip addr進行繫結。

17、

/home/mysql/master.sh的作用是狀態改為master以後執行的指令碼。首先判斷複製是否有延遲,

如果有延遲,等1分鐘後,不論是否有延遲,都並停止複製,並且記錄binlog和pos點。檔案內容如下。


這個指令碼可以放在2個節點上

vi /home/mysql/master.sh

#!/bin/bash


. /home/mysql/.bashrc


Master_Log_File=$(mysql -uroot -p123456 -h192.168.159.128 -e "show slave status\G" | grep -w Master_Log_File | awk -F": " '{print $2}')

Relay_Master_Log_File=$(mysql -uroot -p123456 -h192.168.159.128 -e "show slave status\G" | grep -w Relay_Master_Log_File | awk -F": " '{print $2}')

Read_Master_Log_Pos=$(mysql -uroot -p123456 -h192.168.159.128 -e "show slave status\G" | grep -w Read_Master_Log_Pos | awk -F": " '{print $2}')

Exec_Master_Log_Pos=$(mysql -uroot -p123456 -h192.168.159.128 -e "show slave status\G" | grep -w Exec_Master_Log_Pos | awk -F": " '{print $2}')


i=1


while true

do


if [ $Master_Log_File = $Relay_Master_Log_File ] && [ $Read_Master_Log_Pos -eq $Exec_Master_Log_Pos ]

then

   echo "ok"

   break

else

   sleep 1


   if [ $i -gt 60 ]

   then

      break

   fi

   continue

   let i++

fi

done


mysql -uroot -p123456 -h192.168.159.128 -e "stop slave;"

mysql -uroot -p123456 -h192.168.159.128 -e "reset slave all;"

mysql -uroot -p123456 -h192.168.159.128 -e "reset master;"

mysql -uroot -p123456 -h192.168.159.128 -e "show master status;" > /tmp/master_status_$(date "+%y%m%d-%H%M").txt


/home/mysql/stop.sh表示Keepalived停止以後需要執行的指令碼。

檢查是否還有複製寫入操作,最後無論是否執行完畢都退出。檔案內容如下。


這個指令碼可以放在2個節點上

vi /home/mysql/stop.sh


注意要把keepalived的一些指令碼拷貝一下,這樣,使用命令/etc/init.d/keepalived stop才可以使用

到安裝目錄

cp /opt/keepalived-1.4.2/keepalived/etc/init.d/keepalived  /etc/init.d/

cp /opt/keepalived-1.4.2/keepalived/etc/sysconfig/keepalived /etc/sysconfig/



啟動Keepalived 
keepalived -D -f /etc/keepalived/keepalived.conf 

如果要加上啟動日誌

keepalived -D -f /etc/keepalived/keepalived.conf --log-file='/etc/keepalived/error.log'

停止keepalived

/etc/init.d/keepalived stop


2個節點分別啟動keepalived


[root@mysql1 opt]# ps -ef|grep keep

root     18057     1  0 00:50 ?        00:00:00 keepalived -D -f /etc/keepalived/keepalived.conf

root     18058 18057  0 00:50 ?        00:00:00 keepalived -D -f /etc/keepalived/keepalived.conf

root     18059 18057  0 00:50 ?        00:00:00 keepalived -D -f /etc/keepalived/keepalived.conf

root     18061 17938  0 00:50 pts/2    00:00:00 grep keep


檢視vip在哪個節點上

ip addr


[root@mysql1 opt]# 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: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 00:0c:29:ea:81:9a brd ff:ff:ff:ff:ff:ff

    inet 192.168.159.128/24 brd 192.168.159.255 scope global eth1

    inet 192.168.159.100/32 scope global eth1

    inet6 fe80::20c:29ff:feea:819a/64 scope link 

       valid_lft forever preferred_lft forever

3: pan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN 

    link/ether 16:23:b1:c1:a0:ca brd ff:ff:ff:ff:ff:ff


發現是在主節點上


這樣就證明keepalived啟用成功了。


測試keepalived高可用可以自動進行切換


把MYSQL主庫kill或者關機停止MYSQL。


在從庫ip addr發現VIP漂移到了從庫上,登陸從庫,進行建庫,DML等操作都可以進行,那麼代表自動切換成功。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28371090/viewspace-2663707/,如需轉載,請註明出處,否則將追究法律責任。

相關文章