MySQL数据库主从 如果主挂了如何自动将主切换到从

问题描述:
结构的1主2从,机器名分别为M1、S1、S2。使用keepalived+haproxy,将M1、S1做心跳,在M1正常的情况下,S1只负责读,如果M1挂了,则让S1变成读+写。
问题如下:在M1挂掉,S1升级成新主机的情况下,S2如何能够自动将主机变更为S1,并且知道S1接手以后,新的日志文件的名称和position。

最佳回答:

备库如何发起DUMP请求
引入GTID,最大的好处当然是我们可以随心所欲的切换主备拓扑结构了。在一个正常运行的复制结构中,我们可以在备库简单的执行如下SQL:

CHANGE MASTER TO MASTER_USER=’$USERNAME’, MASTER_HOST=’ ‘, MASTER_PORT=’ ‘, MASTER_AUTO_POSITION=1;

打开GTID后,我们就无需指定binlog文件或者位置,MySQL会自动为我们做这些事情。这里的关键就是MASTER_AUTO_POSITION。IO线程连接主库,可以大概分为以下几步:
1.IO线程在和主库建立TCP链接后,会去获取主库的uuid(get_master_uuid),然后在主库上设置一个用户变量@slave_uuid(io_thread_init_commands)

2.之后,在主库上注册SLAVE(register_slave_on_master)

在主库上调用register_slave来注册备库,将备库的host,user,password,port,server_id等信息记录到slave_list哈希中。

3.调用request_dump,开始向主库请求数据,这里分两种情况:
MASTER_AUTO_POSITION=0时,向主库发送命令的类型为COM_BINLOG_DUMP,这是传统的请求BINLOG的模式
MASTER_AUTO_POSITION=1时,命令类型为COM_BINLOG_DUMP_GTID,这是新的方式。
这里我们只讨论第二种。第二种情况下,会先去读取备库已经执行的gtid集合
quoted code in rpl_slave.cc :
if (command == COM_BINLOG_DUMP_GTID)

{
// get set of GTIDs
Sid_map sid_map(NULL/*no lock needed*/);
Gtid_set gtid_executed(&sid_map);
global_sid_lock->wrlock();
gtid_state->dbug_print();
if (gtid_executed.add_gtid_set(mi->rli->get_gtid_set()) != RETURN_STATUS_OK ||
      gtid_executed.add_gtid_set(gtid_state->get_logged_gtids()) !=
      RETURN_STATUS_OK)

构建完成发送包后,发送给主库。

在主库上接受到命令后,调用入口函数com_binlog_dump_gtid,流程如下:

1.slave_gtid_executed.add_gtid_encoding(packet_position, data_size) ;读取备库传来的GTID SET
2.读取备库的uuid(get_slave_uuid),被根据uuid来kill僵尸线程(kill_zombie_dump_threads)
这也是之前SLAVE IO线程执行SET @SLAVE_UUID的用处。
3.进入mysql_binlog_send函数:
         |?>调用MYSQL_BIN_LOG::find_first_log_not_in_gtid_set,从最后一个Binlog开始扫描,获取文件头部的PREVIOUS_GTIDS_LOG_EVENT,如果它是slave_gtid_executed的子集,保存当前binlog文件名,否则继续向前扫描。
         这一步的目的就是为了找出备库执行到的最后一个Binlog文件。
         
         |?>从这个文件头部开始扫描,遇到GTID_EVENT时,会去判断该GTID是否包含在slave_gtid_executed中:
                         Gtid_log_event gtid_ev(packet->ptr() + ev_offset,
                                 packet->length() ? checksum_size,
                                 p_fdle);
                          skip_group= slave_gtid_executed->contains_gtid(gtid_ev.get_sidno(sid_map),
                                                     gtid_ev.get_gno());
         主库通过GTID决定是否可以忽略事务,从而决定执行开始的位置

注意,在使用MASTER_LOG_POSITION后,就不要指定binlog的位置,否则会报错。

时间: 2024-10-28 23:24:52

MySQL数据库主从 如果主挂了如何自动将主切换到从的相关文章

MySQL数据库主从同步第四版

MySQL的主从同步是一个很成熟的架构,优点为:①在从服务器可以执行查询工作(即我们常说的读功能),降低主服 务器压力;②在从主服务器进行备份,避免备份期间影响主服务器服务;③当主服务器出现问题时,可以切换到从服务器.所以我在项目部署和实施中经常会采用这 种方案;鉴于生产环境下的mysql的严谨性,我这里推荐采用张宴兄的MySQL源码编译的方法. 第④版更新内容如下: 一.增加了mysql5.1.38的编译安装过程,安装过程仍然采用张宴早期安装mysql的方法,摈弃了用脚本控制的办法; 二.从库

mysql数据库主从同步

环境: Mater:   CentOS7.1  5.5.52-MariaDB  192.168.108.133 Slave:   CentOS7.1  5.5.52-MariaDB  192.168.108.140 1.导出主服务数据,将主备初始数据同步 master: //从master上导出需要同步的数据库信息 mysqldump -u*** -p*** --database test > test.sql //将master上的备份信息传输到slave上 scp /root/test.sq

学习mysql数据库主从同步复制原理

MySQL的Replication(英文为复制)是一个多MySQL数据库做主从同步的方案,特点是异步复制,广泛用在各种对MySQL有更高性能.更高可靠性要求的场合.与之对应的是另一个同步技术是MySQL Cluster,但因为MySQL Cluster配置比较复杂,所以使用者较少. MySQL的Replication是一个异步复制的过程(mysql5.1.7以上版本分为异步复制和半同步两种模式),它是从一个Mysql instance(instance英文为实例)(我们称之为Master)复制到

MySQL数据库主从同步实现

MySQL 是全球最受欢迎的开源数据库,作为开源软件组合 LAMP(Linux + Apache + MySQL + Perl/PHP/Python)中的重要一环,广泛应用于各类应用.Web2.0 时代,风靡全网的社区论坛软件系统 Discuz 和博客平台 Wordpress 均基于 MySQL 实现底层架构.Web3.0 时代,阿里巴巴.Facebook.Google 等大型互联网公司都采用更为灵活的 MySQL 构建了成熟的大规模数据库集群.阿里云数据库 MySQL 版基于 Alibaba

MySQL数据库主从同步安装与配置总结

MySQL的主从同步是一个很成熟的架构,优点为: ①在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力: ②在从主服务器进行备份,避免备份期间影响主服务器服务: ③当主服务器出现问题时,可以切换到从服务器. 所以我在项目部署和实施中经常会采用这种方案. + 数据库目录及其它 my.cnf配置文件     /etc/my.cnf mysql数据库位置    datadir=/var/lib/mysql 主数据库:192.168.2.119 从数据库:192.168.2.220 操作

Linux下MySQL数据库主从同步配置

说明: 操作系统:CentOS 5.x 64位 MySQL数据库版本:mysql-5.5.35 MySQL主服务器:192.168.21.128 MySQL从服务器:192.168.21.129 准备篇: 说明:在两台MySQL服务器192.168.21.128和192.168.21.129上分别进行如下操作 备注: 作为主从服务器的MySQL版本建议使用同一版本! 或者必须保证主服务器的MySQL版本要高于从服务器的MySQL版本! 一.配置好IP.DNS .网关,确保使用远程连接工具能够连接

java 关于数据库的操作 删除之后不能自动更新 主窗体要重新运行 才能显示出删除后的结果.

问题描述 主窗体程序...packageframedemo;importjava.awt.BorderLayout;importjava.awt.FlowLayout;importjava.awt.ScrollPane;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.R

mysql数据库主从同步配置方法

安装完mysql后 打开主数据库my.cnf mkdir /home/log/ 添加   配置代码  代码如下 复制代码 01.##########同步配置开始###################   02.server-id=1  03.log-bin =   /home/log/mysql_serverid.log   04.set-variable = binlog-ignore-db=mysql  05.set-variable = binlog-ignore-db=test  06.

配置MySQL数据库主从服务器实现双机热备

网站:bbs.osyunwei.com程序在:Web 服务器192.168.21.129 上面数据库在:MySQL 服务器192.168.21.169 上面实现目的:增加一台MySQL 备份服务器(192.168.21.168),做为MySQL 服务器(192.168.21.169)的从服务器,这两台MySQL 服务器之间实现双机热备.即:从服务器(192.168.21.168)上面指定的数据库永远与主服务器(192.168.21.169)上面指定的数据库保持同步,并且随着主服务器(192.16