翼度科技»论坛 编程开发 mysql 查看内容

MySQL InnoDB ReplicaSet安装文档

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
MySQL副本集介绍

MySQL InnoDB ReplicaSet(也叫MySQL副本集,有些地方也翻译成MySQL复制集)是在 MySQL 8.0.19 版本(2020-01-13 Released)之后开始支持的,MySQL副本集中拥有一个primary节点,一个或多个secondary节点,它不像MySQL InnoDB Cluster一样提供故障自愈和多主模式,但是它提供手工的方法添加、移除和配置相关节点.说得直白一点,MySQL副本集其实就是将MySQL主从复制、MySQL Shell、MySQL Router技术融合起来的一种技术,它的优点是可以帮助用户快速、简单的部署和管理主从复制。但是它的不足与限制也非常多。这里仅仅学习、研究MySQL副本集,毕竟技术都是快速向前迭代发展的。说不定哪天就蜕变得非常惊艳。
MySQL副本集的限制

下面是官方文档[1]中介绍的MySQL InnoDB ReplicaSet(MySQL副本集)的一些限制:

  • 没有自动故障转移功能。在主节点不可用的情况下,需要使用 AdminAPI 手动触发故障转移,然后才能再次进行任何更改。但是,辅助实例仍可供读取数据。
    No automatic failover. In events where the primary becomes unavailable, a failover needs to be triggered manuallyusing AdminAPI before any changes are possible again. However, secondary instances remain available for reads.
  • 无法防止由于意外停止或不可用而导致部分数据丢失:在意外停止时未完成的事务可能会丢失。
    No protection from partial data loss due to an unexpected halt or unavailability: Transactions that are not completeat the time of the unexpected halt could be lost.
  • 在意外退出或不可用后无法防止数据不一致。如果手动故障转移提升了一个辅助实例,而前一个主实例仍然可用(例如,由于网络分区),则裂脑情况可能会导致数据不一致。
    No protection against inconsistencies after an unexpected exit or unavailability. If a manual failover promotesa secondary instance while the former primary is still available, for example, due to a network partition,the split-brain situation could introduce data inconsistencies.
  • InnoDB ReplicaSet 不支持多主模式。允许写入所有成员的经典复制拓扑无法保证数据一致性。
    InnoDB ReplicaSet does not support a multi-primary mode. Data consistency cannot be guaranteed withclassic replication topologies that allow writes to all members.
  • 读取横向扩展是有限的。InnoDB ReplicaSet 基于异步复制,因此无法像 Group Replication 那样调整流量控制。
    Read scale-out is limited. InnoDB ReplicaSet is based on asynchronous replication, and therefore thereis no possible tuning of flow control as there is with Group Replication.
  • 所有从节点(次要成员)都从单一来源复制。对于某些特定的用例,这可能会影响单一来源,例如,大量的小更新。
    All secondary members replicate from a single source. For some particular use-cases,this could impact the single source, for example, numerous small updates.
  • 仅支持运行 MySQL 8.0 及更高版本的实例。
    Only instances running MySQL version 8.0 and later are supported.
  • 仅支持基于 GTID 的复制,二进制日志文件位置复制与 InnoDB ReplicaSet 不兼容。
    Only GTID-based replication is supported, Binary log file position replication is incompatible with InnoDB ReplicaSet.
  • 仅支持基于行的复制 (RBR),不支持基于语句的复制 (SBR)。
    Only Row-Based Replication (RBR) is supported, Statement-Based Replication (SBR) is unsupported.
  • 不支持复制过滤Replication filters are not supported.
  • 任何实例上都不允许使用非托管复制通道Unmanaged replication channels are not allowed on any instance.
  • 一个 ReplicaSet 最多由一个主实例组成。 支持一个或多个辅助实例。 尽管可以添加到 ReplicaSet 的辅助节点数量没有限制,但连接到 ReplicaSet 的每个 MySQL Router 都必须监视每个实例。 因此,添加到 ReplicaSet 的实例越多,监控就越多A ReplicaSet consists of a maximum of one primary instance. One or multiple secondaries are supported. Although there is no limit to the number of secondaries you can add to a ReplicaSet, each MySQL Router connected to a ReplicaSet has to monitor each instance. Therefore, the more instances added to a ReplicaSet, the more monitoring there is.
  • ReplicaSet 必须由 MySQL Shell 管理。 例如,复制帐户是由 MySQL Shell 创建和管理的。 不支持在 MySQL Shell 之外对实例进行配置更改,例如直接使用 SQL 语句更改主实例。 始终使用 MySQL Shell 来处理 InnoDB ReplicaSet。
    The ReplicaSet must be managed by MySQL Shell. For example, the replication account is created and managed by MySQL Shell. Making configuration changes to the instance outside MySQL Shell, for example, using SQL statements directly to change the primary instance, is not supported. Always use MySQL Shell to work with InnoDB ReplicaSet.
MySQL副本集的部署

这里计划在下面两台服务器上安装MySQL InnoDB ReplicaSet(MySQL副本集),MySQL数据库版本为8.0.33,操作系统版本为RHEL 8.8
  1. 192.168.9.154  dbtest04
  2. 192.168.9.159  dbtest05
复制代码
1:配置/etc/hosts
  1. 192.168.9.154  dbtest04
  2. 192.168.9.159  dbtest05
复制代码
如上所示,在配置文件/etc/hosts中加入服务器的ip/hostname信息。注意需要在MySQL副本集所有primary节点和secondary节点上配置/etc/hosts,具体根据你MySQL副本集的实际情况配置。注意事项:必须配置/etc/hosts,否则副本集在调用addInstance等函数时可能会遇到问题.因为互相默认使用hostname信息来连接的.
2:安装MySQL Shell

这里使用root用户安装MySQL Shell,最好每个节点都安装MySQL Shell,另外,MySQL Shell有许多安装方式,有些安装方式需要设置环境变量,而yum安装方式不用额外去设置环境变量。
  1. # yum localinstall mysql-shell-8.0.35-1.el8.x86_64.rpm
复制代码
3:安装MySQL单实例

这里略过MySQl单实例安装,因为实在是太简单了(个人一般使用mysql_auto_install.sh脚本安装),不过需要注意参数文件my.cnf中一些参数设置,有一些基本参数需要你设置一下。下面是一些常见得参数(部分参数)
  1. server_id=xxx #使用实际的数字替换,建议使用IP地址的最后一段数字
  2. gtid_mode=on
  3. enforce_gtid_consistency=on
  4. binlog_transaction_dependency_tracking=writeset
复制代码
否则,你后续操作可能遇到下面类似这样的错误:
  1. MySQL  192.168.9.154:3306 ssl  JS > dba.configureReplicaSetInstance('rsadmin@192.168.9.154:3306', {clusterAdmin: "'repl'@'192.168.9.%'"});
  2. Configuring local MySQL instance listening at port 3306 for use in an InnoDB ReplicaSet...

  3. This instance reports its own address as dbtest04:3306
  4. Clients and other cluster members will communicate with it through this address by default. If this is not correct, the report_host MySQL system variable should be changed.
  5. Password for new account: ***********
  6. Confirm password: ***********

  7. applierWorkerThreads will be set to the default value of 4.

  8. NOTE: Some configuration options need to be fixed:
  9. +----------------------------------------+---------------+----------------+--------------------------------------------------+
  10. | Variable                               | Current Value | Required Value | Note                                             |
  11. +----------------------------------------+---------------+----------------+--------------------------------------------------+
  12. | binlog_transaction_dependency_tracking | COMMIT_ORDER  | WRITESET       | Update the server variable                       |
  13. | enforce_gtid_consistency               | OFF           | ON             | Update read-only variable and restart the server |
  14. | gtid_mode                              | OFF           | ON             | Update read-only variable and restart the server |
  15. +----------------------------------------+---------------+----------------+--------------------------------------------------+

  16. Some variables need to be changed, but cannot be done dynamically on the server.
  17. Do you want to perform the required configuration changes? [y/n]: n
  18. Dba.configureReplicaSetInstance: Cancelled (RuntimeError)
复制代码
4:创建rsadmin管理账号

在各个节点上创建账号rsadmin(MySQL Shell使用),因为一般而言,root账号的hostname限定为localhost(127.0.0.1),所以我们单独为MySQL Shell创建一个管理账号。
  1. create user rsadmin@'192.168.9.%' identified by 'gYj#jfdy874=d2';
  2. grant all on *.* to 'rsadmin'@'192.168.9.%' with grant option;
  3. flush privileges;
复制代码
上面为了方便,授予rsadmin相当大的权限,你也可以限制一下它的权限
  1. GRANT SELECT, RELOAD, SHUTDOWN, PROCESS, FILE, EXECUTE, REPLICATION SLAVE, 
  2. REPLICATION CLIENT, CREATE USER ON *.* TO `rsadmin`@`192.168.9.%` WITH GRANT OPTION;                                                                                                                       
  3. GRANT CLONE_ADMIN,CONNECTION_ADMIN,GROUP_REPLICATION_ADMIN
  4. ,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_APPLIER,REPLICATION_SLAVE_ADMIN
  5. ,ROLE_ADMIN,SYSTEM_VARIABLES_ADMIN 
  6. ON *.* TO `rsadmin`@`192.168.9.%` WITH GRANT OPTION;                 
  7. GRANT INSERT, UPDATE, DELETE ON `mysql`.* TO `rsadmin`@`192.168.9.%` WITH GRANT OPTION;
复制代码
5:检查实例是否符合副本集的条件

在MySQL shell中检查各个实例是否符合创建 ReplicaSet 的条件,如果发现需要修改的地方,就会提示确认修改。
  1. \connect rsadmin@192.168.9.154:3306
  2. dba.configureReplicaSetInstance('rsadmin@192.168.9.154:3306', {clusterAdmin: "'rsadmin'@'192.168.9.%'"});
  3. dba.configureReplicaSetInstance('rsadmin@192.168.9.159:3306', {clusterAdmin: "'rsadmin'@'192.168.9.%'"});
复制代码
如下所示:192.168.9.159的参数文件my.cnf没有修改参数,会有错误提示:
  1. MySQL  192.168.9.154:3306 ssl  JS > dba.configureReplicaSetInstance('rsadmin@192.168.9.154:3306', {clusterAdmin: "'rsadmin'@'192.168.9.%'"});
  2. Configuring local MySQL instance listening at port 3306 for use in an InnoDB ReplicaSet...

  3. This instance reports its own address as dbtest04:3306
  4. Clients and other cluster members will communicate with it through this address by default. If this is not correct, the report_host MySQL system variable should be changed.
  5. User 'rsadmin'@'192.168.9.%' already exists and will not be created.

  6. applierWorkerThreads will be set to the default value of 4.

  7. The instance 'dbtest04:3306' is valid to be used in an InnoDB ReplicaSet.
  8. The instance 'dbtest04:3306' is already ready to be used in an InnoDB ReplicaSet.

  9. Successfully enabled parallel appliers.
  10.  MySQL  192.168.9.154:3306 ssl  JS > dba.configureReplicaSetInstance('rsadmin@192.168.9.159:3306', {clusterAdmin: "'rsadmin'@'192.168.9.%'"});
  11. Please provide the password for 'rsadmin@192.168.9.159:3306': **************
  12. Save password for 'rsadmin@192.168.9.159:3306'? [Y]es/[N]o/Ne[v]er (default No): y
  13. Configuring MySQL instance at dbtest05:3306 for use in an InnoDB ReplicaSet...

  14. This instance reports its own address as dbtest05:3306
  15. Clients and other cluster members will communicate with it through this address by default. If this is not correct, the report_host MySQL system variable should be changed.
  16. User 'rsadmin'@'192.168.9.%' already exists and will not be created.

  17. applierWorkerThreads will be set to the default value of 4.

  18. NOTE: Some configuration options need to be fixed:
  19. +----------------------------------------+---------------+----------------+--------------------------------------------------+
  20. | Variable                               | Current Value | Required Value | Note                                             |
  21. +----------------------------------------+---------------+----------------+--------------------------------------------------+
  22. | binlog_transaction_dependency_tracking | COMMIT_ORDER  | WRITESET       | Update the server variable                       |
  23. | enforce_gtid_consistency               | OFF           | ON             | Update read-only variable and restart the server |
  24. | gtid_mode                              | OFF           | ON             | Update read-only variable and restart the server |
  25. +----------------------------------------+---------------+----------------+--------------------------------------------------+

  26. Some variables need to be changed, but cannot be done dynamically on the server.
  27. Do you want to perform the required configuration changes? [y/n]: y
  28. Do you want to restart the instance after configuring it? [y/n]: y
  29. Configuring instance...
  30. The instance 'dbtest05:3306' was configured to be used in an InnoDB ReplicaSet.
  31. Restarting MySQL...
  32. NOTE: MySQL server at dbtest05:3306 was restarted.
  33.  MySQL  192.168.9.154:3306 ssl  JS >
复制代码
建议根据提示修改my.cnf文件后,重启MySQL服务,然后重新验证:
  1. dba.configureReplicaSetInstance('rsadmin@192.168.9.159:3306', {clusterAdmin: "'rsadmin'@'192.168.9.%'"});
复制代码
6:创建副本集kerry_repl
  1. #创建名为kerry_repl的副本集,名字可以根据实际情况设置
  2. var rs = dba.createReplicaSet("kerry_repl")
  3. #添加replication信任(MySQL Shell 8.0.28 及之后的版本创建 InnoDB ReplicaSet 时,如果你有安全需要,可以通过下面函数设置)
  4. rs.setOption('replicationAllowedHost', '192.168.9.0/24')

  5. #检查副本集的状态
  6. rs.status()
复制代码
具体执行过程如下所示:
  1. MySQL  192.168.9.154:3306 ssl  JS > var rs = dba.createReplicaSet("kerry_repl")
  2. A new replicaset with instance 'dbtest04:3306' will be created.

  3. * Checking MySQL instance at dbtest04:3306

  4. This instance reports its own address as dbtest04:3306
  5. dbtest04:3306: Instance configuration is suitable.

  6. * Checking connectivity and SSL configuration...
  7. * Updating metadata...

  8. ReplicaSet object successfully created for dbtest04:3306.
  9. Use rs.addInstance() to add more asynchronously replicated instances to this replicaset and rs.status() to check its status.

  10.  MySQL  192.168.9.154:3306 ssl  JS > rs.setOption('replicationAllowedHost', '192.168.9.0/24')
  11. Internally managed replication users updated for ReplicaSet 'kerry_repl'
  12.  MySQL  192.168.9.154:3306 ssl  JS > rs.status()
  13. {
  14.     "replicaSet": {
  15.         "name": "kerry_repl", 
  16.         "primary": "dbtest04:3306", 
  17.         "status": "AVAILABLE", 
  18.         "statusText": "All instances available.", 
  19.         "topology": {
  20.             "dbtest04:3306": {
  21.                 "address": "dbtest04:3306", 
  22.                 "instanceRole": "PRIMARY", 
  23.                 "mode": "R/W", 
  24.                 "status": "ONLINE"
  25.             }
  26.         }, 
  27.         "type": "ASYNC"
  28.     }
  29. }
  30.  MySQL  192.168.9.154:3306 ssl  JS >
复制代码
7:添加实例
  1. rs.addInstance('192.168.9.159:3306')
  2. rs.status()
复制代码
具体操作如下所示
  1. MySQL  192.168.9.154:3306 ssl  JS > rs.addInstance('192.168.9.159:3306')
  2. Adding instance to the replicaset...

  3. * Performing validation checks

  4. This instance reports its own address as dbtest05:3306
  5. dbtest05:3306: Instance configuration is suitable.

  6. * Checking async replication topology...

  7. * Checking connectivity and SSL configuration...

  8. * Checking transaction state of the instance...

  9. NOTE: The target instance 'dbtest05:3306' has not been pre-provisioned (GTID set is empty). The Shell is unable to decide whether replication can completely recover its state.
  10. The safest and most convenient way to provision a new instance is through automatic clone provisioning, which will completely overwrite the state of 'dbtest05:3306' with a physical snapshot from an existing replicaset member. To use this method by default, set the 'recoveryMethod' option to 'clone'.

  11. WARNING: It should be safe to rely on replication to incrementally recover the state of the new instance if you are sure all updates ever executed in the replicaset were done with GTIDs enabled, there are no purged transactions and the new instance contains the same GTID set as the replicaset or a subset of it. To use this method by default, set the 'recoveryMethod' option to 'incremental'.


  12. Please select a recovery method [C]lone/[I]ncremental recovery/[A]bort (default Clone): c
  13. * Updating topology
  14. Waiting for clone process of the new member to complete. Press ^C to abort the operation.
  15. * Waiting for clone to finish...
  16. NOTE: dbtest05:3306 is being cloned from dbtest04:3306
  17. ** Stage DROP DATA: Completed




  18. ** Clone Transfer      FILE COPY  ============================================================    0%  Not Started    PAGE COPY  ============================================================    0%  Not Started    REDO COPY  ============================================================    0%  Not Started** Clone Transfer      FILE COPY  ============================================================    0%  In Progress    PAGE COPY  ============================================================    0%  Not Started    REDO COPY  ============================================================    0%  Not Started** Clone Transfer      FILE COPY  ############################################################  100%  Completed    PAGE COPY  ############################################################  100%  Completed    REDO COPY  ############################################################  100%  Completed
  19. NOTE: dbtest05:3306 is shutting down...

  20. * Waiting for server restart... ready 
  21. * dbtest05:3306 has restarted, waiting for clone to finish...
  22. ** Stage RESTART: Completed
  23. * Clone process has finished: 73.65 MB transferred in about 1 second (~73.65 MB/s)

  24. ** Changing replication source of dbtest05:3306 to dbtest04:3306
  25. ** Waiting for new instance to synchronize with PRIMARY...

  26. ** Transactions replicated  ============================================================    0% ** Transactions replicated  ###########################################################=   98% ** Transactions replicated  ############################################################  100% 

  27. The instance 'dbtest05:3306' was added to the replicaset and is replicating from dbtest04:3306.

  28. * Waiting for instance 'dbtest05:3306' to synchronize the Metadata updates with the PRIMARY...

  29. ** Transactions replicated  ============================================================    0% ** Transactions replicated  ##########################################################==   97% ** Transactions replicated  ############################################################  100% 

  30.  MySQL  192.168.9.154:3306 ssl  JS > rs.status()
  31. {
  32.     "replicaSet": {
  33.         "name": "kerry_repl", 
  34.         "primary": "dbtest04:3306", 
  35.         "status": "AVAILABLE", 
  36.         "statusText": "All instances available.", 
  37.         "topology": {
  38.             "dbtest04:3306": {
  39.                 "address": "dbtest04:3306", 
  40.                 "instanceRole": "PRIMARY", 
  41.                 "mode": "R/W", 
  42.                 "status": "ONLINE"
  43.             }, 
  44.             "dbtest05:3306": {
  45.                 "address": "dbtest05:3306", 
  46.                 "instanceRole": "SECONDARY", 
  47.                 "mode": "R/O", 
  48.                 "replication": {
  49.                     "applierStatus": "APPLIED_ALL", 
  50.                     "applierThreadState": "Waiting for an event from Coordinator", 
  51.                     "applierWorkerThreads": 4, 
  52.                     "receiverStatus": "ON", 
  53.                     "receiverThreadState": "Waiting for source to send event", 
  54.                     "replicationLag": null, 
  55.                     "replicationSsl": "TLS_AES_256_GCM_SHA384 TLSv1.3"
  56.                 }, 
  57.                 "status": "ONLINE"
  58.             }
  59.         }, 
  60.         "type": "ASYNC"
  61.     }
  62. }
  63.  MySQL  192.168.9.154:3306 ssl  JS > 
复制代码
MySQL Router安装

bootstrap模式支持failover,在--directory指定的路径下自动生成安装目录,配置文件里的默认端口为6446和6447,这里将MySQL Router安装在192.168.9.159上,如果资源充足的话,建议将MySQL Router安装在单独的一台服务器上。
  1. $ cd /data/soft
  2. $ tar xvf  mysql-router-8.0.35-linux-glibc2.28-x86_64.tar.xz -C /opt/mysql
  3. $ cd /opt/mysql/
  4. $ ln -s mysql-router-8.0.35-linux-glibc2.28-x86_64/ router
复制代码
配置环境变量
在mysql用户下编辑~/.bash_profile,加入下面配置信息
  1. export PATH=$PATH:/opt/mysql/router/bin
复制代码
执行下面命令使其生效
  1. $ source ~/.bash_profile
复制代码
  1. #查看帮助信息
  2. mysqlrouter --help

  3. #创建mysqlrouter的数据目录
  4. mkdir -p /data/mysqlrouter

  5. $ mysqlrouter --bootstrap rsadmin@dbtest04:3306  \
  6.              --directory /data/mysqlrouter \
  7.              --account rs_router \
  8.              --conf-bind-address="192.168.9.159" --account-host="192.168.9.%" \
  9.              --name='myrouter'  --user mysql --force-password-validation
复制代码
  1. $ mysqlrouter --bootstrap mysqladmin@dbtest04:3306  \
  2. >              --directory /data/mysqlrouter \
  3. >              --account rs_router \
  4. >              --name='myrouter'  --user mysql --force-password-validation
  5. Please enter MySQL password for mysqladmin: 
  6. # Bootstrapping MySQL Router 8.0.35 (MySQL Community - GPL) instance at '/data/mysqlrouter'...

  7. Please enter MySQL password for rs_router: 
  8. - Creating account(s) (only those that are needed, if any)
  9. - Verifying account (using it to run SQL queries that would be run by Router)
  10. - Storing account in keyring
  11. - Adjusting permissions of generated files
  12. - Creating configuration /data/mysqlrouter/mysqlrouter.conf

  13. # MySQL Router 'myrouter' configured for the InnoDB ReplicaSet 'kerry_repl'

  14. After this MySQL Router has been started with the generated configuration

  15.     $ mysqlrouter -c /data/mysqlrouter/mysqlrouter.conf

  16. InnoDB ReplicaSet 'kerry_repl' can be reached by connecting to:

  17. ## MySQL Classic protocol

  18. - Read/Write Connections: localhost:6446
  19. - Read/Only Connections:  localhost:6447

  20. ## MySQL X protocol

  21. - Read/Write Connections: localhost:6448
  22. - Read/Only Connections:  localhost:6449
复制代码
我们配置一下mysqlrouter的systemctl服务。使用root账号创建文件/usr/lib/systemd/system/mysqlrouter.service,然后配置如下所示:
  1. [Unit]
  2. Description=MySQL Router
  3. After=syslog.target
  4. After=network.target

  5. [Service]
  6. Type=simple
  7. User=mysql
  8. Group=mysql

  9. PIDFile=/data/mysqlrouter/mysqlrouter.pid

  10. ExecStart=/opt/mysql/router/bin/mysqlrouter -c /data/mysqlrouter/mysqlrouter.conf

  11. Restart=on-failure

  12. PrivateTmp=true

  13. [Install]
  14. WantedBy=multi-user.target
复制代码
然后执行下面命令
  1. # systemctl daemon-reload
  2. # systemctl enable mysqlrouter.service
  3. # systemctl status mysqlrouter.service
  4. # systemctl start mysqlrouter.service
复制代码
到这边MySQL副本集就已经搭建成功,然后就是简单的测试。这里就不作展开介绍了。
总结

MySQL副本集的安装是非常简单的,但是从官方文档,我们可以看到MySQL副本集的限制与不足也是非常多。它跟MySQL主从复制的差别不是特别大。其最大的特点就是使用MySQL Shell搭建非常简单方便,MySQL Router可以检测到MySQL副本集的节点变化。目前来说,生成中使用的价值不是非常大。
参考资料

[1] 1: https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-innodb-replicaset.html
扫描上面二维码关注我如果你真心觉得文章写得不错,而且对你有所帮助,那就不妨帮忙“推荐"一下,您的“推荐”和”打赏“将是我最大的写作动力!本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.
来源:https://www.cnblogs.com/kerrycode/p/17957465
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具