腾讯云迁移到客户私有云记录
专线配置
公有云到私有云,本次通过拉专线,打通公有云VPC跟私有云VPC的网络,然后进行内网通信,保证数据的安全、稳定。
开通专线
腾讯云控制台搜索“物理专线”,填写自己机房、对方机房的信息,跟专线提供商(例如联通、移动)申请专线拉通。分配好VLAN网段,一般为30位掩码的IP,以提供给腾讯云边界以及私有云边界交换机通信使用。注意:需要跟客户私有云机房协商好,要使用多VLAN进行通信;若不使用VLAN,后续通道新增、扩展十分麻烦
腾讯云专线接入后台配置)
新增专线网关
控制台搜索“专线网关”,点击新建即可。标准型网关是单纯转发流量。如果公有云跟私有云子网重叠,则需要做NAT转换或IP地址映射,这时候就需要使用NAT网关。
新增通道
在专线接入——>专线通道新建一个通道(vlan)
配置VLAN
当两边都配置好VLAN后,通道会显示已连接。如果处于配置中,说明两端的VLAN IP没有配置正确。
配置VPC路由
专线配置完成后,需要配置公有云上VPC的路由表。控制台搜索私有网络,然后左侧菜单栏点击路由表,对对应的VPC路由表进行路由新增。
客户私有云也需要写回程路由,这点需要跟客户私有云的网络工程师沟通。
ES迁移
迁移中,第一步先迁移ES。对于ES的迁移,腾讯云提供了两种方案:
- 使用snapshot
- 使用elasticdump工具
这次迁移我们选择了elasticdump工具。
elasticsearch-dump
- 安装
curl -L https://npmjs.org/install.sh | sh
npm install elasticdump -g
- 主要参数说明
--input: 源地址,可为 ES 集群 URL、文件或 stdin,可指定索引,格式为:{protocol}://{host}:{port}/{index}
--input-index: 源 ES 集群中的索引
--output: 目标地址,可为 ES 集群地址 URL、文件或 stdout,可指定索引,格式为:{protocol}://{host}:{port}/{index}
--output-index: 目标 ES 集群的索引
--type: 迁移类型,默认为 data,表明只迁移数据,可选 settings, analyzer, data, mapping, alias
- 迁移单个索引
注意:
第一条命令先将索引的 settings 先迁移,如果直接迁移 mapping 或者 data 将失去原有集群中索引的配置信息如分片数量和副本数量等,当然也可以直接在目标集群中将索引创建完毕后再同步 mapping 与 data。
elasticdump --input=http://172.16.0.39:9200/companydatabase --output=http://172.16.0.20:9200/companydatabase --type=settings
elasticdump --input=http://172.16.0.39:9200/companydatabase --output=http://172.16.0.20:9200/companydatabase --type=mapping
elasticdump --input=http://172.16.0.39:9200/companydatabase --output=http://172.16.0.20:9200/companydatabase --type=data
- 迁移所有索引
以下操作通过 elasticdump 命令将集群172.16.0.39中的所有索引迁移至集群172.16.0.20。
此操作并不能迁移索引的配置,例如分片数量和副本数量,必须对每个索引单独进行配置的迁移,或者直接在目标集群中将索引创建完毕后再迁移数据。
elasticdump --input=http://172.16.0.39:9200 --output=http://172.16.0.20:9200
- 脚本
因为不确定第四种方法是否靠谱,所以使用脚本的方式来进行迁移传输。
cat elastic_sync.sh
#!/bin/bash
SOURCE_ELASTIC="http://172.16.1.100:9200"
SOURCE_AUTH="" #username and password of es for using curl
SOURCE_PATH="" #username and password of es for using elasticdump,must be a file
DESTIN_ELASTIC="http://10.19.12.13:9200"
DESTIN_AUTH="-u user:pass"
DESTIN_PATH="./pass" #里面存放了目标elasticsearch的账号密码,格式:user:pass
getIndices(){
[ -f "indices.txt" ] && rm -f indices.txt
curl -XGET ${SOURCE_AUTH} ${SOURCE_ELASTIC}/_cat/indices > indices.txt
cat indices.txt|awk '{print $3}' > indices_temp.txt
}
syncIndices(){
for indice in `cat indices_temp.txt`
do
echo "${indice} is beginning!"
elasticdump --input=${SOURCE_ELASTIC}/${indice} --output=${DESTIN_ELASTIC}/${indice} --type=settings --httpAuthFile=${DESTIN_PATH}
if [ $? != 0 ];then
echo "$indice already exit!"
continue
fi
elasticdump --input=${SOURCE_ELASTIC}/${indice} --output=${DESTIN_ELASTIC}/${indice} --type=mapping --httpAuthFile=${DESTIN_PATH}
elasticdump --input=${SOURCE_ELASTIC}/${indice} --output=${DESTIN_ELASTIC}/${indice} --type=data --httpAuthFile=${DESTIN_PATH}
done
}
getIndices
syncIndices
如果单个传输太慢,可以使用screen来做并发传输。
yum -y install screen
for i in `seq 10` #10个并发
do
screen -dmS elastic${i} /bin/bash ./elastic_sync.sh
done
MYSQL迁移
公有云CDB到私有云mariadb集群迁移
mysql备份
公有云有两种备份方式:物理备份和逻辑备份。物理备份是使用xtrabackup生成备份,以文件形式恢复数据;逻辑备份是使用传统sql语句恢复数据。
这次我们选择逻辑备份。从公有云上面,手动备份
然后其中一台服务器下载。
恢复方法:https://cloud.tencent.com/document/product/236/33364
需要下载xtrabackup、qpress工具
数据恢复
分两部分恢复:
-
冷备恢复(不需要停服务,提前做,缩短变更时间)
参考腾讯云文档成sql文件后,使用原始的方法恢复到私有云的mysql。mysql -uUSER -pPASSWORD -PPORT < XXX.sql
-
增量数据恢复。此处使用mysqlbinlog工具恢复(腾讯云逻辑备份有大坑!!下面注意看)。
先查看sql文件,看看binlog偏移位置cat XXX.sql |head -n 35
获取到binlog的文件名后、偏移位置后,上腾讯云后台查看对应的binlog文件:
然后你会操蛋地发现,根本就没有这个binlog的文件!!当时我找了很久的客服,上升了N次问题后,腾讯云侧终于找到问题了:逻辑备份(sql文件的形式)是使用了从库的数据,不会直接从主库做备份,避免主库的压力过大,影响生产(我心里是崩溃的,那你倒是提供从库的binlog啊……)。简单来说,就是公有云后台提供了主库的binlog文件,但sql文件中的文件名还有偏移位置,都是从库的,到时候恢复的时候,肯定是会报错的。所以,只能继续提工单,让腾讯云的技术支持给出对应的主库的binlog文件名、偏移位置。得到正确的MASTER_LOG_FILE跟MASTER_LOG_POS后,可以开始愉快地恢复了。跟运维沟通,把服务的入口关闭后,执行恢复:mysqlbinlog --start-position=MASTER_LOG_POS MASTER_LOG_FILE(sql文件) | mysql -u${user} -p${password} -f --socket=/data10/prod/mysql.sock
记住加-f参数,遇到错误继续往下执行(因为不同的实例可能会误报权限错误,但后续做校验的时候,其实是不影响的)。
如果有多个binlog文件,第二个binlog文件恢复的时候就不需要指定偏移位置了(不需要再加–start-position参数),直接整个恢复。
最后一个binlog,需要刷新一下出来。在公有云的mysql中执行:flush logs;
过几分钟后,公有云后台会有新的binlog出来,这时候再恢复过去。
数据校验
使用腾讯提供的数据校验工具。这里不提供方案。
错误数据恢复
如果校验中,发现错误数据,需要恢复的话比较麻烦,需要删除旧数据,插入新数据。这里推荐使用phpmyadmin工具。公有云的mysql有自带的phpmyadmin,而私有云的phpmyadmin需要我们自己搭建。
公有云登录phpmyadmin方式:
使用docker运行phpadmin工具
docker pull phpmyadmin/phpmyadmin
传入全局变量:PMA_HOST是mysql的IP,PMA_PORT是mysql的端口
docker run --name myadmin -d -e PMA_HOST=10.19.3.1 -e PMA_PORT=122 -p 8080:80 phpmyadmin/phpmyadmin
然后访问运行docker的那台机器的8080端口,输入数据库的账号、密码,登陆进去。
界面化操作就很舒服了。把不一致的数据在私有云中删除,然后在公有云PMA中把数据导出,在私有云PMA中把数据导入。
后续处理
因为数据比较重要,为了方便紧急切换、数据恢复(从私有云再切到公有云),我们需要在迁移完成后,马上刷新一下binlog。这样,我们新产生的数据,都原封不动在新的binlog中,不需要记录偏移位置。恢复的时候,整个恢复就可以了。
私有云数据库中执行:
powershell flush logs;
Redis迁移
其实redis可迁可不迁。但为了不给第二天的mysql过大压力,还是做了迁移。
直接使用腾讯云提供的redis迁移工具。
https://cloud.tencent.com/document/product/239/33786
业务迁移
由运维提供方案。