本文档风哥主要介绍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主从复制的配置步骤:
# 编辑主服务器配置文件
# 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)集群的配置步骤:
# 编辑配置文件
# 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的配置步骤:
# 下载并安装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)集群的实际案例:
# 步骤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
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
