MySQL源码编译部署主从及MHA高可用集群实战

一.Mysql的源码编译

1.下载安装包

复制代码
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-8.3.0.tar.gz

2.源码编译

复制代码
# 安装编译依赖的软件包,包括C/C++编译器(如gcc/gcc-c++)、构建工具(如cmake, git, bison)和开发库(如openssl-devel, ncurses-devel)
[root@mysql-node1 ~]# dnf install cmake3 gcc git bison openssl-devel ncurses-devel systemd-devel rpcgen.x86_64 libtirpc-devel-1.3.3-9.el9.x86_64.rpm  gcc-toolset-12-gcc gcc-toolset-12-gcc-c++ gcc-toolset-12-binutils gcc-toolset-12-annobin-annocheck gcc-toolset-12-annobin-plugin-gcc -y

# 解压下载的MySQL源码压缩包
[root@mysql-node1 ~]# tar zxf mysql-boost-8.3.0.tar.gz
# 进入解压后的源码目录,并创建独立的编译构建目录
[root@mysql-node1 mysql-8.3.0]# mkdir  build
[root@mysql-node1 mysql-8.3.0]# cd build/

# 使用CMake配置MySQL的编译选项,例如指定安装路径、数据目录、字符集、存储引擎等
[root@mysql-node1 build]# cmake3 .. -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql -DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_EXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_unicode_ci -DWITH_BOOST=bundled  -DWITH_SSL=system -DWITH_DEBUG=OFF

# 执行编译,此过程耗时较长
[root@mysql-node1 build]# make

3.部署mysql

复制代码
# 将编译好的MySQL二进制文件、库和脚本等安装到指定的`/usr/local/mysql`目录
[root@mysql-node1 build]# make install
[root@mysql-node1 build]# cd /usr/local/mysql/

# 编辑当前用户的bash配置文件,将MySQL的可执行文件路径添加到系统环境变量PATH中
[root@mysql-node1 mysql]# vim ~/.bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs
export PATH=$PATH:/usr/local/mysql/bin				#设置mysql运行环境的环境变量


# 使环境变量配置立即生效
[root@mysql-node1 mysql]# source  ~/.bash_profile

# 创建一个名为`mysql`的系统用户,用于运行MySQL服务进程
[root@mysql-node1 mysql]# useradd  -r -s /sbin/nologin -M mysql

# 创建MySQL的数据存储目录,并将其所有者改为mysql用户
[root@mysql-node1 mysql]# mkdir  -p /data/mysql
[root@mysql-node1 mysql]# chown mysql.mysql /data/mysql/

# 创建并编辑MySQL的主配置文件,设置数据目录和socket文件路径
[root@mysql-node1 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock

4.mysql数据结构初始化

复制代码
# 初始化MySQL数据目录,创建系统数据库(如mysql, sys等)和表,此步骤会生成root用户的初始随机密码
[root@mysql-node1 ~]#  mysqld --initialize --user=mysql

5.启动mysql

复制代码
# 安装MySQL服务启动脚本所需的基础依赖包
[root@mysql-node1 support-files]# dnf install initscripts-10.11.8-4.el9.x86_64 -y

# 将MySQL自带的启动脚本复制到系统的init.d目录,以支持service/chkconfig命令管理
[root@mysql-node1 support-files]# cd /usr/local/mysql/support-files/
[root@mysql-node1 support-files]# cp -p mysql.server  /etc/init.d/mysqld

# 启动MySQL服务
[root@mysql-node1 support-files]# /etc/init.d/mysqld start
Starting MySQL.Logging to '/data/mysql/mysql-node1.err'.
. SUCCESS!

# 设置MySQL服务在运行级别3和5下开机自动启动
[root@mysql-node1 support-files]# chkconfig --level 35 mysqld on

6.mysql的安全初始化

复制代码
# 运行安全增强脚本,以交互式方式设置root密码、移除匿名用户、禁止root远程登录、移除测试数据库等
[root@mysql-node1 ~]# mysql_secure_installation
Securing the MySQL server deployment.

Enter password for user root:

The existing password for the user account root has expired. Please set a new password.

New password:

Re-enter new password:

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: no
Using existing password for root.
Change the password for root ? ((Press y|Y for Yes, any other key for No) : no


Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done!

二.Mysql集群实战--主从复制

1.编写my.cnf 主配置文件

复制代码
# 在主服务器(mysql-node1)上编辑配置文件,设置server-id为10,并开启二进制日志
[root@mysql-node1 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0

server-id=10
log-bin=mysql-bin

# 在第一个从服务器(mysql-node2)上编辑配置文件,设置唯一的server-id为20,并开启二进制日志
[root@mysql-node2 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0

server-id=20
log-bin=mysql-bin

# 在第二个从服务器(mysql-node3)上编辑配置文件,设置唯一的server-id为30,并开启二进制日志
[root@mysql-node3 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0

server-id=30
log-bin=mysql-bin


# 在三台主机上重启MySQL服务以使新的配置文件生效
[root@mysql-node1~3 ~]# /etc/init.d/mysqld restart

2.建立同步时需要用到的数据库账号

复制代码
# 在主服务器上登录MySQL,查看默认身份验证插件
[root@mysql-node1 ~]# mysql -uroot -ptest
...
mysql> SHOW VARIABLES LIKE 'default_authentication_plugin';
+-------------------------------+-----------------------+
| Variable_name                 | Value                 |
+-------------------------------+-----------------------+
| default_authentication_plugin | caching_sha2_password |
+-------------------------------+-----------------------+
1 row in set (0.00 sec)

# 创建一个名为'test'的用户,使用`mysql_native_password`插件进行身份验证,以便于主从复制
mysql> create user test@'%' identified with mysql_native_password by 'test';    #建立用户
Query OK, 0 rows affected (0.04 sec)

mysql> select User from mysql.user;
+------------------+
| User             |
+------------------+
| test             |
| mysql.infoschema |
| mysql.session    |
| mysql.sys        |
| root             |
+------------------+
5 rows in set (0.00 sec)

# 授予'test'用户复制相关的权限
mysql>  GRANT replication slave ON *.* to test@'%';		#给用户授权
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW GRANTS FOR test@'%';
+---------------------------------------------+
| Grants for test@%                           |
+---------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO `test`@`%`|
+---------------------------------------------+
1 row in set (0.00 sec)


# 在从服务器上测试使用新创建的'test'用户能否成功连接到主服务器
[root@mysql-node2 ~]# mysql -utest -ptest -h172.25.254.10
...
mysql> quit

3.配置数据库一主一从

复制代码
#在主服务器上查看当前的二进制日志文件状态,记录文件名`File`和位置`Position`,供从服务器连接时使用
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      659 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

# 在第一个从服务器(mysql-node2)上配置主从复制
[root@mysql-node2 ~]# mysql -uroot -ptest
...
# 执行`CHANGE MASTER TO`命令,指定主服务器的IP、用户、密码以及要开始复制的二进制日志位置
mysql>  CHANGE MASTER TO MASTER_HOST='172.25.254.10',MASTER_USER='test',MASTER_PASSWORD='test',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=659;
Query OK, 0 rows affected, 8 warnings (0.03 sec)

# 启动从服务器上的复制线程
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.03 sec)

# 查看从服务器的复制状态
mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 172.25.254.10
                  Master_User: test
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 659
               Relay_Log_File: mysql-node2-relay-bin.000002
                Relay_Log_Pos: 328
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes					#I/O线程运行中,表示正在从主服务器接收二进制日志
            Slave_SQL_Running: Yes					#SQL线程运行中,表示正在执行中继日志中的事件

4.测试

复制代码
# 在主服务器上创建一个新的数据库`test`
[root@mysql-node1 ~]# mysql -uroot -ptest
mysql> show databases;
...
mysql> create database test;
Query OK, 1 row affected (0.00 sec)

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.00 sec)

# 在从服务器上检查是否已同步创建了`test`数据库
[root@mysql-node2 ~]# mysql -uroot -ptest
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.00 sec)

5.向当前一主一从中加入新的数据库

复制代码
# 在主服务器上,模拟在主从复制已运行一段时间后,在主库创建一个表并插入数据
[root@mysql-node1 ~]# mysql -uroot -ptest
mysql> CREATE TABLE test.userlist (
    -> name VARCHAR(10) not null,
    -> pass VARCHAR(50) not null
    -> );
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO test.userlist values ('user1','123');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM test.userlist;
+-------+------+
| name  | pass | 
+-------+------+
| user1 | 123  |
+-------+------+
1 row in set (0.01 sec)


# 准备将新的从服务器(mysql-node3)加入集群,需要先手动同步现有数据
# 使用`mysqldump`导出主服务器上`test`数据库的数据
[root@mysql-node1 ~]# mysqldump -uroot -p test > test.sql
# 将导出的数据文件传输到新的从服务器
[root@mysql-node1 ~]# scp test.sql root@172.25.254.30:/root/

# 在新的从服务器上,先创建同名数据库,然后导入数据
[root@mysql-node3 ~]# mysql -uroot -ptest -e "create database test;"
[root@mysql-node3 ~]# mysql -uroot -ptest test < test.sql

# 验证数据已成功导入新的从服务器
[root@mysql-node3 ~]# mysql -uroot -ptest
mysql> select * from test.userlist;
+-------+------+
| name  | pass |
+-------+------+
| user1 | 123  |
+-------+------+
1 row in set (0.00 sec)

6.将新库加入主从结构中

复制代码
# 在主服务器上再次查看当前二进制日志位置,作为新从服务器开始复制的起点
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |     1415 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+


# 在新的从服务器(mysql-node3)上配置主从复制,使用上面查询到的日志文件和位置
[root@mysql-node3 ~]# mysql -uroot -ptest
mysql>  CHANGE MASTER TO MASTER_HOST='172.25.254.10',MASTER_USER='test',MASTER_PASSWORD='test',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=1415;

mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.04 sec)

# 验证新从服务器的复制状态
mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 172.25.254.10
                  Master_User: test
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 1415
               Relay_Log_File: mysql-node3-relay-bin.000002
                Relay_Log_Pos: 328
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

7.测试一主两从

复制代码
# 在主服务器上插入新的数据
mysql> INSERT INTO  timinglee.userlist values ('user2','123');

# 在**新的**从服务器上查看数据,确认复制成功
mysql> select * from timinglee.userlist;
+-------+------+
| name  | pass |
+-------+------+
| user1 | 123  |
| user2 | 123  |
+-------+------+
2 rows in set (0.00 sec)

三.MySQL MHA 高可用集群环境配置与操作

1.MySQL-MHA 高可用集群环境配置

准备工作 - 保证数据一致性(所有MySQL节点)

此步骤的目的是清空现有数据,并重新初始化一个全新的、数据同步的主从复制环境,为MHA的搭建准备干净的环境。

复制代码
# 在主节点(mysql-node1)上停止MySQL服务,清空数据目录,并重新初始化数据库
[root@mysql-node1 ~]# /etc/init.d/mysqld stop
[root@mysql-node1 ~]# rm -fr /data/mysql/*
[root@mysql-node1 ~]# mysqld --initialize --user mysql

# 启动MySQL服务,并运行安全初始化向导
[root@mysql-node1 ~]# /etc/init.d/mysqld start
Starting MySQL.Logging to '/data/mysql/mysql-node1.err'.
 SUCCESS!
[root@mysql-node1 ~]# mysql_secure_installation

# 创建用于主从复制的专用用户'test'
[root@mysql-node1 ~]# mysql -uroot -ptest -e "create user test@'%' identified with mysql_native_password by 'test';"
# 授予该用户复制权限
[root@mysql-node1 ~]# mysql -uroot -ptest -e "GRANT replication slave ON *.* to test@'%';"
# 查看主库状态,记录File和Position(或GTID),用于配置从库
[root@mysql-node1 ~]# mysql -uroot -ptest -e "show master status;"

# 在从库节点(mysql-node2, mysql-node3)上配置主从复制
# 指向主库IP (172.25.254.10),并使用上面创建的复制用户
[root@mysql-node2~3 ~]# mysql -uroot -ptest -e "CHANGE MASTER TO MASTER_HOST='172.25.254.10', MASTER_USER='test', MASTER_PASSWORD='test', MASTER_AUTO_POSITION=1;"
# 启动从库复制线程
[root@mysql-node2~3 ~]# mysql -uroot -ptest -e "start slave;"
# 检查从库复制状态
[root@mysql-node2~3 ~]# mysql -uroot -ptest -e "show slave status\G;"

1.1 在所有主机中安装MHA相应软件

在MHA管理节点(mha)上安装MHA Manager和Node软件包,并在所有MySQL节点上安装Node软件包。Manager负责监控和故障转移,Node运行在每个MySQL服务器上用于状态上报和指令执行。

复制代码
# 在MHA管理节点上,解压软件包并安装Perl依赖
[root@mha ~]# unzip MHA-7.zip
[root@mha ~]# cd MHA-7/
[root@mha MHA-7]# dnf install perl perl-DBD-MySQL perl-CPAN -y

# 进入CPAN交互式环境,安装MHA所需的Perl模块
[root@mha MHA-7]# cpan
cpan[1]> install Config::Tiny
cpan[2]> install Log::Dispatch
cpan[3]> install Mail::Sender
cpan[4]> install Parallel::ForkManager
cpan[5]> exit

# 验证Perl模块是否安装成功
[root@mha ~]# perl -MConfig::Tiny -e 'print "OK\n"'
[root@mha ~]# perl -MLog::Dispatch -e 'print "OK\n"'
[root@mha ~]# perl -MMail::Sender -e 'print "OK\n"'
[root@mha ~]# perl -MParallel::ForkManager -e 'print "OK\n"'

# 在MHA管理节点上安装Manager和Node的RPM包
[root@mha MHA-7]# rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm mha4mysql-node-0.58-0.el7.centos.noarch.rpm --nodeps

# 在所有MySQL节点上仅安装Node的RPM包
[root@mha MHA-7]# rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm --nodeps

1.2 在所有MySQL节点(从库)中分发并安装Node软件

从MHA管理节点将Node软件包远程复制到各个MySQL节点并安装,实现批量部署。

复制代码
# 通过循环,将Node包scp到各个MySQL节点(172.25.254.10, .20, .30)并远程执行安装
[root@mha MHA-7]# for i in 10 20 30
> do
> scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm root@172.25.254.$i:/mnt
> ssh -l root 172.25.254.$i "rpm -ivh /mnt/mha4mysql-node-0.58-0.el7.centos.noarch.rpm --nodeps"
> done

1.3 修改MHA-Manager中的检测代码

注释: 修改Perl模块文件以适配特定MySQL版本格式,解决可能出现的版本解析问题。

复制代码
[root@mha MHA-7]# vim /usr/share/perl5/vendor_perl/MHA/NodeUtil.pm
# 找到并修改 parse_mysql_major_version 函数,确保版本号解析正确
# 原始代码 (第199-203行) 被注释或修改
# 修改后的函数如下:
sub parse_mysql_major_version($) {
  my $str = shift;
  my @nums = $str =~ m/(\d+)/g;
  my $result = sprintf( '%03d%03d', $nums[0]//0, $nums[1]//0);
  return $result;
}

1.4 为MHA建立远程登录用户

在Master数据库上创建一个具有完全权限的'root'用户(允许任意主机连接),供MHA Manager在故障切换时管理数据库。

复制代码
# 在主库(172.25.254.10)的MySQL中执行
mysql> create user root@'%' identified with mysql_native_password by 'test';
mysql> GRANT ALL ON *.* TO root@'%' ;

5. 生成MHA-manager的配置文件模板

创建MHA的配置文件目录,并将示例配置文件合并生成一个默认的配置文件模板。

复制代码
[root@mha mha4mysql-manager-0.58]# mkdir /etc/masterha/ -p
[root@mha MHA-7]# tar zxf mha4mysql-manager-0.58.tar.gz
[root@mha MHA-7]# cd mha4mysql-manager-0.58
[root@mha mha4mysql-manager-0.58]# cat samples/conf/masterha_default.cnf samples/conf/app1.cnf > /etc/masterha/app1.cnf

6. 修改配置文件

编辑生成的配置文件,定义集群名称、数据库访问凭据、服务器列表、角色和监控参数。

复制代码
[root@mha mha4mysql-manager-0.58]# vim /etc/masterha/app1.cnf
# 配置文件内容如下:
[server default]
user=root                # MySQL管理用户
password=test            # 对应用户密码
ssh_user=root            # SSH登录用户(用于节点间通信)
repl_user=test           # 主从复制用户
repl_password=test       # 主从复制用户密码
master_binlog_dir= /data/mysql  # Master的binlog目录
remote_workdir=/tmp       # 远程节点工作目录
secondary_check_script= masterha_secondary_check -s 172.25.254.10 -s 172.25.254.20 # 二次检查脚本
ping_interval=3          # ping检测间隔(秒)
# 以下为可选的脚本配置,用于VIP漂移、关机、报告等,此处被注释
# master_ip_failover_script= /script/masterha/master_ip_failover
# shutdown_script= /script/masterha/power_manager
# report_script= /script/masterha/send_report
# master_ip_online_change_script= /script/masterha/master_ip_online_change
manager_workdir=/etc/masterha  # Manager工作目录
manager_log=/etc/masterha/mha.log  # Manager日志文件

# 定义集群中的MySQL服务器
[server1]
hostname=172.25.254.10   # 主库IP
candidate_master=1       # 是候选主库(故障时可提升为主)
check_repl_delay=0       # 忽略复制延迟检查

[server2]
hostname=172.25.254.20   # 从库1 IP
candidate_master=1       # 是候选主库
check_repl_delay=0

[server3]
hostname=172.25.254.30   # 从库2 IP
no_master=1              # 不能作为主库(例如:用于备份或特定用途)

7. 检测环境

在启动MHA Manager之前,必须进行两个关键检查,确保SSH免密登录和MySQL主从复制状态正常。

复制代码
# 1. 检查MHA管理节点到所有MySQL节点之间的SSH无密码连接
[root@mha mha4mysql-manager-0.58]# masterha_check_ssh --conf=/etc/masterha/app1.cnf
# ... 输出应显示 "All SSH connection tests passed successfully."

# 2. 检查MySQL主从复制集群的配置和运行状态
[root@mha mha4mysql-manager-0.58]# masterha_check_repl --conf=/etc/masterha/app1.cnf
# ... 输出应显示 "MySQL Replication Health is OK."
# 并展示出当前的拓扑结构:172.25.254.10 (Master) -> 172.25.254.20, 172.25.254.30 (Slaves)

8. 在所有MySQL节点上安装MHA-Node软件依赖

每个运行MHA-Node的MySQL服务器也需要安装与Manager节点相同的Perl模块,以确保Node脚本能正常运行。

复制代码
# 在所有的数据库主机(mysql-node1~3)上安装Perl依赖
[root@mysql-node1~3 ~]# dnf install perl perl-DBD-MySQL perl-CPAN -y
# 解压CPAN模块包(如果存在离线包)
[root@mysql-node1~3 ~]# tar zxf cpan_plugin.tar.gz
# 进入CPAN安装所需的Perl模块(步骤同Manager节点)
[root@mysql-node1~3 ~]# cpan
# ... (安装 Config::Tiny, Log::Dispatch, Mail::Sender, Parallel::ForkManager)
# 同样进行模块安装成功验证
[root@mysql-node1~3 ~]# perl -MConfig::Tiny -e 'print "OK\n"'
...

2.集群切换操作

2.1手动切换

Master无故障切换(在线切换)

在主库运行正常时,手动将其角色切换到另一台候选主库(如172.25.254.20),原主库降级为新主库的从库。适用于计划内维护。

复制代码
# 切换前的初始状态:20和30都是从库,复制来自10
[root@mysql-node2 ~]# mysql -uroot -ptest -e "show slave status\G;" | head -n 10
# Master_Host: 172.25.254.10

# 执行在线切换命令,将主库从10切换到20,并将原主库10设置为20的从库(--orig_master_is_new_slave)
[root@mha ~]# masterha_master_switch \
--conf=/etc/masterha/app1.cnf \
--master_state=alive \
--new_master_host=172.25.254.20 \
--new_master_port=3306 \
--orig_master_is_new_slave \
--running_updates_limit=10000
# 命令执行过程中会进行交互式确认,并显示详细的切换步骤和状态。

# 切换后验证:10和30都应指向20作为主库
[root@mysql-node1 ~]# mysql -uroot -ptest -e "show slave status\G;" | head -n 15
# Master_Host: 172.25.254.20
[root@mysql-node3 ~]# mysql -uroot -ptest -e "show slave status\G;" | head -n 15
# Master_Host: 172.25.254.20
Master故障后切换(故障转移)

在主库(172.25.254.10)发生故障宕机后,手动触发故障转移流程,将备选主(172.25.254.20)提升为新的主库。

复制代码
# 模拟主库故障后,执行故障转移命令
[root@mha ~]# masterha_master_switch \
--master_state=dead \
--conf=/etc/masterha/app1.cnf \
--dead_master_host=172.25.254.10 \
--dead_master_port=3306 \
--new_master_host=172.25.254.20 \
--new_master_port=3306 \
--ignore_last_failover
# 命令会检测到10已宕机,并提示用户确认是否继续。确认后,MHA将20提升为主库,并尝试让30去复制20。

# 查看切换结果
[root@mysql-node3 ~]# mysql -uroot -ptest -e "show slave status\G;" | head -n 15
# Master_Host: 172.25.254.20

# 故障恢复后处理
# 1. 移除MHA为防止脑裂产生的锁文件
[root@mha ~]# ls /etc/masterha/
# 会看到 app1.failover.complete 文件
[root@mha ~]# rm -fr /etc/masterha/app1.failover.complete

# 2. 修复原主库(10)并重新加入集群作为20的从库
[root@mysql-node1 ~]# /etc/init.d/mysqld start
[root@mysql-node1 ~]# mysql -uroot -ptest -e "CHANGE MASTER TO MASTER_HOST='172.25.254.20', MASTER_USER='test', MASTER_PASSWORD='test', MASTER_AUTO_POSITION=1;"
[root@mysql-node1 ~]# mysql -uroot -ptest -e "start slave;"
[root@mysql-node1 ~]# mysql -uroot -ptest -e "show slave status\G;" | head -n 15
# Master_Host: 172.25.254.20

2. 自动切换

启动MHA Manager监控进程,当检测到主库故障时,自动执行故障转移,无需人工干预。

复制代码
# 为了方便观察日志,可以先清空旧日志并实时查看
[root@mha ~]# > /etc/masterha/*.log
[root@mha ~]# watch -n 1 cat /etc/masterha/mha.log  # 打开另一个终端执行

# 在第一个终端,以后台进程方式启动MHA Manager监控
[root@mha ~]# masterha_manager --conf=/etc/masterha/app1.cnf &
[1]+ 运行中 masterha_manager --conf=/etc/masterha/app1.cnf &

# 模拟主库故障,观察自动切换过程
[root@mysql-node1 ~]# /etc/init.d/mysqld stop
# 此时,在 watch 终端可以看到MHA检测到主库宕机,并自动开始执行故障转移流程,最终将20提升为新主库。
相关推荐
Carino_U2 小时前
全面理解mysql架构
mysql·adb·架构
w-白兰地2 小时前
配置Unity中的ADB环境变量
unity·adb·游戏引擎
Yang-Never2 小时前
ADB ->Android 实时监控内存
android·开发语言·adb·android studio
卤炖阑尾炎3 小时前
MySQL 全量、增量备份与恢复实战指南
mysql·adb
zhangren024683 小时前
Laravel7.x新特性全面解析
数据库·mysql·adb·php
LcVong17 小时前
MySQL 5.2/5.7 开启Binlog日志详细步骤(附验证+查看+恢复)
数据库·mysql·adb
qq_283720051 天前
MySQL实战 (十一):内存优化innodb_buffer_pool_size 等核心参数配置
adb
杨云龙UP2 天前
mysqldump逻辑备份文件恢复总结:全库恢复、单库恢复,一篇讲明白
linux·运维·服务器·数据库·mysql·adb
ybwycx2 天前
mysql重置root密码(适用于5.7和8.0)
数据库·mysql·adb