MYSQL主從復(fù)制及讀寫分離

一骨宠、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 vip = '10.0.0.55/24'; mykey = '1';
my ssh_start_vip = "/sbin/ifconfig eth0:key vip"; myssh_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

  1. 參數(shù):在配置文件中添加以下
    report_script=/usr/local/bin/send
  2. 準(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;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末璃谨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鲤妥,更是在濱河造成了極大的恐慌佳吞,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棉安,死亡現(xiàn)場離奇詭異底扳,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)垂券,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門花盐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人菇爪,你說我怎么就攤上這事算芯。” “怎么了凳宙?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵熙揍,是天一觀的道長。 經(jīng)常有香客問我氏涩,道長届囚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任是尖,我火速辦了婚禮意系,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘饺汹。我一直安慰自己蛔添,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布吨掌。 她就那樣靜靜地躺著桐猬,像睡著了一般割捅。 火紅的嫁衣襯著肌膚如雪鹤竭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天尝苇,我揣著相機(jī)與錄音蒸辆,去河邊找鬼治拿。 笑死足绅,一個胖子當(dāng)著我的面吹牛捷绑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播编检,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼胎食,長吁一口氣:“原來是場噩夢啊……” “哼扰才!你這毒婦竟也來了允懂?” 一聲冷哼從身側(cè)響起蕾总,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤柄延,失蹤者是張志新(化名)和其女友劉穎市俊,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绅你,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了晶伦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片频祝。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡沽一,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出铣缠,到底是詐尸還是另有隱情,我是刑警寧澤捡硅,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布纹因,位于F島的核電站逼蒙,受9級特大地震影響是牢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜驻债,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拆祈,春花似錦老玛、人聲如沸互亮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背妆毕。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留远舅,地道東北人闰蛔。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像图柏,于是被迫代替她去往敵國和親序六。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 人人都羨慕老師蚤吹,可有幾個理解老師的辛酸例诀,明明是在傾其所有,他們卻說你沒事找事裁着。我已漸漸迷茫繁涂,漸漸失去了方向,內(nèi)心隱...
    想飛的心閱讀 191評論 0 1
  • 連續(xù)來的多云天氣讓囂張跋扈的熱氣終于泄了下去。沒有了炎炎烈日桶雀,出門行走也頓覺神清氣爽了矿酵,躁動的心終于歸復(fù)平靜。 總...
    幸福D蘇眉閱讀 548評論 0 5
  • 在生活中矗积,要學(xué)會前行全肮,曾經(jīng)縱然美好,卻不是我們可以一直擁有的棘捣,太多美好都轉(zhuǎn)瞬即逝辜腺,曾經(jīng)以為的幸福和快樂,換了一個時...
    磨人魚閱讀 413評論 0 0
  • 荒園無人跡 野樹伴風(fēng)眠 葉落塞池滿 鳥啼破林暗 矮舍犬吠疾 小徑貓行緩 信步出門去 揮去一院寒
    黑瞳_6f0d閱讀 323評論 0 0