MySQL Innodb Cluster搭建与初探

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: -------------------------------------------------------------------------------------------------正文-----------------------------------...
-------------------------------------------------------------------------------------------------正文---------------------------------------------------------------------------------------------------------------
场景:
有些空余时间了, 想要测试一下Group Replication与MySQL Router~\(≧▽≦)/~

结论:
可用性方面不错;
性能方面其实还不错, 不过写入能力还是老问题, 读多写少的业务可以关注一下Innodb Cluster;

测试环境:

MySQL 8.0.3-rc
MySQL Router 8.0
MySQL shell
sysbench 1.0 (以后再补一篇测试数据......)

虚拟机:

4C24G, 2.00GHz  x 5 (MySQL 8.0.3-rc)
4C24G, 2.40GHz  x 4 (MySQL 8.0.3-rc)
8C24G, 2.40GHz  x 1 (MySQL Router)

搭建过程:

1. 官方源直接安装MySQL相关的所有包, apt-get/yum

2. MySQL的配置, 除了常规配置以外, 推荐加上如下的部分, loose开头的参数表示如果不存在group_replication插件, 则忽略这些配置

点击(此处)折叠或打开

  1. report_host = 192.168.0.100                      ##GR插件会用这个report_host来标记Group中的每个MySQL实例, 确保每个MySQL实例的hostname不一样, 或者这个report_host不一样
  2. log_bin = /home/mysql/mysql-binlog               ##必须开启
  3. log_slave_updates = ON                           ##必须开启
  4. master_info_repository = TABLE                   ##必须使用Table
  5. relay_log_info_repository = TABLE                ##必须使用Table
  6. gtid_mode = ON                                   ##必须开启GTID
  7. enforce_gtid_consistency = ON                    ##必须开启
  8. slave_preserve_commit_order = ON                 ##确保GR_applier按照一致的顺序复现事务
  9. binlog_checksum = NONE                           ##必须设置为NONE
  10. transaction_write_set_extraction=XXHASH64        ##必须设置为XXHASH64

  11. #group_replication = ON                           ##开启Group Replication插件, 安装插件之后再开启
  12. loose-group_replication_start_on_boot=off        ##默认关闭, 防止重启后自动创建新的Group
  13. loose-group_replication_local_address= "192.168.0.100:13306"    ##官方工具会默认使用13306端口作为插件的端口, 设置为13306方便测试
  14. loose-group_replication_group_seeds= "192.168.0.100:13306,192.168.1.100:13306"    ##官方工具貌似不会主动管理这个参数, 手动加上
  15. loose-group_replication_bootstrap_group=off      ##默认关闭防止自动创建新的Group
  16. loose-group_replication_ip_whitelist = '192.168.0.0/24,192.168.1.0/24'    ##推荐在初始化前手工加上, 控制哪些ip的机器可以加入Group

PS: 测试中, 全程使用innodb_flush_log_at_trx_commit = 2 和 sync_binlog = 0 的设置,  双1的性能实在是弱......_(:з」∠)_

3 . 启动所有的MySQL实例, 并安装插件

点击(此处)折叠或打开

  1. INSTALL PLUGIN group_replication SONAME 'group_replication.so'

4. 在mysql中创建用户temp, 测试图方便, 用ALL on *.*就行, 在官方文档中, 有列出这个用户需要的具体权限, 如下

点击(此处)折叠或打开

  1. GRANT ALL PRIVILEGES ON mysql_innodb_cluster_metadata.* TO your_user@'%' WITH GRANT OPTION;
  2. GRANT RELOAD, SHUTDOWN, PROCESS, FILE, SUPER, REPLICATION SLAVE, REPLICATION CLIENT, \
  3. CREATE USER ON *.* TO your_user@'%' WITH GRANT OPTION;
  4. GRANT SELECT ON performance_schema.* TO your_user@'%' WITH GRANT OPTION;
  5. GRANT SELECT ON *.* TO your_user@'%' WITH GRANT OPTION;
  6. GRANT SELECT, INSERT, UPDATE, DELETE ON mysql.* TO your_user@'%' WITH GRANT OPTION

还有一个需要注意的是: 官方推荐修改/etc/hosts, 实测中, 把localhost指向内网IP, 或者是创建temp@localhost的同权限用户也行, 官方的工具会用到@localhost的登录方式;

PS: with grant option很重要, 因为工具会新建一个mysql_route_xxxx用户, 以及存储meta的新数据库;

4. 在Group Primary的机器上启动MySQL shell, 这个很重要, 因为第3点中提到的:   官方的工具会用到@localhost的登录方式
PS: 推荐用mysqlsh --log-level=DEBUG3来启动mysql shell, 且不要关闭wizard;

5. 进入MySQL shell以后, 可以选择使用java script还是python, 这里比较习惯python, 就用python的方式, 和js基本没区别;


6. dba.help()命令能看到支持的所有命令, 搭建过程中主要用到的主要有这几个:
    check_instance_configuration :  检查实例的参数配置是否符合搭建Group的要求
    configure_local_instance :          持久化实例的配置参数到配置文件
    create_cluster :                            创建innodb cluster
    get_cluster :                                 获取这个实例所属innodb cluster的信息
    \connect 用户名@ip:port:  登录到某个实例, 一般为本机

7. 使用dba. check_instance_co nfiguration('temp@192.168.0.100:3306')来检测配置参数, 按照第一步设置之后, 应该是直接返回OK的, 如果还有缺失的话, 就手动补上吧
PS: 这个工具可以自动把参数修改成符合要求的设置, 有兴趣可以研究一下, 这里就不唠叨了ㄟ( ▔, ▔ )ㄏ


8. 接下来就是使用create_cluster来创建innodb cluster了, 这里放上比较常用的一些设置信息


简单说明部分参数:
multiMaster : 如果要创建多主集群, 就需要单独指定这个参数, 否则默认创建单主集群(类似于一主多从的复制架构);
adoptFromGR : 如果已经手动把Group搭建起来了, 需要在这个Group上创建新的innodb cluster, 那就需要显式指定这个参数, 且关闭wizard模式, 关掉wizard模式之后, 需要再额外添加创建集群的用户名和密码作为参数, 推荐开启wizard, 并全程使用MySQL shell搭建innodb cluster;
ipWhitelist : 在测试的时候, 可能是工具没有管理seed这个参数, 所以在创建的时候即便指定了白名单, 也无法向Group里面添加新实例;



PS: 在python模式下, 如果需要添加参数, 就这么写

点击(此处)折叠或打开

  1. cluster = cluster.create_cluster('temp@192.168.0.100:3306', {'multiMaster':1,'adoptFromGR':1})


9. 开启wizard的情况下(本文默认开启), 使用如下命令创建Cluster: 

点击(此处)折叠或打开

  1. cluster = dba.create_cluster('testCluster')
如果没问题的话, 就会有如下提示信息


10. 集群创建成功以后, 用add_instance命令把所有的实例都添加到群组就好了, 在官方的宣讲中, 暂时不支持超过9个实例组成一个Group, 实际上, 不超过7个比较好, auto_increament的默认设置是7;

11. 这时候登录数据库, 就会看到多出来一个库, 叫做mysql_innodb_cluster_metadata, 里面有cluster的一些信息, 有兴趣可以看看;

12. 在其他的虚拟机上安装MySQL Router, 然后用bootstrap来自动生成配置;

点击(此处)折叠或打开

  1. mysqlrouter --bootstrap temp@192.168.0.100:3306 --directory /home/mysqlrouter/ --user=mysqlrouter
在对应的目录下会有start.sh和stop.sh来启动和关闭mysqlrouter
PS : stop.sh可能会关不掉mysqlrouter, 留意一下, 脚本的问题

13. 读写默认使用6446, 只读使用6447, 这时候就可以随意进行测试了;

14. 如果要创建多主模式, 需要调整两个参数

点击(此处)折叠或打开

  1. group_replication_single_primary_mode = OFF
  2. group_replication_enforce_update_everywhere_checks = ON

PPS: MySQLRouter会根据meta的数据来动态调整读写和只读连接, 比如说Primary挂掉了, meta发生了变化, MySQLRouter会在很短的时间内发现并把流量切换到新的Primary;

PPPPPS: 性能测试数据待整理
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
8天前
|
存储 缓存 关系型数据库
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
MySQL的存储引擎是其核心组件之一,负责数据的存储、索引和检索。不同的存储引擎具有不同的功能和特性,可以根据业务需求 选择合适的引擎。本文详细介绍了MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案。
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
|
13天前
|
存储 关系型数据库 MySQL
MySQL存储引擎详述:InnoDB为何胜出?
MySQL 是最流行的开源关系型数据库之一,其存储引擎设计是其高效灵活的关键。InnoDB 作为默认存储引擎,支持事务、行级锁和外键约束,适用于高并发读写和数据完整性要求高的场景;而 MyISAM 不支持事务,适合读密集且对事务要求不高的应用。根据不同需求选择合适的存储引擎至关重要,官方推荐大多数场景使用 InnoDB。
58 7
|
23天前
|
存储 关系型数据库 MySQL
Mysql索引:深入理解InnoDb聚集索引与MyisAm非聚集索引
通过本文的介绍,希望您能深入理解InnoDB聚集索引与MyISAM非聚集索引的概念、结构和应用场景,从而在实际工作中灵活运用这些知识,优化数据库性能。
98 7
|
29天前
|
存储 关系型数据库 MySQL
MySQL引擎InnoDB和MyISAM的区别?
InnoDB是MySQL默认的事务型存储引擎,支持事务、行级锁、MVCC、在线热备份等特性,主索引为聚簇索引,适用于高并发、高可靠性的场景。MyISAM设计简单,支持压缩表、空间索引,但不支持事务和行级锁,适合读多写少、不要求事务的场景。
57 9
|
11天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
38 3
|
11天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
38 3
|
11天前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE 'log_%';`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
52 2
|
24天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
168 15
|
18天前
|
SQL 关系型数据库 MySQL
数据库数据恢复—Mysql数据库表记录丢失的数据恢复方案
Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表中无任何数据或只有部分数据。 2、客户端无法查询到完整的信息。
|
25天前
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。