Loading... # 搭建MySQL MHA高可用集群步骤 在企业级应用中,**高可用性**(High Availability)是数据库系统的重要特性。**MySQL MHA(Master High Availability)**是一套用于MySQL高可用环境下主从切换和故障恢复的解决方案。本文将详细介绍如何搭建一个MySQL MHA高可用集群,并对每个步骤进行详细解释。😊 ## 一、环境准备 ### 1. 规划集群架构 在搭建之前,我们需要明确集群的架构。通常,MySQL MHA集群包括以下节点: - **1个MHA管理节点(Manager)** - **1个MySQL主节点(Master)** - **2个MySQL从节点(Slave)** **架构图:** ```mermaid graph LR MHA_Manager[📌 MHA Manager] MHA_Manager --> Master(主节点) MHA_Manager --> Slave1(从节点1) MHA_Manager --> Slave2(从节点2) Master --> Slave1 Master --> Slave2 ``` ### 2. 环境要求 - 操作系统:CentOS 7及以上 - MySQL版本:MySQL 5.7或MySQL 8.0 - 网络要求:各节点之间网络互通 - **主机名规划:** | 主机名 | IP地址 | 角色 | | ----------------- | ------------- | ------------ | | **manager** | 192.168.1.100 | MHA管理节点 | | **master** | 192.168.1.101 | MySQL主节点 | | **slave1** | 192.168.1.102 | MySQL从节点1 | | **slave2** | 192.168.1.103 | MySQL从节点2 | ## 二、安装和配置MySQL ### 1. 在所有数据库节点上安装MySQL ```bash sudo yum install -y wget wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm sudo rpm -ivh mysql57-community-release-el7-11.noarch.rpm sudo yum install -y mysql-server ``` **解释:** - `sudo yum install -y wget`:安装 `wget`工具,用于下载文件。 - `wget ...`:下载MySQL的RPM包。 - `sudo rpm -ivh ...`:安装MySQL的YUM源。 - `sudo yum install -y mysql-server`:安装MySQL服务器。 ### 2. 启动并设置MySQL服务 ```bash sudo systemctl start mysqld sudo systemctl enable mysqld ``` **解释:** - `sudo systemctl start mysqld`:启动MySQL服务。 - `sudo systemctl enable mysqld`:设置MySQL开机自启。 ### 3. 配置MySQL主从复制 #### 在主节点(master)上: 编辑 `/etc/my.cnf`文件,添加以下内容: ```ini [mysqld] server-id=1 log-bin=master-bin binlog-format=row ``` **解释:** - `server-id=1`:设置服务器ID,主节点为1。 - `log-bin=master-bin`:启用二进制日志,并指定日志文件前缀。 - `binlog-format=row`:设置二进制日志格式为 `row`。 重启MySQL服务: ```bash sudo systemctl restart mysqld ``` **创建复制用户:** 登录MySQL: ```bash mysql -u root -p ``` 执行SQL语句: ```sql CREATE USER 'repl'@'%' IDENTIFIED BY 'repl_password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; FLUSH PRIVILEGES; ``` **解释:** - 创建名为 `repl`的复制用户,密码为 `repl_password`。 - 赋予复制权限。 #### 在从节点(slave1和slave2)上: 编辑 `/etc/my.cnf`文件,添加以下内容: ```ini [mysqld] server-id=2 # 对于slave2,设置为3 relay-log=relay-log-bin read_only=1 ``` **解释:** - `server-id`:设置服务器ID,必须唯一,`slave1`为2,`slave2`为3。 - `relay-log=relay-log-bin`:设置中继日志。 - `read_only=1`:设置为只读模式。 重启MySQL服务: ```bash sudo systemctl restart mysqld ``` **设置从库与主库同步:** 登录MySQL: ```bash mysql -u root -p ``` 执行SQL语句: ```sql CHANGE MASTER TO MASTER_HOST='192.168.1.101', MASTER_USER='repl', MASTER_PASSWORD='repl_password', MASTER_LOG_FILE='master-bin.000001', MASTER_LOG_POS=4; START SLAVE; ``` **解释:** - `CHANGE MASTER TO`:配置主库的信息。 - `MASTER_HOST`:主库的IP地址。 - `MASTER_USER`和 `MASTER_PASSWORD`:复制用户的用户名和密码。 - `MASTER_LOG_FILE`和 `MASTER_LOG_POS`:指定从哪个位置开始复制。 - `START SLAVE`:启动复制进程。 ### 4. 验证主从复制 在从库上,执行: ```sql SHOW SLAVE STATUS\G; ``` **解释:** - `SHOW SLAVE STATUS\G`:查看从库的复制状态。 确保 `Slave_IO_Running`和 `Slave_SQL_Running`均为 `Yes`。🎉 ## 三、安装和配置MHA ### 1. 在所有节点上安装Perl依赖 ```bash sudo yum install -y epel-release sudo yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager ``` **解释:** - `epel-release`:安装EPEL源,提供额外的包。 - 安装MHA依赖的Perl模块。 ### 2. 安装MHA软件包 #### 在数据库节点(master、slave1、slave2)上: ```bash wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58.tar.gz tar -zxvf mha4mysql-node-0.58.tar.gz cd mha4mysql-node-0.58 sudo perl Makefile.PL sudo make && sudo make install ``` **解释:** - 下载MHA Node软件包。 - 解压并安装。 #### 在管理节点(manager)上: ```bash wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58.tar.gz tar -zxvf mha4mysql-manager-0.58.tar.gz cd mha4mysql-manager-0.58 sudo perl Makefile.PL sudo make && sudo make install ``` **解释:** - 下载MHA Manager软件包。 - 解压并安装。 ### 3. 配置免密登录 在管理节点上,生成SSH密钥: ```bash ssh-keygen -t rsa ``` **解释:** - `ssh-keygen -t rsa`:生成RSA类型的SSH密钥。 将公钥复制到各个节点: ```bash ssh-copy-id root@192.168.1.101 # master ssh-copy-id root@192.168.1.102 # slave1 ssh-copy-id root@192.168.1.103 # slave2 ``` **解释:** - `ssh-copy-id`:将公钥复制到目标主机,实现免密登录。 ### 4. 配置MHA管理文件 在管理节点上,创建配置文件 `/etc/mha/app1.cnf`: ```ini [server default] manager_log=/var/log/mha/app1/manager.log manager_workdir=/var/log/mha/app1 master_binlog_dir=/var/lib/mysql user=repl password=repl_password ssh_user=root [server1] hostname=192.168.1.101 candidate_master=1 check_repl_delay=0 [server2] hostname=192.168.1.102 [server3] hostname=192.168.1.103 ``` **解释:** - `[server default]`:默认配置。 - `manager_log`和 `manager_workdir`:MHA日志和工作目录。 - `master_binlog_dir`:主库的二进制日志目录。 - `user`和 `password`:复制用户的信息。 - `[server1]`、`[server2]`、`[server3]`:各个数据库节点的配置。 ### 5. 测试MHA配置 在管理节点上,执行: ```bash masterha_check_ssh --conf=/etc/mha/app1.cnf ``` **解释:** - `masterha_check_ssh`:检查各节点的SSH配置。 如果输出 `SSH connection ok`,则说明SSH配置成功。🎉 继续执行: ```bash masterha_check_repl --conf=/etc/mha/app1.cnf ``` **解释:** - `masterha_check_repl`:检查各节点的复制配置。 如果输出 `MySQL Replication Health is OK`,则说明复制配置成功。👍 ## 四、启动MHA 在管理节点上,启动MHA管理进程: ```bash nohup masterha_manager --conf=/etc/mha/app1.cnf & ``` **解释:** - `nohup`:忽略挂起信号,确保进程在退出终端后继续运行。 - `masterha_manager`:启动MHA管理程序。 查看MHA运行状态: ```bash masterha_check_status --conf=/etc/mha/app1.cnf ``` **解释:** - `masterha_check_status`:检查MHA的运行状态。 ## 五、模拟故障切换 在主节点上,停止MySQL服务,模拟主库故障: ```bash sudo systemctl stop mysqld ``` **解释:** - 停止MySQL服务,模拟主库宕机。 在管理节点上,查看MHA的日志: ```bash tail -f /var/log/mha/app1/manager.log ``` **解释:** - `tail -f`:持续输出日志内容,监控MHA的动作。 MHA会自动检测到主库故障,并将 `slave1`提升为新的主库。🎉 ## 六、验证切换结果 在新的主库上(slave1),检查角色: ```sql SHOW MASTER STATUS; ``` **解释:** - `SHOW MASTER STATUS`:查看当前主库的状态。 在从库上(slave2),检查复制状态: ```sql SHOW SLAVE STATUS\G; ``` **解释:** - 确保从库正在从新的主库同步数据。 ## 七、总结 通过以上步骤,我们成功搭建了一个**MySQL MHA高可用集群**。在主库发生故障时,MHA可以自动完成故障切换,确保数据库服务的连续性。😊 --- **思维导图:MySQL MHA高可用集群搭建步骤** ```mermaid graph TD A[环境准备] B[安装配置MySQL] C[安装配置MHA] D[启动MHA] E[模拟故障切换] F[验证结果] A --> B --> C --> D --> E --> F ``` --- **重点提示**: - **配置主从复制时,确保各节点的 `server-id`唯一**。🔑 - **MHA管理节点需要具备对数据库节点的免密SSH访问权限**。🔑 - **在生产环境中,务必做好数据备份,防止数据丢失**。⚠️ --- **表格:MHA重要配置参数说明** | 参数 | 说明 | | --------------------------- | -------------------------------------------------- | | **manager_log** | MHA管理日志的存放路径 | | **manager_workdir** | MHA管理的工作目录 | | **master_binlog_dir** | 主库的二进制日志目录路径 | | **user** | 用于连接数据库的用户名 | | **password** | 用于连接数据库的用户密码 | | **ssh_user** | 用于SSH连接的用户名 | | **candidate_master** | 标识该节点是否可以作为新的主库,1为可以,0为不可以 | | **check_repl_delay** | 是否检查复制延迟,0为不检查 | --- 通过本文的详细讲解,相信您已经掌握了搭建MySQL MHA高可用集群的步骤。希望这些内容对您的工作有所帮助!👍 最后修改:2024 年 10 月 05 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏