新特性解读 | InnoDB-Cluster 扫盲-日常运维
我们知道,InnoDB Cluster 是 Oralce 官方发布的用来管理 MySQL 组复制的一套工具,有了 InnoDB Cluster,MySQL 原生组复制的部署、运维、开发等将会变得非常简单。
InnoDB Cluster 测试环境如下:
- 节点 A:192.168.2.210:3601(主节点)
- 节点 B:192.168.2.210:3602(从节点)
- 节点 C:192.168.2.210:3603(从节点)
接下来,看看 InnoDB Cluster 提供的一系列内置函数如何简化组复制的日常运维管理。
1、get_cluster 方法
获取集群对象,方便后续管理。
MySQL debian-ytt1:3601 ssl Py > c1 = dba.get_cluster();
MySQL debian-ytt1:3601 ssl Py > c1
<Cluster:ytt_mgr
2、describe 方法
用来获取集群目前状态,输出极简结果。
输出集群节点拓扑图,集群各个节点 IP 地址等。
MySQL debian-ytt1:3601 ssl Py > c1.describe()
{
"clusterName": "ytt_mgr",
"defaultReplicaSet": {
"name": "default",
"topology": [
{
"address": "127.0.0.1:3601",
"label": "127.0.0.1:3601",
"role": "HA"
},
{
"address": "127.0.0.1:3602",
"label": "127.0.0.1:3602",
"role": "HA"
},
{
"address": "127.0.0.1:3603",
"label": "127.0.0.1:3603",
"role": "HA"
}
],
"topologyMode": "Single-Primary"
}
}
3、list_routers 方法
获取集群当前路由信息。
输出当前 mysql router 路由信息,包含读写端口,版本等信息。
MySQL debian-ytt1:3601 ssl Py > c1.list_routers()
{
"clusterName": "ytt_mgr",
"routers": {
"debian-ytt1::system": {
"hostname": "debian-ytt1",
"lastCheckIn": "2020-07-15 11:43:18",
"roPort": 6447,
"roXPort": 64470,
"rwPort": 6446,
"rwXPort": 64460,
"version": "8.0.21"
}
}
}
4、set_option 方法
用来设置集群的全局参数。
比如改变集群的名字:名字由原来 ytt_mgr 更改为 ytt_mgr_sandbox。如下图:
再比如更改集群事务一致性由默认最终一致性级别更改为强一致性级别,如下图:
5、options 方法
获取集群当前所有运行参数的结果,过滤后来验证下效果,如下图:
当然也可以从 mysql router 层来验证效果。如下图,分别获取写节点和读节点的数据一致性参数结果。
6、set_instance_option 方法
单独设置某个节点的参数,不过目前还是不完善,不是每个参数都可以设置。
比如设置每个实例的标签,设置为可读性较强的标签,三个节点分别设置为 node_a、node_b、node_c。如下图:
查看设置好的标签,查看键值为 label 的值。
7、set_primary_instance 方法
提升一个从节点为主节点。
比如把节点 B 提升为主,节点 A 降级为从。如下图:
来验证下:此时 node_b 为主节点,node_a 降为从节点。
MySQL debian-ytt1:3601 ssl Py > c1.status().get("defaultReplicaSet").get("topology")
{
"node_a": {
"address": "127.0.0.1:3601",
"mode": "R/O",
"readReplicas": {},
"replicationLag": null,
"role": "HA",
"status": "ONLINE",
"version": "8.0.21"
},
"node_b": {
"address": "127.0.0.1:3602",
"mode": "R/W",
"readReplicas": {},
"replicationLag": null,
"role": "HA",
"status": "ONLINE",
"version": "8.0.21"
},
"node_c": {
"address": "127.0.0.1:3603",
"mode": "R/O",
"readReplicas": {},
"replicationLag": null,
"role": "HA",
"status": "ONLINE",
"version": "8.0.21"
}
}
这时候 mysql router 会自动把写请求发送到新的主节点 B 上:
root@debian-ytt1:/home/ytt# mysql -uroot -proot -P6446 -hdebian-ytt1 -e "select @@port"
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------+
| @@port |
+--------+
| 3602 |
+--------+
8、switch_to_multi_primary_mode 方法
设置集群模式为多主:
MySQL debian-ytt1:3601 ssl Py > c1.switch_to_multi_primary_mode()
Switching cluster 'ytt_mgr_sandbox' to Multi-Primary mode...
Instance '127.0.0.1:3601' was switched from SECONDARY to PRIMARY.
Instance '127.0.0.1:3602' remains PRIMARY.
Instance '127.0.0.1:3603' was switched from SECONDARY to PRIMARY.
The cluster successfully switched to Multi-Primary mode.
验证下当前的集群模式。
所有节点均变为主,如下图:
9、switch_to_single_primary_mode 方法
切换集群为单主模式,如下图:
10、status 方法
可以查看集群更加详细的运行时信息,避免对 performance_schema.replication* 等一系列性能表进行额外查询。
默认 c1.status 等价于 c1.status({"extended":0})
status() 方法参数为 JSON 对象有四个值:0,1,2,3。
- 0:禁止打印详细信息(默认)
- 1:打印集群元数据相关信息,集群组协议的版本,成员等简单的信息。
- 2:打印集群重放线程的相关事务执行信息。
- 3:打印集群内每个节点所属详细的信息。
下图是执行 c1.status({"extended":2}) 的结果
从结果可以看到目前节点 B 的延迟时间,事务重放的数量,目前重放的 GTID 位置等等。
11、dissolve() 方法
用来解散集群。
dissolve 会删除集群所有元数据、组复制相关配置数据、组复制相关的日志文件(重放日志,恢复日志等)。
MySQL debian-ytt1:3601 ssl Py > c1.dissolve()
...
Are you sure you want to dissolve the cluster? [y/N]: y
Instance '127.0.0.1:3602' is attempting to leave the cluster...
Instance '127.0.0.1:3603' is attempting to leave the cluster...
Instance '127.0.0.1:3601' is attempting to leave the cluster...
The cluster was successfully dissolved.
Replication was disabled but user data was left intact.
总结
MySQL InnoDB Cluster 是一款非常好用的管理 MySQL 组复制的套件,熟悉它的使用方法会极大的简化我们对组复制的日常管理。
- 你知道Unity IoC Container是如何创建对象的吗?
- 发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
- IoC+AOP的简单实现
- 使用了继承、多态还有工厂模式和反射,但是还是没有OO的感觉。[已经增加了实现的代码]
- OO——从不知到知道一点,从迷茫到豁然开朗 (迟来的我的2002到2007)
- 只在UnitTest和WebHost中的出现的关于LogicalCallContext的严重问题
- TEST LAB V8在线渗透实验室教程(三)
- CMQ请求域名
- 在Entity Framework中使用存储过程(一):实现存储过程的自动映射
- 在Entity Framework中使用存储过程(二):具有继承关系实体的存储过程如何定义?
- 表单控件的副产品——查询控件
- 表单控件续(1)——应用接口来简化和分散代码
- 通过自定义配置实现插件式设计
- 让IoC动态解析自定义配置(提供基于Unity的实现)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【Netty】01-服务端和客户端的搭建
- 【Netty】02-netty中不得不说的粘包与拆包
- 【不可思议的CANVAS】画一只会跟着鼠标走的小狗
- 【Netty】03-实战之序列化与反序列化协议
- JDK15正式发布,划时代的ZGC同时宣布转正
- 一文掌握开发利器:正则表达式
- 探讨iOS 图片解压缩到渲染过程
- iOS Abort 问题系统的解决方案
- 【jvm】01- java内存结构分析
- 【redis】01-redis简介
- 3000字详解四种常用的缺失值处理方法
- python学习笔记(7)——远程主机强迫关闭了一个现有的连接
- 【带你成为pyq最靓的仔】朋友圈九宫格(一)之图片切割篇
- Material Design Compoents 1.1.0
- 【第19期】HTTP请求头referer