MySQL案例-半同步引起Master实例Crash-程序员宅基地

技术标签: epoll  php  数据库  

-------------------------------------------------------------------------------------------------正文---------------------------------------------------------------------------------------------------------------

场景 : 
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. 2017-04-28T22:10:00.731611+08:00 5092 [Note] Start binlog_dump to master_thread_id(5092) slave_server(13043), pos(, 4)
  2. 2017-04-28T22:10:01.648365+08:00 5092 [Note] Start semi-sync binlog_dump to slave (server_id: 13043), pos(, 4)
  3. *** buffer overflow detected ***: /usr/sbin/mysqld terminated
  4. ======= Backtrace: =========
  5. /lib/x86_64-linux-gnu/libc.so.6(+0x731af)[0x7fcdfc7981af]
  6. /lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x37)[0x7fcdfc81dcf7]
  7. /lib/x86_64-linux-gnu/libc.so.6(+0xf6f10)[0x7fcdfc81bf10]
  8. /lib/x86_64-linux-gnu/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_64-linux-gnu/libpthread.so.0(+0x80a4)[0x7fcdfdf650a4]
  14. /lib/x86_64-linux-gnu/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 that's 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_64-linux-gnu/libpthread.so.0(+0xf8d0)[0x7fcdfdf6c8d0]
  25. /lib/x86_64-linux-gnu/libc.so.6(gsignal+0x37)[0x7fcdfc75a067]
  26. /lib/x86_64-linux-gnu/libc.so.6(abort+0x148)[0x7fcdfc75b448]
  27. /lib/x86_64-linux-gnu/libc.so.6(+0x731b4)[0x7fcdfc7981b4]
  28. /lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x37)[0x7fcdfc81dcf7]
  29. /lib/x86_64-linux-gnu/libc.so.6(+0xf6f10)[0x7fcdfc81bf10]
  30. /lib/x86_64-linux-gnu/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_64-linux-gnu/libpthread.so.0(+0x80a4)[0x7fcdfdf650a4]
  36. /lib/x86_64-linux-gnu/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.


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33901843/article/details/90249874

智能推荐

java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ObjectMapper_org/fasterxml/jackson/databind/-程序员宅基地

文章浏览阅读7.6w次。当前SpringBoot版本:2.0.2.RELEASEpom.xml:<!--redis client:lettuce--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-da..._org/fasterxml/jackson/databind/

Android 延时执行任务的三种简单方法-程序员宅基地

文章浏览阅读327次。开启一个新的线程 new Thread() { @Override public void run() { try { ..._activiti 延迟执行任务

Tomcat配置技巧Top10 _my club members only area realm-程序员宅基地

文章浏览阅读478次。转自:http://www.yuanma.org/data/2007/0119/article_2153_1.htm1、配置系统管理(Admin Web Application) 大多数商业化的J2EE服务器都提供一个功能强大的管理界面,且大都采用易于理解的Web应用界面。Tomcat按照自己的方式,同样提供一个成熟的管理工具,并且丝毫不逊于那些商业化的竞争对手。Tomcat的Admin _my club members only area realm

字符串模式匹配--KMP算法_使用kmp算法进行模式匹配,模式串ababaabab-程序员宅基地

文章浏览阅读476次。KMP算法的核心,是部分匹配表(Partial Match Table)数组。PMT数组存储字符串前缀集合和后缀集合的交集中最长字串的长度。以ababaca为例,对ababa来说,其字符串前缀集合为{a, ab, aba, abab},后缀集合为{baba, aba, ba, a}。故两集合交集对应的最长字串为aba,其长度为3,其对应的PMT数组中的值即为3。通过利用PMT数组存储重复模式,在字符_使用kmp算法进行模式匹配,模式串ababaabab

什么是Sass?_sass是什么意思-程序员宅基地

文章浏览阅读1.7k次。Sass 是 Syntactically Awesome Stylesheets 的简写,是一个最初由 Hampton Catlin 设计并由 Natalie Weizenbaum 开发的层叠样式表语言。什么是SassSass 是一个将脚本解析成 CSS 的脚本语言(SassScript),也是一款 CSS 预处理器,它减少了 CSS 的重复,也因此节省了时间。Sass 是最早的 CSS 预处理语言,有比 Less 更强大的功能。Sass 扩展了 CSS3,增加了规则、变量、混入选择器、继承等特性。什_sass是什么意思

caffe make runtest 错误解决_caffe make test -j`nproc`过不了-程序员宅基地

文章浏览阅读2.2k次,点赞4次,收藏6次。迦南C的博客,转载请注明出处。当caffe编译 make runtest 出现如上错误时,原因是多gpu支持的bug。先 export CUDA_VISIBLE_DEVICES=0 ,再make runtest 即可解决。)*** Aborted at 1475986823 (unix time) try “date -d @1475986823” if you are using GNU..._caffe make test -j`nproc`过不了

随便推点

安装CUDA时不识别显卡,提示This graphics driver could not find compatible graphics hardware_cuda安装时检测不到显卡-程序员宅基地

文章浏览阅读6.2k次,点赞4次,收藏20次。最近在复现CVPR2020的一篇文章,Grid-GCN,要配置CUDA、MXNET等环境,在配置过程中安装CUDA时,不识别显卡,提示This graphics driver could not find compatible graphics hardware。首先放下我的环境:win10RTX2060VS2015CUDA8.0经过查阅资料后得知,厂商在电脑出场时会给自家的显卡添加了独特的硬件ID,导致CUDA8.0没有包含这个ID,识别不出显卡,而CUDA8.0也算比较老的版本了,一直没有_cuda安装时检测不到显卡

论文阅读(七):Dual-stream Maximum Self-attention Multi-instance Learning (DMSMIL)_mil max-pooling-程序员宅基地

文章浏览阅读390次,点赞4次,收藏3次。文章目录引入前言方法问题表述双流MIL聚合引入  很久没有看论文和写博客,现在把最近看的一篇多示例学习(MIL)的论文解读一下,希望有所收获。前言  该篇论文提出了一种由神经网络参数化的双流最大自注意的MIL模型(DSMIL);  主要步骤:1)第一流部署了一个简单的 MIL max-pooling,并确定了top激活的嵌入实例;2)在第二个流中,通过仅将顶部激活的查询与包中的实例相关联,跨实例计算注意力得分。  特点:基于相同的实例嵌入来训练一个实例分类器和包分类器。方法问题表述  包:_mil max-pooling

题解 | #直播开始时直播间在线人数#date_format-程序员宅基地

文章浏览阅读894次,点赞18次,收藏24次。● ThreadLocal 如何实现线程隔离的,底层是怎么实现的● Sentinel 是如何做到限流的(不知道),那你在项目是怎么用的● 线程、集合、并发包、锁。1. 阿里妈妈,北京,6月要搬到崔各庄,岗位是搜推广引擎,薪资(N+3)*16,提供房补,交通补,有签字费,无股票2. 腾讯TEG云架构平台,北京,岗位是云存储。#面试##江西科泰华软件有限公司#面试有三轮,分别为笔试、HR面、技术面HR面:1、自我介绍2、为什么离职3、问上一家公司的情况及薪资技术面:1、自我介绍2、项。

阶段四第一章认识python和python变量的输入和输出-程序员宅基地

文章浏览阅读867次,点赞14次,收藏28次。计算机语言中可变的量。

Vue.js的第一天学习_vue 生命周期 mother-程序员宅基地

文章浏览阅读917次。Node (后端)中的MVC与前端中的MVVM之间的区别●MVC是后端的分层开发概念;●MWVM是前端视图层的概念,主要关注于视图层分离,也就是说: MVVM把前端的视图层,分为了三部分Model, View。VM ViewModel●为什么有了MVC还要有MVVM第一个Vue.js页面: </head><!-- 描述:1、导入Vue的包 --><body> <!-- 描述:用来new的Vue实例,会控制这个元素的所以内容 -_vue 生命周期 mother

使用jQuery更换图像_jquery图片切换-程序员宅基地

文章浏览阅读226次。jQuery是一种流行的JavaScript库,它简化了JavaScript编程,并提供了许多强大的功能。在jQuery中,可以使用一些简单的代码来更换图像。下面是一个详细的示例,演示如何使用jQuery更换图像。记得在实际使用中替换图像路径和元素ID,以适应你的具体需求。接下来,我们将创建一个包含图像的HTML元素,以及一个用于触发图像更换的按钮。现在,当用户点击"Change Image"按钮时,将会用新图像替换原始图像。在回调函数中,我们定义了新图像的文件路径和alt文本,并使用。_jquery图片切换