Mysql 搭建MHA高可用架構,實現自動failover,完成主從切換

目錄

自動failover

MHA:

MHA 服務

項目:搭建Mysql主從復制、MHA高可用架構

實驗項目IP地址配置:

MHA下載地址

項目步驟:?

一、修改主機名

二、編寫一鍵安裝mha node腳本和一鍵安裝mha mangaer腳本,并執行安裝

三、搭建Mysql主從復制集群(注意所有的Mysql機器都需要打開二進制日志,可以實現自動故障切換)

四、將安裝包?mha4mysql-node和 腳本一鍵安裝mha node腳本傳輸給Mysql主從復制集群,并運行腳本安裝(下載依賴的時候最好翻墻下載)

五、所有服務器互相建立免密通道

5.1、mha manager對所有mysql服務器建立免密通道

5.2、master對slave1、slave2建立免密通道

5.3、slave1對master、slave2建立免密通道

?5.4、slave2對master、slave1建立免密通道

六、在Mysql的主從復制服務器里,配置mha相關信息

6.1、所有mysql服務器(master、slave1、slave2)將mysql命令和mysqlbinlog二進制文件操作命令軟鏈接到/usr/sbin,方便manager管理節點,因為/usr/sbin/ 目錄下可以被直接調用。

6.2、所有mysql服務器新建允許manager訪問的授權用戶mha,密碼123456

七、在mha manager節點上配置好相關腳本、管理節點服務器

7.1、mha manager節點上復制相關腳本到/usr/local/bin下

7.2、復制自動切換時vip管理的腳本到/usr/local/bin下

7.3、修改master_ip_failover文件內容,配置vip(只配置vip(192.168.2.227)相關參數,其他默認不修改)

7.4、創建 MHA 軟件目錄并復制配置文件,使用app1.cnf配置文件來管理 mysql 節點服務器,配置文件一般放在/etc/目錄下

7.5、master服務器上手工開啟vip

7.6、測試:manager節點上測試ssh免密通道,如果正常最后會輸出successfully

7.7、manager節點后臺開啟MHA

八、故障轉移效果測試,模擬matser宕機,指定slave1成為新的master

8.1、模擬master宕機,停掉master

8.2、查看自動故障檢測的效果

8.3、查看/etc/masterha/app1.cnf文件是否發生改變

8.4、再來看看slave2的master_info信息(確定master服務轉移到了salve1上)

九、原master故障修復(原master轉為slave,指向slave1)

9.1、原master開啟mysqld

9.2、修復主從,原master修改master_info指向新的master(原slave1)

9.3、在 manager 節點上修改配置文件/etc/masterha/app1.cnf(再把這個記錄添加進去,因為master宕機后原來的server1會被自動刪除)

9.4、重啟mha manager,并檢查此時的master


自動failover

自動故障切換(Automatic Failover)是一種系統設計和配置策略,旨在在出現故障時自動將服務從一個失敗的節點轉移到另一個健康的節點,以保持系統的可用性。自動故障切換通常用于分布式系統、數據庫集群、高可用性架構等場景,以減少系統停機時間并確保業務連續性。

MHA:

MHA(Master HA)是一款開源的 MySQL 的高可用程序,它為 MySQL主從復制架構提供了 automating master failover (自動化主故障轉移)功能MHA 在監控到 master 節點故障時,會 提升其中擁有最新數據的 slave 節點成為新的master 節點,在此期間,MHA 會通過于其它從節 點獲取額外信息來避免一致性方面的問題。MHA 還提供了 master 節點的在線切換功能,即按需 切換 master/slave 節點。  

參考:MYSQL高可用架構之MHA實戰一 數據庫主從配置(真實可用)_51CTO博客_mysql數據庫主從搭建

基于mycat2+mha+keepalived的半同步主從復制MySQL cluster_mb643815027e44d的技術博客_51CTO博客

MHA 服務

MHA 服務有兩種角色, MHA Manager(管理節點)和 MHA Node(數據節點):

MHA Manager: 通常單獨部署在一臺獨立機器上管理多個 master/slave 集群(組),每個 master/slave 集群稱作一個 application,用來管理統籌整個集群。

MHA node: 運行在每臺 MySQL 服務器上(master/slave/manager),它通過監控具備解析和清理

logs 功能的腳本來加快故障轉移:?主要是接收管理節點所發出指令的代理,代理需要運行在每一個 mysql 節點上。簡單講 node 就是用來收集從節點服務器上所生成的 bin-log對比打算提升為新的主節點之上的從節點的是否擁有并完成操作,如果沒有發給新主節點在本地應用后提升為主節點。

在MHA自動故障切換過程中,MHA試圖從宕機的主服務器上保存二進制日志,最大程度的 保證數據的不丟失,但這并不總是可行的。例如,如果主服務器硬件故障或無法通過ssh訪 問,MHA沒法保存二進制日志,只進行故障轉移而丟失了最新的數據。使用MySQL 5.7的半同步復制,可以大大降低數據丟失的風險。MHA可以與半同步復制結合起來。如果只有 一個slave已經收到了最新的二進制日志,MHA可以將最新的二進制日志應用于其他所有的 slave服務器上,因此可以保證所有節點的數據一致性。


由上圖我們可以看出,每個復制組內部和 Manager 之間都需要ssh實現無密碼互連,只有這樣, 在 Master 出故障時, Manager 才能順利的連接進去,實現主從切換功能。?

項目:搭建Mysql主從復制、MHA高可用架構

實驗項目IP地址配置:

mha_manager:

manager:192.168.2.141? ? #用于監控管理

vip:192.168.2.227

mha_node:

master:192.168.2.150? ? #開啟 bin-log relay-log

slave-1:192.168.2.151? ?#開啟 bin-log relay-log

slave-2:192.168.2.152? ?#開啟 bin-log relay-log

MHA下載地址

mha4mysql-manager-0.58.tar.gz:

wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58.tar.gz

mha4mysql-node-0.58.tar.gz:

wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58.tar.gz

mha4mysql安裝包集合

鏈接:https://pan.baidu.com/s/1cyM1syv8NjwOW8ExR0E21Q?pwd=z52d?
提取碼:z52d

[root@mha_manager ~]#  ls
anaconda-ks.cfg  mha4mysql-manager-0.58.tar.gz  mha4mysql-node-0.58.tar.gz
[root@mha_manager ~]# 

項目步驟:?

一、修改主機名

[root@web-3 ~]# hostnamectl set-hostname mha_manager
[root@web-3 ~]# su -
上一次登錄:五 8月 11 13:28:25 CST 2023從 192.168.2.7pts/0 上
[root@mha_manager ~]# 

二、編寫一鍵安裝mha node腳本和一鍵安裝mha mangaer腳本,并執行安裝

一鍵安裝mha node腳本

[root@mha_manager ~]# cat onekey_install_mha_node.sh 
#查看可以安裝或者已安裝的rpm包,并且作緩存
yum list#下載epel源
yum install epel-release --nogpgcheck -y#下載依賴包
yum install -y perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN#軟件包mha4mysql-node-0.58.tar.gz放入/root目錄下
cd ~
tar zxvf mha4mysql-node-0.58.tar.gz
cd mha4mysql-node-0.58#編譯安裝
perl Makefile.PL
make && make install

一鍵安裝mha mangaer腳本

[root@mha_manager ~]# cat onekey_install_mha_manager.sh 
#查看可以安裝或者已安裝的rpm包,并且作緩存
yum list#下載epel源
yum install epel-release --nogpgcheck -y#下載依賴包
yum install -y perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN#軟件包mha4mysql-manager-0.58.tar.gz放入/root目錄下
cd ~
tar zxvf mha4mysql-manager-0.58.tar.gz
cd mha4mysql-manager-0.58#編譯安裝
perl Makefile.PL
make && make install

三、搭建Mysql主從復制集群(注意所有的Mysql機器都需要打開二進制日志,可以實現自動故障切換

參考:Mysql - 配置Mysql主從復制-keepalived高可用-讀寫分離集群_Claylpf的博客-CSDN博客

四、將安裝包?mha4mysql-node和 腳本一鍵安裝mha node腳本傳輸給Mysql主從復制集群,并運行腳本安裝(下載依賴的時候最好翻墻下載)

[root@mha_manager ~]# scp onekey_install_mha_node.sh root@192.168.2.150:~
The authenticity of host '192.168.2.150 (192.168.2.150)' can't be established.
ECDSA key fingerprint is SHA256:rUDllK9IdVfMva40nDGHGyHLkpuXrHJyRHRPuLbkkv8.
ECDSA key fingerprint is MD5:6d:46:aa:d1:48:87:92:8b:14:ca:d2:18:af:3b:89:51.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.2.150' (ECDSA) to the list of known hosts.
root@192.168.2.150's password: 
onekey_install_mha_node.sh                                                                                                                                 100%  481   745.0KB/s   00:00    
[root@mha_manager ~]# scp onekey_install_mha_node.sh root@192.168.2.151:~
The authenticity of host '192.168.2.151 (192.168.2.151)' can't be established.
ECDSA key fingerprint is SHA256:3SsW//YjcK0UTRAlQkOUcqMcFMaQEhZ1xRSUgHRs/JQ.
ECDSA key fingerprint is MD5:58:8e:3f:27:fb:f5:4e:83:56:70:e6:fd:f7:d0:9d:17.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.2.151' (ECDSA) to the list of known hosts.
root@192.168.2.151's password: 
onekey_install_mha_node.sh                                                                                                                                 100%  481   287.5KB/s   00:00    
[root@mha_manager ~]# scp onekey_install_mha_node.sh root@192.168.2.152:~
The authenticity of host '192.168.2.152 (192.168.2.152)' can't be established.
ECDSA key fingerprint is SHA256:t7FSFcUpEOJYIGkZo1HvvfqhsezGEz7WEScc4KTgQDU.
ECDSA key fingerprint is MD5:7c:68:1c:c3:aa:a5:34:b7:f7:4b:18:0b:93:fb:a6:76.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.2.152' (ECDSA) to the list of known hosts.
root@192.168.2.152's password: 
onekey_install_mha_node.sh                                                                                                                                 100%  481   397.8KB/s   00:00    
[root@mha_manager ~]# 
[root@mysql-3 ~]# bash onekey_install_mha_node.sh 

注:下載依賴包perl的時候如果無法成功下載,可以嘗試轉換源為:The Comprehensive Perl Archive Network - www.cpan.org?,并翻墻下載

五、所有服務器互相建立免密通道

參考:Linux - SSH服務 - SCP - 免密通道建立_linux ssh服務狀態_Claylpf的博客-CSDN博客

5.1、mha manager對所有mysql服務器建立免密通道

[root@mha_manager .ssh]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
/root/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:36631NGvhLwX3HXPFgkfo8t/C0g+k59hqkGi1cn0/cA root@mha_manager
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|             . o |
|         .    + +|
|        + o o. =o|
|       oS= o.Eoo*|
|      o o.ooo==.*|
|     .   ..*=+++.|
|          .oBo=o.|
|         .o++=..o|
+----[SHA256]-----+
[root@mha_manager .ssh]# ssh-copy-id root@192.168.2.150
/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.2.150's password: Number of key(s) added: 1Now try logging into the machine, with:   "ssh 'root@192.168.2.150'"
and check to make sure that only the key(s) you wanted were added.[root@mha_manager .ssh]# [root@mha_manager .ssh]# ssh-copy-id root@192.168.2.151[root@mha_manager .ssh]# ssh-copy-id root@192.168.2.152

5.2、master對slave1、slave2建立免密通道

[root@mysql-1 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:rB6Rg0nbJCHYxWxuBafl4HDB8+1RuuOpHC9/5LYRTAI root@mysql-1
The key's randomart image is:
+---[RSA 2048]----+
| oo=BoE          |
|. .=*B..  .      |
|   o=+o..o.      |
|   .oB.o++       |
|   .+ =.Soo      |
|       ++ ..     |
|      +. =.      |
|     o.+o +.     |
|      ++oo..     |
+----[SHA256]-----+
[root@mysql-1 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.2.151
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.2.151's password: Number of key(s) added: 1Now try logging into the machine, with:   "ssh '192.168.2.151'"
and check to make sure that only the key(s) you wanted were added.[root@mysql-1 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.2.152
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.2.152's password: Number of key(s) added: 1Now try logging into the machine, with:   "ssh '192.168.2.152'"
and check to make sure that only the key(s) you wanted were added.[root@mysql-1 ~]# 

5.3、slave1對master、slave2建立免密通道

[root@mysql-2 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:MMCE8STghhwmha65CVG/w3/9k8/T96sFfcr75CFMTGs root@mysql-2
The key's randomart image is:
+---[RSA 2048]----+
|o*+=+            |
|B ++..           |
|o= .. o      .   |
|o.  .  o    o o  |
|.o . .  S    E ..|
|+   +       +....|
|.o   o   .   +o+.|
|o     . . . o.+++|
|       .   ..+=+B|
+----[SHA256]-----+
[root@mysql-2 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.2.150
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.2.150 (192.168.2.150)' can't be established.
ECDSA key fingerprint is SHA256:rUDllK9IdVfMva40nDGHGyHLkpuXrHJyRHRPuLbkkv8.
ECDSA key fingerprint is MD5:6d:46:aa:d1:48:87:92:8b:14:ca:d2:18:af:3b:89:51.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.2.150's password: Number of key(s) added: 1Now try logging into the machine, with:   "ssh '192.168.2.150'"
and check to make sure that only the key(s) you wanted were added.[root@mysql-2 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.2.152
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.2.152 (192.168.2.152)' can't be established.
ECDSA key fingerprint is SHA256:t7FSFcUpEOJYIGkZo1HvvfqhsezGEz7WEScc4KTgQDU.
ECDSA key fingerprint is MD5:7c:68:1c:c3:aa:a5:34:b7:f7:4b:18:0b:93:fb:a6:76.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.2.152's password: 
Permission denied, please try again.
root@192.168.2.152's password: Number of key(s) added: 1Now try logging into the machine, with:   "ssh '192.168.2.152'"
and check to make sure that only the key(s) you wanted were added.[root@mysql-2 ~]# 

?5.4、slave2對master、slave1建立免密通道

[root@mysql-3 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:m6F9WyLFkNnweKy2ERj3LflPDHqU5ZUL+S8FpCbXhtw root@mysql-3
The key's randomart image is:
+---[RSA 2048]----+
|      . o    .+ o|
|       + X + @.o |
|      . * X @ E..|
|         * O + o.|
|        S + o o..|
|       + B . o. .|
|      . * o . .. |
|         o +     |
|          .      |
+----[SHA256]-----+
[root@mysql-3 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.2.150
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.2.150 (192.168.2.150)' can't be established.
ECDSA key fingerprint is SHA256:rUDllK9IdVfMva40nDGHGyHLkpuXrHJyRHRPuLbkkv8.
ECDSA key fingerprint is MD5:6d:46:aa:d1:48:87:92:8b:14:ca:d2:18:af:3b:89:51.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.2.150's password: Number of key(s) added: 1Now try logging into the machine, with:   "ssh '192.168.2.150'"
and check to make sure that only the key(s) you wanted were added.[root@mysql-3 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.2.151
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.2.151 (192.168.2.151)' can't be established.
ECDSA key fingerprint is SHA256:3SsW//YjcK0UTRAlQkOUcqMcFMaQEhZ1xRSUgHRs/JQ.
ECDSA key fingerprint is MD5:58:8e:3f:27:fb:f5:4e:83:56:70:e6:fd:f7:d0:9d:17.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.2.151's password: Number of key(s) added: 1Now try logging into the machine, with:   "ssh '192.168.2.151'"
and check to make sure that only the key(s) you wanted were added.[root@mysql-3 ~]# 

六、在Mysql的主從復制服務器里,配置mha相關信息

6.1、所有mysql服務器(master、slave1、slave2)將mysql命令和mysqlbinlog二進制文件操作命令軟鏈接到/usr/sbin,方便manager管理節點,因為/usr/sbin/ 目錄下可以被直接調用。

[root@mysql-1 ~]# ln -s /usr/local/mysql/bin/mysql /usr/sbin/
[root@mysql-1 ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/[root@mysql-2 ~]# ln -s /usr/local/mysql/bin/mysql /usr/sbin/
[root@mysql-2 ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/[root@mysql-3 ~]# ln -s /usr/local/mysql/bin/mysql /usr/sbin/
[root@mysql-3 ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/

6.2、所有mysql服務器新建允許manager訪問的授權用戶mha,密碼123456

root@(none) 17:21  mysql>grant all on *.* to 'mha'@'192.168.2.%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.01 sec)root@(none) 17:21  mysql>grant all on *.* to 'mha'@'192.168.2.150' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)root@(none) 17:22  mysql>grant all on *.* to 'mha'@'192.168.2.151' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)root@(none) 17:22  mysql>grant all on *.* to 'mha'@'192.168.2.152' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)root@(none) 17:22  mysql>select user,host from mysql.user;
+---------------+---------------+
| user          | host          |
+---------------+---------------+
| claylpf       | %             |
| sc_slave      | %             |
| mha           | 192.168.2.%   |
| mha           | 192.168.2.150 |
| mha           | 192.168.2.151 |
| mha           | 192.168.2.152 |
| mysql.session | localhost     |
| mysql.sys     | localhost     |
| root          | localhost     |
+---------------+---------------+
9 rows in set (0.00 sec)root@(none) 17:22  mysql>

七、在mha manager節點上配置好相關腳本、管理節點服務器

7.1、mha manager節點上復制相關腳本到/usr/local/bin下

[root@localhost ~]# cp -rp /root/mha4mysql-manager-0.58/samples/scripts/ /usr/local/bin/
[root@localhost ~]# cd /usr/local/bin/
[root@localhost bin]# ls
masterha_check_repl  masterha_check_status  masterha_manager         masterha_master_switch    masterha_stop
masterha_check_ssh   masterha_conf_host     masterha_master_monitor  masterha_secondary_check  scripts
[root@localhost bin]# 
[root@localhost bin]# cd scripts/
[root@localhost scripts]# ls
master_ip_failover  master_ip_online_change  power_manager  send_report
[root@localhost scripts]# 

7.2、復制自動切換時vip管理的腳本到/usr/local/bin下

[root@localhost scripts]# cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin/
[root@localhost scripts]# ls
master_ip_failover  master_ip_online_change  power_manager  send_report
[root@localhost scripts]# 

7.3、修改master_ip_failover文件內容,配置vip(只配置vip(192.168.2.227)相關參數,其他默認不修改)

[root@localhost scripts]# > master_ip_failover  #清空文件內容,復制以下內容
[root@localhost scripts]# vim master_ip_failover 
[root@localhost scripts]# cat 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.2.227';								#指定vip的地址,自己指定
my $brdc = '192.168.2.255';								#指定vip的廣播地址
my $ifdev = 'ens33';										#指定vip綁定的網卡
my $key = '1';												#指定vip綁定的虛擬網卡序列號
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";		#代表此變量值為ifconfig ens33:1 192.168.2.227
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";		#代表此變量值為ifconfig ens33:1 192.168.2.227 down
my $exit_code = 0;											#指定退出狀態碼為0
#my $ssh_start_vip = "/usr/sbin/ip addr add $vip/24 brd $brdc dev $ifdev label $ifdev:$key;/usr/sbin/arping -q -A -c 1 -I $ifdev $vip;iptables -F;";
#my $ssh_stop_vip = "/usr/sbin/ip addr del $vip/24 dev $ifdev label $ifdev:$key";
##################################################################################
GetOptions(
'command=s' => \$command,
'ssh_user=s' => \$ssh_user,
'orig_master_host=s' => \$orig_master_host,
'orig_master_ip=s' => \$orig_master_ip,
'orig_master_port=i' => \$orig_master_port,
'new_master_host=s' => \$new_master_host,
'new_master_ip=s' => \$new_master_ip,
'new_master_port=i' => \$new_master_port,
);exit &main();sub main {print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";if ( $command eq "stop" || $command eq "stopssh" ) {my $exit_code = 1;
eval {
print "Disabling the VIP on old master: $orig_master_host \n";
&stop_vip();
$exit_code = 0;
};
if ($@) {
warn "Got Error: $@\n";
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "start" ) {my $exit_code = 10;
eval {
print "Enabling the VIP - $vip on the new master - $new_master_host \n";
&start_vip();
$exit_code = 0;
};
if ($@) {
warn $@;
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "status" ) {
print "Checking the Status of the script.. OK \n";
exit 0;
}
else {
&usage();
exit 1;
}
}
sub start_vip() {
`ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
## A simple system call that disable the VIP on the old_master
sub stop_vip() {
`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}sub usage {
print
"Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";
}[root@localhost scripts]# 

7.4、創建 MHA 軟件目錄并復制配置文件,使用app1.cnf配置文件來管理 mysql 節點服務器,配置文件一般放在/etc/目錄下

注意:注釋只是提示用,編輯配置文件時最好不要加注釋,否則很可能會出錯

[root@mha_manager scripts]# mkdir /etc/masterha
[root@mha_manager scripts]# cp /root/mha4mysql-manager-0.58/samples/conf/app1.cnf /etc/masterha/
[root@mha_manager scripts]# cd /etc/masterha/
[root@mha_manager masterha]# ls
app1.cnf
[root@mha_manager masterha]# >app1.cnf #清空原有內容
[root@mha_manager masterha]# vim app1.cnf [server default]
manager_log=/var/log/masterha/app1/manager.log       #manager日志
manager_workdir=/var/log/masterha/app1.log    		#manager工作目錄
master_binlog_dir=/data/mysql/          #master保存binlog的位置,這里的路徑要與master里配置的binlog的路徑一致,以便MHA能找到
master_ip_failover_script=/usr/local/bin/master_ip_failover            #設置自動failover時候的切換腳本,也就是上面的那個腳本
master_ip_online_change_script=/usr/local/bin/master_ip_online_change  #設置手動切換時候的切換腳本
user=mha					#設置監控用戶mha
password=123456			#設置mysql中mha用戶的密碼,這個密碼是前文中創建監控用戶的那個密碼
ping_interval=1				#設置監控主庫,發送ping包的時間間隔1秒,默認是3秒,嘗試三次沒有回應的時候自動進行failover
remote_workdir=/tmp			#設置遠端mysql在發生切換時binlog的保存位置
repl_user=slave			#設置復制用戶的用戶slave
repl_password=123456		#設置復制用戶slave的密碼
report_script=/usr/local/send_report     #設置發生切換后發送的報警的腳本
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.2.151 -s 192.168.2.152	#指定檢查的從服務器IP地址
shutdown_script=""			#設置故障發生后關閉故障主機腳本(該腳本的主要作用是關閉主機防止發生腦裂,這里沒有使用)
ssh_user=root				#設置ssh的登錄用戶名[server1]
#master
hostname=192.168.2.150 
port=3306[server2]
#slave1
hostname=192.168.2.151
port=3306
candidate_master=1
#設置為候選master,設置該參數以后,發生主從切換以后將會將此從庫提升為主庫,即使這個主庫不是集群中最新的slavecheck_repl_delay=0
#默認情況下如果一個slave落后master 超過100M的relay logs的話,MHA將不會選擇該slave作為一個新的master, 因為對于這個slave的恢復需要花費很長時間;通過設置check_repl_delay=0,MHA觸發切換在選擇一個新的master的時候將會忽略復制延時,這個參數對于設置了candidate_master=1的主機非常有用,因為這個候選主在切換的過程中一定是新的master[server3]
#slave2
hostname=192.168.2.152
port=3306

7.5、master服務器上手工開啟vip

[root@mysql-1 ~]# ifconfig ens33:1 192.168.2.227/24
[root@mysql-1 ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:61:50:77 brd ff:ff:ff:ff:ff:ffinet 192.168.2.150/24 brd 192.168.2.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet 192.168.2.227/24 brd 192.168.2.255 scope global secondary ens33:1valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe61:5077/64 scope link valid_lft forever preferred_lft forever
[root@mysql-1 ~]# 

7.6、測試:manager節點上測試ssh免密通道,如果正常最后會輸出successfully

[root@mha_manager masterha]# masterha_check_ssh -conf=/etc/masterha/app1.cnf
Mon May  8 11:50:00 2023 - [info] All SSH connection tests passed successfully.

基于mycat2+mha+keepalived的半同步主從復制MySQL cluster_MySQL_09

如果報錯,多看日志/var/log/masterha/app1/manager.log

注意是否每臺mysql間都建立了ssh免密通道,否則會報錯

如果報錯,思考是否軟鏈接建立好了?或者主從復制搭建正確了

在 manager 節點上測試 mysql 主從連接情況,最后出現 MySQL Replication Health is OK 字樣說明正常。

[root@mha_manager masterha]# masterha_check_repl -conf=/etc/masterha/app1.cnf
MySQL Replication Health is OK.

7.7、manager節點后臺開啟MHA

[root@mha_manager masterha]# 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 &
[1] 5085

查看 MHA 狀態,可以看到當前的 master 是 Mysql1 節點。

[root@mha_manager masterha]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:5085) is running(0:PING_OK), master:192.168.2.150

查看MHA日志,看到當前matser是192.168.2.150

[root@mha_manager masterha]# cat /var/log/masterha/app1/manager.log | grep "current master"
Mon May  14 11:57:07 2023 - [info] Checking SSH publickey authentication settings on the current master..
192.168.2.150(192.168.2.150:3306) (current master)

查看mha進程

[root@mha_manager bin]# ps aux|grep manager
root       5085  0.1  4.5 299656 21992 pts/0    S    11:57   0:12 perl /usr/local/bin/masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover
root      14939  0.0  0.2 112824   984 pts/0    S+   14:39   0:00 grep --color=auto manager

八、故障轉移效果測試,模擬matser宕機,指定slave1成為新的master

manager節點監控日志記錄(實時監控)

[root@mha_manager bin]# tail -f /var/log/masterha/app1/manager.log 

8.1、模擬master宕機,停掉master

[root@mysql-1 mysql]# service mysqld stop

8.2、查看自動故障檢測的效果

查看vip是否漂移到了slave1

基于mycat2+mha+keepalived的半同步主從復制MySQL cluster_MySQL_11

查看日志信息

基于mycat2+mha+keepalived的半同步主從復制MySQL cluster_MySQL_12

日志顯示,master已經切換到了192.168.2.151(slave1)

slave2也已經選擇slave1作為master

8.3、查看/etc/masterha/app1.cnf文件是否發生改變

基于mycat2+mha+keepalived的半同步主從復制MySQL cluster_mysql_13

發現原來的server1配置被刪除了

8.4、再來看看slave2的master_info信息(確定master服務轉移到了salve1上)

基于mycat2+mha+keepalived的半同步主從復制MySQL cluster_MySQL_14

九、原master故障修復(原master轉為slave,指向slave1)

9.1、原master開啟mysqld

[root@mysql-1 ~]# service mysqld start

9.2、修復主從,原master修改master_info指向新的master(原slave1)

在mysql-2(slave1)上進行操作

root@(none) 17:18  mysql>change master to master_host='192.168.2.151',master_user='slave',master_password='123456',master_port=3306,master_auto_position=1;
root@(none) 17:19  mysql>start slave;
root@(none) 17:19  mysql>show slave status\G;

9.3、在 manager 節點上修改配置文件/etc/masterha/app1.cnf(再把這個記錄添加進去,因為master宕機后原來的server1會被自動刪除)

[server default]
manager_log=/var/log/masterha/app1/manager.log
manager_workdir=/var/log/masterha/app1
master_binlog_dir=/data/mysql/
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
password=123456
ping_interval=1
remote_workdir=/tmp
repl_password=123456
repl_user=slave
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.2.151 -s 192.168.2.152
shutdown_script=""
ssh_user=root
user=mha[server1]
hostname=192.168.2.151   #原slave1的IP地址
port=3306[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.2.150   #原master的IP地址
port=3306[server3]
hostname=192.168.2.152   #原slave2的IP地址
port=3306 

基于mycat2+mha+keepalived的半同步主從復制MySQL cluster_mysql_16

9.4、重啟mha manager,并檢查此時的master

[root@mha_manager ~]# masterha_stop --conf=/etc/masterha/app1.cnf
Stopped app1 successfully.
[1]+  退出 1                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
[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 & 
[1] 20022
[root@mha_manager ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:20022) is running(0:PING_OK), master:192.168.2.151

master已經從192.168.2.150切換到了192.168.2.151

并且原來的192.168.2.150(原master)變成了slave1,并從192.168.2.151(原slave1)拿二進制日志了

至此,mha就算搭建成功了!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/35848.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/35848.shtml
英文地址,請注明出處:http://en.pswp.cn/news/35848.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

docker容器限定ip訪問

docker容器限定ip訪問 一、測試所需環境&#xff1a;二、使用docker的 iptables 策略三、Docker使用iptables 與系統Firewalld之間的關系四、沖突解決方案 一、測試所需環境&#xff1a; 主機1&#xff1a; ip&#xff1a;192.168.3.117 環境配置&#xff1a;docker、httpd(do…

你真的了解ORM嗎?通過一個簡單的例子來學習ORM

什么是ORM ORM&#xff08;Object-Relational Mapping&#xff09;是一種將面向對象程序數據模型與關系數據庫之間進行映射的技術。 比如數據庫表user&#xff0c;它有id、name、age字段映射到Java實體類就是User類&#xff0c;有id、name、age屬性。 CREATE TABLE user (id…

2023國賽 高教社杯數學建模ABCDE題思路匯總分析

文章目錄 0 賽題思路1 競賽信息2 競賽時間3 建模常見問題類型3.1 分類問題3.2 優化問題3.3 預測問題3.4 評價問題 4 建模資料 0 賽題思路 &#xff08;賽題出來以后第一時間在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 競賽信息 全國大學生數學建模…

echarts加釣魚島赤尾嶼(vue)(親測有效)

1.首先引入json文件&#xff0c;node_modules/echarts中就有 import chinaData from "../../node_modules/echarts/map/json/china.json" 2.初始化地圖&#xff0c;在初始化地圖的時候加入釣魚島和赤尾嶼的數據&#xff0c;在chinaData下的features中加入即可&#x…

Design-Pattern設計模式

Design-Pattern設計模式 圖說設計模式 圖說設計模式 在線書籍 軟件模式是將模式的一般概念應用于軟件開發領域&#xff0c;即軟件開發的 總體指導思路或參照樣板。軟件模式并非僅限于設計模式&#xff0c;還包括 架構模式、分析模式和過程模式等&#xff0c;實際上&#xff…

FFmpeg常見命令行(四):FFmpeg流媒體

前言 在Android音視頻開發中&#xff0c;網上知識點過于零碎&#xff0c;自學起來難度非常大&#xff0c;不過音視頻大牛Jhuster提出了《Android 音視頻從入門到提高 - 任務列表》&#xff0c;結合我自己的工作學習經歷&#xff0c;我準備寫一個音視頻系列blog。本文是音視頻系…

leetcode做題筆記77組合

給定兩個整數 n 和 k&#xff0c;返回范圍 [1, n] 中所有可能的 k 個數的組合。 你可以按 任何順序 返回答案。 思路一&#xff1a;直接求出組合數將每個組合放進數組中 int** combine(int n, int k, int* returnSize, int** returnColumnSizes) {int size 0, num 1, i;in…

Rust中的智能指針:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak<T>

Rust中的智能指針是什么 智能指針&#xff08;smart pointers&#xff09;是一類數據結構&#xff0c;是擁有數據所有權和額外功能的指針。是指針的進一步發展 指針&#xff08;pointer&#xff09;是一個包含內存地址的變量的通用概念。這個地址引用&#xff0c;或 ” 指向”…

UML 類圖的畫法

1.類圖的畫法 類 整體是個矩形&#xff0c;第一層類名&#xff0c;第二層屬性&#xff0c;第三層方法。 &#xff1a;public- : private# : protected空格: 默認的default 對應的類寫法。 public class Student {public String name;public Integer age;protected I…

2023杭電第七場補題報告1002 1004 1011 1013

2023杭電第七場補題報告1002 1004 1011 1013 1002 B. Random Nim Game (hdu.edu.cn) 思路 手推一下就可以發現其實除了一次必定結束的其他情況概論都是 1 2 \frac{1}{2} 21? 代碼 #include <bits/stdc.h> using namespace std; #define int long long void solve()…

【hello C++】特殊類設計

目錄 一、設計一個類&#xff0c;不能被拷貝 二、設計一個類&#xff0c;只能在堆上創建對象 三、設計一個類&#xff0c;只能在棧上創建對象 四、請設計一個類&#xff0c;不能被繼承 五、請設計一個類&#xff0c;只能創建一個對象(單例模式) C&#x1f337; 一、設計一個類&…

Sentinel使用實例

不說了&#xff0c;直接上官方文檔 https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/readme-zh.md Sentinel Example 項目說明 本項目演示如何使用 Sentinel starter 完成 Spring Clo…

【金融量化】對企業進行估值的方法有哪些?

估值的方法有哪些&#xff1f; 如何對企業進行估值&#xff1f;有2個方法估算。 1 絕對估值法 它是一種定價模型&#xff0c;用于計算企業的內在價值。 比如說你可以根據公司近N年的現金流情況。借此去預測未來N年的現金流情況。所有的現金流數據都可以在年報上查詢到。最后…

ios 知識

IOS 類文件.h和.m中interface的區別 大家都知道我們在創建類文件時會發現&#xff1a; #import <UIKit/UIKit.h>interface ViewController : UIViewControllerend和 #import "ViewController.h"interface ViewController ()end那么他們之間有何區別呢&#x…

【Ajax】回調地獄解決方法

回調地獄&#xff08;Callback Hell&#xff09;是指在異步編程中&#xff0c;特別是在嵌套的回調函數中&#xff0c;代碼變得深度嵌套、難以閱讀和維護的現象。這通常發生在處理多個異步操作時&#xff0c;每個操作都依賴于前一個操作的結果。回調地獄使代碼變得難以理解、擴展…

顯卡服務器適用于哪些場景

顯卡&#xff08;GPU&#xff09;服務器&#xff0c;簡單來說&#xff0c;GPU服務器是基于GPU的應用于視頻編解碼、深度學習、科學計算等多種場景的快速、 穩定、彈性的計算服務。那么壹基比小鑫告訴你顯卡服務器主要的用途有哪一些。 一、運行手機模擬器 顯卡服務器可支持…

力扣:62. 不同路徑(Python3)

題目&#xff1a; 一個機器人位于一個 m x n 網格的左上角 &#xff08;起始點在下圖中標記為 “Start” &#xff09;。 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角&#xff08;在下圖中標記為 “Finish” &#xff09;。 問總共有多少條不同的路徑&…

WebRTC音視頻通話-WebRTC本地視頻通話使用ossrs服務搭建

iOS開發-ossrs服務WebRTC本地視頻通話服務搭建 之前開發中使用到了ossrs&#xff0c;這里記錄一下ossrs支持的WebRTC本地服務搭建。 一、ossrs是什么&#xff1f; ossrs是什么呢&#xff1f; SRS(Simple Realtime Server)是一個簡單高效的實時視頻服務器&#xff0c;支持RTM…

STM32CubeIDE的安裝和黑色主題及自動補全代碼

STM32CubeIDE之前用過一點時間&#xff0c;但后來因為不習慣放棄了最近在新電腦上又用起來了&#xff0c;感覺相對之前好了很多&#xff0c;其實如果在工作中基本使用的是STM32,用意法的生態軟件也挺好的&#xff0c;意法最近在這塊也在大力發展&#xff0c;STM32CubeIDE安裝包…

【BASH】回顧與知識點梳理(十三)

【BASH】回顧與知識點梳理 十三 十三. 文件內容查閱13.1 直接檢視文件內容&#xff1a;cat, tac, nlcat (concatenate)tac (反向列示)nl (添加行號打印) 13.2 可翻頁檢視&#xff1a;more, lessmore (一頁一頁翻動)less (一頁一頁翻動) 13.3 資料擷取&#xff1a;head, tailhea…