自建MySQL迁移至云商MySQL实践
  zNxK8cIqmu7p 2023年12月02日 17 0

背景

由于MySQL数据库是自建在K8s上的,现在有三个痛点。

  1. 数据库扩容影响全部访问数据库的功能模块。
  2. 数据库维护需要运维人力,例如数据库定时备份方案,高可用。

后续又引入双云灾备的需求,双云数据库的同步又是一个问题。所以急需将数据库迁移到云商,通过数据传输方案进行数据同步。


流程

自建MySQL迁移至云商MySQL实践_MySQL

把本地切换到云商

  1. 整理所有mysql数据库连接
  2. mysql数据库修改配置,支持binlog
  3. 数据同步
  4. 修改配置文件数据库相关配置,完成切换


云商 数据迁移 云商

  1. 新建 数据全量+实时迁移 任务
  2. 新建 切换前 数据全量迁移 任务 (注意事项:订单库不迁移,冷备切换时迁移)
  3. 切换验证



1 验证可行性

首先在 测试环境 验证本地数据库迁移至云商的可行性以及各个步骤。


1.1 获取所有 MySQL 数据库连接的服务

这里使用 mysql 作为 grep 的关键词是因为所有的自建数据库的名字都是包含 mysql 的。

这一步的目的:根据实际情况手动筛选出来,迁移到云商MySQL之后,需要修改配置文件的服务。

#!/bin/bash

# 命名空间
namespace='mingzhu-simulation'

# 文件
filename="mysql.txt"

# 获取cm列表
for i in $(kubectl get cm -n ${namespace} | grep -v 'NAME' | awk -F ' ' '{print $1}'); do
    if [ -z "$(kubectl get cm ${i} -n ${namespace} -o yaml | grep mysql)" ]; then
        continue
    else
        echo "====${i}====="  >> ${filename}
        kubectl get cm ${i} -n ${namespace} -o yaml | grep mysql  >> ${filename}
        echo "" >> ${filename}
        echo "" >> ${filename}
    fi
done

获取到了服务的列表。


1.2 获取所有数据库实例的所有库

实际环境有4个mysql数据库。需要统计四个数据库分别需要哪些库需要同步,哪些库因为业务关系不能同步。

console-mysql-lstest
	xxx
  xxx
  xxx
  
compass-mysql-latest
	xxx
  xxx
  xxx
 
...


1.3 迁移工具迁移到云商

各个云商的应该都有这个数据迁移的工具。使用方法大致一样。


  1. 根据实际数据量购买合适规格的产品。

自建MySQL迁移至云商MySQL实践_数据库_02


  1. 根据实际情况选择全量 ,全量+增量,还是双向等方案。并配置好两边数据库的连接方式。

需要对数据库开启外网访问,并且开启白名单。

自建MySQL迁移至云商MySQL实践_MySQL_03


  1. 点击购买,会进行预检查。提示没有开始binlog,不能进行增量备份。

自建MySQL迁移至云商MySQL实践_mysql_04


1.4 开启 binlog

  1. 修改MySQL的配置文件
mysql.cnf: |-
    [mysqld]
    # 新增以下配置
    server_id=2
    log_bin = mysql-bin
    binlog_format = ROW
    expire_logs_days = 30


  1. 再次预检查,就通过了。

自建MySQL迁移至云商MySQL实践_MySQL_05


  1. 开启数据同步

自建MySQL迁移至云商MySQL实践_数据库_06


  1. 数据同步完成,并增量已经同步,会有已同步的标记。

自建MySQL迁移至云商MySQL实践_数据库_07



1.5 修改和验证 服务数据库连接配置

测试环境可以直接操作修改,生产环境需要申请窗口期进行配置修改。

例如:

mysql.yaml: |
    dsn: xxuserxxx:xxxpassxxx@tcp(console-mysql-latest:3306)/utc_biz?charset=utf8&parseTime=True&loc=UTC

修改为:
  mysql.yaml: |
    dsn: xxuserxxx:xxxpassxxx@tcp(10.1.2.3:3306)/utc_biz?charset=utf8&parseTime=True&loc=UTC

并重启服务,并验证数据库是否可以正常访问。



注意⚠️:

  1. 每个云商的数据迁移服务的功能都有差异,需要分别验证。
  2. 需要验证迁移两个自建mysql实例到一个云商mysql的可行性。
  3. 还需要验证双云mysql之间数据同步的可行性。



2 实际两个环境上云操作

  1. 先将主环境的数据库同步到云商mysql
  2. 修改主环境的mysql连接配置到云商mysql
  3. 将主环境的云商mysql数据同步到备环境的云商mysql
  4. 配置备环境的mysql连接配置到云商mysql
  5. 建立双向的数据库同步



2.1 准备工作

  1. 获取所有 MySQL 数据库连接的服务。(参考1.1)
  2. 获取所有数据库实例的所有库。(参考1.2)
  3. 开启所有数据库实例的外网连接方式和开启白名单。
  4. 购买同地区的MySQL实例。



2.2 申请操作窗口

根据业务运营协调出可以操作的时间窗口。



2.3 开启binlog,数据全量+增量同步

  1. 在可操作窗口内进行修改数据库的配置,开启binlog。(参考1.4)
  2. 使用迁移工具将数据迁移至云商。(参考1.3)



2.4 修改服务配置

  1. 根据数据量多少,决定和开启binlog一次完成还是分开两次申请。(参考2.2)
  2. 修改服务连接MySQL数据库的配置。(参考1.5)



重点关注⚠️:

所有的任务状态均变成已同步,才可以修改mysql配置。

自建MySQL迁移至云商MySQL实践_MySQL_08


优化mysql连接的配置:将原来使用root用户登录的mysql连接修改为子用户的方式。

CREATE USER 'utc_transdispatch'@'%' IDENTIFIED BY 'utc_transdispatch';
GRANT ALL ON utc_transdispatch.* TO 'utc_transdispatch'@'%';
FLUSH PRIVILEGES;


如果只是上云,到这一步已经完成了。如果还要做双云数据库同步,还需要继续配置数据迁移的操作。



3 双云数据库同步

待补充。。




参考:

Ucloud 预检查错误信息及解决方法

MySQL 开启 binlog 的方法


踩坑:

自建mysql使用5.7和8.0两个版本的mysql。导致服务连接mysql启动报错:authentication plugin 'caching_sha2_password'。

修改用户登录的加密方式:

https://www.cnblogs.com/YorkZhangYang/p/17705230.html

ALTER USER 'maintenance_test'@'%' IDENTIFIED WITH mysql_native_password BY 'maintenance_test';



【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月02日 0

暂无评论

推荐阅读
  eHipUjOuzYYH   2023年12月10日   11   0   0 mysqlsqlUser
  9JCEeX0Eg8g4   2023年11月28日   10   0   0 主数据数据库mysql
  9JCEeX0Eg8g4   2023年12月11日   17   0   0 mysql配置文件