MHA高可用
第1章 高級架構演變:
1.1 高性能架構:
讀寫分離--->mysql-proxy;atlas;
在主從服務器前增加負載均衡服務器,對sql語句進行判斷,以實現讀寫都可以分配給不同的mysql服務器
分庫分表--->Mycat;cobar
1.2 高可用架構:
1. MMM 已經過時
2. MHA 目前推薦
3. MGR ; InnoDB cluster 未來的趨勢,建議學習
4. MySQL NDB cluster 不夠完善
第2章 MHA的引入
2.1 failover 故障轉移 :
主庫宕機後,備幾點要做的事情:
1. 自動監控到工作節點宕機
2. 如果是一主多從結構,需要選擇一個能替代原有節點的新節點,(數據最接近原工作節點)作為工作節點
3. 數據補償:對比從庫和原主庫的數據差異,進行數據補償,S2先補償到S1
4. 需要將剩余節點指向新主庫,構成新的主從關系
5. S1補償到和原主庫一致
a) ssh能連接上原主庫,直接截取保存主庫缺失部分binlog
b) 連接不上的話,我們企業中一般會配置binlog server1:1保存主庫binlog
6. 加入vip功能,讓應用透明化,即用戶無感知服務器的切換
第3章 MHA簡介:
3.1 MHA軟件介紹:
MHA目前在mysql高可用方面是一個相對成熟的解決方案,由日本DeNA公司開發,是一套優秀的作為mysql高可用環境下故障切換的主從提升的高可用軟件,在mysql故障切換過程中,MHA能做到在10-30秒之內自動完成數據的故障切換動作,兵器在進行故障切換的過程中,MHA能在最大程度上保證數據的一致性,以達到真正意義上的高可用
MHA能夠在較短的時間內實現自動故障檢測和故障轉移,通常在10-30秒以內,在復制框架中,MHA能夠很好的解決復制過程中數據一致性的問題,由於不需要在現有的replication中添加額外的服務器,僅需要一個manageer節點,而一個
MHA還提供在線主庫切換的功能,能夠安全的奇幻當前運行的胡庫到一個新的主庫中,大概0.5-2秒內即可完成
MHA軟件有兩部分組成:MHA Manager(管理節點)和MHA Node(數據節點),MHA Manager可以單獨部署在一臺獨立的機器上管理多個主從集群,也可以部署在一臺slave節點上,MHANode運行在沒他mysql服務器上,MHA Manager會定時探測集群中的master節點,當master出現故障時,它可以自動將最新數據的slave提升為新的master,然後將所有其他slave重新指向新的master,整個故障轉移過程對應用程序完全透明
3.2 MHA工作原理:
1. 保存master上的所有binlog事件
2. 找到含有最新binlog位置點的slave
3. 通過中繼日誌(relay-log)將數據恢復到其他slave
4. 將包含最新binlog位置點的slave提升為master
5. 將其他從庫slave指向新的master,原slave,開啟主從復制
6. 將保存下來的binlog恢復到新的master上
3.3 MHA高可用架構圖:
1.1 MHA工具介紹:
MHA軟件由兩部分組成,Manager工具包和Node工具包,主要包括以下:
1.1.1 Manager包括:
masterha_check_ssh #檢査 MHA 的 ssh-key^ masterha_check_repl #檢査主從復制情況 masterha_manger #啟動MHA masterha_check_status #檢測MHA的運行狀態^ masterha_mast er_monitor #檢測master是否宕機一 masterha_mast er_switch #手動故障轉移— masterha_conf_host #手動添加server倍息一 masterha_secondary_check #建立TCP連接從遠程服務器v masterha_stop #停止MHA
1.1.2 Node包括:
save_binary_1ogs #保存宕機的master的binlog apply_diff_relay_logs #識別relay log的差異 filter_mysqlbinlog #防止回滾事件一MHA已不再使用這個工具 purge_relay_logs #清除中繼曰誌一不會阻塞SQL線程
1.2 MHA的優點:
1. 自動故障轉移
2. 主庫崩潰不存在數據不一致的情況
3. 不需要對當前的mysql環境做重大修改
4. 不需要添加額外的服務器
5. 性能優秀,可以工作在半同步和一步復制框架
6. 只要relplication支持的存儲引擎MHA都支持
第2章 GTID復制技術說明:
2.1 先決條件:
1. 主庫和從庫要開啟binlog
2. 主庫和從庫server-id必須不同
3. 要有主從復制用戶
2.2 GTID復制技術說明:
1. GTID簡介:
GTID的全稱為global transaction identifier 即全局事務標識符,是對於一個已提交事務的編號,並且編號全局唯一
GTID=source_id:transaction_id
source_id用於標識源服務器,用server_uuid來表示,這個值在第一次啟動時生成,並寫入到配置文件data/auto.cnf中
transaction_id則是根據在源服務器上第幾個提交的事務來確定
2. GTID事件結構:
1. GTID在二進制日誌中的結構:
1. 查看uuid
[root@db03 ~]# cd /application/mysql/data/ [root@db01 data]# cat auto.cnf [auto] server-uuid=804b7523-3ec6-11e8-b6de-000c297af7c2 [root@db01 data]# cat /application/mysql/data/auto.cnf [auto] server-uuid=f4a983f8-3c06-11e8-a4f3-000c297af7c2
1.1 GTID復制的特點:
1. 整個復制範圍內,事務的GTID是一致的
2. GTID復制時,是自動讀取最後一個relay-log事務信息,獲取到GTID,從庫就按照整個GTID開始自動往後復制,如果relay-log中沒有GTID信息,那麽從庫會去找主庫從第一個開始,全量的二進制日誌
3. 如果從庫是備份恢復搭建的環境,那麽從庫會從備份結束時的事務ID往後自動復制
4. GTID復制不支持事務斷點
1.2 msyql GTID復制配置:
1.2.1 主庫配置文件:
# vi /etc/my.cnf [mysqld] basedir=/usr/local/mysql datadir=/data/mysql server-id=1 log-bin=mysql-bin socket=/tmp/mysql.sock binlog-format=ROW gtid-mode=on enforce-gtid-consistency=true log-slave-updates=1
1.2.2 從庫配置文件:
# vi /etc/my.cnf [mysqld] basedir=/usr/local/mysql datadir=/data/mysql server-id=2 binlog-format=ROW gtid-mode=on enforce-gtid-consistency=true log-bin=mysql-bin log_slave_updates = 1 socket=/tmp/mysql.sock
1.2.3 配置文件解釋:
server-id=x # 同一個復制拓撲中的所有服務器的id號必須惟一 binlog-format=RO # 二進制日誌格式,強烈建議為ROW gtid-mode=on # 啟用gtid類型,否則就是普通的復制架構 enforce-gtid-consistency=true # 強制GTID的一致性 log-slave-updates=1 # slave更新是否記入日誌
1.2.4 復制用戶準備:
mysql>GRANT REPLICATION SLAVE ON *.* TO rep@ '10.0.0.%' IDENTIFIED BY '123' ;
從節點開啟復制:
mysql>start slave; mysql>show slave status\G
1.3 模擬從庫寫入的報錯:
1. 從庫執行:
create database nihao;
2. 主庫也執行相同命令:
create database nihao;
3. 主庫再次之執行後,sql線程宕掉,無法寫入:
Retrieved_Gtid_Set: 94ba1856-3ed2-11e8-b72d-000c291cc733:1-2 Executed_Gtid_Set: 6e445062-3ed2-11e8-b72c-000c297af7c2:1-3, 94ba1856-3ed2-11e8-b72d-000c291cc733:1 正常綠色部分應該相同
解決:
mysql> stop slave; mysql> set gtid_next='94ba1856-3ed2-11e8-b72d-000c291cc733:6'; mysql> begin;commit; mysql> set gtid_next='AUTOMATIC'; mysql> start slave;
跳過出錯的gtid
第2章 搭建MHA高可用架構:
本次MHA部署是基於GTID復制成功構建的,普通的主從復制也可以構建MHA架構
2.1 環境準備:
本次測試共三臺服務器:
db01 10.0.0.51 db02 10.0.0.52 db03 10.0.0.53
系統基本環境如下:
[root@db01 ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) [root@db01 ~]# getenforce Disabled [root@db01 ~]# systemctl status firewalld.service ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: inactive (dead) [root@db01 ~]# hostname -I 10.0.0.51 172.16.1.51
2.2 修改配置文件:
1. 主節點配置文件:
[mysqld] basedir=/application/mysql datadir=/application/mysql/data server-id=1 log-bin=mysql-bin socket=/tmp/mysql.sock binlog-format=ROW gtid-mode=on enforce-gtid-consistency=true log-slave-updates=1 skip-name-resolve
2. db02:
[mysqld] basedir=/application/mysql datadir=/application/mysql/data server-id=2 binlog-format=ROW gtid-mode=on enforce-gtid-consistency=true log-bin=mysql-bin log_slave_updates = 1 socket=/tmp/mysql.sock skip-name-resolve 3. db03: [mysqld] basedir=/application/mysql datadir=/application/mysql/data server-id=3 binlog-format=ROW gtid-mode=on enforce-gtid-consistency=true log-bin=mysql-bin log_slave_updates = 1 socket=/tmp/mysql.sock skip-name-resolve
2.3 為了純凈的環境,重新進行了初始化,便於搭建
rm –rf * /appliaction/mysql/data/* /application/mysql/scripts/mysql_install_db --basedir=/application/mysql --datadir=/application/mysql/data --user=mysql /etc/init.d/mysqld start
2.4 主庫添加復制用戶:
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'10.0.0.%' IDENTIFIED BY '123';
2.4.1 兩個從庫執行:
mysql> change master to master_host='10.0.0.51', master_user='repl', master_password='123', master_auto_position=1; mysql> start slave;
2.5 從庫關閉自動清除中繼日誌
MHA架構中,某些從庫的數據恢復依賴於其他從庫,所以關閉自動清理relay-log功能
mysql> set global relay_log_purge = 0; 關閉自動清除relay-log mysql> set global read_only=1; 開啟只讀模式 vim /etc/my.cnf [mysqld] relay_log_purge = 0
2.6 mha所需軟件下載地址:
下載mha軟件,mha官網 : https://code.google.com/archive/p/mysql-master-ha/
github下載地址:https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads
2.6.1 安裝依賴包:
yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Params-Validate perl-CPAN perl-devel perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
2.7 所有節點安裝node軟件包:
tar xf mha4mysql-node-0.56.tar.gz cd mha4mysql-node-0.56 perl Makefile.PL make && make install
2.8 所有節點創建mha用戶,但是開啟了主從,只在主節點創建就可以了
mysql> grant all privileges on *.* to mha@'10.0.0.%' identified by 'mha';
在從節點檢查確認是否已經都存在了
mysql> select user,host from mysql.user; +------+-----------+ | user | host | +------+-----------+ | mha | 10.0.0.% | | repl | 10.0.0.% | | root | 127.0.0.1 | | root | ::1 | | | db02 | | root | db02 | | | localhost | | root | localhost | +------+-----------+
2.9 配置mysqlbinlog和mysql命令軟連接到/usr/bin下,所有節點都要操作:
不創建軟連接的話,檢測mha復制情況的時候會報錯
ln -s /application/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog ln -s /application/mysql/bin/mysql /usr/bin/mysql
2.10 部署manager節點,建議部署在從節點:
1. 安裝依賴
yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes
2. 安裝manager軟件
tar xf mha4mysql-manager-0.56.tar.gz cd mha4mysql-manager-0.56 perl Makefile.PL make && make install
3. 創建必須目錄:
mkdir -p /var/log/mha/app1 mkdir -p /etc/mha
4. 編寫mha-manager配置文件
[root@db03 mha4mysql-manager-0.56]# vim /etc/mha/app1.cnf [server default] manager_log=/var/log/mha/app1/manager manager_workdir=/var/log/mha/app1 master_binlog_dir=/data/mysql 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
2.11 配置互信,每臺機器上都要做:
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1 ssh-copy-id -i /root/.ssh/id_dsa.pub [email protected] ssh-copy-id -i /root/.ssh/id_dsa.pub [email protected] ssh-copy-id -i /root/.ssh/id_dsa.pub [email protected]
2.11.1 檢測互信:
[root@db01 bin]# ssh 10.0.0.51 date Fri Apr 13 16:13:26 CST 2018 [root@db01 bin]# ssh 10.0.0.52 date Fri Apr 13 16:13:28 CST 2018 [root@db01 bin]# ssh 10.0.0.53 date Fri Apr 13 16:13:26 CST 2018
2.12 MHA啟動前檢測:
masterha_check_ssh --conf=/etc/mha/app1.cnf Fri Apr 13 16:23:33 2018 - [debug] Connecting via SSH from [email protected](10.0.0.53:22) to [email protected](10.0.0.52:22).. Fri Apr 13 16:23:33 2018 - [debug] ok. Fri Apr 13 16:23:34 2018 - [info] All SSH connection tests passed successfully.
2.13 啟動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 mha]# ps -ef |grep mha root 4191 2644 11 16:42 pts/1 00:00:00 perl /usr/local/bin/masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover
第3章 故障模擬:
3.1 發生故障
1. 停掉master節點:
[root@db01 .ssh]# /etc/init.d/mysqld stop
2. db02已經變為主節點:
mysql> show slave status; Empty set (0.00 sec) mysql> show master status; +------------------+----------+--------------+------------------+------------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+------------------------------------------+ | mysql-bin.000004 | 440 | | | 6e445062-3ed2-11e8-b72c-000c297af7c2:1-2 | +------------------+----------+--------------+------------------+------------------------------------------+
3. MHA Manager節點查看:
MHA 守護進程已經幫我們把主節點切換到db02
Started automated(non-interactive) failover. Selected 10.0.0.52(10.0.0.52:3306) as a new master. 10.0.0.52(10.0.0.52:3306): OK: Applying all logs succeeded. 10.0.0.53(10.0.0.53:3306): OK: Slave started, replicating from 10.0.0.52(10.0.0.52:3306) 10.0.0.52(10.0.0.52:3306): Resetting slave info succeeded. Master failover to 10.0.0.52(10.0.0.52:3306) completed successfully.
3.2 故障修復:
1. 修復故障庫,並重新啟動:
2. 在日誌中找出change master to 語句,將修復好的故障庫加入主從架構中,作為新主庫的從庫,MHA將不會切換主庫
[root@db03 app1]# cat manager|grep -i 'change master to' Fri Apr 13 16:49:09 2018 - [info] All other slaves should start replication from here. Statement should be: CHANGE MASTER TO MASTER_HOST='10.0.0.52', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='xxx';
3. 登錄到修復好的故障庫,執行change master to
CHANGE MASTER TO MASTER_HOST='10.0.0.52', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='123'; Query OK, 0 rows affected, 2 warnings (0.09 sec) mysql> start slave;
4. 修改MHA配置文件,把server標簽重新添加回去,故障庫宕機後,mha會自動把server標簽刪除
vim /etc/mha/app1.cnf [server1] hostname=10.0.0.51 port=3306
5. 重新啟動mha服務
MHA高可用