MySQL MHA 部署全攻略:從零搭建高可用數據庫架構

文章目錄

  • 1.MHA介紹
  • 2.MHA組件介紹
  • 3.集群規劃
  • 4.服務器初始化
  • 5.MySQL集群部署
    • 5.1 安裝MySQL集群
    • 5.2 配置一主兩從
    • 5.3 測試MySQL主從
    • 5.4 賦予MHA用戶連接權限
  • 6.安裝MHA環境
    • 6.1 安裝MHA Node
    • 6.2 安裝MHA Manager
  • 7.配置MHA環境
  • 8.MySQL MHA高可用集群測試
    • 8.1 通過VIP連接MySQL
    • 8.2模擬故障測試
  • 9.參考文檔

1.MHA介紹

MySQL的MHA(Master High Availability)是一種用于MySQL高可用性的解決方案,旨在提高MySQL數據庫集群的可用性和故障恢復能力。MHA主要通過自動故障切換來確保數據庫的高可用性,它能夠在主數據庫出現故障時,自動將從數據庫提升為主數據庫,以避免長時間的服務中斷。

2.MHA組件介紹

  1. MHA Manager(MHA 管理器)
    功能:MHA Manager 是 MHA 的控制中心,負責監控 MySQL 主從數據庫的健康狀態,并在主服務器故障時觸發自動故障切換。
    角色:
    監控數據庫主從節點的狀態。
    在主服務器發生故障時,選擇健康的從服務器并提升為新的主服務器。
    管理數據庫節點的配置(如:主庫和從庫的切換)。
    在主庫恢復后,自動將恢復的主庫重新配置為從庫。
    部署:MHA Manager 通常運行在一個獨立的服務器上,不與數據庫實例共享。
  1. MHA Node(MHA 節點)
    功能:MHA Node 是 MHA 管理器和 MySQL 數據庫之間的中介,負責與 MHA Manager 進行通信,并執行主從切換操作。
    角色:
    向 MHA Manager 上報數據庫節點(主庫和從庫)的健康狀態。
    參與故障切換流程,包括主庫的提升和從庫的降級。
    部署:每個 MySQL 實例(主服務器和從服務器)都需要安裝和配置 MHA Node,以便與 MHA Manager 通信。

3.集群規劃

主機名IP地址組件(角色)版本
test-server-01192.168.40.180MHA Manager0.58
test-server-02192.168.40.181MySQL(Master)、MHA Node5.7.20、0.58
test-server-03192.168.40.182MySQL(Master)、MHA Node5.7.20、0.58
test-server-04192.168.40.183MySQL(Master)、MHA Node5.7.20、0.58

4.服務器初始化

  1. 服務器免密

MHA Manager使用SSH登錄到主從數據庫節點,執行故障檢測、切換主庫等操作,包括在故障切換過程中通過SSH訪問數據庫服務器執行切換操作(例如停止服務、修改配置文件等)。

#MHA Manager免密
[root@test-server-01 ~]# ssh-keygen -t rsa
[root@test-server-01 ~]# ssh-copy-id 192.168.40.180
[root@test-server-01 ~]# ssh-copy-id 192.168.40.181
[root@test-server-01 ~]# ssh-copy-id 192.168.40.182
[root@test-server-01 ~]# ssh-copy-id 192.168.40.183#MySQL Master
[root@test-server-02 ~]# ssh-keygen -t rsa
[root@test-server-02 ~]# ssh-copy-id 192.168.40.180
[root@test-server-02 ~]# ssh-copy-id 192.168.40.181
[root@test-server-02 ~]# ssh-copy-id 192.168.40.182
[root@test-server-02 ~]# ssh-copy-id 192.168.40.183#MySQL Slave 1
[root@test-server-03 ~]# ssh-keygen -t rsa
[root@test-server-03 ~]# ssh-copy-id 192.168.40.180
[root@test-server-03 ~]# ssh-copy-id 192.168.40.181
[root@test-server-03 ~]# ssh-copy-id 192.168.40.182
[root@test-server-03 ~]# ssh-copy-id 192.168.40.183#MySQL Slave 2
[root@test-server-04 ~]# ssh-keygen -t rsa
[root@test-server-04 ~]# ssh-copy-id 192.168.40.180
[root@test-server-04 ~]# ssh-copy-id 192.168.40.181
[root@test-server-04 ~]# ssh-copy-id 192.168.40.182
[root@test-server-04 ~]# ssh-copy-id 192.168.40.183
  1. 關閉防火墻
#所有機器 
[root@test-server-01 ~]# systemctl stop firewalld ; systemctl disable firewalld
  1. 配置時間同步
#所有機器
#安裝ntpdate命令
[root@test-server-01 ~]# yum install ntpdate -y#跟網絡時間做同步
[root@test-server-01 ~]# ntpdate cn.pool.ntp.org#把時間同步做成計劃任務
[root@test-server-01 ~]# crontab -e
* *  * * * /usr/sbin/ntpdate   cn.pool.ntp.org

5.MySQL集群部署

MySQL組件下載地址

選擇對應版本下載
在這里插入圖片描述

5.1 安裝MySQL集群

三臺MySQL節點操作

  1. 上傳安裝包到/usr/local/src目錄
[root@test-server02 src]# ll mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz
-rw-r--r-- 1 root root 641127384 Feb 19 13:39 mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz
  1. 解壓安裝包
[root@test-server02 src]# tar -xvf mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz
  1. 移動安裝包,重新命名
[root@test-server02 src]# mv mysql-5.7.20-linux-glibc2.12-x86_64 /usr/local/mysql5.7
  1. 設置路徑環境變量
[root@test-server02 src]# echo 'export  PATH=/usr/local/mysql5.7/bin:$PATH' >> /etc/profile
[root@test-server02 src]# source /etc/profile
  1. 創建MySQL用戶
[root@test-server02 src]# useradd -M -s /sbin/nologin  mysql
  1. 創建MySQL數據目錄
[root@test-server02 src]# mkdir -pv  /opt/mysqldb/{temp,log,data}
  1. 賦予MySQL用戶權限
[root@test-server02 src]# chown -R mysql:mysql /opt/mysqldb
  1. 初始化MySQL數據目錄
[root@test-server02 src]# mysqld --initialize  --datadir=/opt/mysqldb/data --user=mysql2025-02-19T06:40:36.493733Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2025-02-19T06:40:36.494435Z 0 [ERROR] Can't find error-message file '/usr/local/mysql/share/errmsg.sys'. Check error-message file location and 'lc-messages-dir' configuration directive.
2025-02-19T06:40:37.775262Z 0 [Warning] InnoDB: New log files created, LSN=45790
2025-02-19T06:40:37.983917Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2025-02-19T06:40:38.309684Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 6e2db754-ee8c-11ef-b1a1-000c292b8fdc.
2025-02-19T06:40:38.375782Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2025-02-19T06:40:38.378205Z 1 [Note] A temporary password is generated for root@localhost: n-HaNrreh2_t#ERROR不需要管,出現同上日志代表初始化成功。
n-HaNrreh2_t:MySQL初始化之后的密碼,需要保存下來等會使用
  1. 配置MySQL
#MySQL Master配置
[root@test-server02 src]# cat /etc/my.cnf
[mysqld]
basedir=/usr/local/mysql5.7
user=mysql
port=3306
datadir=/opt/mysqldb/data
log-error=/opt/mysqldb/log/err.log
pid-file=/opt/mysqldb/temp/mysqld.pid
socket=/opt/mysqldb/temp/mysqld.sock
symbolic-links=0
server_id=1
gtid-mode=on
enforce-gtid-consistency=true
relay_log_purge=0
log_slave_updates=ON
log_bin=/opt/mysqldb/log/binlog
binlog_format=ROW[client]
socket=/opt/mysqldb/temp/mysqld.sock
default-character-set=utf8#MySQL Slave1配置
[root@test-server03 src]# cat /etc/my.cnf
[mysqld]
basedir=/usr/local/mysql5.7
user=mysql
port=3306
datadir=/opt/mysqldb/data
log-error=/opt/mysqldb/log/err.log
pid-file=/opt/mysqldb/temp/mysqld.pid
socket=/opt/mysqldb/temp/mysqld.sock
symbolic-links=0
server_id=2
gtid-mode=on
enforce-gtid-consistency=true
relay_log_purge=0
log_slave_updates=ON
log_bin=/opt/mysqldb/log/binlog
binlog_format=ROW[client]
socket=/opt/mysqldb/temp/mysqld.sock
default-character-set=utf8#MySQL Slave2配置
[root@test-server04 src]# cat /etc/my.cnf
[mysqld]
basedir=/usr/local/mysql5.7
user=mysql
port=3306
datadir=/opt/mysqldb/data
log-error=/opt/mysqldb/log/err.log
pid-file=/opt/mysqldb/temp/mysqld.pid
socket=/opt/mysqldb/temp/mysqld.sock
symbolic-links=0
server_id=3
gtid-mode=on
enforce-gtid-consistency=true
relay_log_purge=0
log_slave_updates=ON
log_bin=/opt/mysqldb/log/binlog
binlog_format=ROW[client]
socket=/opt/mysqldb/temp/mysqld.sock
default-character-set=utf8#server_id三臺不能相同,數據目錄改成自己的
  1. 創建MySQL啟動文件
#三臺MySQL節點操作
[root@test-server02 src]# cat /usr/lib/systemd/system/mysqld.service
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target[Install]
WantedBy=multi-user.target[Service]
User=mysql
Group=mysql
Type=forking
PIDFile=/opt/mysqldb/temp/mysqld.pid
# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0
# Execute pre and post scripts as root
PermissionsStartOnly=true
# Needed to create system tables
# ExecStartPre=/usr/bin/mysqld_pre_systemd
# Start main service
ExecStart=/usr/local/mysql5.7/bin/mysqld --daemonize --pid-file=/opt/mysqldb/temp/mysqld.pid $MYSQLD_OPTS
# Use this to switch malloc implementation
# EnvironmentFile=-/etc/sysconfig/mysql
# Sets open_files_limit
LimitNOFILE = 5000
Restart=on-failure
RestartPreventExitStatus=1
PrivateTmp=false#目錄根據自己情況修改
#賦予執行權限
[root@test-server02 src]# chmod 644 /usr/lib/systemd/system/mysqld.service    
  1. 啟動MySQL
#三臺MySQL節點操作
#systemd重新加載配置
[root@test-server02 src]# systemctl daemon-reload#設置開機自啟
[root@test-server02 src]# systemctl enable mysqld
Created symlink from /etc/systemd/system/multi-user.target.wants/mysqld.service to /usr/lib/systemd/system/mysqld.service.#重啟MySQL
[root@test-server02 src]# systemctl restart mysqld#查看MySQL狀態
[root@test-server02 src]# systemctl status mysqld
  1. 修改MySQL密碼
#登錄MySQL
[root@test-server02 src]# mysql -uroot -pn-HaNrreh2_t  #每臺MySQL的密碼不同#三臺MySQL節點操作
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

5.2 配置一主兩從

  1. 授予權限

三臺MySQL節點操作

#授予該用戶進行主從復制所需的權限
mysql> grant replication slave on *.* to 'repl_user'@'192.168.40.%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)#刷新
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
  1. 查看二進制文件名和位置信息

master節點操作

mysql> show master status;
+---------------+----------+--------------+------------------+------------------------------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
+---------------+----------+--------------+------------------+------------------------------------------+
| binlog.000001 |     1467 |              |                  | 6e2db754-ee8c-11ef-b1a1-000c292b8fdc:1-6 |
+---------------+----------+--------------+------------------+------------------------------------------+
  1. 配置從節點

Slave 1和Slave 2執行

#根據自己的信息進行修改
mysql> change master to master_host='192.168.40.181',master_user='repl_user',master_password='123456',master_log_file='binlog.000001',master_log_pos=1467;
Query OK, 0 rows affected, 2 warnings (0.03 sec)mysql> start slave;
Query OK, 0 rows affected (0.01 sec)mysql> show slave status \G;
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.40.181Master_User: repl_userMaster_Port: 3306Connect_Retry: 60Master_Log_File: binlog.000001Read_Master_Log_Pos: 1467Relay_Log_File: test-server03-relay-bin.000002Relay_Log_Pos: 317Relay_Master_Log_File: binlog.000001Slave_IO_Running: YesSlave_SQL_Running: Yes#兩個YES代表MySQL已經成功設置成了主從
  1. 讀寫分離

Slave 1和Slave 2執行

#兩個從庫必須設置為只讀模式:
mysql> set global read_only=1;
Query OK, 0 rows affected (0.00 sec)

5.3 測試MySQL主從

MySQL Master操作

CREATE DATABASE test_db;USE test_db;CREATE TABLE test_table (id INT PRIMARY KEY,name VARCHAR(50)
);INSERT INTO test_table (id, name) VALUES (1, 'John');
INSERT INTO test_table (id, name) VALUES (2, 'Alice');

MySQL Slave 1和Slave 2操作

mysql> select * from test_db.test_table;
+----+-------+
| id | name  |
+----+-------+
|  1 | John  |
|  2 | Alice |
+----+-------+
2 rows in set (0.00 sec)
#出來數據代表主從成功

5.4 賦予MHA用戶連接權限

Master操作即可

mysql> grant all privileges on *.* to 'mha_user'@'192.168.40.%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)#主從復制已完成,所以從不用單獨操作

6.安裝MHA環境

  • 安裝MHA依賴環境
#四臺機器全部操作
[root@test-server-01 ~]# yum install epel-release --nogpgcheck -y[root@test-server-01 ~]# yum install -y perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN

6.1 安裝MHA Node

MHA Node下載地址

在這里插入圖片描述

四臺機器全部安裝MHA Node

  1. 上傳部署包到/opt目錄
[root@test-server-01 opt]# ll mha4mysql-node-0.58.tar.gz
-rw-r--r-- 1 root root 56220 Feb 20 09:09 mha4mysql-node-0.58.tar.gz
  1. 生成Makefile
[root@test-server-01 opt]# tar -xf mha4mysql-node-0.58.tar.gz
[root@test-server-01 opt]# cd mha4mysql-node-0.58
[root@test-server-01 mha4mysql-node-0.58]# perl Makefile.PL
*** Module::AutoInstall version 1.06
*** Checking for Perl dependencies...
[Core Features]
- DBI        ...loaded. (1.627)
- DBD::mysql ...loaded. (4.023)
*** Module::AutoInstall configuration finished.
Checking if your kit is complete...
Looks good
Writing Makefile for mha4mysql::node
  1. 編譯安裝
[root@test-server-01 mha4mysql-node-0.58]# make && make install#安裝完成之后 /usr/local/bin會生成四個文件
apply_diff_relay_logs
filter_mysqlbinlog
purge_relay_logs
save_binary_logs1.apply_diff_relay_logs #識別差異的中繼日志事件并將其差異的事件應用于其他的 slave
2.filter_mysqlbinlog    #去除不必要的 ROLLBACK 事件(MHA 已不再使用這個工具)
3.purge_relay_logs      #清除中繼日志(不會阻塞 SQL 線程)
4.save_binary_logs      #保存和復制 master 的二進制日志

6.2 安裝MHA Manager

MHA Manager下載地址

MHA Manager節點操作

  1. 上傳部署包到opt目錄
[root@test-server-01 opt]# ll mha4mysql-manager-0.58.tar.gz
-rw-r--r-- 1 root root 119801 Feb 20 09:37 mha4mysql-manager-0.58.tar.gz
  1. 生成Makefile
[root@test-server-01 opt]# tar -xf mha4mysql-manager-0.58.tar.gz
[root@test-server-01 opt]# cd mha4mysql-manager-0.58
[root@test-server-01 mha4mysql-manager-0.58]# perl Makefile.PL
*** Module::AutoInstall version 1.06
*** Checking for Perl dependencies...
[Core Features]
- DBI                   ...loaded. (1.627)
- DBD::mysql            ...loaded. (4.023)
- Time::HiRes           ...loaded. (1.9725)
- Config::Tiny          ...loaded. (2.14)
- Log::Dispatch         ...loaded. (2.41)
- Parallel::ForkManager ...loaded. (1.18)
- MHA::NodeConst        ...loaded. (0.58)
*** Module::AutoInstall configuration finished.
Checking if your kit is complete...
Looks good
Writing Makefile for mha4mysql::manager
  1. 編譯安裝
[root@test-server-01 mha4mysql-manager-0.58]# make && make install#安裝完成之后 /usr/local/bin會生成幾個文件
masterha_check_repl
masterha_check_ssh
masterha_check_status
masterha_conf_host
masterha_manager
masterha_master_monitor
masterha_master_switch
masterha_secondary_check
masterha_stop1. masterha_check_repl:用于檢查 MySQL 主從復制的狀態,確保主從復制正常運行并進行必要的修復操作。
2. masterha_check_ssh:檢查 MySQL 主從節點之間的 SSH 連接狀態,確保 SSH 連接正常,這對 MHA 工具的正常操作至關重要。
3. masterha_check_status:用于檢查 MySQL 主從復制環境的狀態,包括檢查主從復制延遲等信息。
4. masterha_conf_host:用于配置 MHA 工具中的主機信息,包括主從節點的連接信息等。
5. masterha_manager:主要的 MHA 工具,用于監控和管理 MySQL 主從復制環境的自動故障轉移和故障恢復。
6. masterha_master_monitor:用于監控 MySQL 主服務器的狀態,以及檢測主服務器是否發生故障。
7. masterha_master_switch:用于手動切換 MySQL 主從復制環境中的主服務器,執行主服務器的切換操作。
8. masterha_secondary_check:用于檢查 MySQL 主從復制中的輔助節點(Secondary)狀態,確保輔助節點正常。
9. masterha_stop:用于停止 MHA 工具或相關服務的操作。

7.配置MHA環境

  1. 復制相關腳本到/usr/local/bin目錄
[root@test-server-01 mha4mysql-manager-0.58]# cp -r samples/scripts /usr/local/bin/
[root@test-server-01 mha4mysql-manager-0.58]# ll /usr/local/bin/scripts/
total 32
-rwxr-xr-x 1 root root  3648 Feb 20 09:52 master_ip_failover
-rwxr-xr-x 1 root root  9870 Feb 20 09:52 master_ip_online_change
-rwxr-xr-x 1 root root 11867 Feb 20 09:52 power_manager
-rwxr-xr-x 1 root root  1360 Feb 20 09:52 send_report1.master_ip_failover #自動切換時 VIP 管理的腳本
2.master_ip_online_change #在線切換時 vip 的管理
3.power_manager #故障發生后關閉主機的腳本
4.send_report #因故障切換后發送報警的腳本
  1. 復制自動切換VIP管理腳本到/usr/local/bin目錄。使用該腳本管理VIP
[root@test-server-01 mha4mysql-manager-0.58]# cp -r /usr/local/bin/scripts/master_ip_failover /usr/local/bin/
[root@test-server-01 mha4mysql-manager-0.58]# cp -r /usr/local/bin/scripts/master_ip_online_change  /usr/local/bin/
#master_ip_online_change腳本沒有修改不知道會不會用到,但是下面配置中指定了該路徑
  1. 修改腳本內容

注:只需要修改$vip $brdc $ifdev即可

[root@test-server-01 mha4mysql-manager-0.58]# cd /usr/local/bin/
#刪除原有的 復制下面的直接粘貼即可。VIP根據自己的網段修改
#粘貼的時候記得 vim 編輯文件之后:Esc :set paste之后再進行粘貼
[root@test-server-01 bin]# vim 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.40.200';
my $brdc = '192.168.40.255';
my $ifdev = 'ens33';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
my $exit_code = 0;
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"`;
}
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";
}
  1. 創建MHA目錄并拷貝文件

master_binlog_dir=/opt/mysqldb/data 是MySQL二進制日志文件目錄,該目錄寫錯會導致MySQL MHA集群VIP飄逸失敗

[root@test-server-01 bin]# mkdir /etc/masterha
[root@test-server-01 bin]# cp -r /opt/mha4mysql-manager-0.58/samples/conf/app1.cnf /etc/masterha/
[root@test-server-01 bin]# cat /etc/masterha/app1.cnf
[server default]
manager_log=/etc/masterha/manager.log
manager_workdir=/etc/masterha/mha
master_binlog_dir=/opt/mysqldb/data #指定 MySQL 主服務器的二進制日志文件目錄。
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
user=mha_user
password=123456
port=3306
ping_interval=1
remote_workdir=/etc/masterha/mha-node
repl_user=repl_user
repl_password=123456
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.40.182 -s 192.168.40.183
shutdown_script=""
ssh_user=root[server1]
hostname=192.168.40.181
port=3306[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.40.182
port=3306[server3]
hostname=192.168.40.183
port=3306#配置解釋
1.[server default]:這是默認服務器配置部分,包含了 MHA 管理器的相關配置。
manager_log:指定 MHA 管理器的日志文件路徑。
manager_workdir:指定 MHA 管理器的工作目錄。
master_binlog_dir:指定 MySQL 主服務器的二進制日志文件目錄。
master_ip_failover_script:指定 IP 切換腳本,用于在主服務器發生故障時執行 IP 切換。
master_ip_online_change_script:指定在線 IP 變更腳本。
user:MHA 用戶名。
password:MHA 用戶密碼。
port:MySQL 端口號。
ping_interval:指定 MHA 管理器檢測 MySQL 高可用的間隔時間。
remote_workdir:指定節點服務器的工作目錄。
repl_user:MySQL 復制用戶。
repl_password:MySQL 復制用戶密碼。
secondary_check_script:指定用于檢查備用服務器的腳本。
shutdown_script:指定關閉腳本。
ssh_user:指定用于 SSH 連接的用戶名。2.[server1]:定義了一個 MySQL 服務器節點,其中包含:
hostname:主 MySQL 服務器的 IP 地址。
port:MySQL 端口號。3.[server2]:定義了另一個 MySQL 服務器節點,標記為候選主服務器,包含:
candidate_master:標記此服務器為候選主服務器。
check_repl_delay:檢查復制延遲設置為 0。
hostname:第二個 MySQL 服務器的 IP 地址。
port:MySQL 端口號。4.[server3]:定義了另一個 MySQL 服務器節點,其中包含:
hostname:第三個 MySQL 服務器的 IP 地址。
port:MySQL 端口號。
  1. MySQL Master機器手動開啟VIP
#沒有ifconfig提前安裝,全部機器安裝
[root@test-server02 ~]# yum install net-tools -y
#Master執行
[root@test-server02 ~]# /sbin/ifconfig ens33:1 192.168.40.200/24
You have new mail in /var/spool/mail/root
[root@test-server02 ~]# ip a
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 hostvalid_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:2b:8f:dc brd ff:ff:ff:ff:ff:ffinet 192.168.40.181/24 brd 192.168.40.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet 192.168.40.200/24 brd 192.168.40.255 scope global secondary ens33:1valid_lft forever preferred_lft foreverinet6 fe80::eb22:4e3:6568:88de/64 scope link noprefixroutevalid_lft forever preferred_lft foreverinet6 fe80::38d1:dfef:9158:a02b/64 scope link tentative noprefixroute dadfailedvalid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group defaultlink/ether 02:42:d0:ec:ae:7f brd ff:ff:ff:ff:ff:ffinet 172.17.0.1/16 brd 172.17.255.255 scope global docker0valid_lft forever preferred_lft forever#192.168.40.200VIP 已經出現
  1. MHA Manager測試
1.Manager節點測試ssh免密
[root@test-server-01 ~]# masterha_check_ssh -conf=/etc/masterha/app1.cnfThu Feb 20 10:53:10 2025 - [info] All SSH connection tests passed successfully.
#最后以上輸出以上內容代表正常2.Manager節點測試MySQL主從狀態
[root@test-server-01 ~]# masterha_check_repl -conf=/etc/masterha/app1.cnfMySQL Replication Health is OK.
#最后以上輸出以上內容代表正常
  1. 啟動MHA Manager
#啟動MHA
[root@test-server-01 ~]# nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /etc/masterha/manager.log 2>&1 &
[1] 10828#查看MHA狀態
[root@test-server-01 ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:10828) is running(0:PING_OK), master:192.168.40.181
#啟動成功

8.MySQL MHA高可用集群測試

8.1 通過VIP連接MySQL

#通過VIP連接數據庫
[root@test-server-01 ~]# mysql -h192.168.40.200 -umha_user -p123456
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 18
Server version: 5.7.20-log MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.#Master創建數據庫
MySQL [(none)]> create database test;
Query OK, 1 row affected (0.01 sec)#Slaver 1和Slaver 2查看
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
| test_db            |
+--------------------+
6 rows in set (0.01 sec)#成功

8.2模擬故障測試

  1. #查看manager日志,觀察manager狀態
[root@test-server-01 ~]# tailf -n100 /etc/masterha/manager.log
  1. 停止Master MySQL
[root@test-server02 ~]# systemctl stop mysqld
  1. Slave 1節點查看vip是否飄逸
[root@test-server-03 ~]# ip a
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 hostvalid_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:b9:50:43 brd ff:ff:ff:ff:ff:ffinet 192.168.40.182/24 brd 192.168.40.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet 192.168.40.200/24 brd 192.168.40.255 scope global secondary ens33:1valid_lft forever preferred_lft foreverinet6 fe80::eb22:4e3:6568:88de/64 scope link tentative noprefixroute dadfailedvalid_lft forever preferred_lft foreverinet6 fe80::38d1:dfef:9158:a02b/64 scope link tentative noprefixroute dadfailedvalid_lft forever preferred_lft foreverinet6 fe80::1c4c:acc5:6453:90f3/64 scope link tentative noprefixroute dadfailedvalid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group defaultlink/ether 02:42:56:61:72:fd brd ff:ff:ff:ff:ff:ffinet 172.17.0.1/16 brd 172.17.255.255 scope global docker0valid_lft forever preferred_lft forever#此時發現vip 200已經飄逸到了182節點 這個是slave 1的節點
  1. manager日志
#manager日志中最下面出現下方日志就證明已經切換成功了
----- Failover Report -----
app1: MySQL Master failover 192.168.40.181(192.168.40.181:3306) to 192.168.40.182(192.168.40.182:3306) succeeded
Master 192.168.40.181(192.168.40.181:3306) is down!
Check MHA Manager logs at test-server-01:/etc/masterha/manager.log for details.
Started automated(non-interactive) failover.
Invalidated master IP address on 192.168.40.181(192.168.40.181:3306)
Selected 192.168.40.182(192.168.40.182:3306) as a new master.
192.168.40.182(192.168.40.182:3306): OK: Applying all logs succeeded.
192.168.40.182(192.168.40.182:3306): OK: Activated master IP address.
192.168.40.183(192.168.40.183:3306): OK: Slave started, replicating from 192.168.40.182(192.168.40.182:3306)
192.168.40.182(192.168.40.182:3306): Resetting slave info succeeded.
Master failover to 192.168.40.182(192.168.40.182:3306) completed successfully.
  1. 查看MySQL狀態

登錄MySQL Slave2查看從狀態

[root@test-server-04 ~]# mysql -uroot -p123456
mysql> show slave status \G;
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.40.182Master_User: repl_userMaster_Port: 3306Connect_Retry: 60Master_Log_File: binlog.000002Read_Master_Log_Pos: 1700Relay_Log_File: test-server-04-relay-bin.000003Relay_Log_Pos: 744Relay_Master_Log_File: binlog.000002Slave_IO_Running: YesSlave_SQL_Running: Yes#Master_Host已經成功由192.168.40.181切換成了192.168.40.181。到此MHA集群已經成功搭建了
  1. 故障修復

恢復MySQL

[root@test-server-02 ~]# systemctl start mysqld

主數據庫查看master狀態

mysql> show master status;
+---------------+----------+--------------+------------------+------------------------------------------------------------------------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                                                                  |
+---------------+----------+--------------+------------------+------------------------------------------------------------------------------------+
| binlog.000002 |     1700 |              |                  | 7a69b6e0-eff7-11ef-b307-000c292b8fdc:3-7,
7a7fcdf5-eff7-11ef-ab74-000c29b95043:1-2 |
+---------------+----------+--------------+------------------+------------------------------------------------------------------------------------+
1 row in set (0.00 sec)#正常寫入寫入數據的情況下Position會一直變,可以和研發溝通空閑時間進行鎖庫進行配置
1. 鎖庫命令:FLUSH TABLE WITH READ LOCK;
2. 解鎖命令: unlock tables;
#配置完解開即可#原master做成Slave數據庫
mysql> change master to master_host='192.168.40.182',master_user='repl_user',master_password='123456',master_log_file='binlog.000002',master_log_pos=1700;
Query OK, 0 rows affected, 2 warnings (0.03 sec)mysql> start slave;
Query OK, 0 rows affected (0.01 sec)mysql> show slave status \G;
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.40.182Master_User: repl_userMaster_Port: 3306Connect_Retry: 60Master_Log_File: binlog.000002Read_Master_Log_Pos: 1700Relay_Log_File: test-server-02-relay-bin.000002Relay_Log_Pos: 317Relay_Master_Log_File: binlog.000002Slave_IO_Running: YesSlave_SQL_Running: Yes#已經成功變成了Slave,并且成功連接到了新的Master.
  1. 修改MHA配置

由于停掉了MySQL, /etc/masterha/app1.cnf配置里面默認刪除一開始定義的[server1],現在新增一下

[root@test-server-01 masterha]# cat /etc/masterha/app1.cnf
[server default]
manager_log=/etc/masterha/manager.log
manager_workdir=/etc/masterha/mha
master_binlog_dir=/opt/mysqldb/data
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
user=mha_user
password=123456
port=3306
ping_interval=1
remote_workdir=/etc/masterha/mha-node
repl_user=repl_user
repl_password=123456
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.40.182 -s 192.168.40.183
shutdown_script=""
ssh_user=root[server1]
hostname=192.168.40.181
port=3306[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.40.182
port=3306[server3]
hostname=192.168.40.183
port=3306
  1. MHA測試
1.Manager節點測試ssh免密
[root@test-server-01 ~]# masterha_check_ssh -conf=/etc/masterha/app1.cnfThu Feb 20 10:53:10 2025 - [info] All SSH connection tests passed successfully.
#最后以上輸出以上內容代表正常2.Manager節點測試MySQL主從狀態
[root@test-server-01 ~]# masterha_check_repl -conf=/etc/masterha/app1.cnfMySQL Replication Health is OK.
#最后以上輸出以上內容代表正常
  1. 啟動manager
#啟動MHA
[root@test-server-01 ~]# nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /etc/masterha/manager.log 2>&1 &

到這部署就成功了。部署兩邊就全都懂了

9.參考文檔

1.MySQL集群高可用架構之MHA

2.Mysql數據庫——MHA高可用配置及故障切換

3.MySQL高可用MHA

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

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

相關文章

如何查看java的字節碼文件?javap?能用IDEA嗎?

編譯指令&#xff1a; javac YourProject.java 查看字節碼文件的指令&#xff1a; javap -c -l YourProject.class 不添加-c指令就不會顯示字節碼文件&#xff1a; 不添加 -l 就不會顯示源代碼和字節碼文件的對應關系&#xff1a; 添加-l之后多出來這些&#xff1a; IDEA不太…

1、Window Android 13模擬器 將編譯的映像文件導入Android Studio

1、環境準備 編譯環境&#xff1a;Ubuntu-18.04.5編譯版本&#xff1a;android13-release下載地址&#xff1a;清華大學開源軟件鏡像站AOSP # 下載repo # 同步代碼&#xff1a;repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android13-r…

JUC并發—9.并發安全集合三

大綱 1.并發安全的數組列表CopyOnWriteArrayList 2.并發安全的鏈表隊列ConcurrentLinkedQueue 3.并發編程中的阻塞隊列概述 4.JUC的各種阻塞隊列介紹 5.LinkedBlockingQueue的具體實現原理 6.基于兩個隊列實現的集群同步機制 1.并發安全的數組列表CopyOnWriteArrayList …

報錯:Cannot read properties of null (reading ‘ce‘)解決方法

背景 工作項目中要做右鍵菜單打開趨勢圖彈窗的需求&#xff0c;這個彈窗使用了vue-resizable的第三方插件&#xff0c;這個插件的主要作用是把彈窗設置為可拖拽的效果。這個用vue-resizable做的彈窗已經做好了&#xff0c;在別的項目中能夠正常的運行。但是我把它拿過來放在新…

Ubuntu 下 nginx-1.24.0 源碼分析 - ngx_process_options

ngx_process_options 聲明在 src\core\nginx.c static ngx_int_t ngx_process_options(ngx_cycle_t *cycle); 定義在 src\core\nginx.c static ngx_int_t ngx_process_options(ngx_cycle_t *cycle) {u_char *p;size_t len;if (ngx_prefix) {len ngx_strlen(ngx_prefix);p …

數據結構系列二:包裝類+泛型

包裝類泛型 一、包裝類&#xff08;1&#xff09;基本數據類型和對應的包裝類&#xff08;2&#xff09;裝箱和拆箱 二、泛型&#xff08;1&#xff09;什么是泛型&#xff08;2&#xff09;引出泛型&#xff08;3&#xff09;語法&#xff08;4&#xff09;泛型類的使用1.語法…

量子計算驅動的金融衍生品定價革命:突破傳統蒙特卡洛模擬的性能邊界

引言&#xff1a;金融計算的算力困局 某國際投行采用128量子位處理器對亞洲期權組合定價時&#xff0c;其量子振幅估計算法在2.7秒內完成傳統GPU集群需要68小時的計算任務。在蒙特卡洛路徑模擬實驗中&#xff0c;量子隨機游走算法將10,000維衍生品的價格收斂速度提升4個數量級…

Spring容器初始化擴展點:ApplicationContextInitializer

目錄 一、什么是ApplicationContextInitializer&#xff1f; 1、核心作用2、適用場景 二、ApplicationContextInitializer的使用方式 1、實現ApplicationContextInitializer接口2、注冊初始化器 三、ApplicationContextInitializer的執行時機四、實際應用案例 1、動態設置環境…

hive—常用的函數整理

1、size(split(...))函數用于計算分割后字符串數組的長度 實例1&#xff09;&#xff1a;由客戶編號列表計算客戶編號個數 --數據準備 with tmp_test01 as ( select tag074445270 tag_id,202501busi_mon , 012399931003,012399931000 index_val union all select tag07444527…

vue3 采用xlsx庫實現本地上傳excel文件,前端解析為Json數據

需求&#xff1a;本地上傳excel 文件&#xff0c;但需要對excel 文件的內容進行解析&#xff0c;然后展示出來 1. 安裝依賴 首先&#xff0c;確保安裝了 xlsx 庫&#xff1a; bash復制 npm install xlsx 2. 創建 Vue 組件 創建一個 Vue 組件&#xff08;如 ExcelUpload.v…

若依框架實現動態失效時間JWT Token的實踐指南

一、功能需求背景 在前后端分離架構中&#xff0c;JWT&#xff08;JSON Web Token&#xff09;作為無狀態認證方案被廣泛使用。若依&#xff08;RuoYi&#xff09;框架的TokenService默認采用固定失效時間策略&#xff0c;但在實際開發中常需要根據業務場景動態調整Token有效期…

C++ 設計模式-策略模式

支付策略 #include <iostream> #include <memory> #include <unordered_map> #include <vector> #include <ctime>// 基礎策略接口 class PaymentStrategy { public:virtual ~PaymentStrategy() default;virtual std::string name() const 0;…

國產編輯器EverEdit - 如何在EverEdit中管理工程?

1 工程管理 1.1 應用場景 用戶創建工程后&#xff0c;會涉及到工程的管理 &#xff0c;比如&#xff1a;打開工程、關閉工程等 1.2 使用方法 1.2.1 打開工程 單擊主菜單工程 -> 打開工程&#xff0c;會彈出打開對話框&#xff0c;用戶在對話框中選擇需要打開的工程文件即…

MYSQL-數據庫-DDL-DML-DQL-DCL-基礎學習

MySql概念&#xff1a; 建立在關系模型基礎上&#xff0c;有多張相互連接的二維表組成的數據庫 SQL通用語法&#xff1a; 1.SQL語句可以單行或多行書寫&#xff0c;以分號結尾 2.SQL語句可以使用空格/縮進來增強語句的可讀性 3.MySQL數據庫的SQL語句不區分大小寫&#xff0c;關…

SpringBoot核心框架之AOP詳解

SpringBoot核心框架之AOP詳解 一、AOP基礎 1.1 AOP概述 AOP&#xff1a;Aspect Oriented Programming&#xff08;面向切面編程&#xff0c;面向方面編程&#xff09;&#xff0c;其實就是面向特定方法編程。 場景&#xff1a;項目部分功能運行較慢&#xff0c;定位執行耗時…

【RK3588嵌入式圖形編程】-SDL2-構建模塊化UI

構建模塊化UI 文章目錄 構建模塊化UI1、概述2、創建UI管理器3、嵌套組件4、繼承5、多態子組件6、總結在本文中,將介紹如何使用C++和SDL創建一個靈活且可擴展的UI系統,重點關注組件層次結構和多態性。 1、概述 在前面的文章中,我們介紹了應用程序循環和事件循環,這為我們的…

第四屆圖像、信號處理與模式識別國際學術會議(ISPP 2025)

重要信息 會議官網&#xff1a;www.icispp.com 會議時間&#xff1a;2025年3月28-30日 會議地點&#xff1a;南京 簡介 由河海大學和江蘇大學聯合主辦的第四屆圖像、信號處理與模式識別國際學術會議&#xff08;ISPP 2025) 將于2025年3月28日-30日在中國南京舉行。會議主…

低代碼與開發框架的一些整合[2]

1.分析的項目資源說明 經過近期的的不斷分析與運行對比&#xff0c;最終把注意力集中在了以下幾個框架&#xff1a; 01.dibootdiboot.diboot: 寫的更少, 性能更好 -> 為開發人員打造的低代碼開發平臺。Mybatis-plus關聯查詢&#xff0c;關聯無SQL&#xff0c;性能高10倍&a…

Spring Boot 中事務的用法詳解

引言 在 Spring Boot 中&#xff0c;事務管理是一個非常重要的功能&#xff0c;尤其是在涉及數據庫操作的業務場景中。Spring 提供了強大的事務管理支持&#xff0c;能夠幫助我們簡化事務的管理和控制。本文將詳細介紹 Spring Boot 中事務的用法&#xff0c;包括事務的基本概…

Java面試——Tomcat

優質博文&#xff1a;IT_BLOG_CN 一、Tomcat 頂層架構 Tomcat中最頂層的容器是Server&#xff0c;代表著整個服務器&#xff0c;從上圖中可以看出&#xff0c;一個Server可以包含至少一個Service&#xff0c;用于具體提供服務。Service主要包含兩個部分&#xff1a;Connector和…