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;
记下File
和Position
值,然后导出数据库:
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数据库的高可用性,确保数据的可靠性和一致性。