20.9.2 组复制状态变量
原文:
dev.mysql.com/doc/refman/8.0/en/group-replication-status-variables.html
MySQL 8.0 支持一个提供有关组复制信息的状态变量。该变量在此处描述:
group_replication_primary_member
在单主模式下运行时显示主成员的 UUID。如果组在多主模式下运行,则显示空字符串。
警告group_replication_primary_member
状态变量已被弃用,并计划在将来的版本中删除。
查看第 20.1.3.1.2 节,“查找主”。
20.10 常见问题
原文:
dev.mysql.com/doc/refman/8.0/en/group-replication-frequently-asked-questions.html
本节提供了常见问题的答案。
一个组中 MySQL 服务器的最大数量是多少?
一个组最多可以由 9 台服务器组成。尝试向具有 9 个成员的组添加另一台服务器会导致加入请求被拒绝。这个限制是通过测试和基准测试确定的,是一个安全边界,在稳定的本地区域网络上组表现可靠。
组中的服务器是如何连接的?
组中的服务器通过打开对等 TCP 连接连接到组中的其他服务器。这些连接仅用于组内通信和服务器之间的消息传递。此地址由group_replication_local_address
变量配置。
group_replication_bootstrap_group
选项用于什么目的?
引导标志指示成员创建一个组并充当初始种子服务器。加入组的第二个成员需要请求引导组的成员动态更改配置,以便将其添加到组中。
成员需要在两种情况下引导组。当组最初创建时,或者当关闭并重新启动整个组时。
如何为分布式恢复过程设置凭据?
您可以将用户凭据永久设置为group_replication_recovery
通道的凭据,使用CHANGE REPLICATION SOURCE TO
语句(从 MySQL 8.0.23 开始)或CHANGE MASTER TO
语句(MySQL 8.0.23 之前)。另外,从 MySQL 8.0.21 开始,您可以在每次启动 Group Replication 时在START GROUP_REPLICATION
语句中指定它们。
使用CHANGE REPLICATION SOURCE TO
| CHANGE MASTER TO
设置的用户凭据以明文形式存储在服务器上的复制元数据存储库中,但在START GROUP_REPLICATION
中指定的用户凭据仅保存在内存中,并且通过STOP GROUP_REPLICATION
语句或服务器关闭时会被删除。因此,使用START GROUP_REPLICATION
指定用户凭据有助于保护组复制服务器免受未经授权的访问。但是,此方法与通过group_replication_start_on_boot
系统变量指定自动启动组复制不兼容。有关更多信息,请参见 Section 20.6.3.1, “Secure User Credentials for Distributed Recovery”。
我可以使用组复制来扩展我的写入负载吗?
不直接,但 MySQL 组复制是一种共享无内容完全复制解决方案,组中的所有服务器都复制相同数量的数据。因此,如果组中的一个成员将 N 字节写入存储作为事务提交操作的结果,那么其他成员上也大致会写入 N 字节到存储,因为事务在所有地方都被复制。
然而,由于其他成员不必像原始成员在最初执行事务时那样进行相同数量的处理,他们会更快地应用更改。事务以仅用于应用行转换的格式进行复制,而无需重新执行事务(基于行的格式)。
此外,由于更改以基于行的格式传播和应用,这意味着它们以优化和紧凑的格式接收,并且与原始成员相比,可能减少所需的 IO 操作次数。
总结一下,您可以通过将无冲突的事务分布到组中的不同成员来扩展处理能力。您可以很可能扩展出小部分 IO 操作,因为远程服务器只接收读取-修改-写入到稳定存储的必要更改。
与简单复制相比,组复制是否需要更多的网络带宽和 CPU,在相同的工作负载下?
由于服务器需要不断相互交互以进行同步,因此预计会有一些额外负载。很难量化需要多少数据。这也取决于组的大小(三台服务器对带宽需求的压力比九台服务器少)。
内存和 CPU 占用也更大,因为服务器同步部分和组消息传递需要执行更复杂的工作。
我可以在广域网上部署组复制吗?
是的,但是每个成员之间的网络连接 必须 是可靠的,并且具有适当的性能。低延迟、高带宽的网络连接是实现最佳性能的要求。
如果仅网络带宽是问题,那么可以使用 第 20.7.4 节,“消息压缩” 来降低所需的带宽。然而,如果网络丢包导致重传和更高的端到端延迟,吞吐量和延迟都会受到负面影响。
警告
当任何组成员之间的网络往返时间(RTT)为 5 秒或更长时,您可能会遇到问题,因为内置的故障检测机制可能会错误地触发。
在临时连接问题的情况下,成员是否会自动重新加入组?
这取决于连接问题的原因。如果连接问题是暂时的,并且重新连接足够快以至于故障检测器没有意识到它,那么服务器可能不会从组中移除。如果是一个“长期”的连接问题,那么故障检测器最终会怀疑存在问题,并将服务器从组中移除。
从 MySQL 8.0 开始,有两个设置可用于增加成员保持在组中或重新加入组的机会:
group_replication_member_expel_timeout
增加了在创建怀疑(在初始 5 秒检测期之后发生)和将成员驱逐之间的时间。您可以设置最多 1 小时的等待时间。从 MySQL 8.0.21 开始,默认设置为 5 秒的等待时间。group_replication_autorejoin_tries
使成员在被驱逐或不可达的大多数超时后尝试重新加入组。成员将按照指定的次数间隔五分钟进行自动重新加入尝试。从 MySQL 8.0.21 开始,默认情况下激活此功能,并且成员进行三次自动重新加入尝试。
如果服务器被从组中驱逐,并且任何自动重新加入尝试都不成功,您需要手动重新加入它。换句话说,当服务器被明确从组中移除后,您需要手动重新加入它(或者有一个脚本自动执行)。
什么时候会将成员从组中排除?
如果成员变得沉默,其他成员将其从组配置中移除。实际上,当成员崩溃或存在网络断开时可能会发生这种情况。
在给定成员经过一定超时后检测到故障,并创建一个不包含静默成员的新配置。
当一个节点明显滞后时会发生什么?
没有一种方法可以自动定义何时从组中自动驱逐成员的策略。您需要找出为什么成员滞后并解决问题,或将该成员从组中移除。否则,如果服务器太慢以至于触发流量控制,那么整个组也会减速。流量控制可以根据您的需求进行配置。
在怀疑组内出现问题时,是否有特定成员负责触发重新配置?
不,组内没有特定成员负责触发重新配置。
任何成员都可以怀疑存在问题。所有成员需要(自动)同意某个成员已经失败。一个成员负责将其从组中驱逐,触发重新配置。负责驱逐成员的成员不是您可以控制或设置的。
我可以将 Group Replication 用于分片吗?
Group Replication 旨在提供高可用性的副本集;数据和写入在组内的每个成员上都会复制。为了扩展超出单个系统所能提供的范围,您需要围绕多个 Group Replication 集构建编排和分片框架,其中每个副本集维护和管理总数据集的给定分片或分区。这种设置通常称为“分片集群”,允许您线性扩展读取和写入,而且没有限制。
如何在使用 SELinux 时使用 Group Replication?
如果启用了 SELinux,您可以使用 sestatus -v 进行验证,然后需要启用 Group Replication 通信端口的使用。请参阅 为 Group Replication 设置 TCP 端口上下文。
如何在使用 iptables 时使用 Group Replication?
如果启用了 iptables,那么您需要为机器之间的通信打开 Group Replication 端口。要查看每台机器上当前的规则,请执行 iptables -L。假设配置的端口是 33061,在必要端口上启用通信,请执行 iptables -A INPUT -p tcp --dport 33061 -j ACCEPT。
如何恢复由组成员使用的复制通道的中继日志?
Group Replication 使用的复制通道的行为方式与异步源到副本复制中使用的复制通道相同,因此依赖于中继日志。在更改relay_log
变量或主机名更改时,可能会出现错误。请参阅 Section 19.2.4.1, “The Relay Log”以了解在此情况下的恢复过程。另外,在 Group Replication 中专门解决此问题的另一种方法是发出STOP GROUP_REPLICATION
语句,然后发出START GROUP_REPLICATION
语句重新启动实例。Group Replication 插件会再次创建group_replication_applier
通道。
Group Replication 为什么使用两个绑定地址?
Group Replication 使用两个绑定地址,以便在 SQL 地址(客户端用于与成员通信的地址)和group_replication_local_address
之间分割网络流量,成员内部使用该地址进行通信。例如,假设一个服务器有两个网络接口分配给网络地址203.0.113.1
和198.51.100.179
。在这种情况下,您可以通过设置group_replication_local_address=203.0.113.1:33061
来使用203.0.113.1:33061
作为内部组网络地址。然后您可以使用198.51.100.179
作为hostname
,3306
作为port
。客户端 SQL 应用程序将连接到198.51.100.179:3306
的成员。这使您可以在不同网络上配置不同的规则。同样,内部组通信可以与用于客户端应用程序的网络连接分开,以增加安全性。
Group Replication 如何使用网络地址和主机名?
Group Replication 使用成员之间的网络连接,因此其功能直接受到主机名和端口配置的影响。例如,Group Replication 的分布式恢复过程使用服务器的主机名和端口创建到现有组成员的连接。当成员加入组时,它会接收组成员信息,使用在performance_schema.replication_group_members
中列出的网络地址信息。该表中列出的成员之一被选为从组到加入成员的缺失数据的捐赠者。
这意味着使用主机名配置的任何值,例如 SQL 网络地址或组种子地址,必须是完全合格的名称,并且每个组成员都可以解析。例如,您可以通过 DNS 或正确配置的/etc/hosts
文件或其他本地进程来确保这一点。如果您想在服务器上配置MEMBER_HOST
值,请在将其加入组之前使用服务器上的--report-host
选项指定。
重要
分配的值直接使用,不受skip_name_resolve
系统变量的影响。
要在服务器上配置MEMBER_PORT
,请使用report_port
系统变量指定。
为什么服务器上的自增设置发生了变化?
当在服务器上启动 Group Replication 时,auto_increment_increment
的值会更改为group_replication_auto_increment_increment
的值,默认为 7,并且auto_increment_offset
的值会更改为服务器 ID。当 Group Replication 停止时,更改会被还原。这些设置避免了在组成员上写入时选择重复的自增值,从而导致事务回滚。Group Replication 的默认自增值 7 代表可用值数量和复制组的允许最大大小(9 个成员)之间的平衡。
只有当auto_increment_increment
和auto_increment_offset
的值都已经被修改为默认值 1 时,更改才会生效并回滚。如果它们的值已经从默认值修改过,Group Replication 不会改变它们。从 MySQL 8.0 开始,当 Group Replication 处于单主模式时,系统变量也不会被修改,只有一个服务器进行写入。
如何找到主服务器?
如果组在单主模式下运行,找出哪个成员是主要的可能很有用。请参阅 Section 20.1.3.1.2, “Finding the Primary”
第二十一章 MySQL Shell
原文:
dev.mysql.com/doc/refman/8.0/en/mysql-shell-userguide.html
MySQL Shell 是用于 MySQL 服务器的高级客户端和代码编辑器。除了提供的 SQL 功能外,类似于mysql,MySQL Shell 还提供了 JavaScript 和 Python 的脚本功能,并包括用于与 MySQL 交互的 API。MySQL Shell 是一个可以单独安装的组件。
以下讨论简要描述了 MySQL Shell 的功能。有关更多信息,请参阅 MySQL Shell 手册,网址为dev.mysql.com/doc/mysql-shell/en/
。
MySQL Shell 包括以下用 JavaScript 和 Python 实现的 API,您可以使用这些 API 开发与 MySQL 交互的代码。
- 当 MySQL Shell 连接到 MySQL 服务器使用 X 协议时,X DevAPI 使开发人员能够同时处理关系型和文档数据。这使您可以将 MySQL 用作文档存储,有时被称为“使用 NoSQL”。有关更多信息,请参阅第二十二章,将 MySQL 用作文档存储。有关 X DevAPI 的概念和用法的文档,请参阅《X DevAPI 用户指南》。
- AdminAPI 使数据库管理员能够使用 InnoDB Cluster,为基于 InnoDB 的 MySQL 数据库提供了高可用性和可伸缩性的集成解决方案,而无需高级 MySQL 专业知识。AdminAPI 还包括对 InnoDB ReplicaSet 的支持,它使您能够以类似于 InnoDB Cluster 的方式管理运行异步 GTID 基于复制的一组 MySQL 实例。此外,AdminAPI 使 MySQL Router 的管理更加简单,包括与 InnoDB Cluster 和 InnoDB ReplicaSet 的集成。请参阅 MySQL AdminAPI。
MySQL Shell 有两个版本,社区版和商业版。社区版免费提供。商业版提供额外的企业功能,成本低廉。
第二十二章 使用 MySQL 作为文档存储
目录
22.1 MySQL 文档存储的接口
22.2 文档存储概念
22.3 JavaScript 快速入门指南:MySQL Shell 文档存储
22.3.1 MySQL Shell
22.3.2 下载并导入 world_x 数据库
22.3.3 文档和集合
22.3.4 关系表
22.3.5 表格中的文档
22.4 Python 快速入门指南:MySQL Shell 文档存储
22.4.1 MySQL Shell
22.4.2 下载并导入 world_x 数据库
22.4.3 文档和集合
22.4.4 关系表
22.4.5 表格中的文档
22.5 X 插件
22.5.1 检查 X 插件安装
22.5.2 禁用 X 插件
22.5.3 使用加密连接与 X 插件
22.5.4 使用 X 插件与缓存 SHA-2 认证插件
22.5.5 使用 X 插件进行连接压缩
22.5.6 X 插件选项和变量
22.5.7 监控 X 插件
本章介绍了一种与 MySQL 作为文档存储一起工作的替代方式,有时被称为“使用 NoSQL”。如果您打算以传统(SQL)方式使用 MySQL,那么本章可能与您无关。
传统上,诸如 MySQL 这样的关系型数据库通常要求在存储文档之前定义模式。本节描述的功能使您能够将 MySQL 用作文档存储,这是一种无模式、因此是模式灵活的文档存储系统。例如,当您创建描述产品的文档时,您无需知道和定义任何产品的所有可能属性,就可以存储和操作文档。这与在关系型数据库中工作并将产品存储在表中有所不同,因为在向数据库添加任何产品之前,必须知道和定义表的所有列。本章描述的功能使您能够选择如何配置 MySQL,仅使用文档存储模型,或将文档存储模型的灵活性与关系模型的强大功能结合起来。
要将 MySQL 用作文档存储,您需要使用以下服务器功能:
- X 插件使 MySQL 服务器能够使用 X 协议与客户端通信,这是将 MySQL 用作文档存储的先决条件。从 MySQL 8.0 开始,X 插件在 MySQL 服务器中默认启用。有关验证 X 插件安装、配置和监视的说明,请参阅第 22.5 节,“X 插件”。
- X 协议支持 CRUD 和 SQL 操作,通过 SASL 进行身份验证,允许流式传输(流水线处理)命令,并且在协议和消息层面是可扩展的。与 X 协议兼容的客户端包括 MySQL Shell 和 MySQL 8.0 连接器。
- 使用 X 协议与 MySQL 服务器通信的客户端可以使用 X DevAPI 来开发应用程序。X DevAPI 提供了一个现代的编程接口,设计简单而强大,支持已建立的行业标准概念。本章介绍如何在 MySQL Shell 中作为客户端使用 X DevAPI 的 JavaScript 或 Python 实现。详细教程请参阅 X DevAPI 用户指南。
22.1 MySQL 文档存储接口
原文:
dev.mysql.com/doc/refman/8.0/en/document-store-interfaces.html
要将 MySQL 作为文档存储使用,您需要使用专用组件和支持与 MySQL 服务器通信的客户端来开发基于文档的应用程序。
- 以下 MySQL 产品支持 X 协议,并允许您在选择的语言中使用 X DevAPI 开发与作为文档存储的 MySQL 服务器通信的应用程序:
- MySQL Shell(提供 JavaScript 和 Python 中 X DevAPI 的实现)
- Connector/C++
- Connector/J
- Connector/Node.js
- Connector/NET
- Connector/Python
- MySQL Shell 是一个交互式界面,支持 JavaScript、Python 或 SQL 模式的 MySQL。您可以使用 MySQL Shell 来原型应用程序,执行查询和更新数据。安装 MySQL Shell 包含下载和安装 MySQL Shell 的说明。
- 本章中的快速入门指南(教程)将帮助您开始使用 MySQL Shell 与 MySQL 作为文档存储。
JavaScript 的快速入门指南在这里:第 22.3 节,“JavaScript 快速入门指南:用于文档存储的 MySQL Shell”。
Python 的快速入门指南在这里:第 22.4 节,“Python 快速入门指南:用于文档存储的 MySQL Shell”。 - MySQL Shell 用户指南在 MySQL Shell 8.0 提供了关于配置和使用 MySQL Shell 的详细信息。
22.2 文档存储概念
原文:
dev.mysql.com/doc/refman/8.0/en/document-store-concepts.html
本节解释了在使用 MySQL 作为文档存储时引入的概念。
- JSON 文档
- 集合
- CRUD 操作
JSON 文档
JSON 文档是由键值对组成的数据结构,是使用 MySQL 作为文档存储的基本结构。例如,world_x 模式(本章后面安装)包含这个文档:
{ "GNP": 4834, "_id": "00005de917d80000000000000023", "Code": "BWA", "Name": "Botswana", "IndepYear": 1966, "geography": { "Region": "Southern Africa", "Continent": "Africa", "SurfaceArea": 581730 }, "government": { "HeadOfState": "Festus G. Mogae", "GovernmentForm": "Republic" }, "demographics": { "Population": 1622000, "LifeExpectancy": 39.29999923706055 } }
这份文档显示,键的值可以是简单的数据类型,比如整数或字符串,也可以包含其他文档、数组和文档列表。例如,geography
键的值由多个键值对组成。JSON 文档在 MySQL 中内部表示为二进制 JSON 对象,通过JSON
MySQL 数据类型。
文档与传统关系数据库中的表格之间最重要的区别在于,文档的结构不需要提前定义,并且一个集合可以包含具有不同结构的多个文档。另一方面,关系表要求定义其结构,并且表中的所有行必须包含相同的列。
集合
集合是用于在 MySQL 数据库中存储 JSON 文档的容器。应用程序通常针对文档集合运行操作,例如查找特定文档。
CRUD 操作
可以针对集合执行的四个基本操作是创建(Create)、读取(Read)、更新(Update)和删除(Delete)(CRUD)。在 MySQL 中,这意味着:
- 创建一个新文档(插入或添加)
- 读取一个或多个文档(查询)
- 更新一个或多个文档
- 删除一个或多个文档
22.3 JavaScript 快速入门指南:用于文档存储的 MySQL Shell
原文:
dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-javascript.html
22.3.1 MySQL Shell
22.3.2 下载和导入 world_x 数据库
22.3.3 文档和集合
22.3.4 关系表
22.3.5 表中的文档
本快速入门指南提供了使用 MySQL Shell 与文档存储应用程序进行交互原型设计的指令。该指南包括以下主题:
- MySQL 功能、MySQL Shell 和
world_x
示例模式的介绍。 - 操作以管理集合和文档。
- 操作以管理关系表。
- 适用于表中文档的操作。
要按照这个快速入门指南,您需要安装了 X 插件的 MySQL 服务器,默认情况下在 8.0 中,并且使用 MySQL Shell 作为客户端。MySQL Shell 8.0 提供了关于 MySQL Shell 更深入的信息。文档存储使用 X DevAPI 访问,并且 MySQL Shell 在 JavaScript 和 Python 中都提供了这个 API。
相关信息
- MySQL Shell 8.0 提供了关于 MySQL Shell 更深入的信息。
- 有关本快速入门指南中使用的工具的更多信息,请参阅安装 MySQL Shell 和第 22.5 节,“X 插件”。
- X DevAPI 用户指南提供了更多使用 X DevAPI 开发使用文档存储的应用程序的示例。
- 还提供了一个 Python 快速入门指南。
22.3.1 MySQL Shell
原文:
dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-javascript-shell.html
本快速入门指南假定您对 MySQL Shell 有一定的了解。以下部分是一个高级概述,请参阅 MySQL Shell 文档以获取更多信息。MySQL Shell 是到 MySQL 服务器的统一脚本接口。它支持 JavaScript 和 Python 脚本。JavaScript 是默认处理模式。
启动 MySQL Shell
安装并启动 MySQL 服务器后,将 MySQL Shell 连接到服务器实例。您需要知道要连接的 MySQL 服务器实例的地址。要将实例用作文档存储,服务器实例必须安装 X 插件,并且您应该使用 X 协议连接到服务器。例如,要连接到默认 X 协议端口 33060 上的实例 ds1.example.com
,请使用网络字符串 *
user*@ds1.example.com:33060
。
提示
如果您使用经典的 MySQL 协议连接到实例,例如使用默认的port
3306,而不是mysqlx_port
,则无法使用本教程中展示的文档存储功能。例如,db
全局对象未被填充。要使用文档存储功能,请始终使用 X 协议连接。
如果 MySQL Shell 尚未运行,请打开一个终端窗口并输入:
mysqlsh *user*@ds1.example.com:33060/world_x
或者,如果 MySQL Shell 已在运行,请使用 \connect
命令输入:
\connect *user*@ds1.example.com:33060/world_x
您需要指定要将 MySQL Shell 连接到的 MySQL 服务器实例的地址。例如,在上一个示例中:
user
代表您的 MySQL 帐户的用户名。ds1.example.com
是运行 MySQL 的服务器实例的主机名。请将其替换为您用作文档存储的 MySQL 服务器实例的主机名。- 本会话的默认模式为
world_x
。有关设置world_x
模式的说明,请参见 Section 22.3.2, “下载和导入 world_x 数据库”。
有关更多信息,请参见 Section 6.2.5, “使用类似 URI 字符串或键值对连接到服务器”。
一旦 MySQL Shell 打开,mysql-js>
提示表示此会话的活动语言为 JavaScript。
mysql-js>
MySQL Shell 支持以下输入行编辑:
- 左箭头 和 右箭头 键在当前输入行内水平移动。
- 上箭头 和 下箭头 键在先前输入的行集中上下移动。
- Backspace 删除光标前的字符,输入新字符会在光标位置输入。
- Enter发送当前输入行到服务器。
获取 MySQL Shell 帮助
在命令解释器提示符处输入mysqlsh --help以获取命令行选项列表。
mysqlsh --help
在 MySQL Shell 提示符处输入\help
以获取可用命令及其描述列表。
mysql-js> \help
输入\help
后跟命令名称以获取有关单个 MySQL Shell 命令的详细帮助。例如,要查看\connect
命令的帮助,请输入:
mysql-js> \help \connect
退出 MySQL Shell
要退出 MySQL Shell,请输入以下命令:
mysql-js> \quit
相关信息
- 查看交互式代码执行以了解 MySQL Shell 中交互式代码执行的工作原理。
- 查看使用 MySQL Shell 入门以了解会话和连接选项。
MySQL8 中文参考(八十三)(2)https://developer.aliyun.com/article/1565956