MySQL 故障转移

2023-11-08

在高可用领域,除了通过规范化运维和软硬件优化,提升平均失效时间(MTBF), 降低平均恢复时间(MTTR)也非常关键,本文主要讲述的内容是其中的故障转移故障恢复部分。

降低平均恢复时间(MTTR)
  • 宕机的原因
    • 运行环境(操作系统、硬盘、网络等)原因占 35%
    • 性能问题(DDL/长事务导致资源耗尽等)占 35%
    • 复制原因占 20%
    • 其他(数据丢失或损坏)占10%
  • 基于复制的冗余
    • 使用 MySQL 的复制功能搭建热备份
    • 主备相隔粒度越大,可用性保障等级越高(机柜<机房<城市)
  • 故障转移
    • 应用和数据库连接方式会影响故障转移的时效,应用可以通过虚拟IP/DNS/中间件等形式访问数据库
    • 虚拟IP,一个虚拟 IP 绑定一个真实 IP,故障转移时把绑定的 IP 修改为备库的 IP 即可实现快速故障转移
    • DNS,一个 DNS 可以绑定多个 IP,可以实现快速故障转移,同时可以实现负载均衡
    • 中间件,通过重写 JDBC 等接口,灵活调用和访问数据库,可以实现快速故障转移、读写分离、负载均衡,同时可以实现分库分表等分布式查询等
故障探测
I. 探测方法
  1. ping 虚拟ip
  2. select 获取 test 库中的 heartbeat 表
  3. update 更新 test 库中的 heartbeat 表 create table heartbeat (ts timestamp);
II. 探测结果汇总
  1. 网络异常: 网络连接超时,无法从网络上找到对应主机
    • 被探测实例单机网络故障
    • 被探测实例所在机房网络故障
    • HA 程序所在机器网络故障
    • HA 程序所在机房网络故障
  2. 主机异常: 网络连接被拒绝,找到主机,无法在主机上找到对应服务端口的实例
    • 被探测实例所在机器机器故障
    • 被探测实例异常退出
  3. 实例异常: 探测连接创建超时,服务端口存在,但是创建连接时超时
    • 被探测实例异常,已经无法正常提供服务
  4. 读写异常: 成功创建连接,但 select/update 操作执行超时,但是无法执行读/写操作
    • 被探测实例 Hang 住
III. 探测程序部署架构
  1. 单点部署,自身不具备高可用
  2. 热备部署,自身具备高可用
    • 使用 Keepalived 进行监控和切换
    • 如果发生机房间的网络故障,容易产生脑裂(两个机房都认为对方有问题)
  3. 分布式部署,避免脑裂
    • HA 程序使用 ZooKeeper 保存、识别 MySQL 实例和自身的状态,也可以利用它实现分布式锁,进行并发同步
    • 需要至少在三个机房各一台机器,部署至少 3 个节点的 ZooKeeper 集群
    • 利用 PAXOS 协议对分布式一致性©和分区容错性§的强支持,避免脑裂,准确判断问题节点
故障转移和修复
  1. 根据探测结果判断是否出现故障,如果是故障,则判断是否是提供服务的主库
  2. 查看备库备库状态,确认备库可用,并且备库 Replication 的延迟小于阈值
  3. 等待备库应用 relay log(需要设置应用超时时间),然后 stop slave;
  4. 记录备库 relay log 对应主库的位点
  5. 掉用中间件/DNS/VIP 的接口,把应用流量转移到备库
  6. 把新主库设置为 RW
  7. 老主库再次连接上后,kill 掉它上面的所有连接,保证应用流量都到备库,避免 DNS 等 catch 功能导致的切换不干净
  8. 老主库再次连接上后,把它设置为 RO
  9. 老主库恢复后,进行故障恢复:
    • 修复数据:切花前备库往往存在一点延迟,根据记录的位点,从老主库 binlog 提取数据,来修复新主库
    • 修复复制:重新启动复制后,往往会出现主键冲突,需要谨慎对比和修复数据,不能盲目 skip 复制的错误
故障转移程序依赖的数据
  1. 主备关系和实时状态
  2. 故障转移黑名单
  3. 每个实例的故障转移类型:中间件、DNS、VIP
  4. 每种故障转移类型的切换接口
  5. 每个实例的故障转移级别:遇到哪一种类型的故障(探测结果)进行切换
MHA 介绍
  • 架构
    • Manager 单点部署
    • Node 随 MySQL 实例部署
IP 角色
192.168.1.200 Manager
192.168.1.201 Node
192.168.1.202 Node
192.168.1.203 Node

在这里插入图片描述

  • 功能简介

    • 一主多备情况下 Master 自动监控和快速故障转移(9-12s)。
    • 在线切换 Master 到不同主机,在替换 raid 控制器、提升 master 机器硬件等等情况下。
    • Master crash 不会导致主从数据不一致性,MHA 自动识别 slave 间 relay log events 的不同,然后应用与不同的slave,最终所有 slave 都同步。
    • 适用任何存储引擎。
  • MHA 的实施步骤

    • 从 Down 的主上面获取到 Binlog 事件
    • 确定最新(最全)的从库(比较Master_Log_File,Read_Master_Log_Pos)
    • 分别应用不同的relay log事件到其他从库
    • 应用从主库上获取的binlog事件(发生故障时的事件)
    • 提升一个从库为新的主库(此时从库已经一致)
    • 将其他从库的主库重新指定
  • 主库探测逻辑

    • 支持 masterha_secondary_check ,通过配置另外一个机器(remote_host1)作为跳板探测 Master,Manager-(A)->remote_host1-(B)->Master_host。B 探测失败才会执行 FO。
    • 两种探测方式可选: ping_connect/ping_select,默认为 select,间隔默认是 3 秒,失败 3 次(代码写死的)则认为 master_down 。
  • Node Fencing,用户可以自己实现一个 shutdown_script,设置配置文件后 MHA 会自动调用

  • 功能限制

    • 不支持多级复制 M->M->S
    • 保留中继日志,需要定期清理
    • 支持最大集群数 100 左右
    • MHA Manager 本身是单点(可结合 Keepalived 实现高可用)
参考文档

《高性能 MySQL》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL 故障转移 的相关文章

  • 如何从shell脚本自动登录MySQL?

    我有一个 MySQL 服务器 其中有一个用户和密码 我想在 shell 脚本中执行一些 SQL 查询而不指定密码 如下所示 config sh MYSQL ROOT root MYSQL PASS password mysql sh sou
  • 在 C# 中,当有人插入、删除或修改记录时,如何从 MySQL 获取事件?

    我正在 WPF Net 中开发一个程序 我需要知道何时有人对数据库的任何表进行更改 这个想法是在数据库发生更改时从数据库接收一个事件 我读了很多文章 但找不到解决我的问题的方法 亲切的问候 最好的解决方案是使用消息队列 在您的应用程序向数据
  • MySQL - 从临时表插入

    这看起来非常简单 但我坚持使用简单的插入语句 见下文 begin work CREATE TEMPORARY TABLE IF NOT EXISTS insert table AS select r resource id fr file
  • 如何优化这个MySQL慢(非常慢)查询?

    我有一个 2 GB 的 mysql 表 包含 500k 行 我在没有负载的系统上运行以下查询 select from mytable where name in n1 n2 n3 n4 bunch more order by salary
  • MySql 5.7 ORDER BY 子句不在 GROUP BY 子句中并且包含非聚合列

    我试图在不禁用 my ini 中的 only full group by 的情况下弄清楚 这是我的查询 SELECT p title COUNT t qty AS total FROM payments t LEFT JOIN produc
  • MySQL 8 用逗号分割字符串并将其转换为JSON ARRAY

    我有以下字符串 a b c d 我想将它转换成一个 json 数组 像这样 a b c d MySQL 8 有什么函数可以实现这个功能吗 Try SELECT CAST CONCAT REPLACE a b c d AS JSON See
  • mysql转储到derby

    我正在使用 derby 在 eclipse 中进行开发 是否可以从 MySQL 转储表并以某种方式将其用于 derby 我知道 ddl 和 dml 对于两个 dbms 来说是不同的 但我正在寻找一种除了转储 导出之外的合适方法 我可以找到两
  • PHP MYSQL文件内容转义问题

    我正在尝试使用 php 将 pdf 文件上传到 mysql 数据库中 除了文件内容之外 一切都很好 无论我如何尝试转义特殊字符 查询总是失败 主要是 未知命令 n 我使用过addslashes mysql real escape strin
  • PHP PDO 使用 bindParam 第一个参数(不带冒号)[重复]

    这个问题在这里已经有答案了 请检查这个 user id int GET user id sql DELETE FROM users WHERE user id user id query db gt prepare sql query gt
  • 无法在 Mac 上启动 MySQL

    使用 Brew 安装后 我无法运行 MySQL 我使用的是 OS X El Capitan 版本 10 11 3 和 MySQL Server 版本 5 7 11 当我启动服务器时 我收到 启动 MySQL 错误 服务器退出而不更新 PID
  • 如何在 MySQL 中测试 Select for Update

    我正在表演SELECT FOR UPDATE或 InnoDB 表的行级锁定 我的目的是只有一个请求可以读取同一行 因此 如果两个用户同时请求相同的数据 其中只有一个人获取数据 即第一个触发查询的人 但是我如何测试锁定是否已放置 因为我正在通
  • mysql 中的二进制、十六进制和八进制值

    我对在 mysql 数据库中使用二进制 十六进制和八进制系统非常感兴趣 首先 请给我一个建议 为什么我们在存储信息时需要它们 因为信息太多 或者为什么 另外 哪种类型的值必须存储在标记系统中 另外这里还有像 这是例子 gt SELECT 5
  • 让登录更安全

    我已使用此代码进行管理员登录 仅当用户输入正确的用户名和密码时才应打开loginhome php 但后来我意识到这根本不安全 任何人都可以直接访问 mywebsite loginhome php 而无需登录 注销后 可以使用后退按钮打开 l
  • PHP MySql 百分比

    我的问题是关于百分比 我不是专家 所以我会尽力以更好的方式进行解释 我的 mysql 服务器中有一个表 假设有 700 条记录 如下所示 Name country language Birth Lucy UK EN 1980 Mari Ca
  • 如何在MYSQL中将整个字符串小写并保持第一个大写[重复]

    这个问题在这里已经有答案了 我的表栏目 我预期的输出会在列中发生变化 Smith Allen Doyle Dennis Baker Waker 这是我尝试过的 但不起作用 UPDATE TABLE employee SET last nam
  • 在 SQL 中,如何从 SELECT * FROM ... 中排除结果?

    我知道我的标题不太具有描述性 让我在这里详细解释一下 假设一个表有 26 个字段 例如字段 a 字段 z 我只想要一个选择查询只返回 15 个字段 所以 通常 我会执行 SELECT field a field b field o FROM
  • 获取带有计数的不同记录

    我有一张桌子personid and msg列 personid msg 1 msg1 2 msg2 2 msg3 3 msg4 1 msg2 我想得到总计msg对于每个personid 我正在尝试这个查询 select distinct
  • mysql自动存储记录创建时间戳

    mysql 有什么方法可以在创建记录时自动将时间戳存储在记录行中 我试图使用时间戳 数据类型 和 current timestamp 作为默认值 但后来意识到每次更新记录时都会更新 我只需要一些可以存储创建时间戳的东西 Thanks Set
  • Mysql插入表后不显示右单引号(’)

    我有一个名为 测试 的表 我插入了一行 其中包含unicode字符右单引号 0x2019在名称字段中 SQL insert into Testing values Sno Name Address insert into Testing v
  • post php mysql 的拆分关键字

    我有一个表存储帖子 ID 它的标签如下 Post id Tags 1 keyword1 keyword2 keyword3 我想循环遍历该表中的每一行并执行以下操作 将关键字1 关键字2 关键字3放入新表中 word id word val

随机推荐

  • 【解决】NullReferenceException: Object reference not set to an instance of an object

    游戏引擎 Unity 版本 2019 4 6f1 2017版本以上均可 编译平台 Visual Studio 2019 一 问题描述 描述 原 文 报错 NullReferenceException Object reference not
  • IT云运维技术分享

    1 运维体系 1 1 市场对运维的需求 时代发展到今天 社会的生活方式与生产方式的全面的数字化 无论是传统企业还是互联网企业 都在全面上云 这也意味着企业的关键业务乃至 身家性命 都已经全部放在 IT 系统之上 因此企业需要系统足够稳定可靠
  • python37-32_python37.dll文件 免费版

    python37 dll文件是一款非常重要的系统文件 你还在为python37 dll文件缺失出错而苦恼吗 小编推荐你使用这款软件 它可以帮助大家修复因为缺失python37 dll引起的一场和报错 只需要在本站下载压缩包解压后安装在指定文
  • 神经网络-Unet网络

    文章目录 前言 1 seq2seq 编码后解码 2 网络结构 3 特征融合 4 前言 Unet用来做小目标语义分割 优点 网络结构非常简单 大纲目录 2016年特别火 在细胞领域做分割特别好 1 seq2seq 编码后解码 2 网络结构 几
  • H - Hiking trip Gym - 103577H

    题目链接 题意 题意很简单就是模拟一个过程 但是模拟很复杂错了很多次 下面是AC代码 include
  • Unity脚本开发基础

    1 打开工程 Assets中新建文件夹Scripts 在文件夹中右键Create C 创建完毕 双击脚本 打开IDE 注意 类名和脚本名要是一样的 Start函数 在其中的内容会在一开始就被执行 所以一些需要初始化的变量写在其中 Updat
  • GitLab 与 SourceTree的结合使用

    这里写自定义目录标题 为公司分配的GitLab账号 重置密码 为GitLab添加公钥 第一步 创建ssh 第二部 为GitLab添加ssh 下载sourcetree 这里我们点击Bitbucket进行授权登陆 不登陆安装工具会很慢还有可能出
  • MySQL数据库的介绍

    数据库简介 数据库指的是长期存在计算机内 有组织 可共享 大量数据的集合 数据是按照特定的数据模型来组织 存储在数据库中 数据库的好处 1 持久化数据到本地 2 可以实现结构化查询 方便管理 数据库相关概念 DB database 数据库
  • 第二天(八)osg::Object* readObjectFile(const std::string& filename,const ReaderWriter::Options* options)

    目前流程是 osgViewer viewBase frame viewerInit 创建帧事件 并将漫游器与事件和视口相关联 gt osgViewer Viewer ViewerInit gt osgViewer View Init gt
  • whatweb

    Whatweb介绍 Whatweb是一个基于Ruby语言的开源网站指纹识别软件 正如它的名字一样 whatweb能够识别各种关于网站的详细信息包括 CMS类型 博客平台 中间件 web框架模块 网站服务器 脚本类型 JavaScript库
  • flutter 创建插件遇到的两个问题,一:右键Flutter菜单不可用,二:可用后,iOS工程打开没有pods目录。

    今天研究flutter 插件 按照教程 通过android studio 创建 flutter 插件 创建完成后 点击工程右键 弹出菜单中Flutter 项目为灰色 不可用 升级flutter AndroidStudio都未解决 flutt
  • 人工智能数学基础--概率与统计10:离散随机变量的概率函数及常见的二项分布、泊松分布

    一 离散随机变量的概率函数及分布函数 设X为离散随机变量 其全部可能取值为 a1 a2 则 pi P X ai i 1 2 称为X的概率函数 也称为随机变量X的概率分布 设X为随机变量 包括离散和非离散 则函数 P X x F x lt x
  • Google Analytics 统计用户点击和每个页面浏览的用户id

  • python - write() argument must be str, not bytes

    python write argument must be str not bytes 源代码 import requests r requests get https www baidu com img bd logo1 png if r
  • 【满分】【华为OD机试真题2023B卷 JS】计算误码率

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 计算误码率 知识点双指针 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 误码率是最常用的数据通信传输质量指标 它可以理解为 在多少位数据中出现一位差错 移动通信网络中
  • Python进阶语法(一)

    目录 一 Python列表推导式 1 1 使用方法 1 2 列表推导式优点 1 2 1 提升效率 1 2 2 方便转换数据 1 2 3 用于过滤数据 1 3 推广延申 1 3 1 字典推导式 1 3 2 元组推导式 1 3 3 集合推导式
  • Phpstorm好用插件

    IDE Eval Reset 无限次免费刷新30天试用期 插件市场安装 在Settings Preferences gt Plugins 内手动添加第三方插件仓库地址 https plugins zhile io 搜索 IDE Eval R
  • Mybatis 向MySql数据库插入带有日期类型字段的数据

    未验证 我们的实体类里面一个字段的日期类型是util Date 在向数据库插入该实体时会报错 说是 日期哪个字段 Data truncation 所以需要做些更改 在mybatis的MAPPER映射文件中对插入的日期进行相应属性的设置
  • java语言StringUtils工具类

    import com mls util tool codec EncodeUtils import com mls util tool collect ListUtils import org apache commons lang3 St
  • MySQL 故障转移

    在高可用领域 除了通过规范化运维和软硬件优化 提升平均失效时间 MTBF 降低平均恢复时间 MTTR 也非常关键 本文主要讲述的内容是其中的故障转移和故障恢复部分 文章目录 降低平均恢复时间 MTTR 故障探测 I 探测方法 II 探测结果