容器化|自建 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 的迁移方式进行阐述。

Original: https://www.cnblogs.com/radondb/p/16696376.html
Author: RadonDB
Title: 容器化|自建 MySQL 集群迁移到 Kubernetes

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/598906/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 04-MySQL锁

    数据库锁 1、SQL语言包括那几个部分 SQL语言包括 数据定义(DDL)、数据操纵(DML)、数据控制(DCL)和数据查询(DQL)四个部分 2、每部分都有哪些操作关键词 数据定…

    数据库 2023年6月16日
    084
  • Question07-查询学过”张三”老师授课的同学的信息

    * SELECT DISTINCT Student.* FROM Student , SC , Course , Teacher WHERE Student.SID = SC.SI…

    数据库 2023年6月16日
    059
  • 一时兴起,写了个寻路代码

    看到一个面试题,是有关寻路的,于是想练练手,自己也写一个。 把地图坐标设计为二维数据,坐标点的值代表不同意义。 先上代码: 1 import java.util.ArrayList…

    数据库 2023年6月14日
    0104
  • Xshell连接Centos7无法输入密码

    使用命令vi /etc/ssh/sshd_config 修改文件 在最后一行找到 PasswordAuthentication 改成yes 重新运行 systemctl resta…

    数据库 2023年6月14日
    0102
  • 记一次MySql唯一索引在left join连表查询没走索引的问题

    在新建一张账单结算信息表bill_settlement_info的时候,建立的唯一索引uk_bill_no(bill_no,tenant_id)。由于列表查询用到该表的字段。所以在…

    数据库 2023年6月16日
    076
  • MP 的攻击 SQL 阻断解析器(V3.4.0)

    一、何为SQL阻断器 官网给出的一句话 阻止恶意的全表更新删除 官网地址已经总结的很到位了 二、具体是如何实现的 也很简单,通过MP(Mybatis-Plus)的拦截器来实现,官方…

    数据库 2023年6月6日
    091
  • MySQL约束

    约束指对字段的约束,用于确保数据库的数据满足特定的规则。在MySQL中,数据库的约束包括, NOT NULL,PRIMARY KEY,UNIQUE,FOREIGN KEY,CHEC…

    数据库 2023年6月16日
    0129
  • java使用EasyExcel导入导出excel

    使用alibab的EasyExce完成导入导出excel 一、准备工作 1、导包 org.apache.poi poi 3.17 org.apache.poi poi-ooxml-…

    数据库 2023年6月6日
    091
  • show engine innodb status 输出结果解读

    show engine innodb status 输出结果解读 基于MySQL 5.7.32最近想整理一下show engine innodb status的解读,但是发现中文互…

    数据库 2023年6月16日
    0112
  • yum安装Mysql8.0

    停止MySQL service mysqld status service mysqld stop 卸载已经安装过的MySQL 检查是否已经安装 rpm -qa|grep mysq…

    数据库 2023年6月9日
    074
  • IDEA中如何查看接口的所有实现类呢?

    接口是我们日常开发中常用的操作,那么如何查看一个接口有哪些实现类呢?下文笔者将讲述IDEA编辑器中 查看实现类的快捷方法,如下所示 在spring源码阅读中,每一个接口都有很多实现…

    数据库 2023年6月11日
    082
  • 「萌新指南」SOA vs. 微服务:What’s the Difference?

    实话实说,在我还没有实习之前,我是连 SOA 是啥都不知道的,只听说过微服务,毕竟微服务实在太火了,想不知道都难,我觉得实习的时候肯定也是微服务,进组之后发现是 SOA 架构,当时…

    数据库 2023年6月6日
    0111
  • 对炒股看法

    1. 自己的炒股情况 2017 年左右接触炒股, 陆续入迷. 个人情况输的多. 主要输在阅历浅, 策略不连贯, 心态不稳. 期间翻阅了大量书籍, 学到了很多, 开拓了眼界. 真的是…

    数据库 2023年6月9日
    087
  • 如何本地navicat连接虚拟机安装的linux 的mysql

    2022.3.20 如何本地连接虚拟机安装的linux 的mysql 1防火墙开启开启 1.1、开启端口3306 1.2、重启防火墙 1.3查看已经开放的端口: 如果mysql 密…

    数据库 2023年5月24日
    077
  • Amazon Aurora解读(SIGMOD 2017)

    Amazon在SIGMOD 2017发表了论文《Amazon Aurora: DesignConsiderations for High Throughput Cloud-Nati…

    数据库 2023年6月9日
    086
  • java读写锁

    工作遇到了金钱计算,需要用到读写锁保证数据安全。记录一下。 单纯读没有限制,读写、写写的时候会有安全问题。 _hashMap_存在并发线程安全问题,而 _hashtable_线程安…

    数据库 2023年6月16日
    085
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球