1. 主從復(fù)制架構(gòu)演變
1.讀寫分離: 讀多寫少的業(yè)務(wù)類型
Atlas , ProxySQL ,Maxscale .....
2.高可用: 解決業(yè)務(wù)主庫宕機(jī)時(shí),還能繼續(xù)提供原有服務(wù)
MHA,PXC,MGC,MGR,MIC(8.0)
3.分布式架構(gòu): 將邏輯單元拆分到不同的節(jié)點(diǎn)中,分擔(dān)存儲(chǔ)壓力和業(yè)務(wù)壓力.
Mycat,DBLE,Sharding-jdbc
4.NewSQL架構(gòu): 合久必分,分久必合.
TiDB , Polardb ,TDSQL
2. 企業(yè)高可用標(biāo)準(zhǔn)評(píng)估:全年無故障率
99.9% 0.1% 365*24*60*0.001= 525.6 min
99.99% 0.01% 365*24*60*0.001= 52.56 min
99.999% 0.001% 365*24*60*0.001= 5.256 min
99.9999% 0.0001% 365*24*60*0.001= 0.5256 min
負(fù)載集群: 3個(gè)9
主備集群: 4個(gè)9 MHA
多活集群: 5個(gè)9 MySQL Cluster, MIC, PXC ,MGC
Real Application Cluster : Oracle RAC sysbase cluster
3. MHA環(huán)境基礎(chǔ)搭建
1.規(guī)劃
主庫 51 node
從庫 52 node
53 node manager
2.準(zhǔn)備環(huán)境
1主2從GTID
3.配置關(guān)鍵程序軟連接
ln -s /usr/local/mysql57/bin/mysqlbinlog /usr/bin/mysqlbinlog
ln -s /usr/local/mysql57/bin/mysql /usr/bin/mysql
4.配置各節(jié)點(diǎn)互信(僅供參考)
三臺(tái)機(jī)器互相免密登錄
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
5.安裝軟件
下載mha軟件
mha官網(wǎng):https://code.google.com/archive/p/mysql-master-ha/
github下載地址:https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads所有節(jié)點(diǎn)安裝Node軟件依賴包
yum install perl-DBD-MySQL -y
rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
- 在db01主庫中創(chuàng)建mha需要的用戶
grant all privileges on *.* to mha@'10.0.0.%' identified by 'mha';
- 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.配置文件準(zhǔn)備(db03)
- 創(chuàng)建配置文件目錄
mkdir -p /etc/mha
- 創(chuàng)建日志目錄
mkdir -p /var/log/mha/app1
- 編輯mha配置文件
cat > /etc/mha/app1.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=123
repl_user=repl
ssh_user=root
[server1]
hostname=10.0.0.51
port=3306
[server2]
hostname=10.0.0.52
candidate_master=1
port=3306
[server3]
hostname=10.0.0.53
port=3306
EOF
7.狀態(tài)檢查
- 互信檢查
masterha_check_ssh --conf=/etc/mha/app1.cnf
- 主從檢查
masterha_check_repl --conf=/etc/mha/app1.cnf
8.啟動(dòng)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 &
9.查看MHA狀態(tài)
masterha_check_status --conf=/etc/mha/app1.cnf
查看各節(jié)點(diǎn)的server_id是否相同
mysql -umha -pmha -h 10.0.0.51 -e "select @@server_id"
mysql -umha -pmha -h 10.0.0.52 -e "select @@server_id"
mysql -umha -pmha -h 10.0.0.53 -e "select @@server_id"
5. MHA 軟件結(jié)構(gòu)介紹
1.Manager工具包主要包括以下幾個(gè)工具
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.Node工具包主要包括以下幾個(gè)工具
這些工具通常由MHA Manager的腳本觸發(fā),無需人為操作
save_binary_logs 保存和復(fù)制master的二進(jìn)制日志
apply_diff_relay_logs 識(shí)別差異的中繼日志事件并將其差異的事件應(yīng)用于其他的
purge_relay_logs 清除中繼日志(不會(huì)阻塞SQL線程)
*6.MHA 的工作原理
- 通過masterha_manger腳本啟動(dòng)MHA高可用功能
- 通過masterha_master_monitor監(jiān)控主節(jié)點(diǎn)的狀態(tài),每ping_interval秒探測(cè)一次主庫的心跳,一共檢測(cè)4次.如過.4次都沒通,認(rèn)為主庫宕機(jī)
- 進(jìn)行選主工作
算法一: 權(quán)重candidate_master=1
算法二: 判斷日志量
算法三: 按照配置文件的順序 - 數(shù)據(jù)補(bǔ)償
ssh能連: 各個(gè)從庫通過(save_binary_logs)立即保存缺失部分binlog到/var/tmp/xxxx,并補(bǔ)償數(shù)據(jù).
ssh不能連:數(shù)據(jù)較少的從庫,會(huì)通過apply_diff_relay_logs,計(jì)算差異,追平數(shù)據(jù). - 通過masterha_master_switch 腳本切換.
所有從節(jié)點(diǎn),stop slave; reset slave all;
s2節(jié)點(diǎn),change master to s1 ,start slave - 調(diào)用masterha_conf_host腳本,從集群中將故障節(jié)點(diǎn)剔除.
- manager 自殺.
7. MHA 擴(kuò)展功能應(yīng)用
7.1 MHA 的vip功能
- 1.準(zhǔn)備腳本
[root@db03 ~]# cp master_ip_failover.txt /usr/local/bin/master_ip_failover
[root@db03 ~]# cd /usr/local/bin/
[root@db03 bin]# chmod +x master_ip_failover
[root@db03 bin]# dos2unix master_ip_failover
改配置文件:
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";
- 2.manager配置文件修改
添加參數(shù)
vim /etc/mha/app1.cnf
master_ip_failover_script=/usr/local/bin/master_ip_failover
- 3.手工生成vip(主節(jié)點(diǎn))
ifconfig eth0:1 10.0.0.55/24
- 4.重啟MHA
停止MHA
masterha_stop --conf=/etc/mha/app1.cnf
啟動(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 &
檢查MHA是否啟動(dòng)
masterha_check_status --conf=/etc/mha/app1.cnf
7.2 binlog server(db03)
- 1.參數(shù)
vim /etc/mha/app1.cnf
[binlog1]
no_master=1
hostname=10.0.0.53
master_binlog_dir=/data/mysql/binlog
- 2.創(chuàng)建必要目錄
mkdir -p /data/mysql/binlog
chown -R mysql.mysql /data/*
- 3.拉取主庫binlog日志
cd /data/mysql/binlog
mysqlbinlog -R --host=10.0.0.51 --user=mha --password=mha --raw --stop-never mysql-bin.000001 &
- 4.重啟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 &
7.3 郵件提醒
- 1.準(zhǔn)備郵件腳本
send_report - 準(zhǔn)備發(fā)郵件的腳本(上傳 email_2019-最新.zip中的腳本,到/usr/local/bin/中)
- 2.修改manager配置文件,調(diào)用郵件腳本
vi /etc/mha/app1.cnf
report_script=/usr/local/bin/send
- 停止MHA
masterha_stop --conf=/etc/mha/app1.cnf
- 開啟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 &
- 關(guān)閉主庫,看警告郵件
8. MHA 故障修復(fù):
1. 恢復(fù)故障節(jié)點(diǎn)db01
/etc/init.d/mysqld start
2. 修復(fù)主從
將db01 加入到主從環(huán)境中作為從庫角色
change master to
master_host='10.0.0.52',
master_user='repl',
master_password='123' ,
MASTER_AUTO_POSITION=1;
start slave;
3. 修復(fù)binlog_server(db03)
[root@db03 binlog]# cd /data/mysql/binlog/
[root@db03 binlog]# rm -rf *
[root@db03 binlog]# mysqlbinlog -R --host=10.0.0.52 --user=mha --password=mha --raw --stop-never mysql-bin.000001 &
4. 檢查主庫vip
[root@db02 ~]# ifconfig -a
5. 檢查配置文件節(jié)點(diǎn)信息(db03)
[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. 狀態(tài)檢查
互信檢查
masterha_check_ssh --conf=/etc/mha/app1.cnf
主從檢查
masterha_check_repl --conf=/etc/mha/app1.cnf
7. 啟動(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 &
2.讀寫分離Atlas+MHA應(yīng)用
1. 介紹
Atlas是由 Qihoo 360, Web平臺(tái)部基礎(chǔ)架構(gòu)團(tuán)隊(duì)開發(fā)維護(hù)的一個(gè)基于MySQL協(xié)議的數(shù)據(jù)中間層項(xiàng)目。
它是在mysql-proxy 0.8.2版本的基礎(chǔ)上,對(duì)其進(jìn)行了優(yōu)化,增加了一些新的功能特性。
360內(nèi)部使用Atlas運(yùn)行的mysql業(yè)務(wù),每天承載的讀寫請(qǐng)求數(shù)達(dá)幾十億條。
- 下載地址
https://github.com/Qihoo360/Atlas/releases - 注意:
1、Atlas只能安裝運(yùn)行在64位的系統(tǒng)上
2、Centos 5.X安裝 Atlas-XX.el5.x86_64.rpm,Centos 6.X安裝Atlas-XX.el6.x86_64.rpm。
3、后端mysql版本應(yīng)大于5.1,建議使用Mysql 5.6以上
2.安裝配置
- 安裝Atlas
yum install -y Atlas*
- 編寫配置文件
cd /usr/local/mysql-proxy/conf
mv test.cnf test.cnf.bak
vi test.cnf
[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
- 啟動(dòng)atlas
/usr/local/mysql-proxy/bin/mysql-proxyd test start
ps -ef |grep proxy
3. Atlas功能測(cè)試
- 測(cè)試讀操作:
mysql -umha -pmha -h 10.0.0.53 -P 33060
db03 [(none)]>select @@server_id;
- 測(cè)試寫操作:
mysql> begin;select @@server_id;commit;
4. Atlas的管理
db03 [(none)]>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 |
+----------------------------+-----------------------------------