MySQL(178)MySQL如何实现数据的高可用性?

MySQL实现数据高可用性的方法有多种,其中常见的包括主从复制、半同步复制、组复制(Group Replication)、Galera Cluster等。以下是详细介绍和示例代码。

一、主从复制(Master-Slave Replication)

主从复制是一种经典的高可用性方案,通过将数据从主节点复制到一个或多个从节点,实现数据的冗余和负载均衡。

1. 配置主节点

首先,编辑主节点的MySQL配置文件my.cnf

ini 复制代码
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-format=row

重新启动MySQL服务:

bash 复制代码
sudo systemctl restart mysql

创建复制用户并赋予复制权限:

sql 复制代码
CREATE USER 'replica'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%';
FLUSH PRIVILEGES;

锁定主数据库并导出数据:

sql 复制代码
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

记下FilePosition值,然后导出数据库:

bash 复制代码
mysqldump -u root -p --all-databases --master-data > db_dump.sql

解锁主数据库:

sql 复制代码
UNLOCK TABLES;

2. 配置从节点

将之前导出的数据库导入到从节点:

bash 复制代码
mysql -u root -p < db_dump.sql

编辑从节点的MySQL配置文件my.cnf

ini 复制代码
[mysqld]
server-id=2
relay-log=relay-log

重新启动MySQL服务:

bash 复制代码
sudo systemctl restart mysql

配置从节点以开始复制:

sql 复制代码
CHANGE MASTER TO
MASTER_HOST='主节点IP',
MASTER_USER='replica',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',  -- 从SHOW MASTER STATUS获得
MASTER_LOG_POS= 123;  -- 从SHOW MASTER STATUS获得

START SLAVE;

检查复制状态:

sql 复制代码
SHOW SLAVE STATUS\G

二、半同步复制(Semi-Synchronous Replication)

半同步复制增强了主从复制的可靠性,确保事务提交后至少一个从节点接收到数据。

1. 配置主节点

在主节点的my.cnf中添加:

ini 复制代码
[mysqld]
plugin-load=rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000

重新启动MySQL服务:

bash 复制代码
sudo systemctl restart mysql

在MySQL命令行中启用半同步复制插件:

sql 复制代码
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled = 1;

2. 配置从节点

在从节点的my.cnf中添加:

ini 复制代码
[mysqld]
plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=1

重新启动MySQL服务:

bash 复制代码
sudo systemctl restart mysql

在MySQL命令行中启用半同步复制插件:

sql 复制代码
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
SET GLOBAL rpl_semi_sync_slave_enabled = 1;

三、组复制(Group Replication)

组复制是一种高可用性和高扩展性的方案,提供多主架构,支持自动故障转移。

1. 配置所有节点

在每个节点的my.cnf中添加:

ini 复制代码
[mysqld]
server-id=1  # 不同节点设置不同的ID
log-bin=mysql-bin
binlog-format=row
gtid-mode=ON
enforce-gtid-consistency=ON
master-info-repository=TABLE
relay-log-info-repository=TABLE
transaction-write-set-extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address="192.168.0.1:33061"  # 每个节点不同
loose-group_replication_group_seeds="192.168.0.1:33061,192.168.0.2:33061,192.168.0.3:33061"
loose-group_replication_bootstrap_group=OFF  # 只在第一个启动的节点设置为ON

重新启动MySQL服务:

bash 复制代码
sudo systemctl restart mysql

2. 启动组复制

在第一个节点上启动组复制:

sql 复制代码
SET SQL_LOG_BIN=0;
CREATE USER 'rpl_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'rpl_user'@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;

CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
START GROUP_REPLICATION;

在其他节点上加入组复制:

sql 复制代码
SET SQL_LOG_BIN=0;
CREATE USER 'rpl_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'rpl_user'@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;

CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
START GROUP_REPLICATION;

检查组复制状态:

sql 复制代码
SELECT * FROM performance_schema.replication_group_members;

四、Galera Cluster

Galera Cluster提供了同步多主复制,确保所有节点上的数据一致性。

1. 安装Galera插件

根据系统环境安装Galera插件,例如:

bash 复制代码
sudo apt-get install galera-3
sudo apt-get install mysql-wsrep-5.7

2. 配置Galera Cluster

在每个节点的my.cnf中添加:

ini 复制代码
[mysqld]
binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_name="my_galera_cluster"
wsrep_cluster_address="gcomm://192.168.0.1,192.168.0.2,192.168.0.3"
wsrep_node_name="node1"
wsrep_node_address="192.168.0.1"
wsrep_sst_method=rsync

重新启动MySQL服务:

bash 复制代码
sudo systemctl restart mysql

3. 启动Galera Cluster

在第一个节点上启动集群:

bash 复制代码
sudo galera_new_cluster

在其他节点上启动MySQL服务:

bash 复制代码
sudo systemctl start mysql

检查集群状态:

sql 复制代码
SHOW STATUS LIKE 'wsrep_%';

五、总结

MySQL提供了多种实现高可用性的方法,包括主从复制、半同步复制、组复制和Galera Cluster。每一种方法都有其适用的场景和配置要求。通过合理选择和配置,可以实现MySQL数据库的高可用性,确保数据的可靠性和一致性。

相关推荐
欧阳的棉花糖3 分钟前
全栈必知:从小单体到大系统,模块怎么长出来的?
前端·后端
用户6757049885029 分钟前
Wire,一个神奇的Go依赖注入神器!
后端·go
一个热爱生活的普通人12 分钟前
拒绝文档陷阱!用调试器啃下 Google ToolBox 数据库工具箱源码
后端·go
BOOM朝朝朝12 分钟前
Mongo索引
数据库·后端
心之语歌16 分钟前
Spring AI MCP 服务端
后端
苦学编程的谢1 小时前
Spring AOP_2
java·后端·spring·java-ee
子洋1 小时前
本地安装 QuickJS 与 入门示例
前端·javascript·后端
程序员爱钓鱼1 小时前
Go语言实战案例:编写一个简易聊天室服务端
后端·go·trae
程序员爱钓鱼1 小时前
Go语言实战案例:实现一个并发端口扫描器
后端·go·trae
woniu_maggie2 小时前
SAP BYPASSING BUFFER表缓存
后端