我在组复制(多主)基础架构中使用 MySQL 8.0.18。目前有 4 个主服务器相互连接,一切似乎都运行良好,但在大约 2 周的时间里,所有服务器上的所有 mysqld 进程都用完了所有交换空间。内存使用量保持在 800Mb,因为我怀疑 innodb_log_buffer_size 正在发挥作用。
服务器规格:
Debian 10
1GB 内存
3GB 交换空间
20GB 固态硬盘
mysql.cnf:
最大连接数=20
innodb_log_buffer_size=800M
密钥缓冲区大小=50M
超级读取仅=关闭
gtid_mode = 开启
强制实施_gtid_consistency = ON
master_info_repository = 表
Relay_log_info_repository = 表
binlog_checksum = 无
log_slave_updates = ON
log_bin=binlog
binlog_format = ROW
transaction_write_set_extraction = XXHASH64
松散组复制引导组 = OFF
loose-group_replication_start_on_boot = OFF
loose-group_replication_ssl_mode = 必需
松散组复制恢复使用 SSL = 1
松散组复制不可达多数超时 = 80
松散组复制自动重新加入尝试 = 2015
松散组复制事务大小限制=0
相关操作系统配置:
vm.swappiness=5
我怎样才能让 mysql 停止使用这么多的交换空间?
答案1
配置 InnoDB 内存中可用数据空间的参数是innodb_buffer_pool_size。如果不设置,默认是128MB。这是InnoDB的主要参数,一般建议设置为总内存的80%。
这innodb_log_buffer_size也是一个重要的点,但与当下发生的动作有关,以 16MB 的块形式写入磁盘,以避免在尚未确定写入时出现数据损坏。
还有很多其他与内存相关的配置存储引擎,但是到了8.0版本,绝大多数,或者说全部,都是InnoDB。
大概交换性很高,因为您的数据库不允许使用其所需的 RAM -innodb_buffer_pool_size为128MB。
消除innodb_log_buffer_size并把innodb_buffer_pool_size。