1. 程式人生 > >MHA高可用

MHA高可用

MHA高可用

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節點,而一個

manager能管理多套復制方案,所以能大大節約服務器的數量,兩臺,安裝簡單,沒有性能損耗,以及不需要修改現有的復制部署也是他的優點

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 配置mysqlbinlogmysql命令軟連接到/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高可用