iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL中server_id一致带来的问题如何处理
  • 115
分享到

MySQL中server_id一致带来的问题如何处理

2024-04-02 19:04:59 115人浏览 薄情痞子
摘要

小编给大家分享一下Mysql中server_id一致带来的问题如何处理,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! 简介 我们都知道在mysql搭建复制环境的时候,需要设置每个ser

小编给大家分享一下Mysql中server_id一致带来的问题如何处理,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

简介

我们都知道在mysql搭建复制环境的时候,需要设置每个server的server_id不一致,如果主库与从库的server_id一致,那么复制会失败。但是最近在解决一个客户的问题的时候,遇到一个有意思的现象,客户环境有三台数据库服务器,一主两从,客户的两台从库设置了相同server_id,在排查问题的过程中,查看Mysql错误日志,发现有很多奇怪的信息。
我们模拟了客户的环境,并进行测试、分析,最终在代码中找到了我们想要的答案。下面就是我们测试、分析、总结的步骤以及内容。

测试步骤

环境介绍

  • 主库
    IP:192.168.1.130
    server_id:3656

  • 从库A
    IP:192.168.1.36
    server_id:56

  • 从库B
    IP:192.168.1.57
    server_id:56

三台主机除server_id之外,其余配置如下:

  1. server_id = 123

  2.     [client]

  3.     Socket = /home/mysql/data/mysqldata5.5/sock/mysql.sock

  4.     [mysqld]

  5.     #server_id = 3655

  6.     server_id = 123

  7.     port = 3306

  8.     skip_name_resolve = 1

  9.     binlog_fORMat = ROW

  10.     #binlog_format = STATEMENT

  11.     basedir = /home/mysql/program/mysql5.5.36

  12.     datadir = /home/mysql/data/mysqldata5.5/mydata

  13.     socket = /home/mysql/data/mysqldata5.5/sock/mysql.sock

  14.     pid-file = /home/mysql/data/mysqldata5.5/sock/mysql.pid

  15.     tmpdir = /home/mysql/data/mysqldata5.5/tmpdir

  16.     log-error = /home/mysql/data/mysqldata5.5/log/error.log

  17.     slow_query_log

  18.     slow_query_log_file = /home/mysql/data/mysqldata5.5/slowlog/slow-query.log

  19.     log-bin = /home/mysql/data/mysqldata5.5/binlog/mysql-bin

  20.     relay-log = /home/mysql/data/mysqldata5.5/relaylog/mysql-relay-bin

  21.     innodb_data_home_dir = /home/mysql/data/mysqldata5.5/innodb_ts

  22.     innodb_log_group_home_dir = /home/mysql/data/mysqldata5.5/innodb_log

  23.     #innodb_undo_directory = /home/mysql/data/mysqldata5.5/undo/

  24.     sync_binlog=1

  25.     innodb_file_per_table=1

  26.     #skip_grant_tables

  27.     expire_logs_days = 1

  28.     log_slave_updates = ON

  29.     #replicate-same-server-id=1

  30.     skip_slave_start

  31.     #innodb_undo_tablespaces=1

5.5.36版本现象

初始搭建环境之后,查看各主机状态。搭建环境的步骤就省略。

主库(192.168.1.130)

主库通过show processlist语句查看,只有一个dump线程,但是通过多次刷新,可以看到连接的是不同的服务器。可以看到每次通过show processlist语句显示的dump线程的Host字段中,IP:PORT的值是不断在更新的,说明dump线程在不断的重连,才会出现占用不同的端口的现象。
MySQL中server_id一致带来的问题如何处理
MySQL中server_id一致带来的问题如何处理

从库A(192.168.1.36)

通过show slave status\G命令查看复制状态,多次执行可以看到Slave_io_Running字段显示的内容,出现YES或者Connnecting两种状态。可以看到I/O线程在不断的进行重连。
并且通过tail -f命令查看error log,可以看到I/O线程一直在尝试重新连接。
MySQL中server_id一致带来的问题如何处理
MySQL中server_id一致带来的问题如何处理
MySQL中server_id一致带来的问题如何处理
可以看到在错误日志中打印的信息是,I/O线程连接
MySQL中server_id一致带来的问题如何处理
MySQL中server_id一致带来的问题如何处理

从库B(192.168.1.57)

从库B现象与从库A一致。
MySQL中server_id一致带来的问题如何处理
MySQL中server_id一致带来的问题如何处理
MySQL中server_id一致带来的问题如何处理
MySQL中server_id一致带来的问题如何处理

MySQL中server_id一致带来的问题如何处理

5.6.36版本现象

搭建环境步骤省略。

主库(192.168.1.130)

show processlist查看有两个dump线程,并且多次刷新,发现Host字段中的IP:PORT并没有修改,说明dump线程一直保持连接。
MySQL中server_id一致带来的问题如何处理
MySQL中server_id一致带来的问题如何处理

从库A(192.168.1.36)

tail -f /home/mysql/data/mysqldata5.6/log/error.log查看错误日志,没有不断断开连接
MySQL中server_id一致带来的问题如何处理

从库B(192.168.1.57)

tail -f /home/mysql/data/mysqldata5.6/log/error.log查看错误日志,没有不断断开连接
MySQL中server_id一致带来的问题如何处理
MySQL中server_id一致带来的问题如何处理

原因分析

Http://www.penglixun.com/tech/database/mysql_multi_slave_same_serverid.html这是彭立勋写的关于多个slave使用相同server_id时冲突的原因的一篇文章。按照彭大大的分析,我理解的是,slave的I/O线程连接上主库的时候,主库上会调用reGISter_slave()这个函数,在这个函数中又调用了unregister_slave()函数,会将之前使用相同server_id的线程给注销掉。从而导致从库的I/O线程不断断开重连。
但是仔细看了一下unregister_slave()函数的代码,并没有发现MySQL是根据server_id来注销dump线程的。并且进一步比较了一下5.5.36和5.6.36版本的代码,并没有发现不同。而从库设置server_id一致导致I/O线程不断重连的现象只在5.5版本中看到,在5.6版本中并没有这个现象,所以导致5.5现象的原因不是在unregister_slave()函数中。
进一步看了一下彭大大的文章,发现有人在下面评论,说主要是kill_zombie_slave_threads()函数导致的。于是看了一下kill_zombie_slave_threads()函数的逻辑,发现MySQL应该就是在这一步根据server_id将线程kill了。

  • 5.5.36版本
    首先来看下5.5.36版本的kill_zombie_dump_threads()函数的代码。看到这个函数传入的参数是一个uint32类型的slave_server_id,在函数中做的事情是,遍历MySQL中的所有线程,如果遍历到一个线程是dump线程并且线程的server_id是等于传入的参数值话,则跳出遍历循环,并对kill掉这个线程。

  1. void kill_zombie_dump_threads(uint32 slave_server_id)

  2.     {

  3.       mysql_mutex_lock(&LOCK_thread_count);

  4.       I_List_iterator<THD> it(threads);

  5.       THD *tmp;

  6.       while ((tmp=it++))

  7.       {

  8.         if (tmp->command == COM_BINLOG_DUMP &&

  9.           tmp->server_id == slave_server_id)

  10.         {

  11.          mysql_mutex_lock(&tmp->LOCK_thd_data); // Lock from delete

  12.          break;

  13.         }

  14.       }

  15.       mysql_mutex_unlock(&LOCK_thread_count);

  16.       if (tmp)

  17.       {

  18.         

  19.         tmp->awake(THD::KILL_QUERY);

  20.         mysql_mutex_unlock(&tmp->LOCK_thd_data);

  21.       }

  22.     }


5.6.35版本
再来看一下5.6.36版本的kill_zombie_dump_threads()函数的代码实现,与5.5.36大不相同。首先传入的参数是一THD类型的指针,在函数中实现的逻辑同样是遍历MySQL中的所有线程,如果找到dump线程,首先看一下这个线程有没有uuid字段(因为uuid是在5.6之后的版本才有的,这边是为了兼容5.5),如果有uuid则用uuid进行比较,如果没有uuid,则用server_id进行比较。

  1. void kill_zombie_dump_threads(THD *thd)

  2.     {

  3.       String slave_uuid;

  4.       get_slave_uuid(thd, &slave_uuid);

  5.       if (slave_uuid.length() == 0 && thd->server_id == 0)

  6.         return;

  7.       mysql_mutex_lock(&LOCK_thread_count);

  8.       THD *tmp= NULL;

  9.       Thread_iterator it= global_thread_list_begin();

  10.       Thread_iterator end= global_thread_list_end();

  11.       bool is_zombie_thread= false;

  12.       for (; it != end; ++it)

  13.       {

  14.         if ((*it) != thd && ((*it)->get_command() == COM_BINLOG_DUMP || (*it)->get_command() == COM_BINLOG_DUMP_GTID))

  15.         {

  16.          String tmp_uuid;

  17.          get_slave_uuid((*it), &tmp_uuid);

  18.          if (slave_uuid.length())

  19.          {

  20.            is_zombie_thread= (tmp_uuid.length() && !strncmp(slave_uuid.c_ptr(),

  21.                                              tmp_uuid.c_ptr(), UUID_LENGTH));

  22.          else

  23.          {

  24.            

  25.      pos = uint4korr(packet);

  26.      flags = uint2korr(packet + 4);

  27.      thd->server_id=0;

  28.      if ((slave_server_id= uint4korr(packet+6))) // mysqlbinlog.server_id==0

  29.      kill_zombie_dump_threads(slave_server_id);

  30.      thd->server_id = slave_server_id;

  31.      general_log_print(thd, command, "Log: '%s'  Pos: %ld", packet+10, (long) pos);

  32.      mysql_binlog_send(thd, thd->strdup(packet + 10), (my_off_t) pos, flags);

  33.     unregister_slave(thd,1,1);

  34.     

  35.      error = TRUE;

  36.     break;

  37.     }


在5.6.36版本中也是在case COM_BINLOG_DUMP中,只不过是将之前的逻辑封装在了com_binlog_dump()函数中了,kill_zombie_dump_threads()也是在com_binlog_dump()函数中调用的。

  1. case COM_BINLOG_DUMP:

  2.     error= com_binlog_dump(thd, packet, packet_length);

  3.     break

case COM_BINLOG_DUMP中所进行的操作就是将dump线程通知I/O线程拉取新的binlog。

看完了这篇文章,相信你对“MySQL中server_id一致带来的问题如何处理”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网数据库频道,感谢各位的阅读!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL中server_id一致带来的问题如何处理

本文链接: https://www.lsjlt.com/news/63174.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL中server_id一致带来的问题如何处理
    小编给大家分享一下MySQL中server_id一致带来的问题如何处理,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! 简介 我们都知道在MySQL搭建复制环境的时候,需要设置每个ser...
    99+
    2024-04-02
  • 如何处理Go语言中的并发缓存一致性问题?
    如何处理Go语言中的并发缓存一致性问题?在Go语言中,通过并发机制可以有效提高程序的性能。然而,并发操作也会带来一些问题,其中之一就是并发缓存一致性问题。当多个线程同时对同一个缓存进行读写操作时,就可能会出现数据不一致的情况。如何处理这个问...
    99+
    2023-10-22
    并发 缓存 一致性
  • Cassandra如何处理故障和数据一致性问题
    Cassandra 是一个分布式数据库系统,它具有高可用性和容错性,可以有效处理故障和数据一致性问题。以下是 Cassandra 处...
    99+
    2024-04-02
  • NoSQL怎么处理数据的不一致性问题
    NoSQL数据库通常使用多种方法来处理数据的不一致性问题,具体取决于数据库的类型和实现方式。以下是一些常见的方法: ACID属性...
    99+
    2024-05-07
    NoSQL
  • Go语言中如何处理并发数据库数据一致性问题?
    Go语言中如何处理并发数据库数据一致性问题?当多个并发请求同时访问数据库时,会引发数据一致性问题。在Go语言中,我们可以使用事务和锁来处理这个问题。下面我将详细介绍如何在Go语言中处理并发数据库数据一致性问题,并给出具体的代码示例。首先,我...
    99+
    2023-10-22
    数据库 并发 一致性
  • 如何处理json中不带双引号的key的问题
    目录处理json中不带双引号key问题如下面数据结果报错怎么解决呢?json数据key值有引号与没引号的取值有的json数据的键值是没有引号的有的返回值的键值是由引号的第一种json...
    99+
    2024-04-02
  • 如何处理MySQL死锁问题
    小编给大家分享一下如何处理MySQL死锁问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! MySQL里的锁兼容列表大体是这样...
    99+
    2024-04-02
  • PHP中的自然语言处理:如何避免缓存和关键字带来的问题?
    自然语言处理(NLP)是人工智能的一个重要领域,它涉及到计算机对人类语言的理解和生成。在PHP中,有许多工具和库可供开发人员使用,以便处理文本数据并执行各种NLP任务。然而,在处理自然语言时,缓存和关键字可能会导致一些问题,本文将介绍如何...
    99+
    2023-10-18
    自然语言处理 缓存 关键字
  • Java中如何保证缓存一致性问题
    目录前言:方案分析方案一:更新缓存,更新数据库方案二:更新数据库,更新缓存方案三:删除缓存,更新数据库方案四:更新数据库,删除缓存方案对比总结推荐方案延迟双删实际场景写缓存策略读缓存...
    99+
    2024-04-02
  • 如何理解MySQL的一致性读
    如何理解MySQL的一致性读,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一 前言   ...
    99+
    2024-04-02
  • PHP中如何处理MySQL中的0值转义问题?
    PHP中如何处理MySQL中的0值转义问题? 在开发过程中,我们经常会遇到需要向MySQL数据库中插入0值的情况。然而,由于MySQL中0值的特殊性,可能会在PHP代码中引起一些问题。...
    99+
    2024-02-28
    mysql php 转义 sql语句 防止sql注入
  • 如何解决MySQL存储时间出现不一致的问题
    小编给大家分享一下如何解决MySQL存储时间出现不一致的问题,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!用Java在获取了系统时间后,存入MySQL数据库时,当时间的类型为datetime或Timestamp时发现数据库...
    99+
    2023-06-14
  • 多线程update导致的mysql死锁问题处理方法
    最近想起之前处理过的一个mysql 死锁问题,是在高并发下update批量更新导致的,这里探讨一下发生的原因,以及解决办法; 发生死锁的sql语句如下,其中where条件后的字段是有复合索引的。 update t_push_mes...
    99+
    2023-09-06
    数据库 java 开发语言 mysql死锁问题 mysql
  • 如何解决Mysql乘法除法精度不一致问题
    这篇文章主要介绍如何解决Mysql乘法除法精度不一致问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!问题今天在写项目功能的时候,有一个统计金额的情况,然后需要进行单位转换,所以写下...
    99+
    2024-04-02
  • 如何解决docker中mysql时间与系统时间不一致问题
    这篇文章将为大家详细讲解有关如何解决docker中mysql时间与系统时间不一致问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。最近在Docker中装mysql时,发现数据库时间与系统时间相差8个小时。...
    99+
    2023-06-22
  • 如何在golang中使用shopspring/decimal来处理精度问题
    目录安装 shopspring/decimal创建 Decimal 对象Decimal 对象的四则运算Decimal 对象的比较设置 Decimal 对象的精度总结在 Golang ...
    99+
    2023-05-16
    golang shopspring精度 golang decimal精度
  • 如何在Python中处理异常处理的问题
    如何在Python中处理异常处理的问题异常是程序中的错误,当程序出现异常时,可以使用异常处理机制来捕获和处理这些异常,以保证程序的正常运行。Python提供了丰富而强大的异常处理机制,可以通过try-except语句来捕获并处理异常。下面将...
    99+
    2023-10-22
    Python 异常处理
  • 如何在Python中处理图像处理的问题
    如何在Python中处理图像处理的问题引言:在如今数字化的时代,图像处理已经成为一个非常重要的领域,广泛应用于计算机视觉、医学图像、图像识别等多个领域。Python作为一种简单易学的编程语言,提供了很多强大的图像处理库和工具,使得图像处理变...
    99+
    2023-10-22
    Python 图像处理 处理方法
  • 如何在Python中处理图片处理的问题
    如何在Python中处理图片处理的问题,需要具体代码示例在如今的数字化时代,图片已经成为人们日常生活中不可或缺的一部分。我们随时随地可以通过手机拍摄、下载网络上的图片。然而,有时我们需要对这些图片进行一些处理,如裁剪、缩放、滤镜等操作。本文...
    99+
    2023-10-22
    Python 图片处理
  • 如何解决MySQL到DB2的技术转型过程中的数据一致性问题?
    如何解决MySQL到DB2的技术转型过程中的数据一致性问题?随着企业业务的发展和需求的变化,很多企业在数据存储和管理方面选择了将原本的MySQL数据库转向DB2数据库。然而,在这个技术转型的过程中,由于两种数据库的存储机制和特性不同,可能会...
    99+
    2023-10-22
    MySQL DB 关键词: 数据一致性问题
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作