一骨宠、MYSQL 主從復(fù)制
主從復(fù)制作用:
(1)處理數(shù)據(jù)庫的物理損壞
(2)架構(gòu)演變的基礎(chǔ)(高可用,讀寫分離相满,分布式等)
1层亿、主從復(fù)制搭建前提
(1)至少兩臺以上的mysql實例,(并定義主從立美,不同的server_id匿又,主庫開啟二進(jìn)制日志)
(2)主庫需要開啟專門的復(fù)制用戶
(3)從庫提前進(jìn)行數(shù)據(jù)補(bǔ)償
(4)告知從庫,主庫的:ip port,user,passwd 復(fù)制的起點(change master to)
2建蹄、搭建主從復(fù)制
2.1碌更、準(zhǔn)備兩個數(shù)據(jù)庫節(jié)點(我準(zhǔn)備了 db01,db02兩個節(jié)點)
保證主庫的server_id 小于從庫
保證數(shù)據(jù)庫開啟二進(jìn)制日志
2.2 在主庫創(chuàng)建復(fù)制用戶(權(quán)限:replication slave)
[root@db01 ~]# mysql -uroot -p123456 -e "grant replication slave on . to repl@'10.0.0.%' identified by '123456';"
2.3備份主庫數(shù)據(jù)恢復(fù)到從庫:
[root@db01 ~]# mysqldump -uroot -p123456 -A -E -R --triggers --master-data=2 --single-transaction >/tmp/date +%F
.sql 2>/dev/null
[root@db01 /tmp]# scp 2019-09-02.sql 10.0.0.52:/tmp
[root@db02 /tmp]# mysql -uroot -p123456 </tmp/2019-09-02.sql
2.4在從庫指明主庫的ip port,user,passwd 復(fù)制的起點(change master to)
在恢復(fù)到從庫的數(shù)據(jù)日志中找到位置點: CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000015', MASTER_LOG_POS=154;
help change master to
CHANGE MASTER TO
MASTER_HOST='master2.example.com',
MASTER_USER='replication',
MASTER_PASSWORD='password',
MASTER_PORT=3306,
MASTER_LOG_FILE='master2-bin.001',
MASTER_LOG_POS=4,
MASTER_CONNECT_RETRY=10;
在從庫下執(zhí)行:
[root@db02 /tmp]# mysql -uroot -p123456
mysql> CHANGE MASTER TO
-> MASTER_HOST='10.0.0.51',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='123456',
-> MASTER_PORT=3306,
-> MASTER_LOG_FILE='mysql-bin.000015',
-> MASTER_LOG_POS=154,
-> MASTER_CONNECT_RETRY=10;
Query OK, 0 rows affected, 2 warnings (0.39 sec)
2.5在從庫啟動復(fù)制的專用線程
[root@db02 /tmp]# mysql -uroot -p123456 -e "start slave;"
2.6 判斷主從復(fù)制是否成功
[root@db02 /tmp]# mysql -uroot -p123456 -e "show slave status\G" |grep Running
排錯:
遇見此情況不要慌亂裕偿,首先查看日志,看看是什么報錯
[root@db02 /tmp]# mysql -uroot -p123456 -e "show slave status\G" |grep Running
mysql: [Warning] Using a password on the command line interface can be insecure.
Slave_IO_Running: No
Slave_SQL_Running: Yes
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
mysql主從配置uuid相同錯誤解決
配置mysql主從時痛单,由于是拷貝的mysql目錄嘿棘,導(dǎo)致主從mysql uuid相同, Slave_IO無法啟動旭绒,報錯信息如下:
The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
解決辦法:修改mysql data 目錄下auto.cnf 文件中uuid的值鸟妙,使兩臺mysql不同即可,修改后重啟mysql服務(wù)挥吵。
3重父、主從復(fù)制原理
3.1主從復(fù)制涉及到的文件
主庫
二進(jìn)制日志
從庫
relaylog :存放主庫發(fā)送的二進(jìn)制日志
master.info :存放主庫的信息
relaylog.info :relaylog 信息,記錄了已經(jīng)執(zhí)行(回放)的relaylog的位置點
3.2 涉及到的線程
主庫
使用mysql> show processlist;查看
Binlog Dump thread
從庫
IO線程 Slave_IO_Running: Yes
SQL線程 Slave_SQL_Running: Yes
4忽匈、主從復(fù)制監(jiān)控
(1) 主庫相關(guān)信息(master.info)
Master_Host: 10.0.0.51
Master_User: repl
Master_Port: 3306
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 154
(2) 從庫中繼日志信息(relay.info)
Relay_Log_File: db01-relay-bin.000005
Relay_Log_Pos: 367
Relay_Master_Log_File: mysql-bin.000004
Exec_Master_Log_Pos: 154
(3) 從庫的線程狀態(tài),異常信息
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
(4) 過濾復(fù)制相關(guān)信息
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
(5) 主從延時的判定(落后于主庫的時間)
Seconds_Behind_Master: 0
(6) 延時從庫(主動延遲)
SQL_Delay: 0
SQL_Remaining_Delay: NULL
(7) GTID復(fù)制信息
Retrieved_Gtid_Set:
Executed_Gtid_Set:
5房午、主從故障
5.1 如何監(jiān)控
mysql -uroot -p123456 -e "show slave status \G" |egrep " Last|Running"
5.2 原因
5.2.1 IO 故障
(1) 連接主庫
ip port user passwd
網(wǎng)絡(luò)
主庫宕機(jī)
防火墻
主庫連接數(shù)上限
[root@db01 ~]# mysql -urepl -p123 -h 10.0.0.58 -P 3307
(2) 請求日志
主庫二進(jìn)制日志
如果是二進(jìn)制日志無法同步按照一下方法執(zhí)行即可。
stop slave;
reset slave all;
mysql -S /data/3308/mysql.sock -e "CHANGE MASTER TO MASTER_HOST='10.0.0.51',MASTER_USER='repl',MASTER_PASSWORD='123',MASTER_PORT=3307,MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=154;"
start slave
(3) 接收日志
I/O 線程down掉脉幢,一般時有人stop slave; 重啟即可 歪沃。
(4) 寫入日志
主庫或從庫的relaylog 文件損壞
解決方法1:最穩(wěn)妥的做法是重新做主從.
如果數(shù)據(jù)量大可以使用第2種方法:pt-table-checksum校驗、pt-table-sync修復(fù)數(shù)據(jù)
5.2.2 SQL 故障
回放relaylog
(1) relaylog損壞
(2) 回放語句失敗(執(zhí)行SQL為什么會失敗)
一般是因為主從庫數(shù)據(jù)不一致嫌松,一般有一下幾個方面的問題:
創(chuàng)建的對象已存在
修改的對象不存在
約束性的沖突
5.3 傳統(tǒng)主從復(fù)制的一些缺點
人為的寫入 --解決辦法--只讀從庫,中間件
只讀庫設(shè)置方法:在配置文件添加以下兩個參數(shù)改為on 即可沪曙。
read_only=on #控制普通用戶只讀
super_read_only=on #控制超級管理員只讀。
mysql> show variables like '%read_only%';
| Variable_name | Value |
+-----------------------+-------+
| read_only | OFF |
| super_read_only | OFF |
+-----------------------+-------+
主從本身就是有可能出現(xiàn)數(shù)據(jù)不一致--解決方案--半同步,增強(qiáng)半同步,無損復(fù)制. MGR PXC MGC
5.4 主從修復(fù)的方法
5.4.1
pt-table-checksum校驗
pt-table-sync修復(fù)數(shù)據(jù)
5.4.2
重新構(gòu)建主從
++++++++++++++++++++++++++++++++++++++++++++++
6萎羔、主從延遲
6.1 主庫:
(1) 二進(jìn)制日志書寫不及時--解決辦法--sync_binlog=1
sync_binlog=1 #值為1時液走,表示每次事務(wù)提交后立即寫入磁盤
(2) dump線程串行--解決辦法--GTID
6.2 從庫 :
(1)SQL 串行的問題--解決辦法--MySQL 5.7版本 GTID 邏輯時鐘 Logical_clock
(2) 大事務(wù)--解決辦法--將一個大事務(wù)化成多個小事務(wù)執(zhí)行,執(zhí)行多次
6.3 定位到SQL延時的位置點贾陷。
Relay_Log_File: db01--bin.000005
Relay_Log_Pos: 367
Relay_Master_Log_File: mysql-bin.000004
Exec_Master_Log_Pos: 154
7缘眶、延時從庫
其實時在從庫的SQL線程上控制執(zhí)行時間
7.1 延時從庫配置(在從庫執(zhí)行一下操作)
mysql>stop slave;
mysql>CHANGE MASTER TO MASTER_DELAY=300;
mysql>start slave;
mysql> show slave status \G
SQL_Delay: 300
SQL_Remaining_Delay: NULL
7.2 延時從庫演練
場景 db01(主) db02(延時從庫)
大型互聯(lián)網(wǎng)公司,數(shù)據(jù)量10T左右
每周全備,其他時間備份日志,1主多從,有延時從庫3小時
故障場景: 核心業(yè)務(wù)庫被惡意損壞 (drop database)
恢復(fù)思路:
1. 停從庫SQL線程 stop slave sql_thread;
2. 掛維護(hù)頁
3. 截取從庫的relaylog
起點: sql線程停止時的relay位置點
Relay_Log_File: db01-relay-bin.000004
Relay_Log_Pos: 367
終點: drop
恢復(fù)操作
第一步:模擬主庫數(shù)據(jù)及刪除操作
create database relay charset utf8;
use relay
create table t1 (id int);
insert into t1 values(1);
drop database relay;
第二步:停止從庫SQL線程
mysql>stop slave sql_thread;
第三步:找relaylog的起點和終點并截取日志
起點:
Relay_Log_File: db01-relay-bin.000002
Relay_Log_Pos: 320
Relay_Log_File: db02-relay-bin.000006
Relay_Log_Pos: 367
終點:
mysql>show relaylog events in 'db02-relay-bin.000006';
| db02-relay-bin.000006 | 1027 | Query | 1 | 909 | drop database relay |
[root@db02 /tmp]# mysqlbinlog --start-position=367 --stop-position=1027 /data/mysql/data/db02-relay-bin.000006> /tmp/relay.sql
第四步:從庫恢復(fù)relaylog
mysql>source /tmp/relay.sql
第五步:從庫身份解除
mysql>stop slave;
mysql>reset slave all
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
8、過濾復(fù)制
在從庫的SQL線程上作過濾回放
8.1 主庫方面
Binlog_Ignore_DB #黑名單髓废,不記錄 那個庫的
Binlog_Do_DB #白名單巷懈,記錄那個庫的
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000004 | 1209 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
8.2 從庫方面
將以下參數(shù)選擇加入配置文件,重啟mysql 即可慌洪。
replicate_do_db=庫名 #記錄那個庫
replicate_ignore_db=庫名 #忽略那個庫
replicate_do_table=庫名.表名 #記錄那個表
replicate_ignore_table=庫名.表名 #忽略那個表
查看:
mysql>show slave status\G
Replicate_Do_DB: test1
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
9顶燕、GTID 復(fù)制
介紹:GTID(Global Transaction ID)是對于一個已提交事務(wù)的唯一編號,并且是一個全局(主從復(fù)制)唯一的編號冈爹。
它的官方定義如下:
GTID = server_uuid :transaction_id #保存在auto.cnf 文件中
7E11FA47-31CA-19E1-9E56-C43AA21293967:1-10
什么是sever_uuid涌攻,和Server-id 區(qū)別?
核心特性: 全局唯一,具備冪等性
9.1 GTID核心參數(shù)(編寫進(jìn)配置文件中即可)
gtid-mode=on #啟用gtid模式频伤,否則就是普通的復(fù)制架構(gòu)
enforce-gtid-consistency=true #強(qiáng)制GTID的一致性
log-slave-updates=1 #slave更新是否記入日志
9.2 執(zhí)行change master to 時不用指定position號恳谎,自動查找即可。
change master to
master_host='10.0.0.52',
master_user='repl',
master_password='123456' ,
MASTER_AUTO_POSITION=1;
start slave;
9.3 搭建GTID主從復(fù)制
背景 :一個主庫憋肖,兩個從庫(沒有原始數(shù)據(jù)的庫不用執(zhí)行一下操作)
第一步:清空源數(shù)據(jù)目錄數(shù)據(jù)信息和配置文件(三個庫)
/etc/init.d/mysqld stop
rm -rf /data/mysql/*
rm -rf /data/mysql/*
rm -rf /etc/my.cnf
第二步:初始化數(shù)據(jù)(三個庫)
mysqld --initialize-insecure --user=mysql --basedir=/application/mysql --datadir=/data/mysql/data
第三步:編寫配置文件(server_id 不能相同)
cat >/etc/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/application/mysql
datadir=/data/mysql/data
socket=/tmp/mysql.sock
log_error=/data/mysql/error.log
server_id=3
port=3306
log_bin=/data/mysql/mysql-bin
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
socket=/tmp/mysql.sock
EOF
第四步:創(chuàng)建錯誤日志文件授權(quán)并重啟(三個庫都執(zhí)行)
touch /data/mysql/error.log
chown -R mysql.mysql /data/
/etc/init.d/mysqld start
第五步:主庫添加授權(quán)目錄(僅主庫執(zhí)行)
mysql -e "grant replication slave on *.* to repl@'10.0.0.%' identified by '123456';"
第六步:執(zhí)行從庫配置(兩個從庫)
change master to
master_host='10.0.0.51',
master_user='repl',
master_password='123456' ,
MASTER_AUTO_POSITION=1;
start slave;
show slave status\G
9.4 查看GTID
主庫
mysql> show master status;
+------------------+----------+--------------+------------------+----------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+----------------------------------------+
| mysql-bin.000001 | 444 | | | d30a33a0-d086-11e9-8bc0-000c291fc150:1 |
+------------------+----------+--------------+------------------+----------------------------------------+
1 row in set (0.00 sec)
從庫
mysql> show slave status\G
Retrieved_Gtid_Set: d30a33a0-d086-11e9-8bc0-000c291fc150:1
Executed_Gtid_Set: d30a33a0-d086-11e9-8bc0-000c291fc150:1
二因痛、 MHA 高可用
介紹:MHA初始版本必須有3個數(shù)據(jù)庫節(jié)點(一主兩從婚苹,數(shù)據(jù)庫節(jié)點必須是三臺獨立的主機(jī)),還必須有一個manager 端婚肆,來管理3個獨立的物理節(jié)點的數(shù)據(jù)庫租副,三個數(shù)據(jù)庫節(jié)點坐慰,都叫做node節(jié)點较性,管理主機(jī)叫做manager,
簡單來說结胀,要想完成一個MHA的高可用赞咙,并且各節(jié)點都是互相獨立的主機(jī),那么就需要 1主+2從+1manager=4臺主機(jī)糟港,
MHA 軟件結(jié)構(gòu)
Manager工具包主要包括以下幾個工具:
masterha_manger 啟動MHA
masterha_check_ssh 檢查MHA的SSH配置狀況
masterha_check_repl 檢查MySQL復(fù)制狀況
masterha_master_monitor 檢測master是否宕機(jī)
masterha_check_status 檢測當(dāng)前MHA運行狀態(tài)
masterha_master_switch 控制故障轉(zhuǎn)移(自動或者手動)
masterha_conf_host 添加或刪除配置的server信息
Node工具包主要包括以下幾個工具:
這些工具通常由MHA Manager的腳本觸發(fā)攀操,無需人為操作。
save_binary_logs 保存和復(fù)制master的二進(jìn)制日志
apply_diff_relay_logs 識別差異的中繼日志事件并將其差異的事件應(yīng)用于其他的
purge_relay_logs 清除中繼日志(不會阻塞SQL線程)
1秸抚、 MHA 搭建過程:
第一步:配置各節(jié)點互信(四個節(jié)點互信)
[root@db03 ~]# ssh-keygen -t rsa
[root@m01 /server/scripts]# cat ssh_fenfa.sh
#!/bin/bash
for ip in {51,52,53}
do
echo "=====Issued pub_key with 172.16.1.$ip====="
sshpass -p123456 ssh-copy-id -i /root/.ssh/id_rsa.pub 172.16.1.$ip -o StrictHostKeyChecking=no &>/dev/null
if [ $? -eq 0 ]
then
echo "公鑰信息分發(fā)成功 [ok]"
echo ""
else
echo "公鑰信息分發(fā)失敗 [failed]"
echo ""
fi
done
[root@m01 /server/scripts]#
驗證:
ssh 10.0.0.51 hostname
ssh 10.0.0.52 hostname
ssh 10.0.0.61 hostname
第二步:創(chuàng)建軟件調(diào)用時需要用到的軟連接(三個數(shù)據(jù)節(jié)點都要做)
ln -s /application/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
ln -s /application/mysql/bin/mysql /usr/bin/mysql
第三步:上傳安裝MHA軟件并安裝依賴包(所有節(jié)點)
yum install perl-DBD-MySQL -y
yum install -y mha4mysql-node-0.56-0.el6.noarch.rpm
第四步驟:manager節(jié)點安裝
yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes
yum install -y mha4mysql-manager-0.56-0.el6.noarch.rpm
10.3配置和啟動
(1) 主庫創(chuàng)建管理用戶
db01:
mysql -e "grant all privileges on . to mha@'10.0.0.%' identified by 'mha';"
(2) 主備配置文件(manager節(jié)點)
mkdir -p /etc/mha
mkdir -p /var/log/mha/app1
cat > /etc/mha/mng.cnf <<EOF
[server default]
manager_log=/var/log/mha/app1/manager
manager_workdir=/var/log/mha/app1
master_binlog_dir=/data/binlog
user=mha
password=mha
ping_interval=2
repl_password=123456
repl_user=repl
ssh_user=root
[server1]
hostname=10.0.0.51
port=3306
[server2]
hostname=10.0.0.52
port=3306
candidate_master=1
check_repl_delay=0
[server3]
hostname=10.0.0.53
port=3306
EOF
(3) 啟動前檢查
[root@m01 /]# masterha_check_ssh --conf=/etc/mha/mng.cnf
[root@m01 /]# masterha_check_repl --conf=/etc/mha/mng.cnf
(4) 啟動MHA的manager進(jìn)程
nohup masterha_manager --conf=/etc/mha/mng.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null> /var/log/mha/app1/manager.log 2>&1 &
[root@m01 /]# masterha_check_status --conf=/etc/mha/mng.cnf#查看啟動狀態(tài)
(5) 主庫宕機(jī)測試
/etc/init.d/mysqld stop
(6) 恢復(fù)MHA
注意:在MHA的環(huán)境下速和,主庫一旦宕機(jī),主從關(guān)系就會發(fā)生變化剥汤,想要恢復(fù)宕機(jī)的主庫颠放,需要重新建立主從關(guān)系
使用change master to 在down機(jī)節(jié)點上重新構(gòu)建主從關(guān)系,因為是GTID復(fù)制吭敢,所以可以不用找Position號
change master to
master_host='10.0.0.52',
master_user='repl',
master_password='123456' ,
MASTER_AUTO_POSITION=1;
start slave;
show slave status\G
回到manager 節(jié)點配置文件中重新添加消失的主機(jī)節(jié)點碰凶,然后重啟manager進(jìn)程即可恢復(fù),恢復(fù)后注意監(jiān)測
2鹿驼、MHA工作原理
2.1 主庫宕機(jī)后欲低,從庫選主問題
(1) 當(dāng)主庫宕機(jī)后,MHA會根據(jù)配置文件內(nèi)的權(quán)重進(jìn)行選主(最優(yōu)先);candidate_master=1
如果被選主畜晰,和宕機(jī)主庫的日志數(shù)量相差超過100M時砾莱,也不會進(jìn)行自動選主,加上check_repl_delay=0參數(shù)凄鼻,強(qiáng)制選主腊瑟。
(2) 當(dāng)主庫宕機(jī)后,如果配置文件內(nèi)沒有設(shè)置權(quán)重野宜,會根據(jù)兩個從庫的日志量級進(jìn)行選主(次之)根據(jù)日志量(position或者GTID)
(3) 當(dāng)主庫宕機(jī)后扫步,MHA配置文件內(nèi)沒有設(shè)置權(quán)重,同時兩個從庫的數(shù)據(jù)量級相同匈子,接根據(jù)配置文件的書寫順序進(jìn)行選主(最后)
2.2 數(shù)據(jù)補(bǔ)償
(1) 主庫SSH能連,會在選主之前,立即在各個節(jié)點保存(save_binary_logs) 缺失部分日志到/var/tmp
(2) SSH不能連,通過apply_diff_relay_logs,計算兩個從節(jié)點的relaylog差異,進(jìn)行補(bǔ)償
11.3 當(dāng)主庫故障后河胎,MHA自動選主發(fā)生的事件(不需要人工干預(yù))
(1)被選主庫:清理自身的從庫關(guān)系
stop slave;
reset slave all;
(2)所有從庫和新主庫確認(rèn)新的主從關(guān)系
change master to
start slave
2.3 應(yīng)用透明(VIP)
(1) 腳本準(zhǔn)備
[root@m01 /server/tools]# chmod +x master_ip_failover.txt
[root@m01 /server/tools]# dos2unix master_ip_failover dos2unix master_ip_failover
[root@m01 /server/tools]# cp master_ip_failover.txt /usr/local/bin/master_ip_failover
修改文件內(nèi)容:
my key = '1';
my key
ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
(2) 修改MHA配置文件
添加腳本的完整路徑
master_ip_failover_script=/usr/local/bin/master_ip_failover
(3) 手工添加主庫vip
ifconfig eth0:1 10.0.0.55/24
(4) 重啟MHA
`
masterha_stop --conf=/etc/mha/mng.cnf
nohup masterha_manager --conf=/etc/mha/mng.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null> /var/log/mha/app1/manager.log 2>&1 &
masterha_check_status --conf=/etc/mha/mng.cnf#查看啟動狀態(tài)
2.4 故障切換通知
郵件提醒send_report
- 參數(shù):在配置文件中添加以下
report_script=/usr/local/bin/send - 準(zhǔn)備郵件腳本
send_report
(1)準(zhǔn)備發(fā)郵件的腳本(上傳 email_2019-最新.zip中的腳本,到/usr/local/bin/中)
(2)將準(zhǔn)備好的腳本添加到mha配置文件中,讓其調(diào)用
(3)重啟MHA
masterha_stop --conf=/etc/mha/mng.cnf
nohup masterha_manager --conf=/etc/mha/mng.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null> /var/log/mha/app1/manager.log 2>&1 &
masterha_check_status --conf=/etc/mha/mng.cnf#查看啟動狀態(tài)
2.5 binlog_server數(shù)據(jù)補(bǔ)償功能
binlogserver配置:
找一臺額外的機(jī)器虎敦,必須要有5.6以上的數(shù)據(jù)庫版本游岳,支持gtid并開啟
vim /etc/mha/mng.cnf
[binlog1]
no_master=1
hostname=10.0.0.53
master_binlog_dir=/data/mysql/binlog
創(chuàng)建必要目錄
mkdir -p /data/mysql/binlog
chown -R mysql.mysql /data/*
修改完成后政敢,將主庫binlog拉過來(從000001開始拉,之后的binlog會自動按順序過來)
拉取主庫binlog日志(日志拉取時一定要cd 到日志目錄下)
cd /data/mysql/binlog
mysqlbinlog -R --host=10.0.0.51 --user=mha --password=mha --raw --stop-never mysql-bin.000001 &
注意:
拉取日志的起點,需要按照目前從庫的已經(jīng)獲取到的二進(jìn)制日志點為起點
(3)重啟MHA
masterha_stop --conf=/etc/mha/mng.cnf
nohup masterha_manager --conf=/etc/mha/mng.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null> /var/log/mha/app1/manager.log 2>&1 &
masterha_check_status --conf=/etc/mha/mng.cnf#查看啟動狀態(tài)
恢復(fù)基于MHA的高可用思路:
a胚迫、恢復(fù)故障節(jié)點
b喷户、重新確認(rèn)主從關(guān)系 change master to
c、在MHA配置文件中將故障節(jié)點添加回去
d访锻、binlog 拉取時指向新的主庫
mysqlbinlog -R --host=10.0.0.52 --user=mha --password=mha --raw --stop-never mysql-bin.000001 &
e褪尝、重啟MHA
三、 MHA 配合Atlas 實現(xiàn)數(shù)據(jù)庫的讀寫分離
1期犬、atlas 配置
1.1 上傳 Atlas軟件包后 直接安裝即可河哑,沒有依賴關(guān)系
1.2 安裝后Atlas配置文件存放在/usr/local/mysql-proxy/conf
1.3 備份并重新生成新的配置文件
cd /usr/local/mysql-proxy/conf
mv test.cnf test.cnf.bak
cat > /usr/local/mysql-proxy/conf/test.cnf <<EOF
[mysql-proxy]
admin-username = user
admin-password = pwd
proxy-backend-addresses = 10.0.0.55:3306 #主庫配置
proxy-read-only-backend-addresses = 10.0.0.51:3306,10.0.0.53:3306 #兩個從庫配置
pwds = repl:3yb5jEku5h4=,mha:O2jBXONX098=
daemon = true
keepalive = true
event-threads = 8
log-level = message
log-path = /usr/local/mysql-proxy/log
sql-log=ON
proxy-address = 0.0.0.0:33060
admin-address = 0.0.0.0:2345
charset=utf8
EOF
1.4 啟動配置文件
/usr/local/mysql-proxy/bin/mysql-proxyd test start
1.5 測試
注意這里-h 對應(yīng)的ip 是Atlas 安裝節(jié)點的IP, -u -p 信息必須和數(shù)據(jù)庫內(nèi)的一致(后端數(shù)據(jù)庫擁有的用戶名和密碼)
[root@m01 /usr/local/mysql-proxy/bin]# mysql -umha -pmha -h10.0.0.61 -P33060
MySQL [(none)]> select @@server_id; #測試結(jié)果可以看到兩個從庫的server_id
MySQL [(none)]> begin; select @@server_id commit; 可以看到主庫的數(shù)據(jù)庫節(jié)點
2、 Atlas的管理
這里的 -u -p Atlas配置文件中的用戶名和密碼龟虎,-h 是Atlas安裝節(jié)點的地址
mysql -uuser -ppwd -h10.0.0.61 -P2345
2.1 開用戶
(1) 后端節(jié)點添加用戶
db01 [(none)]>grant all on . to root@'10.0.0.%' identified by '123';
(2) 密碼加密
/usr/local/mysql-proxy/bin/encrypt 123
(3) 修改配置
pwds = repl:3yb5jEku5h4=,mha:O2jBXONX098=,root:3yb5jEku5h4=
(4) 重啟
/usr/local/mysql-proxy/bin/mysql-proxyd test restart
2.2 內(nèi)部管理操作
(0) 獲取幫助
select * from help
使用方法 | 說明 |
---|---|
SELECT * FROM help | shows this help |
SELECT * FROM backends | lists the backends and their state |
SET OFFLINE $backend_id | offline backend server, $backend_id is backend_ndx's id |
SET ONLINE $backend_id | online backend server, ... |
ADD MASTER $backend | example: "add master 127.0.0.1:3306", ... |
ADD SLAVE $backend | example: "add slave 127.0.0.1:3306", ... |
REMOVE BACKEND $backend_id | example: "remove backend 1", ... |
SELECT * FROM clients | lists the clients |
ADD CLIENT $client | example: "add client 192.168.1.2", ... |
REMOVE CLIENT $client | example: "remove client 192.168.1.2", ... |
SELECT * FROM pwds | lists the pwds |
ADD PWD $pwd | example: "add pwd user:raw_password", ... |
ADD ENPWD $pwd | example: "add enpwd user:encrypted_password", ... |
REMOVE PWD $pwd | example: "remove pwd user", ... |
SAVE CONFIG | save the backends to config file |
SELECT VERSION | display the version of Atlas |
(1) 查看后端節(jié)點
db03 [(none)]>SELECT * FROM backends;
(2) 上線和下線節(jié)點
SET OFFLINE $backend_id
SET ONLINE $backend_id
(3) 添加或刪除從節(jié)點
db03 [(none)]>REMOVE BACKEND 3;
db03 [(none)]> ADD SLAVE 10.0.0.53:3306;
(4) 查看和添加刪除用戶
db03 [(none)]> SELECT * FROM pwds;
db03 [(none)]>REMOVE PWD repl;
db03 [(none)]>ADD PWD repl:123;
(5) 保存配置
db03 [(none)]>save config;