MHA高可用MySQL高可用集群
- 一、MHA的介紹
- 二、實驗介紹
- 1、實驗環境
- 2、實驗目的
- 3、實驗配置程序
- 三、實體配置MySQL(MHA)高可用程序
- 1、配置MySQL一主兩從
- 1)修改master組態檔
- 2)修該slave組態檔
- 3)重啟所有資料庫
- 4)為資料庫服務器建立軟連接
- 5)為資料庫服務器開啟主從復制和MHA服務賬戶授權
- 6)查看master資料庫主從復制的,二進制檔案名和同步復制的pos點
- 7)在slave資料庫中同步master資料庫
- 2、安裝 MHA 軟體
- 1)MHA依賴環境包安裝
- 2)node節點安裝
- 3)MHA-manager安裝
- 4、配置無密碼認證
- 5、 配置 MySQL MHA 高可用
- 1)配置MHA自動切換vip腳本
- 2)配置MHA的組態檔
- 6、MHA測驗免密互動、和主從同步
- 1)測驗 ssh 無密碼認證,如果正常最后會輸出 successfully
- 2)檢查mysql主從復制,如過正常最后回輸出 OK
- 7、模擬 master 故障切換
- 1)需要到master資料庫上手動開啟虛擬ip
- 2)啟動MHA
- 3)查看當前master狀態
- 4)將master資料庫關閉
- 5)查看master地址是否改變
- 8、修復故障資料庫
一、MHA的介紹
-
MHA是一款用于解決資料庫MySQL高可用性環境下故障切換和主從提升的高可用軟體,能夠很好的解決單master主資料庫單點故障點的問題,
-
在MySQL故障切換程序中,MHA能做到在0~30秒之內自動完成資料庫的故障切換操作,并且在進行故障切換的程序中, MHA能在最大程度上保證資料的一致性,以達到真正意義上的高可用,
-
MHA能夠在0.5-2秒內實作切換,0.5-2秒的寫阻塞通常是可接受的,所以你甚至能在非維護期間就在線切換master,諸如升級到高版本,升級到更快的服務器之類的作業,將會變得更容易,
-
MHA由Manager節點和Node節點組成,
二、實驗介紹
1、實驗環境
| 服務器 | 作業系統 | IP地址 |
|---|---|---|
| MHA manger節點 | Linux 7.6 (64位) | 192.168.10.161/24 |
| master 主節點 | Linux 7.6 (64位) | 192.168.10.100/24 |
| mater slave主備節點 | Linux 7.6 (64位) | 192.168.10.156/24 |
| slave 從節點 | Linux 7.6 (64位) | 192.168.10.160/24 |
- 實驗規劃圖

2、實驗目的
本案例要求通過 MHA 監控 MySQL 資料庫在master故障時進行自動切換到master salve,不影響業務,
3、實驗配置程序
- 配置 MySQL 一主兩從
- 安裝 MHA 軟體
- 配置無密碼認證
- 配置 MySQL MHA 高可用
- 模擬 master 故障切換
注: 所有服務器關閉selinux和防火墻,
三、實體配置MySQL(MHA)高可用程序
1、配置MySQL一主兩從
- 為三臺資料庫服務器安裝MySQL7.6
- 修改資料庫的組態檔/etc/my.cnf,開啟日志服務
1)修改master組態檔
[root@Mysql1 ~]# vim /etc/my.cnf
[mysqld]
server-id = 1 //資料庫的身份id,不同的資料庫身份id不能一樣
log_bin = master-bin //開啟資料庫二進制檔案
log-slave-updates = true //允許別的從服務器和自己同步
2)修該slave組態檔
除了兩臺slave資料庫的server-id直段不一樣,其他修改的添加的欄位一樣
[root@Mysql2 ~]# vim /etc/my.cnf
server-id = 2
log_bin = master-bin
relay-log = relay-log-bin //開啟中繼日志,同來同步資料庫的二級制檔案
relay-log-index = slave-relay-bin.index //開啟中繼日志索引
3)重啟所有資料庫
[root@Mysql1 ~]# systemctl restart mysqld
4)為資料庫服務器建立軟連接
使liunx系統識別mysql的操作命令,
[root@Mysql1 ~]# ln -s /usr/local/mysql/bin/mysql /usr/sbin/
[root@Mysql1 ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
5)為資料庫服務器開啟主從復制和MHA服務賬戶授權
mysql> grant replication slave on *.* to 'myslave'@'192.168.10.%' identified by '123';
//為主從復制賬戶授權
mysql> grant all privileges on *.* to 'mha'@'192.168.10.%' identified by 'manager';
//為MHA賬戶授權
mysql> flush privileges; //重繪授權
6)查看master資料庫主從復制的,二進制檔案名和同步復制的pos點
mysql> show master status;
+-------------------+----------+
| File | Position |//從服務器要同步的二進制檔案名和同步的pos點
+-------------------+----------+
| master-bin.000001 | 155|
+-------------------+----------+
7)在slave資料庫中同步master資料庫
mysql> change master to master_host='192.168.10.100',master_user='myslave',
> master_password='123',master_log_file='master-bin.000001',
> master_log_pos=155; //同步主資料庫
mysql> start slave; //開啟主從復制
mysql> set global read_only=1; //設定從資料庫為只讀
8)查看slave資料庫的 IO 和 SQL 執行緒是否都是 yes 代表同步是否正常,no 表示不正常,
mysql> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes //都為yes表示同步正常
9)驗證主從復制是否成功,
在主服務器上創建一個表或者庫,在從服務器上查看是否有在主服務器上創建的表或者庫
2、安裝 MHA 軟體
1)MHA依賴環境包安裝
- 每個節點上都要安裝MHA依賴環境包
- 虛擬機的yum倉庫一定要有線網源,可以上網,因為yum安裝的環境包都時需要到線網中下載,
[root@MHA-manager ~]# yum install epel-release --nogpgcheck -y //以不檢查簽名資訊的方式安裝epel源
[root@MHA-manager ~]#yum install -y perl-DBD-MySQL \ //連接資料庫的驅動
perl-Config-Tiny \ //配置資訊
perl-Log-Dispatch \ //日志資訊
perl-Parallel-ForkManager \ //多執行緒管理
perl-ExtUtils-CBuilder \ //單元構建
perl-ExtUtils-MakeMaker \ //編譯行程
perl-CPAN //包管理行程
2)node節點安裝
MHA 軟體包對于每個作業系統版本不一樣,這里 CentOS7.0以上必須選擇 0.57 版本,CentOs6.0以上使用必須使用0.56版本,需要注意的是所有服務器上必須先安裝 node 組件,最后在 MHA-manager 節點上安裝 manager 組件,因為 manager 管理服務器依賴 node 組件,
- node的下載網址https://nodejs.org/en/download/
將下載的node包上傳到各個節點,
- 編譯安裝node組件
[root@Mysql1 ~]# tar zxvf mha4mysql-node-0.57.tar.gz //解壓node安裝包
[root@Mysql1 ~]# cd mha4mysql-node-0.57 //進入到解壓目錄
[root@Mysql1 mha4mysql-node-0.57]# perl Makefile.PL //使用perl 編譯檔案
[root@Mysql1 mha4mysql-node-0.57]# make && make install //編譯安裝node
注: node 安裝后也會在/usr/local/bin 下面會生成幾個腳本(這些工具通常由 MHAManager 的腳本觸發,無需人為操作)主要包括:
| 腳本名 | 用法介紹 |
|---|---|
| save_binary_logs | 保存和復制 master 的二進制日志 |
| -apply_diff_relay_logs | 識別差異的中繼日志事件并將其差異的事件應用于其他的 slave |
| filter_mysqlbinlog | 去除不必要的 ROLLBACK 事件(MHA 已不再使用這個工具) |
| -purge_relay_logs | 清除中繼日志(不會阻塞 SQL 執行緒) |
3)MHA-manager安裝
在 MHA-manager 上安裝 manager 組件(!注意:一定要先安裝node 組件才能安裝manager 組件)
- MHA-manager 5.6的下載地址
https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads - MHA-manager 5.7的下載地址需要翻墻才能下載到,這里是以下好的提取地址
鏈接: https://pan.baidu.com/s/18H12bTIYHi2H0dXs2DI7NA 提取碼: mwkq
[root@MHA-manager ~]# tar zxvf mha4MHA-manager-0.57.tar.gz
[root@MHA-manager ~]# cd mha4MHA-manager-0.57
[root@MHA-manager mha4MHA-manager-0.57]# perl Makefile.PL
[root@MHA-manager mha4MHA-manager-0.57]# make && make install
注: manager 安裝后在/usr/local/bin 下面會生成幾個用法工具,主要包括:
| 工具名 | 用法介紹 |
|---|---|
| masterha_check_ssh | 檢查 MHA 的 SSH 配置狀況 |
| masterha_check_repl | 檢查 MySQL 復制狀況 |
| masterha_manger | 啟動 manager的腳本 |
| masterha_check_status | 檢測當前 MHA 運行狀態 |
| masterha_master_monitor | 檢測 master 是否宕機 |
| masterha_master_switch | 控制故障轉移(自動或者手動) |
| masterha_conf_host | 添加或洗掉配置的 server 資訊 |
| masterha_stop | 關閉manager |
4、配置無密碼認證
1) 在 manager 上配置到所有資料庫節點的無密碼認證
[root@MHA-manager ~]# ssh-keygen -t rsa //一路按回車鍵
[root@MHA-manager ~]# ssh-copy-id 192.168.10.100
[root@MHA-manager ~]# ssh-copy-id 192.168.10.156
[root@MHA-manager ~]# ssh-copy-id 192.168.10.160
2)在master上配置到資料庫節點slave的無密碼認證
[root@Mysql1 ~]# ssh-keygen -t rsa
[root@Mysql1 ~]# ssh-copy-id 192.168.10.156
[root@Mysql1 ~]# ssh-copy-id 192.168.10.160
3)在 master-slave 上配置到資料庫節點slave和master的無密碼認證
[root@Mysql2 ~]# ssh-keygen -t rsa
[root@Mysql2 ~]# ssh-copy-id 192.168.10.100
[root@Mysql2 ~]# ssh-copy-id 192.168.10.160
4) 在slave 上配置到資料庫節點master-slave和master的無密碼認證
[root@Mysql3 ~]# ssh-keygen -t rsa
[root@Mysql3 ~]# ssh-copy-id 192.168.10.100
[root@Mysql3 ~]# ssh-copy-id 192.168.10.156
5、 配置 MySQL MHA 高可用
1)配置MHA自動切換vip腳本
[root@MHA-manager ~]# cp -ra /root/mha4mysql-manager-0.57/samples/scripts /usr/local/bin
//將vip控制腳本復制到指定目錄下
- 控制自動切換vip的腳本模板
| 腳本名 | 用法介紹 |
|---|---|
| master_ip_failover | 自動切換時 vip 管理的腳本 |
| master_ip_online_change | 在線切換時 vip 的管理 |
| power_manager | 故障發生后關閉主機的腳本 |
| 1360 5 月 31 2015 send_report | 因故障切換后發送報警的腳本 |
- 復制上述的自動切換時 vip 管理的腳本到/usr/local/bin 目錄,使用腳本管理 vip
[root@MHA-manager ~]# cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin - 添加內容部分
[root@localhost local]# vim /usr/local/bin/master_ip_failover
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use Getopt::Long;
my (
$command, $ssh_user, $orig_master_host, $orig_master_ip,
$orig_master_port, $new_master_host, $new_master_ip, $new_master_port
);
//添加以下內容
my $vip = '192.168.10.200'; //vip的地址
my $brdc = '192.168.10.255'; //vip的網路號,也表示結束地址
my $ifdev = 'ens33'; //網卡名稱
my $key = '1'; //邏輯子介面
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip"; //啟動vip
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down"; //關閉vip
my $exit_code = 0; //狀態的回傳值,正常關倍訓傳0
······ //省略部分資訊
2)配置MHA的組態檔
創建 MHA 軟體目錄并拷貝組態檔,
[root@MHA-manager ~]# mkdir /etc/masterha #創建軟體目錄
[root@MHA-manager ~]# cp /root/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha/ #復制模板到軟體目錄
[root@MHA-manager ~]# vim /etc/masterha/app1.cnf #編輯組態檔
[server default]
manager_workdir=/var/log/masterha/app1.log ##manager作業目錄
manager_log=/var/log/masterha/app1/manager.log #manager日志
master_binlog_dir=/usr/local/mysql/data/ #master保存binlog的位置,這里的路徑要與master里配置的binlog的路徑一致,以便mha能找到
#master_ip_failover_script= /usr/local/bin/master_ip_failover #設定自動failover時候的切換腳本,也就是上邊編輯的自動切換vip腳本
master_ip_online_change_script= /usr/local/bin/master_ip_online_change #設定手動切換時候的切換腳本
password=manager #設定mysql中root用戶的密碼,這個密碼是前文中創建監控用戶的那個密碼
user=mha #設定監控用戶root
ping_interval=1 #設定監控主庫,發送ping包的時間間隔,默認是3秒,嘗試三次沒有回應的時候自動進行railover
remote_workdir=/tmp #設定遠端mysql在發生切換時binlog的保存位置
repl_password=123 #設定復制用戶的密碼
repl_user=myslave #設定復制用戶的用戶
report_script=/usr/local/send_report //設定發生切換后發送的報警的腳本
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.10.100 -s 192.168.10.156
shutdown_script="" #設定故障發生后關閉故障主機腳本(該腳本的主要作用是關閉主機,這里沒有使用)
ssh_user=root #設定ssh的登錄用戶名
[server1]
hostname=192.168.10.100
port=3306
[server2]
hostname=192.168.10.156
port=3306
candidate_master=1 #設定為候選master,如果設定該引數以后,發生主從切換以后將會將此從庫提升為主庫,即使這個主庫不是集群中事件最新的slave
check_repl_delay=0 #默認情況下如果一個slave落后master 100M的relay logs的話,MHA將不會選擇該slave作為一個新的master,因為對于這個slave的恢復需要花費很長時間,通過設定check_repl_delay=0,MHA觸發切換在選擇一個新的master的時候將會忽略復制延時,這個引數對于設定了candidate_master=1的主機非常有用,因為這個候選主在切換的程序中一定是新的master
[server3]
hostname=192.168.10.161
port=3306
6、MHA測驗免密互動、和主從同步
1)測驗 ssh 無密碼認證,如果正常最后會輸出 successfully
[root@localhost local]# masterha_check_ssh -conf=/etc/masterha/app1.cnf
Sun Oct 25 13:59:20 2020 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Sun Oct 25 13:59:20 2020 - [info] Reading application default configuration from /etc/masterha/app1.cnf..
······//省略部分資訊
Sun Oct 25 13:59:26 2020 - [info] All SSH connection tests passed successfully.
2)檢查mysql主從復制,如過正常最后回輸出 OK
[root@localhost ]# masterha_check_repl -conf=/etc/masterha/app1.cnf
Sun Oct 25 15:16:47 2020 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Sun Oct 25 15:16:47 2020 - [info] Reading application default configuration from /etc/masterha/app1.cnf..
·······//省略部分資訊
MySQL Replication Health is OK.
7、模擬 master 故障切換
1)需要到master資料庫上手動開啟虛擬ip
[root@Mysql1 ~]# /sbin/ifconfig ens33:1 192.168.10.200/24
2)啟動MHA
[root@MHA-manager ~]# nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &
--remove_dead_master_conf 該引數代表當發生主從切換后,老的主庫的 ip 將會從組態檔中移除,
--ignore_last_failover 在預設情況下,如果 MHA 檢測到連續發生宕機,且兩次宕機間隔不足 8 小時的話,則不會進行 Failover,之所以這樣限制是為了避免 ping-pong 效應,該引數代表忽略上次 MHA 觸發切換產生的檔案,
默認情況下,MHA 發生切換后會在日志記目錄,也就是上面設定的日志 app1.failover.complete 檔案,下次再次切換的時候如果發現該目錄下存在該檔案將不允許觸發切換,除非在第一次切換后收到洗掉該檔案,
為了方便,這里設定--ignore_last_failover,
-- manger_log 日志存放位置,
3)查看當前master狀態
[root@mysql3 local]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:22244) is running(0:PING_OK), master:192.168.10.100
4)將master資料庫關閉
- 在master資料庫上查看vip是否啟動
[root@mysql1 ~]# ifconfig //查看vip是否開啟
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.10.100 netmask 255.255.255.0 broadcast 192.168.10.255
inet6 fe80::e6f1:c815:f9f7:fa2d prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:5a:1e:11 txqueuelen 1000 (Ethernet)
RX packets 605653 bytes 890376090 (849.1 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 108259 bytes 7264193 (6.9 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.10.200 netmask 255.255.255.0 broadcast 192.168.10.255
ether 00:0c:29:5a:1e:11 txqueuelen 1000 (Ethernet)
[root@mysql1 ~]# systemctl stop mysqld 或 pkill -9 mysql //關閉資料庫
5)查看master地址是否改變
[root@mysql3 local]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:23153) is running(0:PING_OK), master:192.168.10.156
//模擬故障成功master地址由100變為了156
切換備選主庫的演算法:
1.一般判斷從庫的是從(position/GTID)判斷優劣,資料有差異,最接近于master的slave,成為備選主,
2.資料一致的情況下,按照組態檔順序,選擇備選主庫,
3.設定有權重(candidate_master=1),按照權重強制指定備選主,
1)默認情況下如果一個slave落后master 100M的relay logs的話,即使有權重,也會失效,
2)如果check_repl_delay=0的話,即使落后很多日志,也強制選擇其為備選主,
8、修復故障資料庫
1)啟動故障資料庫
[root@mysql1 ~]# systemctl start mysqld
2)修復故障資料庫主從同步
mysql> change master to master_host=‘192.168.10.156’,master_user=‘myslave’,
> master_password=‘123’,master_log_file=‘master-bin.000004’,
> master_log_pos=154;
>start slave;
3)修改MHA服務器組態檔(再把這個記錄添加進去,因為它檢測掉失效時候會自動消失)
[root@localhost ]# vi /etc/masterha/app1.cnf
[server1]
hostname=192.168.195.129
port=3306
4)重啟MHA服務
nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/194609.html
標籤:其他
