MySQL 复制
安装配置
主服务器配置
- 首先,在主服务器的配置文件(
my.cnf
或my.ini
)中添加以下基本配置:
[mysqld]
server-id = 1
log-bin = /var/log/mysql/mysql-bin.log
server-id
:为服务器分配唯一的标识,主服务器通常设置为1
。log-bin
:启用二进制日志,记录对数据库的修改操作,用于复制到从服务器。
- 重启主服务器使配置生效:
sudo systemctl restart mysqld
从服务器配置
- 在从服务器的配置文件中添加以下配置:
[mysqld]
server-id = 2
server-id
:为从服务器分配唯一的标识,一般从服务器的server-id
大于1
。
- 重启从服务器:
sudo systemctl restart mysqld
主要复制启动选项
log_slave_updates
- 功能:使从服务器将其接收到的更新操作记录到自己的二进制日志中,以便级联复制或其他需求。
- 配置示例:
[mysqld]
log_slave_updates = 1
master_connect_retry
- 功能:当从服务器与主服务器连接失败时,设置重新连接的间隔时间(秒)。
- 配置示例:
[mysqld]
master_connect_retry = 60
read_only
- 功能:设置从服务器为只读模式,防止在从服务器上进行写操作,保证数据一致性。
- 配置示例:
[mysqld]
read_only = 1
制定复制的数据库或者表
- 功能:可以指定仅复制某些数据库或表,而不是全部复制。
- 配置示例:
[mysqld]
replicate-do-db = my_database
replicate-do-table = my_database.my_table
replicate-do-db
:只复制指定的数据库。replicate-do-table
:只复制指定的表。
slave_skip_errors
- 功能:让从服务器跳过某些复制错误,继续复制过程。
- 配置示例:
[mysqld]
slave_skip_errors = 1062
- 可以使用
slave_skip_errors
跳过特定的错误码,如1062
(重复键错误)。
日常管理维护
查看从服务器的状态
- 使用 SQL 命令查看从服务器状态:
SHOW SLAVE STATUS\G
- 该命令会输出从服务器的复制状态信息,包括
Slave_IO_State
、Master_Host
、Master_Log_File
等,有助于了解复制是否正常运行,以及出现问题时的排查。
主从服务器同步维护
- 启动复制:
CHANGE MASTER TOMASTER_HOST='master_host_name',MASTER_USER='replication_user',MASTER_PASSWORD='replication_password',MASTER_LOG_FILE='recorded_log_file',MASTER_LOG_POS=recorded_log_position;
START SLAVE;
- 解释:
MASTER_HOST
:主服务器的主机名或 IP 地址。MASTER_USER
和MASTER_PASSWORD
:复制用户和密码。MASTER_LOG_FILE
和MASTER_LOG_POS
:从服务器开始复制的主服务器二进制日志文件和位置。
从服务器复制出错的原理
- 常见错误原因:
- 网络问题导致从服务器与主服务器断开连接。
- 主从服务器的数据不一致,可能是由于在从服务器上进行了未经授权的写操作。
- 复制命令或语句在从服务器上执行失败,例如由于数据类型不匹配或约束冲突。
log event entry exceeded max_allowed_packet 的处理
- 问题描述:当二进制日志中的事件大小超过
max_allowed_packet
参数设置的值时,会出现该错误。 - 解决方法:
- 在主服务器上增大
max_allowed_packet
参数:
SET GLOBAL max_allowed_packet = 1024 * 1024 * 10; -- 设置为 10MB
- 同时,在从服务器上也适当增大该参数。
- 在主服务器上增大
多主复制时的自增长变量冲突问题
- 问题描述:在多主复制环境中,不同主服务器生成的自增长
ID
可能会冲突。 - 解决方法:
- 使用不同的自增长步长和起始值,例如:
-- 在主服务器 1 上 SET @@auto_increment_increment = 2; SET @@auto_increment_offset = 1; -- 在主服务器 2 上 SET @@auto_increment_increment = 2; SET @@auto_increment_offset = 2;
- 或者使用 UUID 作为唯一标识符,而不是自增长
ID
。
查看服务器的复制制度
- 使用 SQL 语句查看复制信息:
SHOW MASTER STATUS;
SHOW SLAVE STATUS;
SHOW MASTER STATUS
显示主服务器的二进制日志信息,SHOW SLAVE STATUS
显示从服务器的复制状态。
切换主从服务器
- 步骤:
- 在新的主服务器上启用二进制日志和相应的复制配置。
- 在从服务器上重新配置复制,使用新的主服务器信息:
STOP SLAVE; CHANGE MASTER TOMASTER_HOST='new_master_host',MASTER_USER='new_replication_user',MASTER_PASSWORD='new_replication_password',MASTER_LOG_FILE='new_recorded_log_file',MASTER_LOG_POS=new_recorded_log_position; START SLAVE;
总之,MySQL
复制是实现数据冗余、负载均衡和高可用性的重要手段。在使用过程中,需要合理配置复制选项,进行日常维护和状态监控,及时处理复制过程中的问题,确保主从服务器之间的数据同步正常进行。同时,根据不同的场景和需求,可以调整复制策略和解决复制中的特殊问题,如多主复制的自增长冲突等。
MySQL Cluster 架构
MySQL Cluster 的版本支持
- MySQL Cluster 版本:MySQL Cluster 是 MySQL 数据库的高可用和分布式集群解决方案,不同版本提供不同的功能和性能优化。
- 支持的特性:
- 确保选择的 MySQL Cluster 版本支持所需的功能,如多主复制、自动分片、高可用性等。
- 不同版本可能支持不同的存储引擎,通常使用 NDB 存储引擎进行集群数据存储。
管理节点配置步骤
配置文件
- 创建管理节点的配置文件,通常命名为
config.ini
。
[ndbd default]
NoOfReplicas = 2
DataMemory = 80M
IndexMemory = 18M[ndbd]
HostName = node1
NodeId = 2[ndbd]
HostName = node2
NodeId = 3[ndb_mgmd]
NodeId = 1
HostName = mgmnode
DataDir = /var/lib/mysql-cluster[mysqld]
NodeId = 50
HostName = sqlnode1[api]
NodeId = 100
- 解释:
[ndbd default]
:设置 NDB 存储节点的默认属性,如副本数和内存使用。[ndbd]
:定义每个存储节点,包括主机名和节点 ID。[ndb_mgmd]
:管理节点的配置,指定节点 ID 和数据目录。[mysqld]
:SQL 节点的配置,包括节点 ID 和主机名。
启动管理节点
ndb_mgmd -f config.ini --initial
- 解释:
ndb_mgmd
是管理节点的启动命令。-f config.ini
表示使用指定的配置文件。--initial
仅在首次启动或重建集群时使用,会初始化管理节点的配置。
SQL 节点和数据节点的配置
SQL 节点配置
- 在 SQL 节点的
my.cnf
或my.ini
中添加以下配置:
[mysqld]
ndbcluster
ndb-connectstring=mgmnode
- 解释:
ndbcluster
表示启用 MySQL Cluster 功能。ndb-connectstring
指向管理节点的主机名。
数据节点配置
- 对于数据节点,确保
config.ini
中已正确配置存储节点信息。 - 启动数据节点:
ndbd
开始使用 Cluster
启动 Cluster
- 首先启动管理节点(如上述)。
- 然后启动数据节点:
ndbd
- 最后启动 SQL 节点:
systemctl start mysqld
Cluster 的测试
- 连接到 SQL 节点:
mysql -u root -p
- 执行 SQL 语句,测试集群功能,例如创建表:
CREATE TABLE test_table (id INT AUTO_INCREMENT PRIMARY KEY,data VARCHAR(100)
) ENGINE=ndbcluster;
- 解释:
- 使用
ENGINE=ndbcluster
表示该表使用 NDB 存储引擎,存储在集群中。
- 使用
Cluster 的关闭
- 关闭 SQL 节点:
systemctl stop mysqld
- 关闭数据节点:
ndbd --shutdown
- 关闭管理节点:
ndb_mgmd --shutdown
维护 Cluster
数据备份
- 使用
mysqldump
进行逻辑备份:
mysqldump -u root -p --all-databases > cluster_backup.sql
- 对于 NDB 存储引擎,也可以使用
ndb_restore
进行物理备份。
数据恢复
- 对于逻辑备份,使用
mysql
命令恢复:
mysql -u root -p < cluster_backup.sql
- 对于物理备份,使用
ndb_restore
恢复到集群:
ndb_restore -c mgmnode -m -r -n 1 -b backup_dir
日志管理
- 管理节点日志:查看
ndb_$NodeId_cluster.log
文件。 - SQL 节点日志:查看 MySQL 服务器的常规日志文件,如
/var/log/mysql/error.log
或/var/log/mysql/query.log
。
小结
- MySQL Cluster 提供了高可用、分布式的数据库解决方案。
- 配置时需要仔细设置管理节点、SQL 节点和数据节点的配置文件。
- 启动和关闭集群时要遵循一定的顺序,确保数据一致性。
- 维护集群涉及数据备份和恢复,以及日志管理。
- 在使用 MySQL Cluster 时,需要考虑性能、高可用性和可扩展性,根据业务需求调整配置,解决可能出现的性能和管理问题。 ```