jjzjj

MySQL主备切换

相邀大龙虾 2023-03-28 原文
正常测试主备切换: 主备节点正常

  1. 备节点读取 seconds_behind_master 值如果符合可接受影响时间大小则进行下一步, 如果不能接受则继续等待同步
  2. 将主库设置为read_only,, 查看备库节点应用完中专日志,
  3. 设置备节点为read_only=false,
  4. 切换地址,主备切换完成
  5. 恢复业务连接

主节点故障down机,切换方案:

主备-从节点主机故障切换

基于位点的主备切换

  1. 执行一条change master命令:
  1. CHANGE MASTER TO MASTER_HOST=$host_name
  2. MASTER_PORT=$port
  3. MASTER_USER=$user_name
  4. MASTER_PASSWORD=$password
  5. MASTER_LOG_FILE=$master_log_name
  6. MASTER_LOG_POS=$master_log_pos
  1. MASTER_LOG_FILE和MASTER_LOG_POS表示,要从主库的 master_log_name文件的master_log_pos这个位置的日志继续同步 ,master_log_name--文件名, master_log_pos -- 文件偏移量
  2. 取同步位点:
  1. 等待新主库A‘ 应用完中转日志(realy_log)
  2. 在A’上执行show master status; 命令,得到当前A‘上最新的File 和Position;
  3. 记录源主库故障的时间点T
  4. 用mysqlbinlog 工具解析A’ 的File,得到T时刻的位点Position
  5. mysqlbinlog File --stop-datetime=T --start-datetime=T
  1. 展示中: end_log_pos 的值就是这个 $master_log_pos
  2. 如果出现同步数据到备库以及主库down 就发生在传完中转日志的时刻, 此时会导致这个位点再一次回传给备库执行, 进而报错冲突问题, 所以需要跳过此报错
  1. 主动跳过一个事务。跳过命令的写法是: set global sql_slave_skip_counter=1; start slave;
  2. 另外一种方式是,通过设置slave_skip_errors参数,直接设置跳过指定的错误。 在执行主备切换时,有这么两类错误,是经常会遇到的:
  1. 1062错误是插入数据时唯一键冲突;
  2. 1032错误是删除数据时找不到行。

GTID

理解: 对这个文件名以及文件位点进行打包, 加入集合中, 每个实例中有各自的对应集合包, 比对每个主从关系的集合是否同步

格式:

GTID= server_uuid:gno【官方标准格式: GTID=source_id:transaction_id 】

source_id就是server_uuid

  1. gtid_next=automatic, 代表使用默认值,MySQL会把server_uuid:gno 分配给这个事务
  1. 记录binlog时, 先记录一行 SET @@SESSION.GTID_NEXT='server_uuid:gno';
  2. 将这个GTID加入本实例的GTID集合
  1. 如果gtid_next是一个指定的GTID值, 比如通过set gtid_nest='current_gtid' 指定为current_gtid, 有两种可能
  1. 如果这个current_gtid已经存在于实例中的GTID 集合, 那么这个事务直接被忽略
  2. 如果不存在GTID集合, 将这个current_gtid 分配给接下看来要执行的事务, 系统不需要分配新的GTID,因此gno也不用加1
基于GTID 的主备切换

主库down, A‘作为新的主库即将切换业务, 备库B 设置为新主库A’的从库

CHANGE MASTER TO

MASTER_HOST=$host_name

MASTER_PORT=$port

MASTER_USER=$user_name

MASTER_PASSWORD=$password

master_auto_position=1

基于这个master_auto_position=1 主备关系使用的是GTID协议。

实例A‘算出set_a 与set_b 的差集,所有存在于set_a,但是不存在于set_b的GTID

实例B上执行start slave命令,取binlog的逻辑是这样的

  1. 实例B 指定主库A’, 基于主备切换协议建立连接
  2. 实例B把set_b 发给主库A‘
  3. 实例A’算出set_a与set_b的差集, 判断A;本地是否包含了这个差集需要的所有binlog 事务
  1. binlog判断, 如果不包含, 标识A‘已经把实例B 所需要的binliog给删除了, 直接反馈报错
  2. 如果确认全部包含, A; 从自己的binloig 文件里面, 找出第一个不再set_b事务,发给B;
  1. 之后按照这个事务开启, 依次读取binlog 发送给B执行

对于这个一主多从:

当A主库发生故障。 新的主库A’, B,C, D作为从节点分别发起change master命令将同步节点切换到A‘

新的主库A'的server_uuid_of_A:1-N, B从库的GTID集合是server_uuid_of_A':1-M,则主备切换后, B的集合就显示的是;server_uuid_of_A':1-M,server_uuid_of_A:1-N


补充:

  1. binlog判断, 如果不包含, 标识A‘已经把实例B 所需要的binliog给删除了, 直接反馈报错
问题: GTID模式下,如果一个新的从库接上主库,但是需要的binlog已经没 了,要怎么做?

  1. 如果业务允许主从不一致, 可以现在主库执行show global variables like "gtid_purged", 得到主库已经删除的GTID集合, 假设是gtid_purged1; 然后先在从库执行reset master, 再执行set global gtid_purged="gtid_purged1"; 最后执行 start slave, 就会从主库现存的binlog开始同步。 binlog 确实的那一部分,数据在从库上就可能会有丢失, 造成主从不一致
  2. 如果需要主从数据一致, 最好是通过重新搭建从库来做
  3. 如果有其他从库保留全量binlog, 可以把新的从库接到这个保留全量binlog 的从库, 追上日志之后, 如果有需要,再接回主库
  4. 如果binlog 有备份, 可以先在从库上应用缺失的binlog,然后再执行start slave

有关MySQL主备切换的更多相关文章

  1. ruby-on-rails - Ruby on Rails with Haml - 如何从 erb 切换 - 2

    我正在从erb文件切换到HAML。我将hamlgem添加到我的系统中。我创建了app/views/layouts/application.html.haml文件。我应该只删除application.html.erb文件吗?此外,仍然有/public/index.html文件被呈现为默认页面。我想创建自己的默认index.html.haml页面。我应该把它放在哪里以及如何使系统呈现该文件而不是默认索引文件?谢谢! 最佳答案 是的,您可以删除任何已转换为HAML的View的ERB版本。至于你的另一个问题,删除public/index/h

  2. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  3. ruby-on-rails - 无法安装 mysql2 0.3.14 gem - 2

    我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby​​目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin

  4. ruby - 如何使用 ruby​​ mysql2 执行事务 - 2

    我已经开始使用mysql2gem。我试图弄清楚一些基本的事情——其中之一是如何明确地执行事务(对于批处理操作,比如多个INSERT/UPDATE查询)。在旧的ruby-mysql中,这是我的方法:client=Mysql.real_connect(...)inserts=["INSERTINTO...","UPDATE..WHEREid=..",#etc]client.autocommit(false)inserts.eachdo|ins|beginclient.query(ins)rescue#handleerrorsorabortentirelyendendclient.commi

  5. ruby-on-rails - 当我通过 rvm 使用 rails3 时,如何在 ubuntu 上安装 mysql2 gem? - 2

    我正在尝试绕过rails配置这个极其复杂的迷宫。到目前为止,我设法在ubuntu上设置了rvm(出于某种原因,ruby在ubuntu存储库中已经过时了)。我设法建立了一个Rails项目。我希望我的测试项目使用mysql而不是mysqlite。当我尝试“rakedb:migrate”时,出现错误:“!!!缺少mysql2gem。将其添加到您的Gemfile:gem'mysql2'”当我尝试“geminstallmysql”时,出现错误,告诉我需要为安装命令提供参数。但是,参数列表很大,我不知道该选择哪些。如何通过在ubuntu上运行的rvm和mysql获取rails3?谢谢。

  6. ruby-on-rails - 语言环境不在 Rails 4 中切换 - 2

    我的Rails应用程序在rails4.0.2上,我在使用locale变量和params[:locale]切换翻译时遇到问题官方railsguide.我在mysite有一个单页网站.我的国际化路线:scope"(:locale)",locale:/en|de/do#myrouteshereend我的应用程序Controllerbefore_filter:set_localedefset_localeI18n.locale=params[:locale]||I18n.default_locale#Rails.application.routes.default_url_options[:l

  7. jquery - 在 Rails 中从原型(prototype)切换到 jquery,助手呢? - 2

    我目前从prototype切换到jquery主要是为了支持简单的ajax文件上传。我使用:https://github.com/indirect/jquery-rails95%的javascript代码是由railshelper编写的,例如:-remote_function-render:updatedo|page|-page.replace_html'id',:partial=>'content'-page['form']['name']=something-page.visual_effect:highlight,'head_success'...我知道我必须为Jquery重写5%

  8. Centos7-yum安装mysql-修改密码-无密码登录-安全配置 - 2

    目录1、yum安装mysql修改密码(1)在mysql里面修改(2)第二种方式,利用mysqladmin修改密码2、没有密码,登录mysql修改密码3、mysql的安全设置1、yum安装mysql在CentOS中默认安装有MariaDB(MySQL的一个分支),安装完成之后可以直接覆盖MariaDB。rpm-qa|grepmariadb查询是否安装了mariadbrpm-e--nodepsmariadb-libs-5.5.60-1.el7_5.x86_64卸载mariadwgethttp://dev.mysql.com/get/mysql57-community-release-el7-11.

  9. 微信小程序切换云环境 - 2

    在开发微信小程序的时候,我们可能需要开发环境和测试环境,或者其他环境,下面是切换环境的方法。首先需要明确的是:前端的页面代码是不区分环境的,环境的区分指的是云函数、云数据库、云存储这些。1、更改云函数的使用云环境这里我们从cloud1更改为test-cloud,这个改完是没有用的,因为在前端代码指定了使用的云环境。cloudfunctions文件和miniprogram文件虽然都在一个目录下,但是这两个没有直接联系。2、在evList.js中添加自己云环境evList.js存储了云环境列表,这里把test-cloud加到这个列表里,需要填写envId和alias,参照cloud1写就行。3、更

  10. ruby - 安装 dm-mysql-adapter 时出错 - 2

    我是Ruby的新手。我安装了DataMapper并且正在尝试安装dm-mysql-adapter-1.0.2gem。但是当我尝试安装时,出现以下错误。我正在使用ubuntu操作系统。vinoth@vinoth-laptop:~/Downloads$geminstalldm-mysql-adapter-1.0.2----with-mysql-lib=/usr/lib/mysql----with-mysql-conf=/usr/bin/mysqlWARNING:Installingto~/.gemsince/home/vinoth/gemsand/home/vinoth/gems/bina

随机推荐