12-MHA+讀寫分離

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.安裝軟件
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 的工作原理

  1. 通過masterha_manger腳本啟動(dòng)MHA高可用功能
  2. 通過masterha_master_monitor監(jiān)控主節(jié)點(diǎn)的狀態(tài),每ping_interval秒探測(cè)一次主庫的心跳,一共檢測(cè)4次.如過.4次都沒通,認(rèn)為主庫宕機(jī)
  3. 進(jìn)行選主工作
    算法一: 權(quán)重candidate_master=1
    算法二: 判斷日志量
    算法三: 按照配置文件的順序
  4. 數(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ù).
  5. 通過masterha_master_switch 腳本切換.
    所有從節(jié)點(diǎn),stop slave; reset slave all;
    s2節(jié)點(diǎn),change master to s1 ,start slave
  6. 調(diào)用masterha_conf_host腳本,從集群中將故障節(jié)點(diǎn)剔除.
  7. 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                            |
+----------------------------+-----------------------------------
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容