MySQL8.0.21 InnoDB Cluster 从零搭建集群方案详细文档

您所在的位置:网站首页 mysql分布式集群搭建 MySQL8.0.21 InnoDB Cluster 从零搭建集群方案详细文档

MySQL8.0.21 InnoDB Cluster 从零搭建集群方案详细文档

2023-09-18 09:33| 来源: 网络整理| 查看: 265

InnoDB集群

hi~ ,本文档分享新版本MySQL 8.0.21 Innodb Cluster集群搭建过程 ~

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

每个MySQL服务器实例都运行MySQL Group Replication,它提供了具有内置故障转移功能的InnoDB Clusters中复制数据的机制。AdminAPI消除了直接在InnoDB群集中使用组复制的需要。

MySQL路由器可以根据您部署的群集自动进行自我配置,从而将客户端应用程序透明地连接到服务器实例。如果服务器实例发生意外故障,群集将自动重新配置。

在默认的单主服务器模式下,InnoDB集群具有单个读写服务器实例-主服务器。多个辅助服务器实例是主服务器的副本。如果主服务器发生故障,则辅助服务器将自动升级为主服务器角色。MySQL Router会检测到此情况并将客户端应用程序转发到新的主服务器。高级用户还可以将集群配置为具有多个主数据库。

下图概述了这些技术如何协同工作:

图21.1 InnoDB Cluster概述 在这里插入图片描述

环境信息

这里准备三台虚拟机就可以了, MySQL Router 和 MySQL Shell 可以和 MySQL Server 部署在同一台服务器上,生产环境,可以根据具体场景对标安装,实验环境参考如下:

栏目服务器一服务器二服务器三端口操作系统Ubuntu 16.04.3 LTSUbuntu 16.04.3 LTSUbuntu 16.04.3 LTS/IP地址192.168.0.1192.168.0.2192.168.0.3/主机名UBUNTU-DEV-0-1UBUNTU-DEV-0-2UBUNTU-DEV-0-3/MySQL Server 8.0.21MGR节点一MGR 节点二MGR 节点三3306MySQL Shell 8.0.21MySQL Shell 节点一MySQL Shell 节点二MySQL Shell 节点三/MySQL Router 8.0.21MySQL Router 节点一MySQL Router 节点二MySQL Router 节点三6446(写)6447(读) 安装说明

这里我们先安装 MGR 组复制成功之后, 再安装 MySQL Shell 8.0.21 组件和部署 MySQL Router 8.0.21,即“采用组复制的方式”部署 MySQL InnoDB Cluter 集群。

即先有组复制的存在,然后使用它来创建集群。 后续我们在创建集群的时候,需要将 {adoptFromGR: true} 选项传递 给该 dba.createCluster()功能。创建的InnoDB群集匹配复制组是以单主数据库还是多主数据库运行。

安装顺序: (1)MySQL Server 8.0.21 -> (2)启动MGR组复制 -> (3)MySQL Shell 8.0.21 -> (4)创建 Innodb Cluster 集群 -> (5)MySQL Router 8.0.21

接下来和大家一步步来实现部署上述集群架构。

安装MySQL Server 8.0.21

安装之前,请提前下载好的以上三个软件的二进制安装包,所有安装都采用二进制解压安装即可,如下:

软件包名MD5值下载链接mysql-8.0.21-linux-glibc2.12-x86_64.tar.xzd39efe001766edfa956e673c1a60a26ahttps://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.21-linux-glibc2.12-x86_64.tar.xzmysql-shell-8.0.21-linux-glibc2.12-x86-64bit.tar.gzaee9bbef97f3fc545f1239203c878100https://downloads.mysql.com/archives/get/p/43/file/mysql-shell-8.0.21-linux-glibc2.12-x86-64bit.tar.gzmysql-router-8.0.21-linux-glibc2.12-x86_64.tar.xz92015c580ad7abec125522b164203a85https://downloads.mysql.com/archives/get/p/41/file/mysql-router-8.0.21-linux-glibc2.12-x86_64.tar.xz

安装MySQL Server用二进制安装即可,这里安装一台,剩下两个节点的安装相同,配置文件要稍加注意一下,比如server id不要重复!部分IP改为节点的IP地址,比如 report_host。

my.cnf 关键的配置如下:

server_id=13306 gtid_mode=on enforce_gtid_consistency=1 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_ip_whitelist='192.168.0.0/24' loose-group_replication_local_address='192.168.0.1:33061' loose-group_replication_group_seeds='192.168.0.1:33061,192.168.0.2:33061,192.168.0.3:33061' loose-group_replication_bootstrap_group=off loose-group_replication_single_primary_mode=on loose-group_replication_enforce_update_everywhere_checks=off loose-group_replication_recovery_get_public_key=on loose-group_replication_recovery_use_ssl=off loose-group_replication_ssl_mode='DISABLED' loose-group_replication_consistency='EVENTUAL' loose-group_replication_member_expel_timeout=5 report_host='192.168.0.1' report_port=3306 plugin_load_add ='group_replication.so' auto_increment_increment=1 auto_increment_offset=1 mysqlx_port=33060 admin_port=33062

安装一些依赖包:

root@UBUNTU-DEV-0-1:~# apt-get update root@UBUNTU-DEV-0-1:~# apt -y install libaio1 root@UBUNTU-DEV-0-1:~# apt -y install xz-utils

创建mysql账号,用于启动mysql进程

root@UBUNTU-DEV-0-1:~# groupadd mysql && useradd -r -g mysql -s /bin/false mysql root@UBUNTU-DEV-0-1:~# cat /etc/passwd | grep -iw "mysql" mysql:x:999:30003::/home/mysql:/bin/false

解压软件包,先把软件包上传到 /opt 目录

root@UBUNTU-DEV-0-1:~# cd /opt root@UBUNTU-DEV-0-1:/opt# tar -xvf mysql-8.0.21-linux-glibc2.12-x86_64.tar.xz root@UBUNTU-DEV-0-1:/opt# cp -Rf ./mysql-8.0.21-linux-glibc2.12-x86_64/* /usr/local/mysql/ root@UBUNTU-DEV-0-1:/opt# chown -R mysql:mysql /usr/local/mysql/ root@UBUNTU-DEV-0-1:/opt# chmod -R 755 /usr/local/mysql/

创建mysql需要的数据目录

root@UBUNTU-DEV-0-1:~# mkdir -p /data/mysql/{data,binlog,relay} root@UBUNTU-DEV-0-1:~# chown -R mysql:mysql /data/mysql/{data,binlog,relay} root@UBUNTU-DEV-0-1:~# chmod -R 750 /data/mysql/

初始化数据库,注意在修改root密码的时候,加上 SET SQL_LOG_BIN=0; … SET SQL_LOG_BIN=1;本次该节点的操作不记录日志,密码填你实际的密码。

# 初始化数据库 root@UBUNTU-DEV-0-1:~# /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql --datadir=/data/mysql/data --user=mysql --initialize-insecure # 启动数据库 root@UBUNTU-DEV-0-1:~# /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf 2>&1 > /dev/null & # 修改root密码永不过期 root@UBUNTU-DEV-0-1:~# /usr/local/mysql/bin/mysql -uroot -S /data/mysql/data/mysql.sock -e "SET SQL_LOG_BIN=0;SET global super_read_only=OFF; SET global read_only=OFF; alter user 'root'@'localhost' password expire never; set password for 'root'@'localhost'='123456';flush privileges; SET SQL_LOG_BIN=1;"

为所有节点设置一个连接账户并授予REPLICATION权限

mysql> SET SQL_LOG_BIN=0; mysql> CREATE USER IF NOT EXISTS `repl`@`192.168.0.1` IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER; mysql> CREATE USER IF NOT EXISTS `repl`@`192.168.0.2` IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER; mysql> CREATE USER IF NOT EXISTS `repl`@`192.168.0.3` IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER; mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT, BACKUP_ADMIN ON *.* TO `repl`@`192.168.0.1`; mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT, BACKUP_ADMIN ON *.* TO `repl`@`192.168.0.2`; mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT, BACKUP_ADMIN ON *.* TO `repl`@`192.168.0.3`; mysql> FLUSH PRIVILEGES; mysql> SET SQL_LOG_BIN=1;

为了能够管理群集,必须确保您拥有一个具有所需特权的合适用户。推荐的方法是创建一个管理用户。如果在配置实例时未创建管理用户,请使用以下SQL语句来操作。例如,要创建一个名为的用户icadmin,该用户可以管理分配给变量的InnoDB集群 cluster,参与如下操作:这个步骤可选的,如果你后续想直接通过root账号来创建集群也可以的。

mysql> SET SQL_LOG_BIN=0; mysql> CREATE USER IF NOT EXISTS `icadmin`@`192.168.0.%` IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER; mysql> GRANT SELECT, RELOAD, SHUTDOWN, PROCESS, FILE, SUPER, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE USER ON *.* TO `icadmin`@`192.168.0.%` WITH GRANT OPTION mysql> GRANT BACKUP_ADMIN,CLONE_ADMIN,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_APPLIER,SYSTEM_VARIABLES_ADMIN ON *.* TO `icadmin`@`192.168.0.%` WITH GRANT OPTION mysql> GRANT INSERT, UPDATE, DELETE ON `mysql`.* TO `icadmin`@`192.168.0.%` WITH GRANT OPTION mysql> GRANT INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `mysql_innodb_cluster_metadata`.* TO `icadmin`@`192.168.0.%` WITH GRANT OPTION mysql> GRANT INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `mysql_innodb_cluster_metadata_bkp`.* TO `icadmin`@`192.168.0.%` WITH GRANT OPTION mysql> GRANT INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `mysql_innodb_cluster_metadata_previous`.* TO `icadmin`@`192.168.0.%` WITH GRANT OPTION mysql> FLUSH PRIVILEGES; mysql> SET SQL_LOG_BIN=1;

执行以下两台语句安装组复制插件

mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so'; mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%group_replication%'; # 设置复制账号、配置通道 mysql> CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery'; mysql> SELECT User_name,Channel_name FROM mysql.slave_master_info WHERE user_name = 'repl'; mysql> SET global group_replication_recovery_get_public_key=ON;

安装好后,检查进程信息

root@UBUNTU-DEV-0-1:~# ps -ef | grep mysql root 112677 1 0 10:06 pts/1 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf mysql 114210 112677 0 10:06 pts/1 00:00:24 /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql --datadir=/data/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=error.log --pid-file=/data/mysql/data/mysqld.pid --socket=/data/mysql/data/mysql.sock --port=3306 root 116153 111548 0 11:04 pts/1 00:00:00 grep --color=auto mysql

其它两个节点的安装方式参照上面步骤即可!

启动组复制

第一步是部署至少三个MySQL Server实例,MySQL组复制作为MySQL服务器的插件提供,并且组中的每个服务器都需要配置和安装插件。

在此示例中,三个实例用于该组,这是创建组的最小实例数。添加更多实例将增加组的容错能力。例如,如果该组由三个成员组成,则在一个实例失败的情况下,该组可以继续。但是,如果发生另一个故障,该组将无法继续处理写事务。通过添加更多实例,在组继续处理事务时可能发生故障的服务器数量也会增加。一个组中最多可以使用9个实例。

对于组复制,数据必须存储在InnoDB事务存储引擎中,使用其他存储引擎(包括临时 MEMORY存储引擎)可能会导致组复制中的错误。disabled_storage_engines 如下设置 系统变量以防止其使用:

disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"

从MySQL 8.0.21开始,组复制支持二进制日志中校验和的存在,并且可以使用它们来验证某些通道上事件的完整性,因此可以使用默认设置。否则请在my.cnf中要补充一条:

binlog_checksum=NONE

当安装好三个节点后,首次启动组的过程称为引导。您可以使用 group_replication_bootstrap_group 系统变量来引导组。引导程序只能由一台服务器(启动该组的服务器)执行一次,并且只能执行一次。

为了安全地引导该组,请连接到节点一并发出以下语句:

mysql> set GLOBAL group_replication_bootstrap_group=ON; mysql> start GROUP_REPLICATION; mysql> set GLOBAL group_replication_bootstrap_group=OFF;

或者,如果您要为START GROUP_REPLICATION语句提供分布式恢复的用户凭据(可以从MySQL 8.0.21开始),则发出以下语句:

mysql> SET GLOBAL group_replication_bootstrap_group=ON; mysql> START GROUP_REPLICATION USER='repl', PASSWORD='123456'; mysql> SET GLOBAL group_replication_bootstrap_group=OFF;

此时,组中有一个成员,现在是时候通过添加先前配置的其他两个服务器来扩展组。将节点二、节点三加入组复制:

mysql> START GROUP_REPLICATION;

或者,如果您要为START GROUP_REPLICATION语句提供分布式恢复的用户凭据(可以从MySQL 8.0.21开始):

mysql> START GROUP_REPLICATION USER='repl', PASSWORD='123456';

不需要像节点一上执行这些前面的步骤,这里有在你的差异是并不需要引导组,因为组已经存在。 此时,仅需要将服务器二、三添加到已经存在的组中。

检查组复制状态:

mysql> select * FROM performance_schema.replication_group_members; +---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | +---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+ | group_replication_applier | 108e369e-2a16-11eb-9ad3-0050568c0de0 | 192.168.0.2 | 3306 | ONLINE | SECONDARY | 8.0.21 | | group_replication_applier | c4b33d08-2a0b-11eb-93b4-0050568c9d79 | 192.168.0.1 | 3306 | ONLINE | PRIMARY | 8.0.21 | | group_replication_applier | d25573a3-2a16-11eb-b8ed-0050568ceb88 | 192.168.0.3 | 3306 | ONLINE | SECONDARY | 8.0.21 | +---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+ 3 rows in set (0.00 sec)

至些,MGR三节点组复制安装完毕!

安装MySQL Shell 8.0.21

MySQL Shell是MySQL Server的高级客户端和代码编辑器。除了提供的类似于MySQL的SQL功能外,MySQL Shell还提供JavaScript和Python脚本功能,并包括与MySQL配合使用的API。X DevAPI使您能够使用关系数据和文档数据,AdminAPI使您可以使用InnoDB Cluster。

MySQL Shell提供以下功能。

支持的语言

MySQL Shell处理以JavaScript,Python和SQL编写的代码。根据当前处于活动状态的语言,将任何执行的代码作为这些语言之一进行处理。还有一些特定的MySQL Shell命令(带有前缀)\,使您可以配置MySQL Shell,而与当前选择的语言无关。

交互式代码执行

MySQL Shell提供了一种交互式代码执行模式,您可以在MySQL Shell提示符下键入代码并处理每个输入的语句,并将处理结果打印在屏幕上。如果使用中的终端支持Unicode文本输入。支持彩色端子。

批处理代码执行

除了交互执行代码外,MySQL Shell还可以从不同来源获取代码并进行处理。这种以非交互方式处理代码的方法称为 批处理执行。

支持的API

AdminAPI使您可以管理MySQL实例,使用它们创建InnoDB集群,InnoDB ReplicaSet以及集成MySQL路由器。 当MySQL Shell使用X协议连接到MySQL服务器时,X DevAPI使开发人员可以使用关系数据和文档数据。

X协议支持

MySQL Shell旨在为所有支持X协议的MySQL产品提供集成的命令行客户端。MySQL Shell的开发功能专为使用X协议的会话而设计。MySQL Shell还可以使用经典MySQL协议连接到不支持X协议的MySQL服务器。

还有其它功能,请参阅官方文档…

安装MySQL Shell非常简单,先把软件包上传到/opt目录, 直接解压就行:

root@UBUNTU-DEV-0-1:~# cd /opt root@UBUNTU-DEV-0-1:/opt# tar -zxvf mysql-shell-8.0.21-linux-glibc2.12-x86-64bit.tar.gz root@UBUNTU-DEV-0-1:/opt# cp -Rf ./mysql-shell-8.0.21-linux-glibc2.12-x86-64bit/* /usr/local/mysqlshell/ root@UBUNTU-DEV-0-1:/opt# chown -R mysql:mysql /usr/local/mysqlshell root@UBUNTU-DEV-0-1:/opt# chmod -R 755 /usr/local/mysqlshell # 设置环境变量 root@UBUNTU-DEV-0-1:/opt# echo "export PATH=\$PATH:/usr/local/mysqlshell/bin" >> /etc/profile root@UBUNTU-DEV-0-1:/opt# source /etc/profile

三个节点部署操作一样,按上面操作即可!

创建 Innodb Cluster 集群

如果您已经有组复制的现有部署,并且想要使用它来创建群集,请将adoptFromGR选项传递 给该 dba.createCluster()功能。创建的InnoDB群集匹配复制组是以单主数据库还是多主数据库运行。

要采用现有的组复制组,请使用MySQL Shell连接到组成员。执行以下SQL:

mysql-js> var cluster = dba.createCluster('testCluster', {adoptFromGR: true}); A new InnoDB cluster will be created based on the existing replication group on instance '192.168.0.1:3306'. Creating InnoDB cluster 'testCluster' on '192.168.0.1:3306'... Adding Seed Instance... Adding Instance '192.168.0.2:3306'... Adding Instance '192.168.0.1:3306'... Adding Instance '192.168.0.3:3306'... Resetting distributed recovery credentials across the cluster... Cluster successfully created based on existing replication group.

检查集群状态: “status”: “OK” 表示集群状态是正常的 “topologyMode”: “Single-Primary” 表示是单主模式 “mode”: “R/W” 表示可读可写 “mode”: “R/O” 表示只读

root@UBUNTU-DEV-0-1:~# /usr/local/mysqlshell/bin/mysqlsh -h 192.168.0.1 -P 3306 -uicadmin -p Please provide the password for '[email protected]:3306': ****** Save password for '[email protected]:3306'? [Y]es/[N]o/Ne[v]er (default No): MySQL Shell 8.0.21 Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type '\help' or '\?' for help; '\quit' to exit. Creating a session to '[email protected]:3306' Fetching schema names for autocompletion... Press ^C to stop. Your MySQL connection id is 85 Server version: 8.0.21 MySQL Community Server - GPL No default schema selected; type \use to set one. MySQL 192.168.0.1:3306 ssl JS > dba.getCluster("testCluster").status(); { "clusterName": "testCluster", "defaultReplicaSet": { "name": "default", "primary": "192.168.0.1:3306", "ssl": "DISABLED", "status": "OK", "statusText": "Cluster is ONLINE and can tolerate up to ONE failure.", "topology": { "192.168.0.1:3306": { "address": "192.168.0.1:3306", "mode": "R/W", "readReplicas": {}, "replicationLag": null, "role": "HA", "status": "ONLINE", "version": "8.0.21" }, "192.168.0.2:3306": { "address": "192.168.0.2:3306", "mode": "R/O", "readReplicas": {}, "replicationLag": null, "role": "HA", "status": "ONLINE", "version": "8.0.21" }, "192.168.0.3:3306": { "address": "192.168.0.3:3306", "mode": "R/O", "readReplicas": {}, "replicationLag": null, "role": "HA", "status": "ONLINE", "version": "8.0.21" } }, "topologyMode": "Single-Primary" }, "groupInformationSourceMember": "192.168.0.1:3306" } MySQL Router 8.0.21

MySQL Router是InnoDB Cluster的一部分,是轻量级的中间件,可在应用程序与后端MySQL服务器之间提供透明的路由。它可以用于各种用例,例如通过有效地将数据库流量路由到适当的后端MySQL服务器来提供高可用性和可伸缩性。可插拔架构还使开发人员能够针对自定义用例扩展MySQL Router。

强烈建议将MySQL Router 8.0与MySQL Server 8.0和5.7一起使用。

为了获得最佳性能,MySQL路由器通常与使用它的应用程序安装在同一主机上。可能的原因包括:

允许本地UNIX域套接字连接到应用程序,而不是TCP / IP。减少网络延迟。为了允许MySQL路由器连接到MySQL而不需要路由器主机的额外帐户,对于专门为应用程序主机创建的MySQL帐户(例如 [email protected]),而不是像myapp @%这样的值 。通常,应用程序服务器最容易扩展。

您可以在网络上运行多个MySQL Router实例,而无需将MySQL Router隔离到单个计算机上。这是因为MySQL路由器对任何特定的服务器或主机都没有亲和力。

图3.1示例MySQL路由器部署

在这里插入图片描述 这里我们通过 Bootstrapping MySQL Router 的方式来安装部署 MySQL Router 8.0.21:

解压软件包:

root@UBUNTU-DEV-0-1:~# cd /opt root@UBUNTU-DEV-0-1:/opt# tar -xvf mysql-router-8.0.21-linux-glibc2.12-x86_64.tar.xz root@UBUNTU-DEV-0-1:/opt# cp -Rf ./tar/mysql-router-8.0.21-linux-glibc2.12-x86_64/* /usr/local/mysqlrouter/ root@UBUNTU-DEV-0-1:/opt# chown -R mysql:mysql /usr/local/mysqlrouter root@UBUNTU-DEV-0-1:/opt# chmod -R 755 /usr/local/mysqlrouter

创建MySQL Router 目录

root@UBUNTU-DEV-0-1:~# mkdir -p /data/mysqlrouter root@UBUNTU-DEV-0-1:/opt# chown -R mysql:mysql /data/mysqlrouter root@UBUNTU-DEV-0-1:/opt# chmod -R 755 /data/mysqlrouter # 设置环境变量 root@UBUNTU-DEV-0-1:/opt# echo "export PATH=\$PATH:/usr/local/mysqlrouter/bin" >> /etc/profile root@UBUNTU-DEV-0-1:/opt# source /etc/profile

bootstrap引导,创建一个独立的MySQL Router实例 --directory选项指定路由目录,–name指定路由器名称,以下例子是一个名为InnoDB的集群 “testCluster” 已经存在。

root@UBUNTU-DEV-0-1:~# /usr/local/mysqlrouter/bin/mysqlrouter --bootstrap root:[email protected] --directory /data/mysqlrouter --conf-use-sockets --user=mysql --name=mysql_router_13306 --conf-bind-address=192.168.0.1 --account-host="192.168.0.%" # Bootstrapping MySQL Router instance at '/data/mysqlrouter'... - Creating account(s) (only those that are needed, if any) - Verifying account (using it to run SQL queries that would be run by Router) - Storing account in keyring - Adjusting permissions of generated files - Creating configuration /data/mysqlrouter/mysqlrouter.conf # MySQL Router 'mysql_router_13306' configured for the InnoDB Cluster 'testCluster' After this MySQL Router has been started with the generated configuration $ /usr/local/mysqlrouter/bin/mysqlrouter -c /data/mysqlrouter/mysqlrouter.conf the cluster 'testCluster' can be reached by connecting to: ## MySQL Classic protocol - Read/Write Connections: localhost:6446, /data/mysqlrouter/mysql.sock - Read/Only Connections: localhost:6447, /data/mysqlrouter/mysqlro.sock ## MySQL X protocol - Read/Write Connections: localhost:64460, /data/mysqlrouter/mysqlx.sock - Read/Only Connections: localhost:64470, /data/mysqlrouter/mysqlxro.sock

引导过程已在mysqlrouter.conf指定的目录中创建了 具有所需文件的文件,结果将向您展示如何启动此MySQL Router实例。生成的MySQL路由器目录类似于:

root@UBUNTU-DEV-0-1:~# tree /data/mysqlrouter/ /data/mysqlrouter/ ├── data │ ├── keyring │ └── state.json ├── log │ └── mysqlrouter.log ├── mysqlro.sock ├── mysqlrouter.conf ├── mysqlrouter.key ├── mysqlrouter.pid ├── mysql.sock ├── mysqlxro.sock ├── mysqlx.sock ├── run ├── start.sh └── stop.sh

生成的MySQL路由器配置文件(mysqlrouter.conf)类似于:

# File automatically generated during MySQL Router bootstrap [DEFAULT] name=mysql_router_13306 user=mysql logging_folder=/data/mysqlrouter/log runtime_folder=/data/mysqlrouter/run data_folder=/data/mysqlrouter/data keyring_path=/data/mysqlrouter/data/keyring master_key_path=/data/mysqlrouter/mysqlrouter.key connect_timeout=15 read_timeout=30 dynamic_state=/data/mysqlrouter/data/state.json [logger] level = INFO [metadata_cache:testCluster] cluster_type=gr router_id=1 user=mysql_router1_1ladsfx41k2f metadata_cluster=testCluster ttl=0.5 auth_cache_ttl=-1 auth_cache_refresh_interval=2 use_gr_notifications=0 [routing:testCluster_rw] bind_address=192.168.0.1 bind_port=6446 socket=/data/mysqlrouter/mysql.sock destinations=metadata-cache://testCluster/?role=PRIMARY routing_strategy=first-available protocol=classic max_connections=5000 max_connect_errors=1000000 [routing:testCluster_ro] bind_address=192.168.0.1 bind_port=6447 socket=/data/mysqlrouter/mysqlro.sock destinations=metadata-cache://testCluster/?role=SECONDARY routing_strategy=round-robin-with-fallback protocol=classic max_connections=5000 max_connect_errors=1000000 [routing:testCluster_x_rw] bind_address=192.168.0.1 bind_port=64460 socket=/data/mysqlrouter/mysqlx.sock destinations=metadata-cache://testCluster/?role=PRIMARY routing_strategy=first-available protocol=x max_connections=5000 max_connect_errors=1000000 [routing:testCluster_x_ro] bind_address=192.168.0.1 bind_port=64470 socket=/data/mysqlrouter/mysqlxro.sock destinations=metadata-cache://testCluster/?role=SECONDARY routing_strategy=round-robin-with-fallback protocol=x max_connections=5000 max_connect_errors=1000000

启动MySQL Router 路由器:

root@UBUNTU-DEV-0-1:~# bash /data/mysqlrouter/start.sh 2>&1 > /dev/null & root@UBUNTU-DEV-0-1:~# ps -ef | grep mysqlrouter root 125379 1 0 15:44 pts/1 00:00:00 sudo ROUTER_PID=/data/mysqlrouter/mysqlrouter.pid /usr/local/mysqlrouter/bin/mysqlrouter -c /data/mysqlrouter/mysqlrouter.conf --user=mysql mysql 125381 125379 1 15:44 pts/1 00:01:27 /usr/local/mysqlrouter/bin/mysqlrouter -c /data/mysqlrouter/mysqlrouter.conf --user=mysql

测试执行以下SQL,通过IP和端口查看输出结果:

### 测试写接口 ### root@UBUNTU-DEV-0-1:~# /usr/local/mysql/bin/mysql -uicadmin -p -h 192.168.0.1 -P 6446 mysql> select @@hostname as hostname, @@port as port; +----------------------+------+ | hostname | port | +----------------------+------+ | UBUNTU-DEV-0-1 | 3306 | +----------------------+------+ 1 row in set (0.00 sec) ### 测试读接口 ### root@UBUNTU-DEV-0-1:~# /usr/local/mysql/bin/mysql -uicadmin -p -h 192.168.0.1 -P 6447 mysql> select @@hostname as hostname, @@port as port; +----------------------+------+ | hostname | port | +----------------------+------+ | UBUNTU-DEV-0-2 | 3306 | +----------------------+------+ 1 row in set (0.00 sec) mysql> select @@hostname as hostname, @@port as port; +----------------------+------+ | hostname | port | +----------------------+------+ | UBUNTU-DEV-0-3 | 3306 | +----------------------+------+ 1 row in set (0.00 sec)

至此,MySQL InnoDB Cluster 整套集群就已经搭建完毕了。

总结

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

InnoDB Cluster使用组复制,因此您的服务器实例必须满足相同的要求。AdminAPI提供了 dba.checkInstanceConfiguration()验证实例是否满足组复制要求的dba.configureInstance()方法,以及 配置实例以满足要求的方法。 注意 使用沙盒部署时,实例被配置为自动满足这些要求。

组复制成员可以包含使用存储引擎InnoDB(例如)以外的表MyISAM。此类表无法通过组复制写入,因此在使用InnoDB Cluster时无法写入。为了能够使用InnoDB Cluster写入此类表,请InnoDB在使用InnoDB Cluster中的实例之前将所有此类表转换。

必须在要与InnoDB Cluster一起使用的任何实例上启用性能模式。

MySQL Shell用于配置服务器以供InnoDB Cluster使用的配置脚本需要访问Python。在Windows上,MySQL Shell包含Python,不需要用户配置。在Unix上,必须将Python作为外壳环境的一部分。要检查您的系统是否正确配置了Python,请执行以下操作:

$ /usr/bin/env python

如果启动了Python解释器,则无需采取进一步措施。如果前面的命令失败,请在/usr/bin/python和您选择的Python二进制文件之间创建一个软链接。

从8.0.17版本开始,实例必须server_id在InnoDB集群中使用唯一性 。使用该 操作时,如果集群中的实例已使用,则该操作将失败并显示错误。 Cluster.addInstance(instance)server_idinstance

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

The End !



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3