1. 首页 > MySQL教程 > 正文

MySQL教程FG019-MySQL高可用环境安装

本文档风哥主要介绍MySQL高可用环境的安装和配置方法,包括主从复制、MGR集群和InnoDB Cluster等高可用方案。风哥教程参考MySQL官方文档Replication、Group Replication和InnoDB
Cluster等。更多视频教程www.fgedu.net.cn

Part01-基础概念与理论知识

1.1 高可用概述

MySQL高可用是指通过各种技术手段,确保MySQL数据库服务在面对各种故障时能够持续提供服务,减少服务中断的时间。学习交流加群风哥微信: itpux-com

1.2 高可用方案

MySQL常见的高可用方案包括:

  • 主从复制 + 外部故障转移工具
  • MySQL Group Replication (MGR)
  • MySQL InnoDB Cluster
  • 第三方解决方案(如ProxySQL、MaxScale等)

1.3 架构规划

根据业务需求规划高可用架构,包括节点数量、网络拓扑、存储配置等。

Part02-生产环境规划与建议

2.1 硬件规划

根据高可用架构的需求,规划服务器硬件配置,包括CPU、内存、存储等。

2.2 网络规划

规划网络配置,包括网络拓扑、IP地址分配、网络延迟等。

2.3 存储规划

规划存储配置,包括存储类型、容量、性能等。

Part03-生产环境项目实施方案

3.1 主从复制配置

MySQL主从复制的配置步骤:

# 步骤1:配置主服务器
# 编辑主服务器配置文件
# vi /etc/my.cnf
[mysqld]
# 基础配置
datadir=/mysql/data
socket=/tmp/mysql.sock
log-error=/mysql/logs/error.log
pid-file=/mysql/data/mysqld.pid

# 复制配置
server-id=1
log_bin=/mysql/binlog/mysql-bin
expire_logs_days=7
binlog_format=ROW

# 重启主服务器
# systemctl restart mysqld

# 步骤2:创建复制用户
# mysql -u root -p
mysql> CREATE USER ‘repl’@’%’ IDENTIFIED BY ‘Password123!’;
mysql> GRANT REPLICATION SLAVE ON *.* TO ‘repl’@’%’;
mysql> FLUSH PRIVILEGES;

# 步骤3:获取主服务器状态
mysql> SHOW MASTER STATUS;
+——————+———-+————–+——————+——————-+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+——————+———-+————–+——————+——————-+
| mysql-bin.000001 | 123 | | | |
+——————+———-+————–+——————+——————-+

# 步骤4:配置从服务器
# 编辑从服务器配置文件
# vi /etc/my.cnf
[mysqld]
# 基础配置
datadir=/mysql/data
socket=/tmp/mysql.sock
log-error=/mysql/logs/error.log
pid-file=/mysql/data/mysqld.pid

# 复制配置
server-id=2
relay_log=/mysql/relaylog/relay-bin
read_only=1

# 重启从服务器
# systemctl restart mysqld

# 步骤5:配置从服务器连接主服务器
# mysql -u root -p
mysql> CHANGE MASTER TO
-> MASTER_HOST=’192.168.1.100′,
-> MASTER_USER=’repl’,
-> MASTER_PASSWORD=’Password123!’,
-> MASTER_LOG_FILE=’mysql-bin.000001′,
-> MASTER_LOG_POS=123;

# 步骤6:启动复制
mysql> START SLAVE;

# 步骤7:检查复制状态
mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.100
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 123
Relay_Log_File: relay-bin.000001
Relay_Log_Pos: 123
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 123
Relay_Log_Space: 123
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: 12345678-1234-1234-1234-1234567890ab
Master_Info_File: /mysql/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)

3.2 MGR集群配置

MySQL Group Replication (MGR)集群的配置步骤:

# 步骤1:配置所有节点的MySQL
# 编辑配置文件
# vi /etc/my.cnf
[mysqld]
# 基础配置
datadir=/mysql/data
socket=/tmp/mysql.sock
log-error=/mysql/logs/error.log
pid-file=/mysql/data/mysqld.pid

# 复制配置
server-id=1 # 每个节点不同
log_bin=/mysql/binlog/mysql-bin
expire_logs_days=7
binlog_format=ROW

# MGR配置
group_replication_group_name=”12345678-1234-1234-1234-1234567890ab”
group_replication_start_on_boot=off
group_replication_local_address=”192.168.1.100:33061″ # 每个节点不同
group_replication_group_seeds=”192.168.1.100:33061,192.168.1.101:33061,192.168.1.102:33061″
group_replication_bootstrap_group=off

# 重启MySQL服务
# systemctl restart mysqld

# 步骤2:在所有节点创建复制用户
# mysql -u root -p
mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER ‘repl’@’%’ IDENTIFIED BY ‘Password123!’ REQUIRE SSL;
mysql> GRANT REPLICATION SLAVE ON *.* TO ‘repl’@’%’;
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;

# 步骤3:在所有节点设置复制通道
# mysql -u root -p
mysql> CHANGE MASTER TO MASTER_USER=’repl’, MASTER_PASSWORD=’Password123!’ FOR CHANNEL
‘group_replication_recovery’;

# 步骤4:在第一个节点初始化集群
# mysql -u root -p
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
mysql> START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;

# 步骤5:在其他节点加入集群
# mysql -u root -p
mysql> START GROUP_REPLICATION;

# 步骤6:检查集群状态
# mysql -u root -p
mysql> SELECT * FROM performance_schema.replication_group_members;
+—————————+————————————–+————-+————-+————–+————-+—————-+—————————-+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
MEMBER_COMMUNICATION_STACK |
+—————————+————————————–+————-+————-+————–+————-+—————-+—————————-+
| group_replication_applier | 12345678-1234-1234-1234-1234567890ab | 192.168.1.100 | 3306 | ONLINE | PRIMARY
| 8.4.0 | XCom |
| group_replication_applier | 23456789-1234-1234-1234-1234567890ab | 192.168.1.101 | 3306 | ONLINE |
SECONDARY | 8.4.0 | XCom |
| group_replication_applier | 34567890-1234-1234-1234-1234567890ab | 192.168.1.102 | 3306 | ONLINE |
SECONDARY | 8.4.0 | XCom |
+—————————+————————————–+————-+————-+————–+————-+—————-+—————————-+

3.3 InnoDB Cluster配置

MySQL InnoDB Cluster的配置步骤:

# 步骤1:安装MySQL Shell
# 下载并安装MySQL Shell
# 以Linux为例
# wget https://dev.mysql.com/get/Downloads/MySQL-Shell/mysql-shell-8.4.0-linux-glibc2.12-x86-64bit.tar.gz
# tar -xzf mysql-shell-8.4.0-linux-glibc2.12-x86-64bit.tar.gz
# mv mysql-shell-8.4.0-linux-glibc2.12-x86-64bit /usr/local/mysql-shell
# export PATH=$PATH:/usr/local/mysql-shell/bin

# 步骤2:配置所有节点的MySQL
# 编辑配置文件
# vi /etc/my.cnf
[mysqld]
# 基础配置
datadir=/mysql/data
socket=/tmp/mysql.sock
log-error=/mysql/logs/error.log
pid-file=/mysql/data/mysqld.pid

# 复制配置
server-id=1 # 每个节点不同
log_bin=/mysql/binlog/mysql-bin
expire_logs_days=7
binlog_format=ROW

# MGR配置
group_replication_group_name=”12345678-1234-1234-1234-1234567890ab”
group_replication_start_on_boot=off
group_replication_local_address=”192.168.1.100:33061″ # 每个节点不同
group_replication_group_seeds=”192.168.1.100:33061,192.168.1.101:33061,192.168.1.102:33061″
group_replication_bootstrap_group=off

# 重启MySQL服务
# systemctl restart mysqld

# 步骤3:在所有节点创建管理用户
# mysql -u root -p
mysql> CREATE USER ‘admin’@’%’ IDENTIFIED BY ‘Password123!’;
mysql> GRANT ALL PRIVILEGES ON *.* TO ‘admin’@’%’ WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;

# 步骤4:使用MySQL Shell创建InnoDB Cluster
# mysqlsh
MySQL JS>

// 连接到第一个节点
MySQL JS> var cluster = dba.createCluster(‘fgedu-cluster’);

// 添加其他节点
MySQL JS> cluster.addInstance(‘admin@192.168.1.101:3306’);
MySQL JS> cluster.addInstance(‘admin@192.168.1.102:3306’);

// 检查集群状态
MySQL JS> cluster.status();
{
“clusterName”: “fgedu-cluster”,
“defaultReplicaSet”: {
“name”: “default”,
“primary”: “192.168.1.100:3306”,
“ssl”: “REQUIRED”,
“status”: “OK”,
“statusText”: “Cluster is ONLINE and can tolerate up to ONE failure.”,
“topology”: {
“192.168.1.100:3306”: {
“address”: “192.168.1.100:3306”,
“mode”: “R/W”,
“readReplicas”: {},
“role”: “HA”,
“status”: “ONLINE”,
“version”: “8.4.0”
},
“192.168.1.101:3306”: {
“address”: “192.168.1.101:3306”,
“mode”: “R/O”,
“readReplicas”: {},
“role”: “HA”,
“status”: “ONLINE”,
“version”: “8.4.0”
},
“192.168.1.102:3306”: {
“address”: “192.168.1.102:3306”,
“mode”: “R/O”,
“readReplicas”: {},
“role”: “HA”,
“status”: “ONLINE”,
“version”: “8.4.0”
}
},
“topologyMode”: “Single-Primary”
}
}

Part04-生产案例与实战讲解

4.1 主从复制实战

MySQL主从复制的实际案例:

# 案例:部署一主两从的主从复制架构

# 步骤1:配置主服务器(192.168.1.100)
# vi /etc/my.cnf
[mysqld]
datadir=/mysql/data
socket=/tmp/mysql.sock
log-error=/mysql/logs/error.log
pid-file=/mysql/data/mysqld.pid
server-id=1
log_bin=/mysql/binlog/mysql-bin
expire_logs_days=7
binlog_format=ROW

# 重启主服务器
# systemctl restart mysqld

# 步骤2:创建复制用户
# mysql -u root -p
mysql> CREATE USER ‘repl’@’%’ IDENTIFIED BY ‘Password123!’;
mysql> GRANT REPLICATION SLAVE ON *.* TO ‘repl’@’%’;
mysql> FLUSH PRIVILEGES;
mysql> SHOW MASTER STATUS;
+——————+———-+————–+——————+——————-+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+——————+———-+————–+——————+——————-+
| mysql-bin.000001 | 123 | | | |
+——————+———-+————–+——————+——————-+

# 步骤3:配置从服务器1(192.168.1.101)
# vi /etc/my.cnf
[mysqld]
datadir=/mysql/data
socket=/tmp/mysql.sock
log-error=/mysql/logs/error.log
pid-file=/mysql/data/mysqld.pid
server-id=2
relay_log=/mysql/relaylog/relay-bin
read_only=1

# 重启从服务器1
# systemctl restart mysqld

# 配置从服务器1连接主服务器
# mysql -u root -p
mysql> CHANGE MASTER TO
-> MASTER_HOST=’192.168.1.100′,
-> MASTER_USER=’repl’,
-> MASTER_PASSWORD=’Password123!’,
-> MASTER_LOG_FILE=’mysql-bin.000001′,
-> MASTER_LOG_POS=123;
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS\G;

# 步骤4:配置从服务器2(192.168.1.102)
# vi /etc/my.cnf
[mysqld]
datadir=/mysql/data
socket=/tmp/mysql.sock
log-error=/mysql/logs/error.log
pid-file=/mysql/data/mysqld.pid
server-id=3
relay_log=/mysql/relaylog/relay-bin
read_only=1

# 重启从服务器2
# systemctl restart mysqld

# 配置从服务器2连接主服务器
# mysql -u root -p
mysql> CHANGE MASTER TO
-> MASTER_HOST=’192.168.1.100′,
-> MASTER_USER=’repl’,
-> MASTER_PASSWORD=’Password123!’,
-> MASTER_LOG_FILE=’mysql-bin.000001′,
-> MASTER_LOG_POS=123;
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS\G;

# 步骤5:测试复制
# 在主服务器上创建数据库和表
# mysql -u root -p
mysql> CREATE DATABASE fgedudb;
mysql> USE fgedudb;
mysql> CREATE TABLE fgedu_users (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50), email VARCHAR(100));
mysql> INSERT INTO fgedu_users (name, email) VALUES (‘张三’, ‘zhangsan@fgedu.net.cn’);

# 在从服务器上验证复制
# mysql -u root -p
mysql> USE fgedudb;
mysql> SELECT * FROM fgedu_users;
+—-+——–+————————+
| id | name | email |
+—-+——–+————————+
| 1 | 张三 | zhangsan@fgedu.net.cn |
+—-+——–+————————+

4.2 MGR集群实战

MySQL Group Replication (MGR)集群的实际案例:

# 案例:部署3节点MGR集群

# 步骤1:配置所有节点
# 节点1(192.168.1.100)
# vi /etc/my.cnf
[mysqld]
datadir=/mysql/data
socket=/tmp/mysql.sock
log-error=/mysql/logs/error.log
pid-file=/mysql/data/mysqld.pid
server-id=1
log_bin=/mysql/binlog/mysql-bin
expire_logs_days=7
binlog_format=ROW
group_replication_group_name=”12345678-1234-1234-1234-1234567890ab”
group_replication_start_on_boot=off
group_replication_local_address=”192.168.1.100:33061″
group_replication_group_seeds=”192.168.1.100:33061,192.168.1.101:33061,192.168.1.102:33061″
group_replication_bootstrap_group=off

# 节点2(192.168.1.101)
# vi /etc/my.cnf
[mysqld]
datadir=/mysql/data
socket=/tmp/mysql.sock
log-error=/mysql/logs/error.log
pid-file=/mysql/data/mysqld.pid
server-id=2
log_bin=/mysql/binlog/mysql-bin
expire_logs_days=7
binlog_format=ROW
group_replication_group_name=”12345678-1234-1234-1234-1234567890ab”
group_replication_start_on_boot=off
group_replication_local_address=”192.168.1.101:33061″
group_replication_group_seeds=”192.168.1.100:33061,192.168.1.101:33061,192.168.1.102:33061″
group_replication_bootstrap_group=off

# 节点3(192.168.1.102)
# vi /etc/my.cnf
[mysqld]
datadir=/mysql/data
socket=/tmp/mysql.sock
log-error=/mysql/logs/error.log
pid-file=/mysql/data/mysqld.pid
server-id=3
log_bin=/mysql/binlog/mysql-bin
expire_logs_days=7
binlog_format=ROW
group_replication_group_name=”12345678-1234-1234-1234-1234567890ab”
group_replication_start_on_boot=off
group_replication_local_address=”192.168.1.102:33061″
group_replication_group_seeds=”192.168.1.100:33061,192.168.1.101:33061,192.168.1.102:33061″
group_replication_bootstrap_group=off

# 重启所有节点
# systemctl restart mysqld

# 步骤2:在所有节点创建复制用户
# mysql -u root -p
mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER ‘repl’@’%’ IDENTIFIED BY ‘Password123!’ REQUIRE SSL;
mysql> GRANT REPLICATION SLAVE ON *.* TO ‘repl’@’%’;
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;

# 步骤3:在所有节点设置复制通道
# mysql -u root -p
mysql> CHANGE MASTER TO MASTER_USER=’repl’, MASTER_PASSWORD=’Password123!’ FOR CHANNEL
‘group_replication_recovery’;

# 步骤4:在节点1初始化集群
# mysql -u root -p
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
mysql> START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;

# 步骤5:在节点2和节点3加入集群
# mysql -u root -p
mysql> START GROUP_REPLICATION;

# 步骤6:检查集群状态
# mysql -u root -p
mysql> SELECT * FROM performance_schema.replication_group_members;
+—————————+————————————–+————-+————-+————–+————-+—————-+—————————-+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
MEMBER_COMMUNICATION_STACK |
+—————————+————————————–+————-+————-+————–+————-+—————-+—————————-+
| group_replication_applier | 12345678-1234-1234-1234-1234567890ab | 192.168.1.100 | 3306 | ONLINE | PRIMARY
| 8.4.0 | XCom |
| group_replication_applier | 23456789-1234-1234-1234-1234567890ab | 192.168.1.101 | 3306 | ONLINE |
SECONDARY | 8.4.0 | XCom |
| group_replication_applier | 34567890-1234-1234-1234-1234567890ab | 192.168.1.102 | 3306 | ONLINE |
SECONDARY | 8.4.0 | XCom |
+—————————+————————————–+————-+————-+————–+————-+—————-+—————————-+

# 步骤7:测试集群
# 在主节点创建数据库和表
# mysql -u root -p
mysql> CREATE DATABASE fgedudb;
mysql> USE fgedudb;
mysql> CREATE TABLE fgedu_users (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50), email VARCHAR(100));
mysql> INSERT INTO fgedu_users (name, email) VALUES (‘张三’, ‘zhangsan@fgedu.net.cn’);

# 在从节点验证复制
# mysql -u root -p
mysql> USE fgedudb;
mysql> SELECT * FROM fgedu_users;
+—-+——–+————————+
| id | name | email |
+—-+——–+————————+
| 1 | 张三 | zhangsan@fgedu.net.cn |
+—-+——–+————————+

# 测试故障转移
# 停止主节点
# systemctl stop mysqld

# 检查集群状态
# 在节点2或节点3执行
mysql> SELECT * FROM performance_schema.replication_group_members;
+—————————+————————————–+————-+————-+————–+————-+—————-+—————————-+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
MEMBER_COMMUNICATION_STACK |
+—————————+————————————–+————-+————-+————–+————-+—————-+—————————-+
| group_replication_applier | 23456789-1234-1234-1234-1234567890ab | 192.168.1.101 | 3306 | ONLINE | PRIMARY
| 8.4.0 | XCom |
| group_replication_applier | 34567890-1234-1234-1234-1234567890ab | 192.168.1.102 | 3306 | ONLINE |
SECONDARY | 8.4.0 | XCom |
+—————————+————————————–+————-+————-+————–+————-+—————-+—————————-+

Part05-风哥经验总结与分享

5.1 常见问题与解决方案

MySQL高可用环境部署时常见的问题包括:

  • 网络问题:确保网络连接稳定,避免网络分区
  • 配置问题:确保所有节点的配置一致
  • 权限问题:确保复制用户权限正确
  • 故障转移问题:确保故障转移机制正常工作

5.2 最佳实践建议

1. 选择合适的高可用方案:根据业务需求选择合适的高可用方案
2. 合理规划架构:根据业务负载规划节点数量和配置
3. 配置监控:为高可用集群配置全面的监控
4. 定期测试:定期测试故障转移机制,确保其正常工作
5. 备份策略:配置定期备份策略,确保数据安全
6. 文档记录:记录高可用集群的配置和管理信息
7. 培训准备:对运维人员进行高可用集群管理培训
8. 应急预案:制定详细的应急预案,应对各种故障场景
学习交流加群风哥QQ113257174

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息