5. 主從復(fù)制延時(shí)
5.1 什么是延時(shí)雅镊?
主庫(kù)做的事,從庫(kù)好久才做刃滓。
5.2 如何監(jiān)控仁烹?
5.2.1 傳輸過(guò)程監(jiān)控
主庫(kù):
show master status ;
從庫(kù):
show slave status \G
例子:
[root@db01 ~]# mysql -S /tmp/mysql3307.sock -e "show master status;"
+------------------+----------+--------------+------------------+-------------------+
| File? ? ? ? ? ? | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |? ? ? 154 |? ? ? ? ? ? ? |? ? ? ? ? ? ? ? ? |? ? ? ? ? ? ? ? ? |
+------------------+----------+--------------+------------------+-------------------+
[root@db01 ~]# mysql -S /tmp/mysql3308.sock -e "show slave status\G"|grep "Read_Master_Log_Pos"
Read_Master_Log_Pos: 154
[root@db01 ~]#
1000以上告警,10000以上緊急
5.2.2 回放是否及時(shí)
[root@db01 ~]# mysql -S /tmp/mysql3307.sock -e "show master status;"
+------------------+----------+--------------+------------------+-------------------+
| File? ? ? ? ? ? | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |? ? ? 154 |? ? ? ? ? ? ? |? ? ? ? ? ? ? ? ? |? ? ? ? ? ? ? ? ? |
+------------------+----------+--------------+------------------+-------------------+
[root@db01 ~]# mysql -S /tmp/mysql3308.sock -e "show slave status\G"|grep " Exec_Master_Log_Pos"
Exec_Master_Log_Pos: 154
10000以上告警咧虎,100000以上緊急
5.3 主從延時(shí)的原因
5.3.1 外部因素
網(wǎng)絡(luò)
主從配置(cpu\mem\io)
參數(shù)配置
等卓缰。
從庫(kù)太多
5.3.2 主庫(kù)方面
# dump線(xiàn)程是串行工作的模式。
5.6以前的版本砰诵,只能一個(gè)一個(gè)事務(wù)投遞binlog征唬。
5.6+版本以后,出現(xiàn)了group commit;
# binlog落地不及時(shí)茁彭。
采用ssd專(zhuān)門(mén)存儲(chǔ)binlog
5.3.3 從庫(kù)問(wèn)題
# IO落地relaylog
一般建議采用SSD
# SQL線(xiàn)程
默認(rèn)情況只有一個(gè)SQL線(xiàn)程总寒,只能串行工作。
主庫(kù)可以并發(fā)事務(wù)理肺。
高并發(fā)場(chǎng)景下摄闸,會(huì)造成較高延時(shí)。
出現(xiàn)大事務(wù)的時(shí)候妹萨,都會(huì)造成較高延時(shí)年枕。
解決方案:
1. 5.6版本,多SQL線(xiàn)程回放功能乎完。但是只能根據(jù)不同庫(kù)(database)進(jìn)行回放熏兄。
2. 5.7+版本中,加入MTS機(jī)制树姨。能夠按照group commit 的邏輯時(shí)鐘摩桶,進(jìn)行并行回放。
# 人的問(wèn)題
高并發(fā)場(chǎng)景下娃弓,會(huì)造成較高延時(shí)典格。
出現(xiàn)大事務(wù)的時(shí)候,都會(huì)造成較高延時(shí)台丛。
鎖問(wèn)題嚴(yán)重耍缴。
==============================
第九章? 主從復(fù)制(Source-Replica)-下-高級(jí)進(jìn)階
1. 延時(shí)從庫(kù)
1.1介紹
是我們認(rèn)為配置的一種特殊從庫(kù).人為配置從庫(kù)和主庫(kù)延時(shí)N小時(shí).
1.2 為什么要有延時(shí)從
什么是數(shù)據(jù)庫(kù)損壞?
物理?yè)p壞
主從復(fù)制非常擅長(zhǎng)解決物理?yè)p壞.
邏輯損壞
普通主從復(fù)制沒(méi)辦法解決邏輯損壞
1.3 配置延時(shí)從庫(kù)
SQL線(xiàn)程延時(shí):數(shù)據(jù)已經(jīng)寫(xiě)入relaylog中了,SQL線(xiàn)程"慢點(diǎn)"運(yùn)行
一般企業(yè)建議3-6小時(shí),具體看公司運(yùn)維人員對(duì)于故障的反應(yīng)時(shí)間
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
1.4 延時(shí)從庫(kù)應(yīng)用 *****
1.4.1 故障恢復(fù)思路
1主1從,從庫(kù)延時(shí)5分鐘,主庫(kù)誤刪除1個(gè)庫(kù)
1. 5分鐘之內(nèi) 偵測(cè)到誤刪除操作
2. 停從庫(kù)SQL線(xiàn)程
3. 截取relaylog
起點(diǎn) :停止SQL線(xiàn)程時(shí),relay最后應(yīng)用位置
Relay_Log_File: db01-relay-bin.000002
Relay_Log_Pos: 320
終點(diǎn):誤刪除之前的position(GTID)
4. 恢復(fù)截取的日志到從庫(kù)
5. 從庫(kù)身份解除,替代主庫(kù)工作
1.4.2 故障模擬及恢復(fù)
1.主庫(kù)數(shù)據(jù)操作
create database relay charset utf8;
use relay
create table t1 (id int);
insert into t1 values(1);
drop database relay;
2. 停止從庫(kù)SQL線(xiàn)程
stop slave sql_thread;
3. 找relaylog的截取起點(diǎn)和終點(diǎn)
起點(diǎn):
Relay_Log_File: db01-relay-bin.000002
Relay_Log_Pos: 485
終點(diǎn):
mysql> show relaylog events in 'db01-relay-bin.000002';
| db01-relay-bin.000002 | 1145 | Query? ? ? ? ? |? ? ? ? 7 |? ? ? ? 1074 | drop database relay? ? ?
mysqlbinlog --start-position=485 --stop-position=1145? /data/3308/data/db01-relay-bin.000002>/tmp/relay.sql
從庫(kù)恢復(fù)relaylog
source /tmp/relay.sql
5.從庫(kù)身份解除
db01 [relay]>stop slave;
db01 [relay]>reset slave all
2. 半同步 ***
解決主從數(shù)據(jù)一致性問(wèn)題挽霉。
2.1 半同步復(fù)制工作原理的變化
1. 主庫(kù)執(zhí)行新的事務(wù),commit時(shí),更新 show master? status\G ,觸發(fā)一個(gè)信號(hào)給
2. binlog dump 接收到主庫(kù)的 show master status\G信息,通知從庫(kù)日志更新了
3. 從庫(kù)IO線(xiàn)程請(qǐng)求新的二進(jìn)制日志事件
4. 主庫(kù)會(huì)通過(guò)dump線(xiàn)程傳送新的日志事件,給從庫(kù)IO線(xiàn)程
5. 從庫(kù)IO線(xiàn)程接收到binlog日志,當(dāng)日志寫(xiě)入到磁盤(pán)上的relaylog文件時(shí),給主庫(kù)ACK_receiver線(xiàn)程
6. ACK_receiver線(xiàn)程觸發(fā)一個(gè)事件,告訴主庫(kù)commit可以成功了
7. 如果ACK達(dá)到了我們預(yù)設(shè)值的超時(shí)時(shí)間,半同步復(fù)制會(huì)切換為原始的異步復(fù)制.
2.2 配置半同步復(fù)制
加載插件
主:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
從:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
查看是否加載成功:
show plugins;
啟動(dòng):
主:
SET GLOBAL rpl_semi_sync_master_enabled = 1;
從:
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
重啟從庫(kù)上的IO線(xiàn)程
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;
查看是否在運(yùn)行
主:
show status like 'Rpl_semi_sync_master_status';
從:
show status like 'Rpl_semi_sync_slave_status';
3 . 過(guò)濾復(fù)制
3.1 說(shuō)明
主庫(kù):
show master status;
Binlog_Do_DB
Binlog_Ignore_DB
從庫(kù):
show slave status\G
? ? ? ? ? ? ? Replicate_Do_DB:
? ? ? ? ? Replicate_Ignore_DB:
? ? ? ? ? Replicate_Do_Table:
? ? ? Replicate_Ignore_Table:
? ? ? Replicate_Wild_Do_Table:
? Replicate_Wild_Ignore_Table:
Replicate_Do_DB:
Replicate_Ignore_DB:
3.2 實(shí)現(xiàn)過(guò)程
[root@db01 ~]# vim /data/3308/my.cnf
replicate_do_db=ppt
replicate_do_db=word
[root@db01 ~]# systemctl restart mysqld3308
主庫(kù):
Master [(none)]>create database word;
Query OK, 1 row affected (0.00 sec)
Master [(none)]>create database ppt;
Query OK, 1 row affected (0.00 sec)
Master [(none)]>create database excel;
Query OK, 1 row affected (0.01 sec)
或者使用以下方法:
mysql> help? CHANGE REPLICATION FILTER
4. GTID復(fù)制
4.1 GTID引入
4.2 GTID介紹
GTID(Global Transaction ID)是對(duì)于一個(gè)已提交事務(wù)的唯一編號(hào)防嗡,并且是一個(gè)全局(主從復(fù)制)唯一的編號(hào)。
它的官方定義如下:
GTID =server_uuid : transaction_id
7E11FA47-31CA-19E1-9E56-C43AA21293967:29
什么是sever_uuid侠坎,和Server-id 區(qū)別蚁趁?
核心特性: 全局唯一,具備冪等性
4.3 GTID核心參數(shù)
重要參數(shù):
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
gtid-mode=on? ? ? ? ? ? ? ? ? ? ? ? --啟用gtid類(lèi)型,否則就是普通的復(fù)制架構(gòu)
enforce-gtid-consistency=true? ? ? --強(qiáng)制GTID的一致性
log-slave-updates=1? ? ? ? ? ? ? ? --slave更新是否記入日志
4.4 GTID復(fù)制配置過(guò)程:
4.4.1 清理環(huán)境
pkill mysqld
\rm -rf /data/3306/data/*
\rm -rf /data/binlog/*
\mv /etc/my.cnf /tmp
mkdir -p /data/3306/data /data/binlog/
chown -R mysql.mysql /data/*
4.4.2 準(zhǔn)備配置文件
主庫(kù)db01:
cat > /etc/my.cnf <<EOF
[mysqld]
basedir=/data/app/mysql/
datadir=/data/3306/data
socket=/tmp/mysql.sock
server_id=51
port=3306
secure-file-priv=/tmp
autocommit=0
log_bin=/data/binlog/mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
prompt=db01 [\\d]>
EOF
slave1(db02):
cat > /etc/my.cnf <<EOF
[mysqld]
basedir=/data/app/mysql
datadir=/data/3306/data
socket=/tmp/mysql.sock
server_id=52
port=3306
secure-file-priv=/tmp
autocommit=0
log_bin=/data/binlog/mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
prompt=db02 [\\d]>
EOF
slave2(db03):
cat > /etc/my.cnf <<EOF
[mysqld]
basedir=/data/app/mysql
datadir=/data/3306/data
socket=/tmp/mysql.sock
server_id=53
port=3306
secure-file-priv=/tmp
autocommit=0
log_bin=/data/binlog/mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
prompt=db03 [\\d]>
EOF
4.4.3 初始化數(shù)據(jù)
mysqld --initialize-insecure --user=mysql --basedir=/data/app/mysql? --datadir=/data/3306/data
4.4.4 啟動(dòng)數(shù)據(jù)庫(kù)
/etc/init.d/mysqld start
4.4.5 構(gòu)建主從:
master:51
slave:52,53
51:
mysql -e "grant replication slave? on *.* to repl@'10.0.0.%' identified by '123';"
52\53:
change master to
master_host='10.0.0.51',
master_user='repl',
master_password='123' ,
MASTER_AUTO_POSITION=1;
start slave;
5. 主從復(fù)制架構(gòu)演變
5.1 原生態(tài)復(fù)制結(jié)構(gòu)演變
1主1從实胸、1主N從
多級(jí)主從
5.2 擴(kuò)展架構(gòu)
讀寫(xiě)分離
高可用
分布式架構(gòu)
=================================
第十章? MySQL高可用及讀寫(xiě)分離技術(shù)
0. MHA高可用架構(gòu)介紹及搭建過(guò)程
0.1 規(guī)劃:
主庫(kù):
51 node
從庫(kù):
52? ? ? node
53? ? ? node? ? manager
0.2 準(zhǔn)備環(huán)境
略他嫡。1主2從GTID
0.3 配置關(guān)鍵程序軟連接
ln -s /data/app/mysql/bin/mysqlbinlog? ? /usr/bin/mysqlbinlog
ln -s /data/app/mysql/bin/mysql? ? ? ? ? /usr/bin/mysql
0.4 配置各節(jié)點(diǎn)互信(各節(jié)點(diǎn)之間無(wú)密碼SSH)
# db01:
rm -rf /root/.ssh
ssh-keygen
cd /root/.ssh
mv id_rsa.pub authorized_keys
scp? -r? /root/.ssh? 10.0.0.52:/root
scp? -r? /root/.ssh? 10.0.0.53:/root
各節(jié)點(diǎn)驗(yàn)證
db01:
ssh 10.0.0.51 date
ssh 10.0.0.52 date
ssh 10.0.0.53 date
db02:
ssh 10.0.0.51 date
ssh 10.0.0.52 date
ssh 10.0.0.53 date
db03:
ssh 10.0.0.51 date
ssh 10.0.0.52 date
ssh 10.0.0.53 date
0.5 安裝軟件
0.5.1 下載mha軟件
mha官網(wǎng):https://code.google.com/archive/p/mysql-master-ha/
github下載地址:https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads
0.5.2 所有節(jié)點(diǎn)安裝Node軟件依賴(lài)包
yum install perl-DBD-MySQL -y
rpm -ivh mha4mysql-node*.rpm
0.5.3 在db01主庫(kù)中創(chuàng)建mha需要的用戶(hù)
grant all privileges on *.* to mha@'10.0.0.%' identified by 'mha';
0.5.4? Manager軟件安裝(db03)
yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes
rpm -ivh mha4mysql-manager*.rpm
0.6? 配置文件準(zhǔn)備(db03)
0.6.1 創(chuàng)建配置文件目錄
mkdir -p /etc/mha
0.6.2 創(chuàng)建日志目錄
mkdir -p /var/log/mha/app1
0.6.3 編輯mha配置文件
vim /etc/mha/app1.cnf
[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=123
repl_user=repl
ssh_user=root
[server1]? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
hostname=10.0.0.51
port=3306? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
[server2]? ? ? ? ? ?
hostname=10.0.0.52
port=3306
[server3]
hostname=10.0.0.53
port=3306
0.7 狀態(tài)檢查
### 互信檢查
masterha_check_ssh? --conf=/etc/mha/app1.cnf
### 主從狀態(tài)檢查
masterha_check_repl --conf=/etc/mha/app1.cnf
0.8 開(kāi)啟MHA(db03):
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover? < /dev/null> /var/log/mha/app1/manager.log 2>&1 &
0.9 查看MHA狀態(tài)
[root@db03 ~]# masterha_check_status --conf=/etc/mha/app1.cnf
1. 什么是高可用??
企業(yè)高可用標(biāo)準(zhǔn):全年無(wú)故障時(shí)間
無(wú)故障時(shí)間? ? ? ? ? 故障時(shí)間? ? ?
99.9%? ? ? ? ? ? ? ? 0.1%? ? = 525.6? min? ? ? ? KA+雙主 :人為干預(yù)
99.99%? ? ? ? ? ? ? 0.01%? ? = 52.56? min? ? ? ? MHA? ? :半自動(dòng)化
99.999%? ? ? ? ? ? ? 0.001%? = 5.256? min? ? ? ? PXC 番官、 MGR 、MGC
99.9999%? ? ? ? ? ? 0.0001%? = 0.5256 min? ? ? ? 自動(dòng)化钢属、云化徘熔、平臺(tái)化
2. MHA的軟件結(jié)構(gòu)?
一堆perl寫(xiě)的腳本。
2.1 manager 組件
masterha_manger? ? ? ? ? ? 啟動(dòng)MHA
masterha_check_ssh? ? ? 檢查MHA的SSH配置狀況
masterha_check_repl? ? ? ? 檢查MySQL復(fù)制狀況
masterha_master_monitor? ? 檢測(cè)master是否宕機(jī)
masterha_check_status? ? ? 檢測(cè)當(dāng)前MHA運(yùn)行狀態(tài)
masterha_master_switch? 控制故障轉(zhuǎn)移(自動(dòng)或者手動(dòng))
masterha_conf_host? ? ? 添加或刪除配置的server信息
2.2 node 組件
save_binary_logs? ? ? ? ? ? 保存和復(fù)制master的二進(jìn)制日志
apply_diff_relay_logs? ? ? 識(shí)別差異的中繼日志事件并將其差異的事件應(yīng)用于其他的
purge_relay_logs? ? ? ? ? ? 清除中繼日志(不會(huì)阻塞SQL線(xiàn)程)
3. 站在產(chǎn)品經(jīng)理角度淆党,評(píng)估高可用軟件設(shè)計(jì)
3.1 監(jiān)控
3.2 選主
3.3 數(shù)據(jù)補(bǔ)償
3.4 故障轉(zhuǎn)移
3.5 應(yīng)用透明
3.6 自動(dòng)提醒
3.7 自愈
4. MHA FailOver 原理
4.1 監(jiān)控 :
通過(guò) masterha_master_monitor 酷师,每隔ping_interval秒探測(cè)一次Master 心跳。
監(jiān)測(cè)不到心跳染乌,一共給4次機(jī)會(huì)山孔。
4.2 選主
4.2.1 日志量(latest? slave)
各個(gè)從庫(kù)的日志量。
無(wú)GTID:
[root@db02 ~]#? mysql -e "show slave status\G" |grep "Master_Log"
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 194
有GTID:
[root@db02 ~]#? mysql -e "show slave status\G" |grep "Executed_Gtid_Set"
Executed_Gtid_Set: 1c35b73a-7321-11ea-8974-000c29248f69:1-6
4.2.2? 候選主 candidate master
candidate_master=1? 強(qiáng)制某個(gè)節(jié)點(diǎn)為備選主荷憋。如果日志量超過(guò)100M差異台颠,放棄掉他。
check_repl_delay=0? 不檢查日志量的差異台谊。
4.2.3 如果沒(méi)有權(quán)重蓉媳,從庫(kù)日志量一樣
根據(jù)配置文件的先后順序選擇新主譬挚。
4.2.4 默認(rèn)
從庫(kù)日志量和主庫(kù)延時(shí)100M以上锅铅。
4.3 日志補(bǔ)償
4.3.1 if? 主庫(kù)ssh 能連接
各個(gè)從節(jié)點(diǎn),通過(guò)save_binary_logs 立即保存缺失部分的binlog到/var/tmp/xxxxx
怎么判斷缺失日志减宣?
有GTID盐须?
[root@db01 ~]# mysql -e "show master status;"
[root@db02 ~]# mysql -e "show slave status\G" |grep "Retrieved_Gtid_Set"
4.3.2 eles 主庫(kù) ssh 不能連接
從節(jié)點(diǎn)調(diào)用apply_diff_relay_logs,計(jì)算兩個(gè)從節(jié)點(diǎn)的relay-log日志差異漆腌。
4.4 故障轉(zhuǎn)移
1. 取消所有節(jié)點(diǎn)的從庫(kù)狀態(tài)
2. 構(gòu)建新的主從關(guān)系
4.5 自動(dòng)將故障節(jié)點(diǎn)贼邓,從配置文件剔除
--remove_dead_master_conf
4.6 自殺
manager自動(dòng)退出。
4.7 應(yīng)用透明: vip
4.8 數(shù)據(jù)補(bǔ)償補(bǔ)充方案:binlog_server
4.9 切換提醒:send_report
5. 模擬故障并恢復(fù)
5.0 工作狀態(tài)查看
[root@db03 app1]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:17501) is running(0:PING_OK), master:10.0.0.51
5.1 宕主庫(kù)測(cè)試
[root@db01 ~]# /etc/init.d/mysqld stop
Shutting down MySQL............ SUCCESS!
[root@db01 ~]#
5.2 看日志
[root@db03 app1]# vim /var/log/mha/app1/manager
5.3 恢復(fù)
5.3.1 修復(fù)故障節(jié)點(diǎn)
[root@db01 ~]# /etc/init.d/mysqld start
Starting MySQL.. SUCCESS!
如果生產(chǎn)怎么辦闷尿?
按實(shí)際情況塑径。
5.3.2 恢復(fù)主從
change master to
master_host='10.0.0.52',
master_user='repl',
master_password='123' ,
MASTER_AUTO_POSITION=1;
start slave;
5.3.3 修復(fù)配置文件
方法一:?
vim /etc/mha/app1.cnf
[server1]
hostname=10.0.0.51
port=3306
方法二:
masterha_conf_host --command=add --conf=/etc/mha/app1.cnf --hostname=10.0.0.51 --block=server10 --params="port=3306"
masterha_conf_host --command=delete --conf=/etc/mha/app1.cnf --block=server1
5.3.4 預(yù)檢測(cè)腳本
[root@db03 ~]# masterha_check_ssh? --conf=/etc/mha/app1.cnf
[root@db03 ~]# masterha_check_repl? --conf=/etc/mha/app1.cnf
5.3.5 啟動(dòng)MHA
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover? < /dev/null> /var/log/mha/app1/manager.log 2>&1 &
[root@db03 ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:24316) is running(0:PING_OK), master:10.0.0.52
[root@db03 ~]#
6. 應(yīng)用透明---VIP
vip :? 10.0.0.55/24
6.1 vip 故障轉(zhuǎn)移腳本
上傳mha_script.tar文件到/usr/local/bin 解壓
6.2 修改權(quán)限
[root@db03 bin]# chmod +x /usr/local/bin/*
6.3 修改內(nèi)容
[root@db03 bin]# cp master_ip_failover master_ip_failover.bak
my $vip = '10.0.0.55/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
my $ssh_Bcast_arp= "/sbin/arping -I eth0 -c 3 -A 10.0.0.55";
6.4 修改Manager 配置文件
vim /etc/mha/app1.cnf
master_ip_failover_script=/usr/local/bin/master_ip_failover
6.5 重啟MHA
[root@db03 bin]# masterha_stop? --conf=/etc/mha/app1.cnf
[root@db03 bin]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover? < /dev/null> /var/log/mha/app1/manager.log 2>&1 &
6.6 手工在主庫(kù)添加VIP
[root@db02 ~]# ifconfig ens33:1 10.0.0.55/24
7. 故障提醒功能
7.1 準(zhǔn)備腳本
[root@db03 bin]# cp send_report send_report.bak1
my $smtp='smtp.qq.com';? ? ? ? ? ? # smtp服務(wù)器
my $mail_from='22654481@qq.com';? ? # 發(fā)件箱
my $mail_user='22654481';? ? ? ? ? # 用戶(hù)名 QQ號(hào)
my $mail_pass='gemghsvgkeyzcagh';? # 授權(quán)碼
my $mail_to=['22654481@qq.com'];? ? # 收件箱
#my $mail_to=['to1@qq.com','to2@qq.com'];
7.2 修改配置文件
vim /etc/mha/app1.cnf
# 添加一行:
report_script=/usr/local/bin/send_report
7.3 重啟MHA
[root@db03 bin]# masterha_stop? --conf=/etc/mha/app1.cnf
[root@db03 bin]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover? < /dev/null> /var/log/mha/app1/manager.log 2>&1 &
7.4 模擬主庫(kù)宕機(jī)?
7.4.1 確認(rèn)主庫(kù)
[root@db03 bin]# masterha_check_status? --conf=/etc/mha/app1.cnf
app1 (pid:27096) is running(0:PING_OK), master:10.0.0.52
7.4.2 宕主庫(kù)
[root@db02 ~]# /etc/init.d/mysqld stop
Shutting down MySQL............ SUCCESS!
7.4.3 觀(guān)察 vip 漂移?
7.4.4 觀(guān)察 郵件
7.5? 修復(fù)MHA 架構(gòu)1主2從
略
8. 日志補(bǔ)償?shù)娜哂喾桨?-binlog_server
8.1 創(chuàng)建必要目錄(db03)
mkdir -p /data/binlog_server/
chown -R mysql.mysql /data/*
cd? /data/binlog_server/
[root@db03 ~]# mysql -e "show slave status \G"|grep "Master_Log"
? ? ? ? ? ? ? Master_Log_File: mysql-bin.000008
? ? ? ? ? Read_Master_Log_Pos: 194
? ? ? ? Relay_Master_Log_File: mysql-bin.000008
? ? ? ? ? Exec_Master_Log_Pos: 194
[root@db03 ~]#
mysqlbinlog? -R --host=10.0.0.51 --user=mha --password=mha --raw? --stop-never mysql-bin.000008 &
注意:
拉取日志的起點(diǎn),需要按照目前從庫(kù)的已經(jīng)獲取到的二進(jìn)制日志點(diǎn)為起點(diǎn)
8.2 配置文件設(shè)置
vim /etc/mha/app1.cnf
[binlog1]
no_master=1
hostname=10.0.0.53
master_binlog_dir=/data/binlog_server/
8.3 重啟MHA
[root@db03 bin]# masterha_stop? --conf=/etc/mha/app1.cnf
[root@db03 bin]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover? < /dev/null> /var/log/mha/app1/manager.log 2>&1 &
9. MHA的維護(hù)操作 - 在線(xiàn)切換功能
9.1 只切換角色
masterha_master_switch? --conf=/etc/mha/app1.cnf --master_state=alive --new_master_host=10.0.0.52 --orig_master_is_new_slave --running_updates_limit=10000
注意:
master_ip_online_change_script is not defined. If you do not disable writes on the current master manually, applications keep writing on the current master. Is it ok to proceed? (yes/NO): yes
1. 此種方法 切換,要注意將原主庫(kù)填具,F(xiàn)TWRL统舀,否則會(huì)造成主從不一致。
2. 手工切換vip
3. 重新拉去新主庫(kù)的binlog
9.2 master_ip_online_change_script功能實(shí)現(xiàn)
功能: 在線(xiàn)切換時(shí)劳景,自動(dòng)鎖原主庫(kù)誉简,VIP自動(dòng)切換
9.2.1 準(zhǔn)備切換腳本
vim /usr/local/bin/master_ip_online_change
my $vip = "10.0.0.55/24";
my $key = "1";
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key $vip down";
my $ssh_Bcast_arp= "/sbin/arping -I ens33 -c 3 -A 10.0.0.55";
9.2.2 修改MHA配置文件
vim /etc/mha/app1.cnf
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
9.2.3 停 MHA
[root@db03 bin]# masterha_stop? --conf=/etc/mha/app1.cnf
9.2.4 檢查repl
[root@db03 bin]# masterha_check_repl? --conf=/etc/mha/app1.cnf
9.2.4 在線(xiàn)切換
masterha_master_switch? --conf=/etc/mha/app1.cnf --master_state=alive --new_master_host=10.0.0.51 --orig_master_is_new_slave --running_updates_limit=10000
9.2.5 重構(gòu)binlogserver
[root@db03 bin]# ps -ef |grep mysqlbinlog
root? ? ? 28144? 16272? 0 17:50 pts/1? ? 00:00:00 mysqlbinlog -R --host=10.0.0.52 --user=mha --password=x x --raw --stop-never mysql-bin.000005
root? ? ? 28529? 16272? 0 18:03 pts/1? ? 00:00:00 grep --color=auto mysqlbinlog
[root@db03 bin]# kill -9 28144
[root@db03 bin]# cd /data/binlog_server/
[root@db03 binlog_server]# ll
total 4
-rw-r----- 1 root root 194 Apr? 1 17:50 mysql-bin.000005
[root@db03 binlog_server]# rm -rf *
[root@db03 binlog_server]# mysqlbinlog? -R --host=10.0.0.51 --user=mha --password=mha --raw? --stop-never mysql-bin.000009 &
[1] 28534
9.2.6 啟動(dòng)MHA
[root@db03 bin]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover? < /dev/null> /var/log/mha/app1/manager.log 2>&1 &
[root@db03 binlog_server]# masterha_check_status? --conf=/etc/mha/app1.cnf
app1 (pid:28535) is running(0:PING_OK), master:10.0.0.51
MHA 高可用環(huán)境搭建
6.1 規(guī)劃:
主庫(kù): 51 node
從庫(kù):
52? ? ? node
53? ? ? node? ? manager
6.2 準(zhǔn)備環(huán)境(略。1主2從GTID)
6.3 配置關(guān)鍵程序軟連接
ln -s /data/app/mysql/bin/mysqlbinlog? ? /usr/bin/mysqlbinlog
ln -s /data/app/mysql/bin/mysql? ? ? ? ? /usr/bin/mysql
6.4 配置各節(jié)點(diǎn)互信(各節(jié)點(diǎn)之間無(wú)密碼SSH)
# db01:
rm -rf /root/.ssh
ssh-keygen
cd /root/.ssh
mv id_rsa.pub authorized_keys
scp? -r? /root/.ssh? 10.0.0.52:/root
scp? -r? /root/.ssh? 10.0.0.53:/root
各節(jié)點(diǎn)驗(yàn)證
db01:
ssh 10.0.0.51 date
ssh 10.0.0.52 date
ssh 10.0.0.53 date
db02:
ssh 10.0.0.51 date
ssh 10.0.0.52 date
ssh 10.0.0.53 date
db03:
ssh 10.0.0.51 date
ssh 10.0.0.52 date
ssh 10.0.0.53 date
6.5 安裝軟件
6.5.1 下載mha軟件
mha官網(wǎng):https://code.google.com/archive/p/mysql-master-ha/
github下載地址:https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads
6.5.2 所有節(jié)點(diǎn)安裝Node軟件依賴(lài)包
yum install perl-DBD-MySQL -y
rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
6.5.3 在db01主庫(kù)中創(chuàng)建mha需要的用戶(hù)
grant all privileges on *.* to mha@'10.0.0.%' identified by 'mha';
6.5.4? Manager軟件安裝(db03)
yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes
rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm
6.6? 配置文件準(zhǔn)備(db03)
6.6.1 創(chuàng)建配置文件目錄
mkdir -p /etc/mha
6.6.2 創(chuàng)建日志目錄
mkdir -p /var/log/mha/app1
6.6.3 編輯mha配置文件
vim /etc/mha/app1.cnf
[server default]
manager_log=/var/log/mha/app1/manager? ? ? ?
manager_workdir=/var/log/mha/app1? ? ? ? ? ?
master_binlog_dir=/data/3306/binlog? ? ?
user=mha? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
password=mha? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
ping_interval=2
repl_password=123
repl_user=repl
ssh_user=root
[server1]? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
hostname=10.0.0.51
port=3306? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
[server2]? ? ? ? ? ?
hostname=10.0.0.52
port=3306
[server3]
hostname=10.0.0.53
port=3306
6.7 狀態(tài)檢查
### 互信檢查
masterha_check_ssh? --conf=/etc/mha/app1.cnf
### 主從狀態(tài)檢查
masterha_check_repl --conf=/etc/mha/app1.cnf
6.8 開(kāi)啟MHA(db03):
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover? < /dev/null> /var/log/mha/app1/manager.log 2>&1 &
6.9 查看MHA狀態(tài)
[root@db03 ~]# masterha_check_status --conf=/etc/mha/app1.cnf