问题描述
MySQL 主库使用云厂商较高配置,规格为 32U 128G 2.5T,数据空间实际使用 1.5 T,日志空间使用 0.5T,如下图。

MySQL 从库通过 K8s 自行搭建,使用 MySQL 原生镜像,规格为 4U 24G。
由于两者配置差距太大,MySQL 从库经过出现同步延迟或者同步报错的现象,MySQL 从库的 my.cnf 配置如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| [mysqld] server_id=服务器唯一标识
character_set_server=utf8
lower_case_table_names=1
event_scheduler=1
max_connections=10000
max_connect_errors=200
max_error_count=100
max_allowed_packet=1G
relay_log=mysqld-relay-bin
innodb_flush_log_at_trx_commit=2
innodb_buffer_pool_size=4G
default-time-zone='+8:00'
tmpdir=/var/lib/mysql/tmp
log-error=/var/lib/mysql/mysql.err
|
原因分析
经过对主库和从库的分析,我们整理了一些从库可优化的配置项。
- 开启并行复制:根据从库配置调整线程数,提高同步的并行效率,关键配置参数为
slave_parallel_mode=optimistic 和 slave_parallel_threads=4。
- 跳过一些错误码:避免复制过程中因为一些非关键性错误(如重复插入、数据不一致等)而中断,例如
1062 重复键,1032更新的数据不存在,1146访问的表不存在。
- 跳过不需要的表:主库存在备份表、历史表,这些表往往数据量较大,从库并不需要这些表数据,可设置
replicate_ignore_db 忽略数据库和 replicate_wild_ignore_table 忽略指定表。
- Buffer Pool优化:提高 InnoDB 数据和索引的缓存大小,例如
innodb_buffer_pool_size=16G。
- binlog 缓存优化:增大 binlog 日志文件的缓存大小、事务缓存大小,例如
binlog_file_cache_size=16M、binlog_cache_size=4M。
解决方案
优化后的 my.cnf 配置文件如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
| [mysqld] server_id=服务器唯一标识
character_set_server=utf8
lower_case_table_names=1
event_scheduler=1
max_connections=10000
max_connect_errors=200
max_error_count=100
max_allowed_packet=1G
relay_log=mysqld-relay-bin
join_cache_level=8
query_cache_size=0
long_query_time=15
default-time-zone='+8:00'
tmpdir=/var/lib/mysql/tmp
log-error=/var/lib/mysql/mysql.err
slave_parallel_mode=optimistic
slave_parallel_threads=4
slave_parallel_max_queued=10M
slave_skip_errors=1062,1032,1146
replicate_ignore_db=库名
replicate_wild_ignore_table=库名.表名
replicate_wild_ignore_table=库名.表名% replicate_wild_ignore_table=information_schema.*
innodb_buffer_pool_size=16G
binlog_file_cache_size=16M
binlog_stmt_cache_size=32M
binlog_cache_size=4M
binlog_commit_wait_count=4
binlog_commit_wait_usec=200000
expire_logs_days=1
log_bin_trust_function_creators=1
innodb_strict_mode=0
innodb_autoinc_lock_mode=2
innodb_lock_wait_timeout=500
innodb_flush_log_at_trx_commit=0
innodb_adaptive_hash_index='OFF'
|
从实际情况来看,跳过不需要的表是最有效的颁发,因为避免了大量数据表的同步,从源头减少了复制工作,同步延迟问题自然得到解决。