详解 InnoDB ReplicaSet

news2024/10/2 12:18:57

详解 InnoDB ReplicaSet

  • InnoDB ReplicaSet 是什么?
  • InnoDB ReplicaSet 的优缺点
  • InnoDB ReplicaSet 的限制
  • 部署 InnoDB ReplicaSet
    • 1. 准备两个 MySQL 实例
      • 添加新实例的配置选项到 `/etc/my.cnf`
      • 分别在两台主机上进行预配置
    • 2. 使用 MySQL Shell 连接到一个实例来配置两个实例
    • 3. 创建 ReplicaSet
    • 4. 将另一个实例加入到创建的 ReplicaSet
    • 5. 查看副本集状态
    • 6. (可选)创建 ReplicaSet 的管理员账号
    • 7. 引导 MySQL Router 为 ReplicaSet 配置路由
    • 8. 查看路由状态
    • 9. 验证路由功能
  • 手动切主
  • 其他信息
  • 总结

InnoDB ReplicaSet 是什么?

InnoDB ReplicaSet ,即 InnoDB 副本集,是一组由 AdminAPI 管理的一组使用基于 GTID 的异步复制的 MySQL 实例组成的集群集合。它由单 (服务器实例)和多 辅助(服务器实例)组成(在 MySQL 复制 中通常叫做 副本)。

类似于 InnoDB ClusterInnoDB ReplicaSet 深度依赖 MySQL ShellMySQL Router ,但它不提供 InnoDB Cluster 所具备的高可用性。通过 AdminAPI ,可以使用 ReplicaSet 对象来管理它。同时, MySQL Router 也支持对其进行引导,引导过程是自动配置的。因此,它适用于在不需要高可用的使用场景中横向扩展读取能力,并提供手动故障转移功能。

InnoDB ReplicaSet 底层基于 MySQL 异步复制技术。因而,它适用于 MySQL 服务器实例部署在广域网(WAN,Wide Area Network),彼此通过异步复制通道连接,辅助实例可容忍更大程度的复制延迟,且不需要在事务上达成共识的场景。

此外,你可以使用 AdminAPI 采用一个已有的复制拓扑来部署一个 InnoDB ReplicaSet ,之后可以像管理从头创建的 InnoDB ReplicaSet 一样管理它。InnoDB ReplicaSet 相较于 MySQL 复制 的优势在于可以使用 MySQL Shell 和 MySQL Router 更简单、方便、快捷的管理,而不需要使用第三方中间件来管理主从架构、故障转移、路由、重定向。

InnoDB ReplicaSet 的优缺点

上面其实已经提及了它的优缺点,按参照对象分析如下:

  • 对比 MySQL 复制
    -优点InnoDB ReplicaSet提供更好的写性能,这是使用它的主要原因。 而且,它通过 MySQL Shell 提供了更加简单、方便、快捷的管理方式。
    -缺点: 所有管理操作必须要通过 MySQL Shell 来完成,不能直连到主实例上配置系统变量。
  • 对比 InnoDB Cluster
    • 优点InnoDB ReplicaSet 对网络的要求不高,支持在广域网跨地域的不稳定或缓慢的网络上部署,允许更大的复制延迟,可以覆盖一些不适合使用 InnoDB Cluster 的场景。
    • 缺点:它属于低配版,不提供高可用,底层使用的是复制而非组复制,因而不需要所有成员在某个事务上达成共识,不支持自动故障转移,且在发生故障转移或网络分区事件时,有发生脑裂的可能。

InnoDB ReplicaSet 的限制

  • 无自动故障转移。在主服务器不可用的情况下,需要使用 AdminAPI 手动触发故障切换,然后才能再次进行任何更改。但是,辅助实例仍然可用于读取。
  • 由于意外暂停或不可用,无法防止部分数据丢失:在意外暂停时未完成的事务可能会丢失。
  • 意外退出或不可用后,无法防止不一致。如果手动故障切换提升了一个辅助实例,而前一个主实例仍然可用,例如,由于网络分区,则大脑分裂的情况可能会导致数据不一致。
  • InnoDB ReplicaSet 不支持多主模式。使用允许写入所有成员的经典复制拓扑无法保证数据一致性。
  • 读取扩展受限。 InnoDB ReplicaSet 基于异步复制,因此不可能像组复制那样调整流控制。
  • 所有辅助成员都从单个源复制。对于某些特定的用例,这可能会影响单个源,例如,许多小更新。
  • 仅支持运行 MySQL 8.0 及更高版本的实例。
  • 仅支持基于 GTID 的复制,二进制日志文件位置复制与 InnoDB ReplicaSet 不兼容。
  • 仅支持基于行的复制( RBR ),不支持基于语句的复制( SBR )。
  • 不支持复制筛选器。
  • 任何实例上都不允许使用非托管复制通道。
  • ReplicaSet 最多包含一个主实例。支持一个或多个辅助设备。虽然可以添加到 ReplicaSet 的辅助服务器数量没有限制,但连接到 ReplicaSet 上的每个 MySQL 路由器都必须监视每个实例。因此,添加到 ReplicaSet 的实例越多,监视就越多。
  • ReplicaSet 必须由 MySQL Shell 管理。例如,复制帐户由 MySQL Shell 创建和管理。不支持在 MySQL Shell 外部对实例进行配置更改,例如,直接使用 SQL 语句更改主实例。始终使用 MySQL Shell 与 InnoDB ReplicaSet 一起工作。

部署 InnoDB ReplicaSet

部署过程类似于部署 InnoDB Cluster,但因基于复制而非组复制,故仅最少需要两个实例即可部署一个 InnoDB ReplicaSet 实例。

以下介绍的是从头部署一个 InnoDB ReplicaSet 实例,采用已有的 MySQL 复制拓扑的部署请参考我的后续文章。

1. 准备两个 MySQL 实例

添加新实例的配置选项到 /etc/my.cnf

ic-source 主机上/etc/my.cnf中添加如下内容创建 MySQL 实例 replica01

[mysqld@replica01]
datadir=/var/lib/mysql/replica01
port=3308
mysqlx_port=33080
admin_port=33082
socket=/var/lib/mysql/replica01/mysql.sock
log-error=/var/log/mysql-replica01.log

innodb_buffer_pool_size=256M
innodb_redo_log_capacity=100M
innodb_flush_method=O_DIRECT_NO_FSYNC

ic-replica1 主机上/etc/my.cnf中添加如下内容创建 MySQL 实例 replica02

[mysqld@replica02]
datadir=/var/lib/mysql/replica02
port=3310
mysqlx_port=33100
admin_port=33102
socket=/var/lib/mysql/replica02/mysql.sock
log-error=/var/log/mysql-replica02.log

innodb_buffer_pool_size=256M
innodb_redo_log_capacity=100M
innodb_flush_method=O_DIRECT_NO_FSYNC

分别在两台主机上进行预配置

分别在两台主机上执行如下操作:

  1. 启动 MySQL 服务器。
    ic-source 主机上启动 mysqld@replica01
$ systemctl start mysqld@replica01
$ systemctl status mysqld@replica01

ic-replica1 主机上启动 mysqld@replica02

$ systemctl start mysqld@replica02
$ systemctl status mysqld@replica02

在 ic-source 上启动 mysqld@replica01
在 ic-replica1 上启动 mysqld@replica02

  1. 配置 root@localhost 及 root@`%` 用户
    获取为 MySQL 的 root 用户初始化的临时密码,并登录 MySQL 。
$ grep temporary /var/log/mysql-replica01.log 
# 替换为你配置的socket
$ mysql -uroot -p -S /var/lib/mysql/replica01/mysql.sock

执行如下 SQL 修改 root@localhost 用户的密码,创建用于远程登录的 root@`%` 用户:

mysql> alter user root@localhost identified by '要为本地root设置的密码';
mysql> create user root@`%` identified by '要为远程root设置的密码';
mysql> grant all on *.* to root@`%` with grant option;

2. 使用 MySQL Shell 连接到一个实例来配置两个实例

ic-source 主机上启动 mysqlsh 连接到 root@ic-source:3308

$ mysqlsh --quiet-start=2 root@ic-source:3308

mysqlsh 中执行:

 MySQL  ic-source:3308 ssl  JS > dba.configureReplicaSetInstance('root@ic-source:3308',{clusterAdmin: "rs_config"})
 MySQL  ic-source:3308 ssl  JS > dba.configureReplicaSetInstance('root@ic-replica1:3310',{clusterAdmin: "rs_config"})

在这里插入图片描述

3. 创建 ReplicaSet

此处我限制了一下复制通道允许的 IP 网段,试一下安全功能。出于安全考虑,生产环境中也应该这么做。

 MySQL  ic-source:3308 ssl  JS > rs=dba.createReplicaSet('ReplicaSet01',{replicationAllowedHost: '192.168.52.0/24'})

4. 将另一个实例加入到创建的 ReplicaSet

 MySQL  ic-source:3308 ssl  JS > rs.addInstance('ic-replica1:3310')

在这里插入图片描述

5. 查看副本集状态

 MySQL  ic-source:3308 ssl  JS > rs.status({extended: 1})

在这里插入图片描述

6. (可选)创建 ReplicaSet 的管理员账号

为了更清晰的权限管理,我们应将配置账户和管理员账户进行权限分离,即便一般情况下二者是同一个。

说明
此步骤也可以放在第二步后执行,然后通过克隆复制,而不是现在所使用的增量复制。

 MySQL  ic-source:3308 ssl  JS > rs.setupAdminAccount('rs_admin01')

在这里插入图片描述

执行完后,我们应该可以在 replica02 实例的 relaylog 和 binlog 中查看到。

建议使用 less 查看,直接 grep 会使你的终端显示字符集乱码,需要 reset 重置才行。

$ mysqlbinlog binlog.000002| less
$ mysqlbinlog binlog.000002| grep rs_admin                  

在这里插入图片描述

$ mysqlbinlog ic-replica1-relay-bin.000002| grep rs_admin

在这里插入图片描述

7. 引导 MySQL Router 为 ReplicaSet 配置路由

$ mysqlrouter --bootstrap rs_config@ic-source:3308 --account rsRouter01 --user=mysqlrouter --directory=/var/lib/mysqlro

因为我这台主机上还有之前搭建的 InnoDB ClusterInnoDB ClusterSet 的路由,所以此处需要修改 mysqlrouter 配置文件 mysqlrouter.conf 的端口号。简单起见,我将前四个 默认端口号10http_port100 设置为 8543

[routing:bootstrap_rw]
bind_address=0.0.0.0
bind_port=64460

[routing:bootstrap_ro]
bind_address=0.0.0.0
bind_port=64470

[routing:bootstrap_x_rw]
bind_address=0.0.0.0
bind_port=64480

[routing:bootstrap_x_ro]
bind_address=0.0.0.0
bind_port=64490

[http_server]
port=8543

8. 查看路由状态

 MySQL  ic-source:3308 ssl  JS > rs.listRouters()

在这里插入图片描述

9. 验证路由功能

$ mysqlsh --sql rsRouter01@ic-source:64460 -e 'select @@hostname,@@port;'
$ mysqlsh --sql rsRouter01@ic-source:64470 -e 'select @@hostname,@@port;'
$ mysqlsh --sql rsRouter01@ic-source:64480 -e 'select @@hostname,@@port;'
$ mysqlsh --sql rsRouter01@ic-source:64490 -e 'select @@hostname,@@port;'

因为只有两个实例,主实例负责写,辅助实例负责读,所以无需像验证 InnoDB Cluster 时执行三次来验证。
在这里插入图片描述

手动切主

$ mysqlsh --quiet-start=2 root@ic-source:33080

mysqlsh 中执行:

 MySQL  ic-source:33080+ ssl  JS > rs=dba.getReplicaSet()
 MySQL  ic-source:33080+ ssl  JS > rs.setPrimaryInstance('replica1:3310')

在这里插入图片描述

其他信息

有关 InnoDB ReplicaSet 的手动强制故障转移、打标签、升级等其他信息,请参阅 我的 《MySQL Shell 8.0 》专栏。

总结

InnoDB ReplicaSet 的关键字是 AdminAPI,MySQL Shell,MySQL Router,MySQL 异步复制 。其功能同比传统 MyCat 等中间构成的 MMM 、MHA 主从架构相差不大,可以理解为 MySQL 官方实现发行版本,但 MySQL Shell 这个 MySQL 未来主打的 DevOps 工具还是更具优势的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/95407.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

海康安防平台对接

1.前置准备工作 1.1下载h5播放器 https://open.hikvision.com/download/5c67f1e2f05948198c909700?type10安装包解压 1.2配置nginx反向代理 将解压的h5放到nginx目录下 配置nginx配置文件,修改如下两个配置 server {listen 9051;server_name localhost;#charset …

Python密码锁屏窗体界面

程序示例精选 Python密码锁屏窗体界面 如需安装运行环境或远程调试,见文章底部微信名片,由专业技术人员远程协助! 前言 这篇博客针对《Python密码锁屏窗体界面》编写代码, 原理上没有采用Windows自带锁屏模块,是通过软…

通过左旋和右旋来实现搜索二叉树的自平衡

首先左旋和右旋的概念都是在平衡二叉树的基础上提出的。并对AVL树 SB树 红黑树在原理层面进行了简单的介绍,无coding。 什么是左旋? 假设存在下述平衡二叉树(某个结点的左子节点都小于该结点,右子结点右大于大结点)&…

初识单链表/单链表头指针的创建

链表的概念及结构 概念:链表是一种物理存储结构上非连续、非顺序的存储结构。链表不像数组中的元素那样,每个数据的的地址是连续的。数组的物理存储结构:数组中上一个数据的地址和下一个数据的地址是连续的,正好差一个整型大小 链…

做副业找不到好项目?公众号依旧是最优选择

大家好,我是蝶衣王的小编,今天分享一下公众号还是否值得做呢 说到做自媒体账号赚钱,有些人可能会说是2022年谁看公众号,阅读量都不如以前了,大家都跑去刷短视频。其实不错,但是对于不想露脸的人来说&#…

深圳大学数学文化赏析MOOC第二次作业答案(满分)

一、单选题 (共 40.00 分) 1. 以下各数集中,不可数的一个是( ) A. 自然数集 B. 整数集 C. 有理数集 D. 无理数集 满分:2.00 分 得分:2.00 分 你的答案: D 正确答案: D 教师评…

java计算机毕业设计ssm重点实验室系统

项目介绍 本重点实验室系统是针对目前仓库的实际需求,从实际工作出发,对过去的重点实验室系统存在的问题进行分析,完善用户的使用体会。采用计算机系统来管理信息,取代人工管理模式,查询便利,信息准确率高,节省了开支,提高了工作的效率。 本系统结合计算机系统的结构、概念、…

机器学习100天:目录

《机器学习100天》!理论python!实战真正的从零开始机器学习,循序渐进,适合初学者快速入门和进阶! 思维导图: 第0章:准备工作 001 开发环境搭建 第1章:数据预处理 002 导入数据集 …

超级简单的vue课程设计电商购物系统,没有数据库文件,通过模拟数据操作

详细地址:《《《下载地址》》》 基于vue前端项目开发的电商购物系统,主要包括商品的列表、商品的详细页、加入购车、注册、用户登录用户等基本的功能。适合于课程设计,该项目的开发没有用到MYSQL数据库,通过模拟数据进行读取&…

转行如何自学Python并且找到工作,分享自己心得

我是25岁转行学python的。说实在,转行就是奔着挣钱去的。希望我的经历可以给想转行的朋友带来一点启发和借鉴。 先简单介绍下个人背景,三流大学毕业,电子商务专业,学习能力一般,没啥特别技能,反正就很普通…

Charles mock数据:

前提:确保手机已和PC上的Charles代理链接成功。 我们在平时的业务开发中,经常有端上已开发完成,但后端接口还没有Ready的情况;或者需要接口频繁变更数据来测试各种case的情况。这样如果过度依赖接口,肯定会极大降低我…

[附源码]Node.js计算机毕业设计糕点销售网站Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

毕业设计-基于大数据的房地产数据分析与预测-python

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…

【Numpy】Numpy光速起步(初学者必备基础知识)

Ding Jiaxiong【2022-12-16】 Gitee仓库:https://gitee.com/DingJiaxiong/machine-learning-study.git 文章目录导入numpy认识数组数组的更多信息创建基本数组添加、删除和排序元素数组的形状和大小重塑数组将一维数组转换为二维数组【即如何向数组中添加新轴】索引和切片从现有…

jsp+ssm计算机毕业设计病历管理系统设计【附源码】

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JSPSSM mybatis Maven等等组成,B/S模式 Mave…

Qt中几个函数的使用方法

一、把字符串转换成整形 demo1: QString str "FF"; bool ok; int hex str.toInt(&ok, 16); // hex 255, ok true int dec str.toInt(&ok, 10); // dec 0, ok false demo2: bool ok; QString line "123"; int line1 line.toInt(&ok)…

重新认识CSS的尺寸体系,熟悉但是不多

前情提要 为了丰富自己是知识体系(为了日更薅羊毛),我最近频繁翻阅MDN的文档,果然MDN文档常看常新。 今天翻到CSS部分,然后发现width和height里,有几个属性值眼熟但是不多,值得好好研究一下&a…

马士兵内部共享—1658页《Java面试突击核心讲》

为助力广大程序员朋友 “面试造火箭”,小编今天给大家分享的便是这份马士兵内部的面试神技——1658页《Java面试突击核心讲》! 面试神技——1658页《Java面试突击核心讲》 主要包含:Java基础、JVM、多线程、MySQL、Spring、SpringBoot、Spr…

HTML期末作业 蛋糕bootstrap响应式网站html+css+javascript+jquery+bootstarp

🎀 精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

接手项目代码,作为测试我做了什么

推荐阅读: [内部资源] 想拿年薪30W的软件测试人员,这份资料必须领取~ Python自动化测试全栈性能测试全栈,挑战年薪40W 从功能测试进阶自动化测试,熬夜7天整理出这一份超全学习指南【附网盘资源】 测试人员如何快速熟悉项目代码…