在前面的内容 MySQL 高可用方案--MGR 第01期:初探 中,我们聊了 MGR 与传统复制的区别、限制、应用场景等,这一节内容我们来聊聊 MGR 的部署。
1 架构介绍
node1:192.168.150.232。 node2:192.168.150.253。 node3:192.168.150.123。
2 基础环境准备
192.168.150.232 node1
192.168.150.253 node2
192.168.150.123 node3
[mysql]
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
log_bin=binlog
log_slave_updates=ON
binlog_format=ROW
master_info_repository=TABLE
relay_log_info_repository=TABLE
transaction_write_set_extraction=XXHASH64
binlog_transaction_dependency_tracking=WRITESET
slave_parallel_type=LOGICAL_CLOCK
slave_preserve_commit_order=1
#组复制相关参数
group_replication_start_on_boot=off
group_replication_local_address= "node1:33061"
group_replication_group_seeds= "node1:33061,node2:33061,node3:33061"
group_replication_bootstrap_group=off
#Plugin
plugin-load-add="mysql_clone.so;group_replication.so"
clone=FORCE_PLUS_PERMANENT
disabled_storage_engines,MGR 只支持 InnoDB 存储引擎,所以可以通过增加这个参数来禁用其他引擎。 server_id,三台机器配置不同的 server_id。 gtid_mode,必须启用 GTID。 enforce_gtid_consistency,服务器只允许执行安全的 GTID 语句来保证一致性。 binlog_transaction_dependency_tracking,控制事务依赖模式,MGR 中,需要设置为 WRITESET。 slave_parallel_type,需要设置为 LOGICAL_CLOCK。 slave_preserve_commit_order,需要设置为 1,表示并行事务的最终提交顺序与 Primary 提交的顺序保持一致,以保证数据一致性。 plugin_load_add,启动时加载插件。这里配置的是组复制的插件。 group_replication_group_name,告诉插件它要加入或创建的组名。group_replication_group_name 必须是合法的 UUID,可以使用 select UUID() 生成一个,这个 UUID 构成了 GTID 的一部分,当组成员从客户端接收事务时,以及组成员内部生成的视图更改事件被写入二进制日志时,使用 GTID。 group_replication_start_on_boot,设置为 off 会指示插件在服务器启动时不会自动启动操作。这在设置 Group Replication 时非常重要,因为它确保您可以在手动启动插件之前配置服务器。一旦配置了成员,就可以将 group_replication_start_on_boot 设置为 on,以便组复制在服务器启动时自动启动。 group_replication_local_address,可以设置成员与组内其他成员进行内部通信时使用的网络地址和端口。Group Replication 将此地址用于涉及组通信引擎(XCom, Paxos的一种变体)的远程实例内部成员到成员之间的连接。group_replication_local_address 配置的网络地址必须是所有组成员都可以解析的。 group_replication_group_seeds,设置组成员的主机名和端口,新成员将使用这些成员建立到组的连接。 group_replication_bootstrap_group,指示插件是否引导该组,在本例中,即使s1是组的第一个成员,我们也在选项文件中将这个变量设置为 off。相反,我们在实例运行时配置 group_replication_bootstrap_group,以确保实际上只有一个成员引导组。 plugin-load-add,增加了 Clone Plugin,如果 MySQL 版本是 8.0.17 或更高的版本,则 MGR 在新增节点时,可以使用 Clone Plugin 来传输集群中已有的数据给新增节点。
3 MySQL Shell 安装
yum install mysql-shell-8.0.25-1.el7.x86_64.rpm -y
4 创建集群用户
CREATE USER 'mgr_user'@'%' IDENTIFIED BY 'BgIka^123';
GRANT CLONE_ADMIN, CONNECTION_ADMIN, CREATE USER, EXECUTE, FILE, GROUP_REPLICATION_ADMIN, PERSIST_RO_VARIABLES_ADMIN, PROCESS, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, REPLICATION_APPLIER, REPLICATION_SLAVE_ADMIN, ROLE_ADMIN, SELECT, SHUTDOWN, SYSTEM_VARIABLES_ADMIN ON *.* TO 'mgr_user'@'%' WITH GRANT OPTION;
GRANT DELETE, INSERT, UPDATE ON mysql.* TO 'mgr_user'@'%' WITH GRANT OPTION;
GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, INDEX, INSERT, LOCK TABLES, REFERENCES, SHOW VIEW, TRIGGER, UPDATE ON mysql_innodb_cluster_metadata.* TO 'mgr_user'@'%' WITH GRANT OPTION;
GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, INDEX, INSERT, LOCK TABLES, REFERENCES, SHOW VIEW, TRIGGER, UPDATE ON mysql_innodb_cluster_metadata_bkp.* TO 'mgr_user'@'%' WITH GRANT OPTION;
GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, INDEX, INSERT, LOCK TABLES, REFERENCES, SHOW VIEW, TRIGGER, UPDATE ON mysql_innodb_cluster_metadata_previous.* TO 'mgr_user'@'%' WITH GRANT OPTION;
5 用 MySQL Shell 创建 MGR
mysqlsh -umgr_user -p'BgIka^123' -h192.168.150.232
var cluster = dba.createCluster('Cluster01')
var cluster = dba.getCluster('Cluster01')
A new InnoDB cluster will be created on instance '192.168.150.232:3306'.
Disabling super_read_only mode on instance 'node1:3306'.
Validating instance configuration at 192.168.150.232:3306...
This instance reports its own address as node1:3306
Instance configuration is suitable.
NOTE: Group Replication will communicate with other members using 'node1:33061'. Use the localAddress option to override.
Creating InnoDB cluster 'Cluster01' on 'node1:3306'...
Adding Seed Instance...
Cluster successfully created. Use Cluster.addInstance() to add MySQL instances.
At least 3 instances are needed for the cluster to be able to withstand up to
one server failure.
cluster.addInstance('mgr_user@192.168.150.253:3306')
cluster.status();
cluster.addInstance('mgr_user@192.168.150.123:3306')
6 MySQL Router 安装
wget https://downloads.mysql.com/archives/get/p/41/file/mysql-router-community-8.0.25-1.el7.x86_64.rpm
yum install mysql-router-community-8.0.25-1.el7.x86_64.rpm -y
mkdir /data/mysqlroute
mysqlrouter -B mgr_user@192.168.150.232:3306 --directory=/data/mysqlroute -u root --force
Please enter MySQL password for mgr_user:
# Bootstrapping MySQL Router instance at '/data/mysqlroute'...
- 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/mysqlroute/mysqlrouter.conf
# MySQL Router configured for the InnoDB Cluster 'Cluster01'
After this MySQL Router has been started with the generated configuration
$ mysqlrouter -c data/mysqlroute/mysqlrouter.conf
the cluster 'Cluster01' can be reached by connecting to:
## MySQL Classic protocol
- Read/Write Connections: localhost:6446
- Read/Only Connections: localhost:6447
## MySQL X protocol
- Read/Write Connections: localhost:6448
- Read/Only Connections: localhost:6449
6446 为读写端口 6447 为只读端口
/data/mysqlroute/start.sh
mysql -umgr_user -p'BgIka^123' -P6446 -h192.168.150.232 -e "select @@hostname"
mysql> select @@hostname;
+------------+
| @@hostname |
+------------+
| node1 |
+------------+
1 row in set (0.00 sec)
7 参考文档
我们创建了一个 MySQL 交流社群,围绕开发、运维、DBA、架构师和其他需要用到 MySQL 的群体,群内会分享一些读书笔记、面试技巧等,同时也用于大家交流使用 MySQL 过程中遇到的问题!
入群请加下方群秘二维码,回复 MySQL,等待群秘邀你入群。
文章转载自MySQL数据库联盟,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。