- GreatSQL社区原创内容未经受权不得随便应用,转载请分割小编并注明起源。
问题1,有举荐的MGR运行最佳配置参考吗
在「3306」社区广州站5月22日的分享会上,万里数据库CTO娄帅给出了他倡议的配置参考,咱们一起来看下:
group_replication_single_primary_mode=ONlog_error_verbosity=3group_replication_bootstrap_group=OFF group_replication_transaction_size_limit=<默认值150MB,但倡议调低在20MB以内,不要应用大事务>group_replication_communication_max_message_size=10Mgroup_replication_flow_control_mode=OFF #官网版本的流控机制不太正当,其实能够思考敞开group_replication_exit_state_action=READ_ONLYgroup_replication_member_expel_timeout=5 #如果网络环境不好,能够适当调高
另外,应用MGR的其余倡议有:
只是用InnoDB表。
- 每个表都必须要有主键。
- 节点数采纳奇数。
- 保障网络可靠性,低提早环境,不要跨城部署(个别倡议网络提早低于1ms)。
- 应用单主模式。
- BINLOG_FORMAT=ROW。
更多对于MGR的最佳应用实际,能够关注「3306」社区公众号(pai3306),获取娄帅老师本次分享内容。
问题2,MySQL Performance Schema都倡议开启哪些监控采集指标(除了默认主动开启的指标)
先说我的认识:个别倡议只开启锁(Lock)监控相干的监测指标。
# 开启MDL监测指标mysql> CALL sys.ps_setup_enable_instrument('wait/lock/metadata/sql/mdl');# 开启全副Lock相干监测指标mysql> CALL sys.ps_setup_enable_instrument('%lock%');
其余的监测指标,例如Memory、Statement、Transaction等,有必要再长期开启。因为从MySQL 5.7开始,PFS反对在线动静开启和敞开,因而非必要的话,不倡议一口气全开。
一般而言,PFS里的监测指标全开的话,对性能影响个别5%左右,内存耗费1G左右,整体还是可控的。
已知的问题是在Percona分支版本中,如果同时开启PFS和线程池后,很容易产生OOM。
小结:
- 需要的话,能够全开。
- 对性能影响无限。
- 但还是倡议只开锁监控相干的。
问题3,mysqld过程占用内存过高怎么排查
遇到一个比拟极其的案例,innodb_buffer_pool_size 值仅设置为2GB,然而mysqld过程却占用了25GB的内存。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND45305 mysql 20 0 28.4g 25g 8400 S 48.5 81.4 64:46.82 mysqld
前面会有专门的文章介绍详细分析排查过程,这里先间接说可能的起因以及解决方案。
可能的起因
1、session(会话)级内存buffer参数设置过高,并且连接数也设置过高,例如
read_buffer_size = 64Mread_rnd_buffer_size = 32Msort_buffer_size = 64Mjoin_buffer_size = 64Mtmp_table_size = 1Gmax_heap_table_size = 1Gmax_connections=2000
当连接数较少时,须要耗费的内存并不多。
然而当遇到突发流量时,可能并发连接数会靠近打满,再加上可能有产生长期表、额定排序的低效率的SQL频繁呈现,这就很容易导致内存占用快速增长。
因而倡议调低session级buffer参数值,并无效管制并发连接数,上面是一个比拟通用的设置值参考:
read_buffer_size = 4Mread_rnd_buffer_size = 4Msort_buffer_size = 4Mjoin_buffer_size = 4Mtmp_table_size = 32Mmax_heap_table_size = 32Mmax_connections = 512
2、PFS中开启过多检测指标,造成内存耗费过大。
在下面也提到过,全副开启PFS后,可能须要大概1GB内存。不过在高并发并随同频繁低效SQL的状况下,可能须要耗费更多内存。
3、可能还用到MyISAM引擎,并且 key_buffer_size 设置过大。
不过当初MyISAM引擎大家个别用得也比拟少了。
4、程序内存透露危险。
能够用valgrind工具测验是否存在这个问题,如果确定的话,能够思考降级MySQL版本,或者定期在保护工夫重启mysqld实例,或者通过高可用切换形式将有危险的实例重启。
5、glibc的内存管理器本身缺点导致。
简言之,就是调用glibc申请的内存应用结束后,归还给OS时没有被失常回收,而变成了碎片,随着碎片的一直增长,就能看到mysqld过程占用的内存一直回升。这时候,咱们能够调用函数被动回收开释这些碎片。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND45305 mysql 20 0 28.4g 25g 8400 S 48.5 81.4 64:46.82 mysqld[root@mysql#] gdb --batch --pid `pidof mysqld` --ex 'call malloc_trim(0)' PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND45305 mysql 20 0 28.4g 5.2g 8288 S 2.7 17.0 64:56.82 mysqld
这就像是在InnoDB表中产生太多碎片后,咱们被动执行 OPTIMIZE TABLE 重建表的做法。
Enjoy MySQL :)
本文由博客一文多发平台 OpenWrite 公布!