容器化|自建 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 ...
随机推荐
- MySql中数据表增加字段很慢怎么办
正确的做法是这样,对于数据量很大的表,需要添加所有或者修改字段的做法是如下: 1.先创建一张一样的表 create table new_tb like tb_old; 2.修改创建表的字段 alter ...
- windows如何结束某个端口的进程
netstat -ano | findstr 端口号 (查询端口号被哪个进程占用) tasklist | findstr 进程PID (根据PID找到进程名称) taskkill -PID 进程PID ...
- 8.4 苹果macOS电脑如何安装Java开发环境(JDK)
和Windows电脑安装差不多. 下载 来到JDK官方下载界面,点击Java SE 8(简称JDK 8)后面的JDK下载,来到该界面,先同意协议,然后下载对应平台的JDK,我们这里下载Mac OS X ...
- linux firewall (marker)
查看防火墙是否开启systemctl status firewalld 若没有开启则是开启状态systemctl start firewalld 关闭则start改为stop 查看所有开启的端口fi ...
- 集合—collection、iterator遍历集合
一.collection接口 1.collection常用方法 点击查看代码 @Test public void test(){ //contains() Collection coll = new ...
- SSH隧道代理
应用场景: A机器可以通过SSH连接到B机器,然后A想用B的身份访问B所在的资源(主要用于浏览器访问) 命令: A机器通过ssh与B建立连接,并暴露3128端口:ssh -N -D 127.0.0.1 ...
- Assembly.GetManifestResourceStream为null
想把某个项目的某个文件夹里面的ini文件生成的时候顺便生成为网站和服务文件夹项目 string _path = Path.Combine(AppDomain.CurrentDomain.BaseDir ...
- Elasticsearch的cmd窗口乱码问题(windows)
elasticsearch 7.6.0 windows版日志乱码问题解决 修改jvm.options,如何重启es即可 新增 -Dfile.encoding=GBK
- maven配置的一个问题
资源导出问题 如果想和dao接口放在一个包下可以做如下配置,但是如果不放在dao接口下,那就会报错,至于为什么,那就得好好学学maven了,因为下面是yaml的,所以需要添加yaml,不然他扫描不到 ...
- csdn 不可复制代码的解决方法
简介 由于csdn需要登陆才可以复制,需要脚本才可以操作 脚本 直接在console控制台输入以下代码即可直接复制 $("#content_views pre").css(&quo ...