容器化|自建 MySQL 集群迁移到 Kubernetes
背景
如果你有自建的 MySQL 集群,并且已经感受到了云原生的春风拂面,想将数据迁移到 Kubernetes 上,那么这篇文章可以给你一些思路。
文中将自建 MySQL 集群数据,在线迁移到 Kubernetes 的 MySQL 集群中,快速实现了 MySQL on Kubernetes。
适用场景
自建 MySQL 数据库迁移至 Kubernetes 的过程中。优点是停机时间短,数据一致性强。
前提条件
- 掌握 RadonDB MySQL Kubernetes 的使用
- 自建集群 MySQL 版本同 RadonDB MySQL Kubernetes 的 MySQL 大版本一致。如:自建集群 MySQL 8.0.22,RadonDB MySQL Kubernetes 中 MySQL 8.0.35
- 自建集群开启 Binlog 和 GTID
操作步骤
Step 1:自建集群开启 GTID
用超级管理员登录自建 MySQL 集群,确保开启 GTID。
# 检查输出是否为 1
mysql -uroot -e "select @@gtid_mode,@@log_bin";
# 如果不为 1 则在 MySQL 终端中执行下面的 SQL
set global ENFORCE_GTID_CONSISTENCY = ON;
set global GTID_MODE = OFF_PERMISSIVE;
set global GTID_MODE = ON_PERMISSIVE;
set global GTID_MODE = ON;
Step 2:容器集群在线迁移全量数据
全量数据迁移期间,容器集群停止所有的写入。
# 在进行操作的节点上安装 screen 工具,防止终端退出
apt install screen -y
# 开启一个 screen 终端
screen -S migration
# 将节点 scale 成 2 节点
kubectl scale mysqlcluster sample --replicas=2
# 将 Follower 角色 Xenon 容器执行 raft disable
kubectl exec -it $(kubectl get po -l role=FOLLOWER,mysql.radondb.com/cluster=sample -o jsonpath="{.items[*].metadata.name}") -c xenon -- xenoncli raft disable
# 进入 Leader 角色 MySQL 容器
kubectl exec -it $(kubectl get po -l role=LEADER,mysql.radondb.com/cluster=sample -o jsonpath="{.items[*].metadata.name}") -c mysql -- bash
screen 窗口可以按
Ctrl + a,然后输入 d 退出。用screen -R migration重新进入迁移数据的终端。
通过管道进行不落地导入全量数据。
mysqldump --all-databases \
--single-transaction \
--triggers \
--routines \
--events \
--max-allowed-packet=805306368 \
--ignore-table=mysql.user \
--ignore-table=mysql.db \
--ignore-table=mysql.tables_priv \
--set-gtid-purged=ON \
-uroot -hxxx -pxxx|mysql -uroot -h127.0.0.1
Step 3:进行增量同步
全量同步完成之后,配置增量同步。
# 重新进入终端
screen -R migration
# 再次进入 Leader 角色 MySQL 容器
kubectl exec -it $(kubectl get po -l role=LEADER,mysql.radondb.com/cluster=sample -o jsonpath="{.items[*].metadata.name}") -c mysql -- bash
# 设置主从同步参数
mysql -uroot -h 127.0.0.1
CHANGE MASTER TO MASTER_HOST='xx', MASTER_PORT=xx, MASTER_USER='root', MASTER_PASSWORD='xx', MASTER_AUTO_POSITION=1;start slave;
# 检查主从同步进度
kubectl exec -it sample-mysql-0 -c xenon -- xenoncli cluster mysql
Seconds_Behind 变为 0 则代表自建集群和容器集群数据完全一致,可以进行下一步操作。
Step 4:同步数据到容器集群的其他节点
# sample-mysql-1 为刚才 raft disable 的 Follower 节点
kubectl label pod sample-mysql-1 rebuild=true
# 查看集群状态等待同步完成
kubectl exec -it sample-mysql-0 -c xenon -- xenoncli cluster gtid
kubectl logs sample-mysql-1 -c init-sidecar -f
# 同步完成后将集群扩容成 3 节点,并按照相同的步骤进行数据同步
kubectl scale mysqlcluster sample --replicas=3;kubectl label pod sample-mysql-2 rebuild=true
Step 5:业务切换
停止自建数据库的业务,启动容器上的业务负载。
Step 6:停止同步
kubectl exec -it $(kubectl get po -l role=LEADER,mysql.radondb.com/cluster=sample -o jsonpath="{.items[*].metadata.name}") -c mysql -- bash
mysql -uroot -h 127.0.0.1
stop slave;reset slave all;
至此,自建 MySQL 集群就已经成功迁移到 Kubernetes 上了。
总结
如果业务规划有停机时间,那么可以在停止写入之后,对源端数据库进行 FTWRL 之后直接进行全量同步。这样省去了增量同步的步骤,缺点是业务停机时间较长。上述全量数据的迁移方式也可以使用 Xtrabackup 工具,后续将基于 Xtrabackup 的迁移方式进行阐述。
参考链接
- https://www.percona.com/blog/2013/06/10/migrating-between-mysql-schemas-with-percona-xtrabackup/
- https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html
- https://www.percona.com/blog/2012/03/23/how-flush-tables-with-read-lock-works-with-innodb-tables/
容器化|自建 MySQL 集群迁移到 Kubernetes的更多相关文章
- 2-18-搭建mysql集群实现高可用
1 环境清理以及安装 1.1 mysql旧版本清除 准备5台虚拟机,分配如下 mysql管理结点:xuegod1.cn IP:192.168.10.31 (安装server.clien ...
- 容器化 | 在 KubeSphere 中部署 MySQL 集群
程润科 数据库研发工程师,目前从事 RadonDB MySQL Kubernetes 研发,热衷于研究数据库内核.K8s 相关技术. 张莉梅 高级文档工程师,目前负责数据库产品文档开发.维护和管理工作 ...
- ABP 框架 数据库底层迁移 Mysql 集群
技术交流,请加QQ群:538327407 我的各种github 开源项目和代码:https://github.com/linbin524 背景 笔者 目前架构的IOT 项目是使用abp 框架作为后台, ...
- 京东分布式MySQL集群方案介绍
背景 数据库作为一个非常基础的系统,任何一家互联网公司都会使用,数据库产品也很多,有Oracle.SQL Server .MySQL.PostgeSQL.MariaDB等,像SQLServer/Ora ...
- 分布式MySQL集群方案的探索与思考
转载:http://www.infoq.com/cn/articles/exploration-of-distributed-mysql-cluster-scheme?utm_campaign=rig ...
- MySQL集群---②Windows平台搭建MySQL CLUSTER集群
原文:http://blog.csdn.net/mazhaojuan/article/details/42211857 本文将通过两台电脑来简单介绍一下Windows平台如何搭建MySQL集群. My ...
- mycat+ mysql集群 分库分表
mycat介绍Mycat数据库分库分表中间件国内最活跃的.性能最好的开源数据库中间件!Mycat关键特性关键特性支持SQL92标准支持MySQL.Oracle.DB2.SQL Server.Postg ...
- 超详细,多图文使用galera cluster搭建mysql集群并介绍wsrep相关参数
超详细,多图文使用galera cluster搭建mysql集群并介绍wsrep相关参数 介绍galera cluster原理的文章已经有一大堆了,百度几篇看一看就能有相关了解,这里就不赘述了.本文主 ...
- Kubernetes实战总结 - 阿里云ECS自建K8S集群
一.概述 详情参考阿里云说明:https://help.aliyun.com/document_detail/98886.html?spm=a2c4g.11186623.6.1078.323b1c9b ...
随机推荐
- HTML:<input type="text"> 输入数字时的验证!(在提交时验证)
<!--非负数:<input type="text" name="" pattern="^\d+$">--> < ...
- NC224938 加减
NC224938 加减 题目 题目描述 小红拿到了一个长度为 \(n\) 的数组.她每次操作可以让某个数加 \(1\) 或者某个数减 \(1\) . 小红最多能进行 \(k\) 次操作.她希望操作结束 ...
- lerna源码阅读
能够找到入口文件 能够本地调试
- Solution -「HNOI」EVACUATE
Sol. 可以发现人的移动除了不能穿墙以外没有别的限制.也就是说人的移动多半不是解题的突破口. 接下来会发现出口的限制很强,即出口每个时刻只能允许一个人出去. 每个时刻? 不难想到对于每一个时刻每一个 ...
- 在less里面使用js函数
.colorPaletteMixin() { @functions: ~`(function() { this.colorPalette = function() { return '123px'; ...
- 国产钡铼分布式IO模块如何与西门子PLC Profinet通讯
1.准备IO模块:耦合器BL200PN.数字量输出模块M2082.数字量输入M1081.模拟量输入模块M3401.模拟量输出M4043. 编辑搜图 请点击输入图片描述(最多18字) 2.BL200P ...
- SQL 字符串去除空格函数汇总
SQL 中使用ltrim()去除左边空格 ,rtrim()去除右边空格 ,没有同时去除左右空格的函数,要去除所有空格可以用replace(字符串,' ',''),将字符串里的空格替换为空 . 例:去除 ...
- 笃情开源:我和 Apache DolphinScheduler 社区的故事
背景 本文的主人翁是 2 次飞机参会现场交流,四天研究就把 DolphinScheduler 用上生产的来自车联网行业的大数据 boy - 黄立同学.怎么样,听起来是不是有点 crazy?下面就来看看 ...
- ASP.NET Core依赖注入系统学习教程:容器对构造函数选择的策略
.NET Core的依赖注入容器之所以能够为应用程序提供服务实例,这都归功于ServiceDescriptor对象提供的服务注册信息.另外,在ServiceDescriptor对象中,还为容器准备了3 ...
- Word 段前分页是什么?怎么设置?
描述 这两个标题在第一个标题的页中,且两个标题都没有独立分页.要让每一个标题独立分页,需要对标题的格式进行修改. 段前分页指的是标题与标题之间不在同一个页中,每一个标题都在独立的页中. 设置段前分页 ...