MYSQL5.6主從+keepalive高可用自動切換
前言
之前自己寫了好多主從搭建,主主搭建的總結,一直沒有去寫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端配置部署
a 、配置引數: [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、從庫與主機建立同步
以下為建立主從同步最基本的 6 個項: 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql mha 主從自動切換 高可用MySql
- postgresql10主從+keepalived高可用自動切換(切換關鍵在指令碼)SQL指令碼
- 5.6 MySql主從自動切換指令碼MySql指令碼
- 雙機高可用、負載均衡、MySQL(讀寫分離、主從自動切換)架構設計負載MySql架構
- ostgreSQL主從切換-手動SQL
- Dledger是如何實現主從自動切換的
- mysql5.6主主複製及keepalived 高可用MySql
- Mysql + keepalive高可用搭建MySql
- Redis主從切換Redis
- MySQL主從切換MySql
- MySQL 主從切換延時高問題分析MySql
- keepalived與mysql主主叢集自動切換MySql
- MHA高可用配置及故障切換
- DRBD+Pacemaker實現DRBD主從角色的自動切換薦
- 高可用之KeepAlive工作原理
- 手工切換MySQL主從MySql
- Redis sentinel主從切換Redis
- mysql主從搭建切換MySql
- keepalive +nginx (主從)Nginx
- mysql主從複製+主備切換MySql
- 實戰dataguard主從切換
- mysql for linux主從切換MySqlLinux
- nginx keepalived 主從切換Nginx
- mysql5.6主主叢集自動同步指令碼MySql指令碼
- POSTGRESQL10.3原始碼安裝主從搭建 pgpoolii + keepalive 高可用(未成功,實驗中)SQL原始碼
- Redis高可用-主從,哨兵,叢集Redis
- keepalived配置redis主從切換Redis
- StoneDB 主從切換實踐方案
- echarts 主題動態切換Echarts
- Redis高可用之戰:主從架構Redis架構
- 【DB寶60】PG12高可用之1主2從流複製環境搭建及切換測試
- REDIS主從頻繁切換事件排查Redis事件
- Mongodb資料同步和主從切換MongoDB
- Redis叢集的主從切換研究Redis
- oracle 11g datagurd主從切換Oracle
- Mysql5.6主從複製MySql
- Redis主從複製 - 通過Keepalived實現Redis Failover自動故障切換功能RedisAI
- MySQL高可用之MHA切換測試(switchover & failover)MySqlAI