翻译:MySQL InnoDB Cluster - Navigating the Cluster

这篇具有很好参考价值的文章主要介绍了翻译:MySQL InnoDB Cluster - Navigating the Cluster。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文是对这篇文章MySQL InnoDB Cluster - Navigating the Cluster[1]的翻译,翻译如有不当的地方,敬请谅解,请尊重原创和翻译劳动成果,转载的时候请注明出处。谢谢!

当我们管理InnoDB Cluster时,一件非常重要的事情就是了解集群处于什么样的状态,特别是要了解如何解释集群状态的报告,以及如何从各种具体失败的故障场景中恢复。

组复制成员状态

组成员所处的状态取决于您是直接查询该成员还是通过其他成员间接查询该成员。

成员本身可见的状态:

OFFLINE
RECOVERING
ERROR
ONLINE

对其他成员可见的状态:

RECOVERING
UNREACHABLE
ONLINE

当MySQL实例正在运行但是其尚未加入任何组时,它就处于OFFLINE的状态。一旦它加入一个组后,MySQL实例与该组的其它节点/成员同步数据时,它将切换为RECOVERING。一旦数据同步恢复完成(分布式恢复完成),它最终切换到ONLINE状态. 如果数据同步由于某些原因失败时,节点则会切换到ERROR状态.

如果一个ONLINE的成员停止响应其他成员时(因为MySQL实例崩溃、网络问题、极高的负载、超时等),其状态将切换为UNREACHABLE。如果该UNREACHABLE成员在超时之前没有恢复,它将被其它成员从组中剔除/驱逐,因此在命令cluster.status()的输出中状态显示为MISSING。驱逐成员的过程是通过投票完成的,因此只有在有足够的成员并达到法定人数的情况下才会发生。

翻译:MySQL InnoDB Cluster - Navigating the Cluster

组或副本集状态

下图概述了组呈现的可能状态以及状态转换是如何发生的。

实线过渡线显示您可以在每种状态下执行的 MySQL Shell 命令,而虚线则是在我们控制之外触发的事件。

为了减少混乱,图中省略了一些可能性。例如,只要有法定人数,您就可以在任何状态下执行大多数命令,例如addInstance()或rejoinInstance()命令

cluster.status()命令显示的组状态信息:

OK               –当所有成员都属于ONLINE状态并且有足够的冗余来容忍至少一个节点故障时显示。
OK_PARTIAL       –当一个或多个成员不可用,但仍有足够的冗余来容忍至少一个节点故障时。
OK_NO_TOLERANCE  –当有足够的ONLINE成员达到法定人数,但没有冗余节点时。两个成员组成的团体没有冗余,因为如果其中一个成员变成了UNREACHABLE,另一个成员就无法单独形成大多数;
                    这意味着您将遇到数据库中断(database outage)情况。但与单个成员组不同的是,至少您的数据在至少一个节点上仍然是安全的。
NO_QUORUM        – 一个或多个成员可能仍然是ONLINE,但不能达到法定人数。在此状态下,您的集群不能写入,因此无法执行事务。但是,只读查询仍然可以执行,并且您的数据是完整且安全的。
UNKNOWN          – 如果您从一个不是ONLINE或RECOVERING状态的实例执行命令status()时,则会显示此状态。在这种情况下,请尝试连接到其他成员。 
UNAVAILABLE      – 该状态在图中显示,但不会出现在cluster.status()命令显示中。在这种状态下,该组的所有成员都是OFFLINE。他们可能仍在运行,但他们不再是该集群的一部分。例如,如果所有成员重新启动而没有重新加入集群,则可能会发生这种情况。
翻译:MySQL InnoDB Cluster - Navigating the Cluster

InnoDB集群的状态转换图。(PDF版[2]

组分区

一种特殊场景是组分区,虽然这种情况很少见,但可能会造成混乱,有时甚至很危险,即组的成员实际上分为2个组或多个组。例如,如果您的成员位于不同的网络中并且他们之间的通信中断,则可能会发生这种情况。在这种情况下,所有成员都是ONLINE,但一个组的成员将被另一个组成员视为UNREACHABLE,反之亦然。由于需要多数,只有一个组(最多一个组)能够接收数据更新,从而保持数据库的一致性。

但是,当使用cluster.forceQuorumUsingPartitionOf()命令时,就像下面所解释的那样,您必须小心,不要让组成员处于这种情况。如果遇到这种情况,您可能会创建2个单独的组来分别接收更新,这将导致您的数据库独立处理事务并使其处于不一致的状态。

翻译:MySQL InnoDB Cluster - Navigating the Cluster
           5个成员全部ONLINE
翻译:MySQL InnoDB Cluster - Navigating the Cluster
           5人成员分裂为两组

从失败中恢复

以下场景是发生故障时可能遇到的一些最常见情况。我们解释了如何识别它们以及如何在MySQL Shell中使用InnoDB Cluster API 来恢复它们。

服务器重新启动

如果mysqld 由于任何原因(实例崩溃、预期重启、重新配置等)重新启动,那么当它恢复时,它将不再位于该组/集群中。它需要重新加入它,这在某些情况下可能必须手动完成。为此,您可以使用cluster.rejoinInstance()命令将MySQL实例加入回组中。它用的参数是MySQL实例的URI。

示例:

cluster.rejoinInstance("root@192.168.1.50")

失去法定人数

如果副本集的大量成员变成UNREACHABLE,以至于它不再拥有多数成员,则它将不再拥有法定人数,并且无法对任何更改做出决定。这包括用户事务,还包括组拓扑的更改。这意味着,即使成员从UNREACHABLE状态恢复了, 该成员依然被阻止,无法重新加入该群组。

要从这种情况中恢复,我们必须首先取消该组(unblock the group),方法是将其重新配置,仅考虑当前ONLINE的成员并忽略所有其他成员。为此,用cluster.forceQuorumUsingPartitionOf()这个命令 传入复制集中中一个ONLINE的成员的URL作为参数。所有可见的ONLINE成员都将添加到重新定义的组中。

请注意,这个命令是一个危险的命令。如上所述,如果您的组中碰巧有一个分区,您可能会意外地出现裂脑,这将导致数据库不一致。在使用此命令之前,请确保所有成员都是UNREACHABLE,并且状态为OFFLINE。

例子: cluster.forceQuorumUsingPartitionOf("root@192.168.1.30")

所有成员OFFLINE

cluster.forceQuorumUsingPartitionOf()命令要求至少有一个实例一直处于ONLINE并且属于该组。如果不知何故,您的所有成员都是OFFLINE状态,则只有从单个种子成员中再次“引导”该组,您才能恢复该组。要执行此操作,您需要在选中的种子实例上使用命令dba.restoreFromCompleteOutage(),然后在剩余成员上使用命令rejoinInstance(),直到集群完全恢复为止。

注意:此命令从 MySQL Shell 1.0.7 开始可用。

结论

MySQL InnoDB Cluster意在为拥有不同知识和经验水平的 MySQL 用户提供高可用性。虽然cluster.status()命令可以让您一目了然地监控集群的状态,但如何了解原理非常重要,这样您就知道何时需要该采取哪些措施来确保 MySQL 数据库保持最佳运行状态。

参考资料

[1]

1: https://dev.mysql.com/blog-archive/mysql-innodb-cluster-navigating-the-cluster/,

[2]

pdf: https://dev.mysql.com/blog-archive/mysqlserverteam/wp-content/uploads/2016/12/AvailabilityStateMachine.pdf文章来源地址https://www.toymoban.com/news/detail-746954.html

到了这里,关于翻译:MySQL InnoDB Cluster - Navigating the Cluster的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [翻译]——How the MySQL Optimizer Calculates the Cost of a Query (Doc ID 1327497.1)

    本文是对这篇文章 How the MySQL Optimizer Calculates the Cost of a Query (Doc ID 1327497.1) [1] 的翻译,翻译如有不当的地方,敬请谅解,请尊重原创和翻译劳动成果,转载的时候请注明出处。谢谢! MySQL 4.0 及后续更高的版本 本文档中的内容适用于任何平台。 了解 MySQL 优化器如何计算SQL语

    2024年02月05日
    浏览(48)
  • How to fix the limit of 1000 shards per cluster in ES

    Let’s first take a look at the error message in the console. The error message you’re seeing indicates that the maximum number of shards allowed in your Elasticsearch cluster has been reached. By default, Elasticsearch has a limit of 1000 shards per cluster. To fix this error, you have a few options: Increase the maximum number of shards: You can increas

    2024年02月03日
    浏览(69)
  • K8s in Action 阅读笔记——【14】Securing cluster nodes and the network

    迄今为止,创建了 Pod 而不考虑它们允许消耗多少 CPU 和内存。但是,正如将在本章中看到的那样,设置 Pod 预期消耗和允许消耗的最大数量是任何 Pod 定义的重要部分。设置这两组参数可以确保 Pod 只占用 Kubernetes 集群提供的资源中的份额,并且还影响 Pod 在集群中的调度方式

    2024年02月08日
    浏览(48)
  • K8s in Action 阅读笔记——【13】Securing cluster nodes and the network

    Pod中的容器通常在不同的Linux名称空间下运行,这使得它们的进程与其他容器或节点默认名称空间下运行的进程隔离开来。 例如,我们学习到每个Pod都拥有自己的IP和端口空间,因为它使用其自己的网络名称空间。同样,每个Pod也拥有自己的进程树,因为它有自己的PID名称空

    2024年02月11日
    浏览(48)
  • MySQL集群(mysql-cluster)

    系统环境:centos7 管理节点:192.168.127.128 数据节点:192.168.127.145,192.168.127.146 sql节点:192.168.127.145,192.168.127.146 创建mysql用户,将程序部署到/home/mysql 目录下 数据节点、sql节点必须卸载mariadb 管理节点 创建/var/lib/mysql/mysql-cluster 目录,且mysql账户有读写权限 /home/mysql目录下创

    2024年02月11日
    浏览(31)
  • MySQL—MySQL的存储引擎之InnoDB

    存储引擎 说明 MyISAM 高速引擎,拥有较高的插入,查询速度,但不支持事务 InnoDB 5.5版本后MySQL的默认数据库存储引擎,支持事务和行级锁,比MyISAM处理速度稍慢 ISAM MyISAM的前身,MySQL5.0以后不再默认安装 MRG_MyISAM 将多个表联合成一个表使用,在超大规模数据存储时很有用 Me

    2024年04月26日
    浏览(44)
  • MySQL — InnoDB 锁

    加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。 在InnoDB中,使用了多种类型的锁: 共

    2024年02月14日
    浏览(39)
  • MySQL — InnoDB介绍

    InnoDB是一款兼顾高可靠性和高性能的通用存储引擎。也是默认的MySQL存储引擎。 它的DML操作遵循ACID模型,事务具有提交、回滚和崩溃恢复功能,以保护用户数据。 行级锁定和oracle风格的一致性读取提高了多用户并发性和性能。 InnoDB表在磁盘上排列数据,以优化基于主键的查

    2024年02月14日
    浏览(43)
  • MySQL监控Innodb信息

    Innodb由于支持事务操作,是mysql中使用最多的存储引擎,所以如何监控Innodb存储引擎以进行性能优化是在使用mysql过程中遇到最多的,那么如何进行监控呢? show engine show status 通过查看日志文件 缓冲池信息 缓冲池是Innodb缓存频繁访问数据的地方,对缓冲池内数据的任何更新也

    2024年02月20日
    浏览(43)
  • MySQL架构 & InnoDB存储引擎

    我们在开发的时候,我们都需要对业务数据进行存储,这个时候,你们就会用到MySQL 、O racal 等数据库。 MySQL它是一个关系型数据库, 这种关系型数据库就有Oracal 、 MySQL,以及最近很火的PgSQL 等。 那什么是关系型数据库呢? 就是它是 基于我们的SQL语句去执行操作的 。 其实

    2024年02月07日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包