当前位置:   article > 正文

MySQL InnoDB集群部署及管理全教程(一)_mysql innodb 安装详细教程

mysql innodb 安装详细教程

MySQL InnoDB 集群提供完整的高可用性 MySQL 的解决方案。通过使用MySQL Shell附带的AdminAPI,您可以轻松 配置和管理至少三个MySQL服务器的组 实例以充当 InnoDB 集群。

InnoDB 集群中的每个 MySQL 服务器实例都运行 MySQL 组复制,提供复制机制 InnoDB 集群中的数据,具有内置故障转移功能。管理接口 无需在 InnoDB 集群,但有关更多信息,请参阅组复制,其中解释了详细信息。从 MySQL 8.0.27,你也可以设置 InnoDB ClusterSet(参见第 8 章 MySQL InnoDB ClusterSet)来提供灾难 通过链接主数据库对 InnoDB 集群部署的容忍度 InnoDB 集群,其自身的一个或多个副本交替存在 位置,例如不同的数据中心。

MySQL 路由器可以自动 根据您部署的群集进行自我配置,连接客户端 应用程序对服务器实例透明。如果发生以下情况 群集重新配置的服务器实例意外故障 自然而然。在默认的单主模式下,一个 InnoDB 集群具有单个读写服务器实例 - 主要。多个辅助服务器实例是 主要。如果主数据库发生故障,则会自动升级辅助数据库 到主要角色。MySQL 路由器检测到这一点并转发客户端 新主数据库的应用程序。高级用户还可以配置 集群以具有多个主数据库。

下图显示了这些技术的工作原理概述 一起:

一、 InnoDB 集群要求

 在安装InnoDB Cluster的生产部署之前,请确保您打算使用的服务器实例满足以下要求。

  • InnoDB集群使用组复制,因此您的服务器实例必须满足相同的要求。请参阅组复制要求。AdminAPI提供dba.checkInstanceConfiguration()方法来验证实例是否满足组复制要求,并提供dba.configureInstance()方法以配置实例以满足要求。
  • 用于Group Replication的数据,以及用于InnoDB Cluster的数据,必须存储在InnoDB事务存储引擎中。使用其他存储引擎(包括临时MEMORY存储引擎)可能会导致组复制出错。在将实例与Group Replication和InnoDB Cluster一起使用之前,请将其他存储引擎中的任何表转换为使用InnoDB。您可以通过在服务器实例上设置disabled_storage_engines系统变量来防止使用其他存储引擎,例如:
    disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
  • 设置群集时,任何服务器实例上都不得有入站复制通道。在正在采用的复制组上允许由组复制自动创建的通道(Group_Replication_applier和Group_replification_recovery)。InnoDB Cluster不支持使用AdminAPI管理的异步复制通道之外的手动配置异步复制通道。如果您正在将现有的复制拓扑迁移到InnoDB Cluster部署,并且在设置过程中需要临时跳过此验证,则可以在创建集群时使用force选项来绕过它。 
  • group_replication_tls_source不能设置为mysql_admin。
  • 必须在任何要与InnoDB Cluster一起使用的实例上启用性能模式。
  • MySQL Shell用于配置InnoDB Cluster中使用的服务器的配置脚本需要访问Python。在Windows上,MySQL Shell包含Python,不需要用户配置。在Unix上,Python必须作为shell环境的一部分找到。要检查您的系统是否正确配置了Python,请执行以下操作:
    $ /usr/bin/env python

    如果启动Python解释器,则不需要执行进一步的操作。如果上一个命令失败,请在/usr/bin/python和您选择的python二进制文件之间创建一个软链接。

  • 从版本8.0.17开始,实例必须在InnoDB集群中使用唯一的server_id。当您使用Cluster.addInstance(实例)操作时,如果集群中的实例已经使用了实例的server_id,则该操作将失败并出现错误。

  • 从版本8.0.23开始,应该将实例配置为使用并行复制应用程序。请参阅第7.5.6节“配置并行复制应用程序”。

  • 在为InnoDB Cluster配置实例的过程中,配置了使用实例所需的大部分系统变量。但是AdminAPI没有配置transaction_instance系统变量,这意味着它默认为REPEATABLE READ。这不会影响单个主集群,但如果您使用的是多主集群,那么除非您在应用程序中依赖可重复的READ语义,否则我们建议使用READ COMMITTED隔离级别。

  • 实例的相关配置选项,特别是组复制配置选项,必须位于单个选项文件中。InnoDB Cluster只支持服务器实例的单个选项文件,不支持使用--defaults extra file选项来指定额外的选项文件。对于使用实例的选项文件的任何AdminAPI操作,必须指定主文件。如果您想为与InnoDB Cluster无关的配置选项使用多个选项文件,则必须手动配置这些文件,确保根据使用多个选择文件的优先规则正确更新这些文件,并确保与InnoDB Cluster相关的设置不会被额外未识别的选项文件中的选项错误地覆盖。

二、 InnoDB 集群限制

由于InnoDB集群使用组复制,您还应该注意其限制。

由于元数据查询中的错误,MySQL Shell 8.0.27无法用于管理运行MySQL Server 8.0.25的InnoDB集群。要解决此问题,请在InnoDB Cluster成员实例上将MySQL Server升级到8.0.26或8.0.27版本,然后再将MySQL Shell 8.0.27与集群一起使用。该问题将在MySQL Shell 8.0.28中修复。

  • InnoDB集群不管理手动配置的异步复制通道。组复制和AdminAPI不会确保异步复制仅在主服务器上处于活动状态,并且不会跨实例复制状态。这可能导致复制不再有效的各种情况,并可能导致大脑分裂。一个InnoDB集群和另一个之间的复制仅由InnoDB ClusterSet支持,该集群可从MySQL 8.0.27中获得,并管理从活动的主读写InnoDB集群到多个只读副本集群的复制。
  • InnoDB集群旨在部署在局域网中。在广域网上部署单个InnoDB集群会对写入性能产生显著影响。一个稳定和低延迟的网络对于InnoDB集群成员服务器使用底层的组复制技术相互通信以达成事务共识非常重要。然而,InnoDB ClusterSet被设计为跨多个数据中心部署,每个InnoDB集群位于一个数据中心,异步复制通道将它们链接起来。
  • 对于AdminAPI操作,您只能使用TCP/IP连接和经典MySQL协议连接到InnoDB集群中的服务器实例。AdminAPI操作不支持使用Unix套接字和命名管道,AdminAPI操作也不支持使用X协议。同样的限制也适用于服务器实例本身之间的连接。 
  • AdminAPI和InnoDB Cluster支持使用运行MySQL Server 5.7的实例。但是,这些实例还有其他限制,并且所描述的某些功能在使用它们时不适用。
  • 使用多主模式时,不支持针对同一对象但在不同服务器上发布的并发数据定义语句和数据操作语句。在对象上发布数据定义语言(DDL)语句期间,在同一对象上但来自不同服务器实例的并发数据操作语言(DML)可能会导致无法检测到在不同实例上执行的冲突DDL。

三、 InnoDB 集群的用户帐户

InnoDB集群中的成员服务器使用三种类型 的用户帐户。一个 InnoDB 集群服务器配置 帐户用于为群集配置服务器实例。 可以创建一个或多个InnoDB集群管理员帐户 供管理员在 群集已设置。一个或多个 MySQL 路由器帐户可以是 为 MySQL 路由器实例创建以连接到集群。每个 用户帐户必须存在于 InnoDB 集群,具有相同的用户名和相同的密码。

InnoDB 集群服务器配置帐户

此帐户用于创建和配置InnoDB集群的成员服务器。每个成员服务器只有一个服务器配置帐户。必须在群集中的每个成员服务器上使用相同的用户帐户名和密码。您可以为此目的使用服务器上的根帐户,但如果这样做,群集中每个成员服务器上的root帐户都必须具有相同的密码。出于安全原因,不建议这样做。
首选方法是使用带有clusterAdmin选项的dba.configureInstance()命令创建InnoDB集群服务器配置帐户。为了提高安全性,请在交互式提示下指定密码,否则请使用clusterAdminPassword选项指定密码。以相同的方式在将成为InnoDB集群一部分的每个服务器实例上创建相同的帐户,使用相同的用户名和密码,包括您连接到的创建集群的实例,以及之后将加入集群的实例。

dba.configureInstance()命令会自动授予帐户所需的权限。如果您愿意,您可以手动设置帐户,授予它手动配置InnoDB集群管理员帐户中列出的权限。除了MySQL管理员的完全权限外,该帐户还需要对InnoDB Cluster元数据表的完全读写权限。
使用dba.configureInstance()操作创建的InnoDB Cluster服务器配置帐户不会复制到InnoDB Cluster中的其他服务器。MySQL Shell禁用dba.configureInstance()操作的二进制日志记录。这意味着您必须在每个服务器实例上单独创建帐户。

InnoDB 集群管理员帐户

在您完成配置过程后,这些帐户可用于管理InnoDB集群。您可以设置多个。每个帐户必须存在于InnoDB集群中的每个成员服务器上,具有相同的用户名和密码。
要为InnoDB ClusterSet部署创建InnoDB Cluster管理员帐户,请在将所有实例添加到该集群后发出Cluster.setupAdminAccount()命令。该命令使用您指定的用户名和密码创建一个具有所有必需权限的帐户。使用cluster.setupAdminAccount()创建帐户的事务被写入二进制日志,并发送到集群中的所有其他服务器实例,以便在它们上创建帐户。

注意
如果主InnoDB Cluster是在MySQL Shell 8.0.20之前的版本中设置的,那么Cluster.setupAdminAccount()命令可能与update选项一起使用,以更新InnoDB Cluster服务器配置帐户的权限。这是对未写入二进制日志的命令的特殊使用。

MySQL 路由器帐户

MySQL路由器使用这些帐户连接InnoDB集群中的服务器实例。您可以设置多个。每个帐户必须存在于InnoDB集群中的每个成员服务器上,具有相同的用户名和密码。创建MySQL路由器帐户的过程与InnoDB Cluster管理员帐户的过程相同,但使用Cluster.setupRouterAccount()命令。

1、手动配置 InnoDB 集群管理员帐户

如果您想手动配置InnoDB集群管理用户,该用户需要此处列出的权限,所有权限都带有GRANT OPTION。

注意

此权限列表基于MySQL Shell的当前版本。权限可能会在不同版本之间更改。因此,建议使用dba.configureInstance()或cluster.setupAdminAccount()操作来设置管理帐户。

重要的
用于管理InnoDB Cluster、InnoDB ClusterSet或InnoDB ReplicaSet部署的每个帐户必须存在于部署中的所有成员服务器实例上,具有相同的用户名和密码。

  • *.* 的全局权限,用于RELOAD、SHUTDOWN、PROCESS、FILE、SELECT、SUPER、REPLICATION SLAVE、REPLICATION CLIENT、REPLICITION_APPLIER、CREATE USER、SYSTEM_VARIABLES_ADMIN、PERSIST_RO_VARIABLES_ADMIN、BACKUP_ADMIN和EXECUTE。 
  • mysql_innodb_cluster_metadata.*、mysql_innodb_cluster_metadata_bkp.*和mysql_innodb _cluster-metadata_previous.*的架构特定权限是ALTER、ALTER ROUTINE、CREATE、CREATE ROUTINE,CREATE TEMPORARY TABLES、CREATE VIEW、DELETE、DROP、EVENT、EXECUTE、INDEX、INSERT、LOCK TABLES,REFERENCES、SHOW VIEW、TRIGGER、UPDATE;和对于mysql.*是INSERT、UPDATE、DELETE。

如果只需要读取操作,例如创建用户 出于监控目的,帐户受到更多限制 可以使用特权。向用户授予your_user所需的权限 监控 InnoDB 集群问题:

  1. GRANT SELECT ON mysql_innodb_cluster_metadata.* TO your_user@'%';
  2. GRANT SELECT ON mysql.slave_master_info TO your_user@'%';
  3. GRANT SELECT ON performance_schema.global_status TO your_user@'%';
  4. GRANT SELECT ON performance_schema.global_variables TO your_user@'%';
  5. GRANT SELECT ON performance_schema.replication_applier_configuration TO your_user@'%';
  6. GRANT SELECT ON performance_schema.replication_applier_status TO your_user@'%';
  7. GRANT SELECT ON performance_schema.replication_applier_status_by_coordinator TO your_user@'%';
  8. GRANT SELECT ON performance_schema.replication_applier_status_by_worker TO your_user@'%';
  9. GRANT SELECT ON performance_schema.replication_connection_configuration TO your_user@'%';
  10. GRANT SELECT ON performance_schema.replication_connection_status TO your_user@'%';
  11. GRANT SELECT ON performance_schema.replication_group_member_stats TO your_user@'%';
  12. GRANT SELECT ON performance_schema.replication_group_members TO your_user@'%';
  13. GRANT SELECT ON performance_schema.threads TO your_user@'%' WITH GRANT OPTION;

2、InnoDB 集群创建的内部用户帐户

作为使用Group Replication的一部分,InnoDB Cluster创建内部恢复用户,以启用集群中服务器之间的连接。这些用户是集群内部的,生成的用户的用户名遵循mysql_innodb_cluster_server_id@%的命名方案,其中server_id对实例是唯一的。在8.0.17之前的版本中,生成的用户的用户名遵循mysql_innodb_cluster_r[10_numbers]的命名方案。
用于这些内部用户的主机名设置为“%”。在v8.0.17之前,ipAllowlist通过在ipAllowlist中为每个主机创建一个帐户来影响主机名行为。有关详细信息,请参阅创建服务器的允许列表。
每个内部用户都有一个随机生成的密码。从版本8.0.18开始,AdminAPI使您能够更改为内部用户生成的密码。请参阅重置恢复帐户密码。随机生成的用户将获得以下授权:

GRANT REPLICATION SLAVE ON *.* to internal_user;

内部用户帐户在种子实例上创建,然后复制到集群中的其他实例。内部用户包括:

  • 通过发出dba.createCluster()创建新集群时生成
  • 通过发出cluster.addInstance()将新实例添加到集群时生成
  • 使用主成员正在使用的身份验证插件生成 

在v8.0.17之前,ipAllowlist导致Cluster.requestInstance()删除旧的内部用户并生成新用户,而不是重用它们。

3、重置恢复帐户密码

从版本8.0.18开始,您可以使用Cluster.resetRecoveryAccountsPassword()操作重置InnoDB Cluster创建的内部恢复帐户的密码,例如遵循自定义密码生存期策略。使用Cluster.resetRecovery AccountsPassword()操作重置群集使用的所有内部恢复帐户的密码。该操作为每个联机实例上的内部恢复帐户设置一个新的随机密码。如果无法访问实例,则操作失败。您可以使用force选项来忽略此类实例,但不建议这样做,而且在使用此操作之前使实例重新联机更安全。此操作仅适用于InnoDB Cluster创建的密码,不能用于更新手动创建的密码。

MySQL InnoDB集群部署及管理全教程(二)_Doker 多克的博客-CSDN博客

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/1006187
推荐阅读
相关标签