阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

MySQL案例-半同步引起Master实例Crash

160次阅读
没有评论

共计 4197 个字符,预计需要花费 11 分钟才能阅读完成。

场景 : 
Crash 发生时的数据库版本: MySQL-5.7.12, 官方标注在 5.7.17 进行了 fix;
开启半同步的主从架构中, 从库开启半同步, 启动 / 重启 slave 线程导致 Master 实例 Crash;

结论 :
mysql bug, 附上 bug 单链接: https://bugs.mysql.com/bug.php?id=79865

问题描述 (摘抄 ):

Description: From 5.7,semi-sync add Ack_receiver thread for listening slave ack,which use select(). But select() can only listen socket fd between 1 and __FD_SET_SIZE(my os is 1024),  when socket fd is bigger than __FD_SET_SIZE, select() has no effect, and can never get  ack from slave,then semi-sync can't run normally.even more,select() use array store fds, when use FD_SET store fd which is bigger than __FD_SET_SIZE, array will overflow,so mysqld may crash。


主要问题就出在 tcp 连接的 select 方法, 通常, 操作系统通过宏 FD_SET_SIZE 来声明一个进程中 select 能操作的文件描述符的最大数据, 然而通常情况下, 这个 FD_SET_SIZE 的值仅为 1024;

实际上, 用 epoll 或者 poll 会比较少, select 貌似是用的很少的;

问题复现 :

准备一套 MySQL-5.7.12 的主从架构, 开启半同步:

为了能尽量简单的启用大量的文件描述符, 这里利用 MyISAM 分区表的 ” 特性 ”;

这时候在主库上连续执行 select 语句多次 (>5);

这时候看一下主库的文件描述符数量;

那么现在在开启半同步的从库上重启一下 slave, 同时 tail 一下主库的日志;

在重启线程几秒钟之后, 主库就发生了 Crash;

PS: 在测试的过程中, 多次执行了 select 语句, 然后确认主库的半同步状态也是 ON 的情况下迅速在从库上重启 slave, 基本是必现的;
PPS: MyISAM 表在 open 的时候会同时打开所有的分区文件, 所以能比较方便的模拟占用大量文件描述符的情景;
(MyISAM 分区表: http://blog.itpub.net/29510932/viewspace-2134679/)
PPPPPPPS:  _(:з」∠)_

附上测试用的脚本与 Crash 的信息

 

  1. CREATE TABLE `myisam_t` (
  2.   `id` int(11) DEFAULT NULL
  3. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
  4. /*!50100 PARTITION BY HASH (id)
  5. PARTITIONS 2000 */

 

  1. 20170428T22:10:00.731611+08:00 5092 [Note] Start binlog_dump to master_thread_id(5092) slave_server(13043), pos(, 4)
  2. 20170428T22:10:01.648365+08:00 5092 [Note] Start semisync binlog_dump to slave (server_id: 13043), pos(, 4)
  3. *** buffer overflow detected ***: /usr/sbin/mysqld terminated
  4. ======= Backtrace: =========
  5. /lib/x86_64linuxgnu/libc.so.6(+0x731af)[0x7fcdfc7981af]
  6. /lib/x86_64linuxgnu/libc.so.6(__fortify_fail+0x37)[0x7fcdfc81dcf7]
  7. /lib/x86_64linuxgnu/libc.so.6(+0xf6f10)[0x7fcdfc81bf10]
  8. /lib/x86_64linuxgnu/libc.so.6(+0xf8c67)[0x7fcdfc81dc67]
  9. /usr/lib/mysql/plugin/semisync_master.so(_ZN12Ack_receiver17get_slave_socketsEP6fd_set+0x83)[0x7fcc73d4a493]
  10. /usr/lib/mysql/plugin/semisync_master.so(_ZN12Ack_receiver3runEv+0x603)[0x7fcc73d4aaf3]
  11. /usr/lib/mysql/plugin/semisync_master.so(ack_receive_handler+0x19)[0x7fcc73d4aba9]
  12. /usr/sbin/mysqld(pfs_spawn_thread+0x1b4)[0xe90784]
  13. /lib/x86_64linuxgnu/libpthread.so.0(+0x80a4)[0x7fcdfdf650a4]
  14. /lib/x86_64linuxgnu/libc.so.6(clone+0x6d)[0x7fcdfc80d87d]

 

  1. 14:10:01 UTC mysqld got signal 6 ;
  2. This could be because you hit a bug. It is also possible that this binary
  3. or one of the libraries it was linked against is corrupt, improperly built,
  4. or misconfigured. This error can also be caused by malfunctioning hardware.
  5. Attempting to collect some information that could help diagnose the problem.
  6. As this is a crash and something is definitely wrong, the information
  7. collection process might fail.
  8. key_buffer_size=8388608
  9. read_buffer_size=131072
  10. max_used_connections=5
  11. max_threads=9999
  12. thread_count=8
  13. connection_count=2
  14. It is possible that mysqld could use up to
  15. key_buffer_size + (read_buffer_size + sort_buffer_size)*max_threads = 21899362 K bytes of memory
  16. Hope thats ok; if not, decrease some variables in the equation.
  17. Thread pointer: 0x0
  18. Attempting backtrace. You can use the following information to find out
  19. where mysqld died. If you see no messages after this, something went
  20. terribly wrong...
  21. stack_bottom = 0 thread_stack 0x40000
  22. /usr/sbin/mysqld(my_print_stacktrace+0x2c)[0xe77fec]
  23. /usr/sbin/mysqld(handle_fatal_signal+0x459)[0x7a7019]
  24. /lib/x86_64linuxgnu/libpthread.so.0(+0xf8d0)[0x7fcdfdf6c8d0]
  25. /lib/x86_64linuxgnu/libc.so.6(gsignal+0x37)[0x7fcdfc75a067]
  26. /lib/x86_64linuxgnu/libc.so.6(abort+0x148)[0x7fcdfc75b448]
  27. /lib/x86_64linuxgnu/libc.so.6(+0x731b4)[0x7fcdfc7981b4]
  28. /lib/x86_64linuxgnu/libc.so.6(__fortify_fail+0x37)[0x7fcdfc81dcf7]
  29. /lib/x86_64linuxgnu/libc.so.6(+0xf6f10)[0x7fcdfc81bf10]
  30. /lib/x86_64linuxgnu/libc.so.6(+0xf8c67)[0x7fcdfc81dc67]
  31. /usr/lib/mysql/plugin/semisync_master.so(_ZN12Ack_receiver17get_slave_socketsEP6fd_set+0x83)[0x7fcc73d4a493]
  32. /usr/lib/mysql/plugin/semisync_master.so(_ZN12Ack_receiver3runEv+0x603)[0x7fcc73d4aaf3]
  33. /usr/lib/mysql/plugin/semisync_master.so(ack_receive_handler+0x19)[0x7fcc73d4aba9]
  34. /usr/sbin/mysqld(pfs_spawn_thread+0x1b4)[0xe90784]
  35. /lib/x86_64linuxgnu/libpthread.so.0(+0x80a4)[0x7fcdfdf650a4]
  36. /lib/x86_64linuxgnu/libc.so.6(clone+0x6d)[0x7fcdfc80d87d]
  37. The manual page at http://dev.mysql.com/doc/mysql/en/crashing.html contains
  38. information that should help you find out what is causing the crash.

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2017-05/143386.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计4197字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中