mysql主机名 17.2 开始组复制
MySQL Group Replication作为MySQL服务器的插件提供,组中的每个服务器都需要配置和安装插件。 本节提供详细的教程,其中包含创建具有至少三个服务器的复制组所需的步骤。
参考官方文档: MySQL Group Replication作为MySQL服务器的插件提供,组中的每个服务器都需要配置和安装插件。 本节提供详细的教程,其中包含创建具有至少三个服务器的复制组所需的步骤。 17.2.1 在单主模式下部署组复制 组中的每个服务器实例都可以在独立的物理计算机上运行,也可以在同一台计算机上运行。 本节介绍如何在一台物理计算机上创建具有三个MySQL Server实例的复制组。 这意味着需要三个数据目录,每个服务器实例一个,并且您需要独立配置每个实例。 17.2.1.1 为组复制部署实例 第一步是部署三个MySQL服务器实例。 Group Replication是MySQL Server 5.7.17及更高版本提供的内置MySQL插件。 有关MySQL插件的更多背景信息,请参见第5.5节“MySQL服务器插件”。 此过程假定MySQL Server已下载并解压缩到名为mysql-5.7的目录中。 以下过程使用一台物理计算机,因此每个MySQL服务器实例都需要该实例的特定的数据目录。 在名为data的目录中创建数据目录并初始化每个目录。 mkdir data mysql-5.7/bin/mysqld --initialize-insecure --basedir=$PWD/mysql-5.7 --datadir=$PWD/data/s1 mysql-5.7/bin/mysqld --initialize-insecure --basedir=$PWD/mysql-5.7 --datadir=$PWD/data/s2 mysql-5.7/bin/mysqld --initialize-insecure --basedir=$PWD/mysql-5.7 --datadir=$PWD/data/s3 警告: 不要在生产环境中使用--initialize-insecure,它仅用于简化教程。 17.2.1.2 为组复制配置实例 组复制服务器配置: 要安装和使用组复制插件,必须正确配置MySQL Server实例。 建议将配置存储在实例的配置文件中。 有关更多信息,请参见第4.2.6节“使用选项文件”。 除非另有说明,否则以下是组中第一个实例的配置,在此过程中称为s1。 以下部分显示了示例服务器配置。 [mysqld] datadir=/opt/data/s1 basedir=/opt/mysql-5.7/ port=24801 socket=/opt/data/s1 /s1.sock 这些设置将MySQL服务器配置为使用先前创建的数据目录以及服务器应打开的端口并开始侦听连接。 注意: 使用非默认端口24801是因为在本教程中,三个服务器实例使用相同的主机名。 在具有三台不同机器的设置中,这不是必需的。 --所以要均要配置不同的监听端口 复制框架: 以下设置根据MySQL组复制要求配置复制。 server_id=1 gtid_mode=ON enforce_gtid_consistency=ON master_info_repository=TABLE relay_log_info_repository=TABLE binlog_checksum=NONE log_slave_updates=ON log_bin=binlog binlog_format=ROW 这些设置将服务器配置为使用唯一标识符编号1,以启用全局事务标识符并将复制元数据存储在系统表而不是文件中。 此外,它还指示服务器打开二进制日志记录,使用基于行的格式并禁用二进制日志事件校验和。 --这个是基本GTID复制环境所需的配置 组复制设置: 此时,my.cnf文件确保配置服务器并指示在给定配置下实例化复制基础结构。 以下部分配置服务器的组复制设置。 transaction_write_set_extraction=XXHASH64 loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" loose-group_replication_start_on_boot=off loose-group_replication_local_address= "127.0.0.1:24901" loose-group_replication_group_seeds= "127.0.0.1:24901,127.0.0.1:24902,127.0.0.1:24903" loose-group_replication_bootstrap_group=off 注意: 上面用于group_replication变量的loose-前缀指示服务器在服务器启动时尚未加载Group Replication插件时继续启动。 group_replication_group_name的值必须是有效的UUID。 在二进制日志中为组复制事件设置GTID时,将在内部使用此UUID。 使用SELECT UUID()生成UUID。 重点 组复制使用此地址为内部组员连接使用XCom。 此地址必须与用于SQL的主机名和端口不同,并且不得用于客户端应用程序。 在运行组复制时,必须为组成员之间的内部通信保留它。 --内部心跳地址 group_replication_local_address配置的网络地址必须可由所有组成员解析。 例如,如果每个服务器实例位于具有固定网络地址的其他计算机上,则可以使用计算机的IP,例如10.0.0.1。 如果使用主机名,则必须使用完全限定名称,并确保它可通过DNS,正确配置的/ etc / hosts文件或其他名称解析过程进行解析。 group_replication_local_address的推荐端口是33061.在本教程中,我们使用在一台计算机上运行的三个服务器实例,因此端口24901到24903用于内部通信网络地址。 重要: group_replication_group_seeds中列出的hostname:port是种子成员的内部网络地址,由group_replication_local_address配置,而不是用于客户端连接的SQL hostname:port,并在例如performance_schema.replication_group_members表中显示。 启动组的服务器不使用此选项,因为它是初始服务器,因此,它负责引导组。 换句话说,引导该组的服务器上的任何现有数据都是用作下一个加入成员的数据的数据。 第二个服务器连接请求组中的唯一成员来加入,第二个服务器上的任何缺失数据都从引导成员上的数据中复制,然后组扩展。 第三个服务器加入可以要求这两个服务器中的任何一个来加入,数据同步到新成员,然后该组再次扩展。 后续服务器在加入时重复此过程。 警告: 在同时加入多个服务器时,请确保它们指向已在该组中的种子成员。 不要使用也加入群组的成员作为种子,因为他们在联系时可能尚未加入群组。 最好首先启动引导程序成员,然后让它创建组。 然后将其作为种子成员来加入其余的成员。 这确保了在连接其余成员时形成组。 重要: 这个选项在任何时候只能在一个服务器实例上使用,通常是第一次引导组时(或者如果整个组被关闭并再次备份)。 如果您多次引导该组,例如当多个服务器实例设置了此选项时,则可以创建一个人工分裂脑情景,其中存在两个具有相同名称的不同组。 在第一个服务器实例联机后禁用此选项。 组中所有服务器的配置非常相似。 您需要更改每个服务器的详细信息(例如server_id,datadir,group_replication_local_address)。 17.2.1.3 用户认证 组复制使用异步复制协议来实现第17.9.5节“分布式恢复”mysql主机名,在将组成员加入组之前同步组成员。 分布式恢复过程依赖于名为group_replication_recovery的复制通道,该通道用于将来自供体成员的事务转移到加入该组的成员。 因此,您需要设置具有正确权限的复制用户,以便组复制可以建立直接的成员到成员恢复复制通道。 使用选项文件启动服务器: mysql-5.7/bin/mysqld --defaults-file=data/s1/s1.cnf 使用REPLICATION-SLAVE权限创建MySQL用户。此过程可以被捕获到二进制日志中,然后您可以依赖分布式恢复来复制用于创建用户的语句。 或者,您可以禁用二进制日志记录,然后在每个成员上手动创建用户,例如,如果要避免将更改传播到其他服务器实例。 要禁用二进制日志记录,请连接到服务器s1并发出以下语句: mysql> SET SQL_LOG_BIN=0; 在以下示例中,将显示用户rpl_user和密码password。 配置服务器时,请使用合适的用户名和密码。 mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'password'; mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%'; mysql> FLUSH PRIVILEGES; 如果禁用了二进制日志记录,则在创建用户后再次启用它。 mysql> SET SQL_LOG_BIN=1; 配置用户后,使用CHANGE MASTER TO语句将服务器配置为在下次需要从其他成员恢复其状态时使用group_replication_recovery复制通道。 发出以下命令,将rpl_user和password替换为创建用户时使用的值。 mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' \\ FOR CHANNEL 'group_replication_recovery'; 分布式恢复是加入组的服务器的第一步,并且与组成员没有相同的事务集。 如果没有为group_replication_recovery复制通道和rpl_user正确设置这些凭据,则服务器无法连接到供应成员并运行分布式恢复过程以与其他组成员同步,因此最终无法加入该组。 同样,如果服务器无法通过服务器的主机名正确识别其他成员,则恢复过程可能会失败。 建议运行MySQL的操作系统具有正确配置的唯一主机名,使用DNS或本地设置。 可以在performance_schema.replication_group_members表的Member_host列中验证此主机名。 如果多个组成员外部化操作系统设置的默认主机名,则成员可能无法解析为正确的成员地址而无法加入该组。 在这种情况下,使用report_host为由每个服务器配置外部化的唯一主机名。 17.2.1.4 加载 组复制 配置并启动服务器s1后,安装组复制插件。 连接到服务器并发出以下命令: INSTALL PLUGIN group_replication SONAME 'group_replication.so'; 重要 在加载组复制之前,必须存在mysql.session用户。 MySQL版本5.7.19中添加了mysql.session。 如果使用早期版本初始化数据字典,则必须运行mysql_upgrade过程。 如果未运行升级,则组复制无法启动,伴随错误消息 There was an error when trying to access the server with user: mysql.session@localhost. Make sure the user is present in the server and that mysql_upgrade was ran after a server update.. 要检查插件是否已成功安装,请发出SHOW PLUGINS; 并检查输出。 它应该显示如下: mysql> SHOW PLUGINS; 要启动该组,请指示服务器s1引导该组,然后启动组复制。 此引导程序应仅由单个服务器完成,该服务器启动组并且仅执行一次。 这就是为什么bootstrap配置选项的值未保存在配置文件中的原因。 如果它保存在配置文件中,则在重新启动时,服务器会自动引导具有相同名称的第二个组。 这将导致两个不同的组具有相同的名称。 同样的道理适用于在此选项设置为ON的情况下停止并重新启动插件。 SET GLOBAL group_replication_bootstrap_group=ON; START GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_group=OFF; 一旦START GROUP_REPLICATION语句返回,该组就已启动。 您可以检查该组现在是否已创建,并且其中包含一个成员: mysql> SELECT * FROM performance_schema.replication_group_members;-+ 此表中的信息确认组中有一个成员具有唯一标识符ce9be252-2b71-11e6-b8f4-00212844f856,它是ONLINE并且在myhost上侦听端口24801上的客户端连接。 为了证明服务器确实在一个组中并且它能够处理负载,创建一个表并向其添加一些内容。 mysql> CREATE DATABASE test; mysql> USE test; mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL); mysql> INSERT INTO t1 VALUES (1, 'Luis'); 检查表t1和二进制日志的内容。 mysql> SELECT * FROM t1; +----+------+ | c1 | c2 | +----+------+ | 1 | Luis | +----+------+ mysql> SHOW BINLOG EVENTS; 如上所示,创建了数据库和表对象,并将相应的DDL语句写入二进制日志。 此外,数据已插入表,并写入二进制日志。 17.2.1.5 增加一个实例到组 此时,该组中有一个成员服务器s1,其中包含一些数据。 现在是时候通过添加先前配置的其他两个服务器来扩展组。 17.2.1.5.1 增加第二个实例 为了添加第二个实例,服务器s2,首先为它创建配置文件。 配置类似于用于服务器s1的配置,除了诸如数据目录的位置,s2将要监听的端口或其server_id之类的配置。 这些不同的行在下面的列表中突出显示。 [mysqld] # server configuration datadir=/data/s2 basedir=/mysql-5.7/ port=24802 socket=/s2.sock # # Replication configuration parameters # server_id=2 gtid_mode=ON enforce_gtid_consistency=ON master_info_repository=TABLE relay_log_info_repository=TABLE binlog_checksum=NONE log_slave_updates=ON log_bin=binlog binlog_format=ROW # # Group Replication configuration # transaction_write_set_extraction=XXHASH64 loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" loose-group_replication_start_on_boot=off loose-group_replication_local_address= "127.0.0.1:24902" loose-group_replication_group_seeds= "127.0.0.1:24901,127.0.0.1:24902,127.0.0.1:24903" loose-group_replication_bootstrap_group= off 与服务器s1的过程类似,使用选项文件启动服务器。 mysql-5.7/bin/mysqld --defaults-file=data/s2/s2.cnf 然后按如下方式配置恢复凭据。 这些命令与设置服务器s1时使用的命令相同,因为用户在组内共享。 在s2上发布以下语句。 SET SQL_LOG_BIN=0; CREATE USER rpl_user@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%'; SET SQL_LOG_BIN=1; CHANGE MASTER TO MASTER_USER='rpl_user' MASTER_PASSWORD='password' FOR CHANNE 'group_replication_recovery'; 安装组复制插件并开始将服务器加入组的过程。 以下示例以与部署服务器s1时相同的方式安装插件。 mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so'; 将s2服务器增加到组 mysql> START GROUP_REPLICATION; 与前面的步骤不同,这些步骤与在s1上执行的步骤相同,这里的区别在于在启动组复制之前,您不用发出SET GLOBAL group_replication_bootstrap_group = ON; 因为该组已由服务器s1创建并引导。 此时,只需将服务器s2添加到现有组中。 Tip: 当组复制成功启动并且服务器加入组时,它会检查super_read_only变量。 通过在成员的配置文件中将super_read_only设置为ON,可以确保因任何原因启动Group Replication失败的服务器不接受事务。 如果服务器应该将组作为读写实例加入,例如作为单主组中的主要组或多主组的成员,当super_read_only变量设置为ON时,它将设置为OFF 加入该组织。 再次检查performance_schema.replication_group_members表显示该组中现在有两个ONLINE服务器。 mysql> SELECT * FROM performance_schema.replication_group_members; 由于服务器s2也标记为ONLINE,它必须已经自动赶上服务器s1。 验证它确实已与服务器s1同步,如下所示。 mysql> SHOW DATABASES LIKE 'test'; +-----------------+ | Database (test) | +-----------------+ | test | +-----------------+ mysql> SELECT * FROM test.t1; +----+------+ | c1 | c2 | +----+------+ | 1 | Luis | +----+------+ mysql> SHOW BINLOG EVENTS; 如上所示,第二台服务器已添加到组中,并自动从服务器s1复制了变更。 根据分布式恢复过程,这意味着在加入组之后并在被声明在线之前,服务器s2已经自动连接到服务器s1并从中获取丢失的数据。 换句话说,它从s1的二进制日志复制缺少的事务,直到它加入组的时间点。 17.2.1.5.2 添加其他实例 向组添加其他实例与添加第二个服务器的步骤顺序基本相同,只是必须更改配置。 总结所需的命令: 1.变更配置文件 [mysqld] # server configuration datadir=/data/s3 basedir=/mysql-5.7/ port=24803 socket=/s3.sock # # Replication configuration parameters # server_id=3 gtid_mode=ON enforce_gtid_consistency=ON master_info_repository=TABLE relay_log_info_repository=TABLE binlog_checksum=NONE log_slave_updates=ON log_bin=binlog binlog_format=ROW # # Group Replication configuration # transaction_write_set_extraction=XXHASH64 loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" loose-group_replication_start_on_boot=off loose-group_replication_local_address= "127.0.0.1:24903" loose-group_replication_group_seeds="127.0.0.1:24901,127.0.0.1:24902,127.0.0.1:24903" loose-group_replication_bootstrap_group= off --其实就是server_id,路径和port(同一台主机),loose-group_replication_local_addres, 2.启动服务器 mysql-5.7/bin/mysqld --defaults-file=data/s3/s3.cnf 3.为 group_replication_recovery 通道配置恢复凭据 SET SQL_LOG_BIN=0; CREATE USER rpl_user@'%'; GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' IDENTIFIED BY 'password'; FLUSH PRIVILEGES; SET SQL_LOG_BIN=1; CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' \\ FOR CHANNEL 'group_replication_recovery'; 4.安装组复制插件并启动 INSTALL PLUGIN group_replication SONAME 'group_replication.so'; START GROUP_REPLICATION; 此时,服务器s3已启动并正在运行,已加入该组并赶上该组中的其他服务器。 再次查询performance_schema.replication_group_members表来确认。 mysql> SELECT * FROM performance_schema.replication_group_members; (编辑:威海站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |