一腐晾,mysql高可用架構(gòu)
1.1 企業(yè)高可用評(píng)估指標(biāo):
3個(gè)9一般級(jí)別,4個(gè)9互聯(lián)網(wǎng)級(jí)別嗤军,5個(gè)9金融級(jí)別
1.2 mysql 數(shù)據(jù)庫(kù)高可用架構(gòu)產(chǎn)品
主備系統(tǒng):
(1) KA+雙主結(jié)構(gòu)+自主開發(fā)的腳本(節(jié)點(diǎn)監(jiān)控,數(shù)據(jù)校驗(yàn),數(shù)據(jù)補(bǔ)償) 3個(gè)9
(2) Google MMM 3-4個(gè)
(3) Facebook MHA 4個(gè)9 , Taobao TMHA , TDSQL MHA
多活系統(tǒng)
(5) PXC(percona), MGC(mariadb) , MySQL Cluster 5個(gè)9
(6) InnoDB Cluster , PolarDB ,TiDB 分布式高可用
1.3 基礎(chǔ)架構(gòu)搭建環(huán)境準(zhǔn)備
(1)環(huán)境準(zhǔn)備(一主兩從)
(2) 準(zhǔn)備配置文件
主庫(kù)db01:
cat > /etc/my.cnf <<EOF
[mysqld]
basedir=/usr/local/mysql/
datadir=/data/mysql/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=/usr/local/mysql
datadir=/data/mysql/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=/usr/local/mysql
datadir=/data/mysql/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
(3) 初始化數(shù)據(jù)
mysqld --initialize-insecure --user=mysql -- basedir=/usr/local/mysql --datadir=/data/mysql/data
(5) 啟動(dòng)數(shù)據(jù)庫(kù)
/etc/init.d/mysqld start
(6) 構(gòu)建主從:
master:51
slave:52,53
51:
grant replication slave on *.* to repl@'10.0.0.%' identified by '123';
52\53:
change master to
master_host='10.0.0.52',
master_user='repl',
master_password='123456' ,
MASTER_AUTO_POSITION=1;
start slave;
說明:MHA高可用至少需要1主兩從結(jié)構(gòu),獨(dú)立節(jié)點(diǎn),不能是多實(shí)例匙奴,開啟GTID復(fù)制更好一些
配置關(guān)鍵程序軟連接
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
說明:MHA工作過程不會(huì)調(diào)用profile里的環(huán)境變量所以系統(tǒng)設(shè)置。
配置個(gè)節(jié)點(diǎn)互信
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
用于截取日志時(shí)恢復(fù)免交互yes
1.4 MHA軟件下載及配置
(1) 下載mha軟件
mha官網(wǎng):https://code.google.com/archive/p/mysql-master-ha/
github下載地址:https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads
(2) 所有節(jié)點(diǎn)安裝Node軟件依賴包
yum install perl-DBD-MySQL -y
rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
(3) 在db01主庫(kù)中創(chuàng)建mha需要的用戶 也可提供給監(jiān)控做管理用戶妄荔。
grant all privileges on . to mha@'10.0.0.%' identified by 'mha';
(5) Manager軟件安裝(db03)
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
此處裝一個(gè)管理主從的manager軟件泼菌,一般放在單獨(dú)一臺(tái)清涼的服務(wù)器上,此處裝S2上
1.5 配置文件準(zhǔn)備
1.創(chuàng)建配置文件目錄
mkdir -p /etc/mha
2.創(chuàng)建日志目錄
mkdir /var/log/mha/app1/manager
3.編輯MHA配置??文件
cat > /etc/mha/app1.cnf<<EOF
[server default]
# manager 工作日志
manager_log=/var/log/mha/app1/manager
# 工作目錄
manager_workdir=/var/log/mha/app1
# 主庫(kù)的binlog位置
master_binlog_dir=/data/binlog
# MHA專用管理用戶
user=mha
password=mha
# 心跳檢測(cè)的時(shí)間間隔,自動(dòng)檢測(cè)4次
ping_interval=2
# 復(fù)制用戶
repl_password=123
repl_user=repl
# ssh的互信用戶
ssh_user=root
[server1]
hostname=10.0.0.51
port=3306
[server2]
hostname=10.0.0.52
candidate_master=1 # 設(shè)定選主權(quán)重
port=3306
[server3]
hostname=10.0.0.53
port=3306
EOF
1.6 狀態(tài)檢查
masterha_check_ssh --conf=/etc/mha/app1.cnf
masterha_check_repl --conf=/etc/mha/app1.cnf
1.7 開啟mha(db03)
nohup masterha_manager --conf=/et c/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover
< /dev/null> /var/log/mha/app1/manager.log 2>&1 &
--conf=/etc/mha/app1.cnf : 業(yè)務(wù)配置文件,可以管理多套 MHA架構(gòu)
--remove_dead_master_conf : 自動(dòng)剔除故障主節(jié)點(diǎn)
--ignore_last_failover : 忽略最后一次failover.
1.8 查看各關(guān)閉命令
[root@db03 ~]# masterha_check_status --conf=/etc/mha/app1.cnf
[root@db03 ~]# masterha_stop --conf=/etc/mha/app1.cnf
1.9 配置總結(jié)
10.5.2 軟件結(jié)構(gòu)
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信息
Node :
這些工具通常由MHA Manager的腳本觸發(fā)啦租,無(wú)需人為操作
save_binary_logs 保存和復(fù)制master的二進(jìn)制日志
apply_diff_relay_logs 識(shí)別差異的中繼日志事件并將其差異的事件應(yīng)用于其他的
purge_relay_logs 清除中繼日志(不會(huì)阻塞SQL線程)
1.10MHA的工作原理 *****
①哗伯,MHA應(yīng)用在最低一主兩從的mysql主從復(fù)制環(huán)境中
②,會(huì)通過masterha_manager來(lái)啟動(dòng)MHA的manager管理程序
③篷角,MHA會(huì)通過msterha_master_monitor監(jiān)控主從的狀態(tài) 通過ping機(jī)制放送四次心跳檢測(cè)
④焊刹,如果發(fā)現(xiàn)主庫(kù)異常,會(huì)觸發(fā)failover程序恳蹲,從新選擇新的主庫(kù)虐块,依次選擇原則為,權(quán)重設(shè)置嘉蕾,binlog量的大小贺奠,配置中server的順序。
⑤错忱,數(shù)據(jù)補(bǔ)償mha會(huì)調(diào)用server_binlog機(jī)制自動(dòng)連接save_binary_logs恢復(fù)缺失的日志到各個(gè)節(jié)點(diǎn)的/var/tmp/xxx.log文件中儡率,此外如果不能建立ssh連接情況會(huì)通過apply_diff_relay_logs自動(dòng)對(duì)比差異互相補(bǔ)償。
⑥以清,數(shù)據(jù)補(bǔ)償完成后喉悴,會(huì)調(diào)用masterha_master_switch腳本進(jìn)行切換,原理為stop 各個(gè)節(jié)點(diǎn)slave玖媚,然后change master reset slave all新的主庫(kù)信息
⑦箕肃,對(duì)與應(yīng)用透明需求VIP需要調(diào)用master_ip_script指定腳本,實(shí)現(xiàn)vip漂移到新的主庫(kù)
⑧今魔,調(diào)用report_script指定腳本大宋故障信息
⑨勺像,最好原先的主庫(kù)信息在manster 的配置文件中被清楚掉,且masterha_manager也會(huì)實(shí)去作用错森。
具體操作
準(zhǔn)備vip腳本
[root@db03 ~]# cp master_ip_failover.txt /usr/local/bin/master_ip_failover
vi /usr/local/bin/master_ip_failover
my $vip = '10.0.0.55/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";注意 eth0根據(jù)實(shí)際寫
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
注意:
[root@db03 ~]# dos2unix /usr/local/bin/master_ip_failover
dos2unix: converting file /usr/local/bin/master_ip_failover to Unix format ...
[root@db03 ~]# chmod +x /usr/local/bin/master_ip_failover
10.7.2 更改manager配置文件:
vim /etc/mha/app1.cnf
添加:
master_ip_failover_script=/usr/local/bin/master_ip_failover
10.7.3 主庫(kù)上吟宦,手工生成第一個(gè)vip地址
手工在主庫(kù)上綁定vip,注意一定要和配置文件中的ethN一 致涩维,我的是eth0:1(1是key指定的值)
ifconfig eth0:1 10.0.0.55/24
10.7.5 重啟mha
masterha_stop --conf=/etc/mha/app1.cnf
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 &
10.8 binlog server(db03) 額外數(shù)據(jù)補(bǔ)償?shù)墓δ? (binlog server功能)
10.8.1 配置參數(shù):
vim /etc/mha/app1.cnf
[binlog1]
no_master=1
hostname=10.0.0.53
master_binlog_dir=/data/mysql/binlog
10.8.2 創(chuàng)建必要目錄
mkdir -p /data/mysql/binlog
chown -R mysql.mysql /data/*
10.8.3 拉取主庫(kù)binlog日志
cd /data/mysql/binlog
mysqlbinlog -R --host=10.0.0.51 --user=mha -- password=mha --raw --stop-never mysql-bin.000001 &
**注意: 生產(chǎn)中, 拉取起點(diǎn)從正在使用的binlog開啟**
10.8.5 重啟MHA
masterha_stop --conf=/etc/mha/app1.cnf
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 &
10.9. 郵件提醒(db03)
10.9.1 準(zhǔn)備腳本
[root@db03 ~]# unzip email_2019-最新.zip
[root@db03 ~]# cd email/
[root@db03 ~/email]# ll
總用量 88
-rw-r--r-- 1 root root 35 12月 27 2017 send
-rw-r--r-- 1 root root 80213 9月 30 2009 sendEmail
-rw-r--r-- 1 root root 203 4月 19 2019 testpl
[root@db03 ~/email]# cp -a * /usr/local/bin/
[root@db03 ~/email]# cd /usr/local/bin/
[root@db03 /usr/local/bin]# chmod +
10.9.2 修改參數(shù):
vim /etc/mha/app1.cnf
report_script=/usr/local/bin/send
10.9.3 重啟MHA
masterha_stop --conf=/etc/mha/app1.cnf
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 &
10.10 測(cè)試MHA高可用能力,并恢復(fù).
10.10.1 停主庫(kù)
pkill mysqld
10.10.2 觀察切換結(jié)果
vip
主從身份
配置文件
binlogserver
manager進(jìn)程
看日志
[root@db03 ~]# vim /var/log/mha/app1/manager
2. 修復(fù)全新的高可用環(huán)境(高可用故障皆可按以下思路排查)
1. 檢查修復(fù)主從關(guān)系開啟mysql故障庫(kù)(此處模擬的時(shí)庫(kù)關(guān) 閉)重新建立新的主從關(guān)系
db01:
change master to
master_host='10.0.0.52',
master_user='repl',
master_password='123' ,
MASTER_AUTO_POSITION=1;
start slave;
2. 檢查修復(fù)配置文件
db03 : 添加此信息
vim /etc/mha/app1.cnf
[server1]
hostname=10.0.0.51
port=3306
3. 修復(fù)binlogserver
[root@db03 ~]# cd /data/mysql/binlog/
[root@db03 /data/mysql/binlog]# rm -rf *
mysqlbinlog -R --host=10.0.0.52 --user=mha -- password=mha --raw --stop-never mysql-bin.000001 &
**說明:此處調(diào)用的是日志補(bǔ)償腳本殃姓,先刪除原先主庫(kù)的 日志文件從新從新的主庫(kù)拉取袁波,在企業(yè)環(huán)境中選擇最新的 binlog日志文件即可。
5. 檢查vip是否漂移到新的主庫(kù)
命令
ifconfig eth0:1 10.0.0.55/24添加臨時(shí)vip網(wǎng)卡重啟也會(huì)消失
ifconfig eth0:1 down刪除
6. 互信檢查蜗侈,主從檢查篷牌,此檢查會(huì)檢查主從關(guān)系,MHA腳 本調(diào)用及vip等信息踏幻,可關(guān)注報(bào)錯(cuò)
masterha_check_ssh --conf=/etc/mha/app1.cnf
masterha_check_repl --conf=/etc/mha/app1.cnf
7. 啟動(dòng)manager
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 /data/mysql/binlog]# masterha_check_status --conf=/etc/mha/app1.cnf