单机迁移集群
停止单机版本老环境
-
检查单机版本老环境的 kafka 队列有无消息堆积
进入存储组件容器
docker exec -it $(docker ps | grep mingdaoyun-sc | awk '{print $1}') bash检查当前容器内是否有 minio 进程
ps aux|grep [m]inio- 如果有输出,代表当前容器内运行的文件存储服务是 V2 版本
- 如果没有输出,代表代表当前容器内运行的文件存储服务是 V1 版本
- 后续迁移文件存储服务时,V1 与 V2 的迁移步骤会有不同
检查 kafka 工作流队列有无堆积
/usr/local/kafka/bin/kafka-consumer-groups.sh --bootstrap-server ${ENV_KAFKA_ENDPOINTS:=127.0.0.1:9092} --describe --group md-workflow-consumer | awk '{count+=$6}END{print count}'-
仅输出 0 代表无堆积,可以立刻停止微服务
-
输出的数字大于 0 代表当前队列中有工作流消息待消费
- 如果在队列中有未消费的数据时停止了微服务,在做完数据迁移,新环境会有某些工作流一直显示排队数字不消失,这些显示排队的流程不会继续消费
-
在安装管理器所在目录执行停止微服务命令
bash service.sh stopall
启动临时容器
-
单独启动挂载明道云数据目录的容器
docker run -itd --entrypoint bash --rm -v /data/mingdao/script/volume/data/:/data/ 788b6f437789-
788b6f437789 为存储组件
mingdaoyun-sc的镜像ID,可通过docker images查看 -
如果单机环境的明道云数据目录有修改, 则以实际为准
-
-
进入刚启动的临时容器
docker exec -it 363625b14db6 bash- 363625b14db6 为刚启动的容器ID,可通过
docker ps查看
- 363625b14db6 为刚启动的容器ID,可通过
-
在临时容器内分别启动 mysql、mongodb、file
source /entrypoint.sh && mysqlStartup &
source /entrypoint.sh && mongodbStartup &
source /entrypoint.sh && filev1Run &如果容器内运行的文件存储服务是 V2 版本,也要额外启动下 minio 服务
echo "127.0.0.1 sc" >> /etc/hosts
source /entrypoint.sh && minioStartup &
文件存储迁移
单机环境中内置的文件存储版本可能有所不同,根据实际情况选择对应版本的迁移文档。
- 文件存储 V1 版本
- 文件存储 V2 版本
-
在临时创建的容器内配置集群环境文件存储信息
mc alias set minio_old http://127.0.0.1:9000 mdstorage eBxExGQJNhGosgv5FQJiVNqH
mc alias set minio_new http://10.206.0.6:9011 mingdao T7RxxxxxxxxxxdRky-
minio_old 中的地址、认证信息无需修改
-
minio_new 中的IP与端口及认证信息注意替换为实际新集群环境的 minio 服务的访问地址与认证信息
-
-
拷贝单机 环境中的文件存储数据到集群环境的 minio 中
mc mirror minio_old/mdmedia minio_new/mdmedia
mc mirror minio_old/mdoc minio_new/mdoc
mc mirror minio_old/mdpic minio_new/mdpic
mc mirror minio_old/mdpub minio_new/mdpub
-
在临时创建的容器内配置集群环境文件存储信息
mc alias set minio_old http://127.0.0.1:9010 mdstorage eBxExGQJNhGosgv5FQJiVNqH
mc alias set minio_new http://10.206.0.6:9011 mingdao T7RxxxxxxxxxxdRky-
minio_old 中的地址、认证信息无需修改
-
minio_new 中的IP与端口及认证信息注意替换为实际新集群环境的 minio 服务的访问地址与认证信息
-
-
拷贝单机环境中的文件存储数据到集群环境的 minio 中
mc mirror minio_old/mdmedia minio_new/mdmedia
mc mirror minio_old/mdoc minio_new/mdoc
mc mirror minio_old/mdpic minio_new/mdpic
mc mirror minio_old/mdpub minio_new/mdpub
数据库迁移
MySQL 数据导出
-
在临时创建的容器内创建 mysql 数据导出目录
mkdir -p /data/backup/mysql_dump -
进入 backup 目录
cd /data/backup/ -
导出 mysql 数据
for dbname in MDApplication MDCalendar MDLog MDProject MDStructure; do
mysqldump --set-gtid-purged=off --default-character-set=utf8mb4 -h127.0.0.1 -P3306 -uroot -p123456 $dbname > mysql_dump/$dbname.sql
done -
导出的数据会持久化保存在宿主机
/data/mingdao/script/volume/data/backup/mysql_dump下
MongoDB 数据导出
-
在临时创建的容器内创建 mongodb 数据导出目录
mkdir -p /data/backup/mongodb_dump -
进入 backup 目录
cd /data/backup/ -
创建导出的 mongodb 库列表
cat > mongodb.list <<EOF
MDAlert
MDChatTop
MDGroup
MDHistory
MDLicense
MDNotification
MDSso
MDUser
commonbase
mdIdentification
mdactionlog
mdapproles
mdapprove
mdapps
mdattachment
mdcalendar
mdcategory
mdcheck
mddossier
mdemail
mdform
mdgroups
mdinbox
mdkc
mdmap
mdmobileaddress
mdpost
mdreportdata
mdroles
mdsearch
mdservicedata
mdsms
mdtag
mdtransfer
mdworkflow
mdworksheet
mdworkweixin
mdwsrows
pushlog
taskcenter
mdintegration
mdworksheetlog
mdworksheetsearch
mddatapipeline
mdwfplugin
mdpayment
mdwfai
EOF- 如果老环境有启用聚合表,则也把
mdaggregationwsrows库加入要导出的 mongodb 库列表
- 如果老环境有启用聚合表,则也把
-
导出 mongodb 数据
for i in $(cat mongodb.list);do mongodump --uri mongodb://127.0.0.1:27017/$i --numParallelCollections=6 --gzip -o ./mongodb_dump/ ;done-
--numParallelCollections参数指定mongodump并行处理集合的数量,默认4,文档这里示例6,如服务器性能较高可适当调整。 -
数据量较大时,导出较为耗时,也可以使用
nohup放后台执行nohup bash -c 'for i in $(cat mongodb.list); do mongodump --uri mongodb://127.0.0.1:27017/$i --numParallelCollections=6 --gzip -o ./mongodb_dump/; done' > mongodump.log 2>&1 &
-
-
导出的数据会持久化保存在宿主机
/data/mingdao/script/volume/data/backup/mongodb_dump下
数据传输
MySQL 数据传输
-
在新环境 mysql master 节点启动一个接收端
mkdir /data/recover && cd /data/recover
nc -l 9900 | tar -zxvf - -
老环境在宿主机中进入导出的数据所在目录启动发送端
cd /data/mingdao/script/volume/data/backup
tar -zcvf - mysql_dump | nc 192.168.1.1 9900
MongoDB 数据传输
-
在新环境 mongodb primary 节点启动一个接收端
mkdir /data/recover && cd /data/recover
nc -l 9900 | tar -zxvf - -
老环境在宿主机中进入导出的数据所在目录启动发送端
cd /data/mingdao/script/volume/data/backup
tar -zcvf - mongodb_dump | nc 192.168.1.2 9900
数据库还原
-
MySQL 与 MongoDB 数据在新环境还原前,会先删除新环境当前 MySQL 与 MongoDB 的业务库进行清空数据,如新环境有数据请提前备份导出!
-
数据还原前,请提前停止新环境的微服务
MySQL 数据还原
-
删除新环境的明道云HAP系统所用 mysql 库
/usr/local/mysql/bin/mysql -h 127.0.0.1 -uroot -p123456 <<< 'drop database MDApplication;'
/usr/local/mysql/bin/mysql -h 127.0.0.1 -uroot -p123456 <<< 'drop database MDCalendar;'
/usr/local/mysql/bin/mysql -h 127.0.0.1 -uroot -p123456 <<< 'drop database MDLog;'
/usr/local/mysql/bin/mysql -h 127.0.0.1 -uroot -p123456 <<< 'drop database MDProject;'
/usr/local/mysql/bin/mysql -h 127.0.0.1 -uroot -p123456 <<< 'drop database MDStructure;' -
新环境创建明道云 HAP 系统所用的 mysql 库
/usr/local/mysql/bin/mysql -h 127.0.0.1 -uroot -p123456 <<< 'create database MDApplication;'
/usr/local/mysql/bin/mysql -h 127.0.0.1 -uroot -p123456 <<< 'create database MDCalendar;'
/usr/local/mysql/bin/mysql -h 127.0.0.1 -uroot -p123456 <<< 'create database MDLog;'
/usr/local/mysql/bin/mysql -h 127.0.0.1 -uroot -p123456 <<< 'create database MDProject;'
/usr/local/mysql/bin/mysql -h 127.0.0.1 -uroot -p123456 <<< 'create database MDStructure;' -
修改 sql 文件中 utf8 为 utf8mb4
for dbname in MDApplication MDCalendar MDLog MDProject MDStructure; do
sed -ri 's/CHARSET=utf8(;| )/CHARSET=utf8mb4\1/g' /data/recover/mysql_dump/$dbname.sql
done
sed -i 's/CHARACTER SET utf8 COLLATE utf8_bin //' /data/recover/mysql_dump/MDProject.sql -
新环境导入备份的 mysql 数据
/usr/local/mysql/bin/mysql -h 127.0.0.1 -uroot -p123456 --default-character-set utf8mb4 -D MDApplication < /data/recover/mysql_dump/MDApplication.sql
/usr/local/mysql/bin/mysql -h 127.0.0.1 -uroot -p123456 --default-character-set utf8mb4 -D MDCalendar < /data/recover/mysql_dump/MDCalendar.sql
/usr/local/mysql/bin/mysql -h 127.0.0.1 -uroot -p123456 --default-character-set utf8mb4 -D MDLog < /data/recover/mysql_dump/MDLog.sql
/usr/local/mysql/bin/mysql -h 127.0.0.1 -uroot -p123456 --default-character-set utf8mb4 -D MDProject < /data/recover/mysql_dump/MDProject.sql
/usr/local/mysql/bin/mysql -h 127.0.0.1 -uroot -p123456 --default-character-set utf8mb4 -D MDStructure < /data/recover/mysql_dump/MDStructure.sql
MongoDB 数据还原
-
创建要删除新环境的明道云 HAP 所用 mongodb 库清单
cat > dropMongodb.list <<EOF
use MDAlert
db.dropDatabase()
use MDChatTop
db.dropDatabase()
use MDGroup
db.dropDatabase()
use MDHistory
db.dropDatabase()
use MDLicense
db.dropDatabase()
use MDNotification
db.dropDatabase()
use MDSso
db.dropDatabase()
use MDUser
db.dropDatabase()
use commonbase
db.dropDatabase()
use mdIdentification
db.dropDatabase()
use mdactionlog
db.dropDatabase()
use mdapproles
db.dropDatabase()
use mdapprove
db.dropDatabase()
use mdapps
db.dropDatabase()
use mdattachment
db.dropDatabase()
use mdcalendar
db.dropDatabase()
use mdcategory
db.dropDatabase()
use mdcheck
db.dropDatabase()
use mddossier
db.dropDatabase()
use mdemail
db.dropDatabase()
use mdform
db.dropDatabase()
use mdgroups
db.dropDatabase()
use mdinbox
db.dropDatabase()
use mdkc
db.dropDatabase()
use mdmap
db.dropDatabase()
use mdmobileaddress
db.dropDatabase()
use mdpost
db.dropDatabase()
use mdreportdata
db.dropDatabase()
use mdroles
db.dropDatabase()
use mdsearch
db.dropDatabase()
use mdservicedata
db.dropDatabase()
use mdsms
db.dropDatabase()
use mdtag
db.dropDatabase()
use mdtransfer
db.dropDatabase()
use mdworkflow
db.dropDatabase()
use mdworksheet
db.dropDatabase()
use mdworkweixin
db.dropDatabase()
use mdwsrows
db.dropDatabase()
use pushlog
db.dropDatabase()
use taskcenter
db.dropDatabase()
use mdintegration
db.dropDatabase()
use mdworksheetlog
db.dropDatabase()
use mdworksheetsearch
db.dropDatabase()
use mddatapipeline
db.dropDatabase()
use mdwfplugin
db.dropDatabase()
use mdpayment
db.dropDatabase()
use mdwfai
db.dropDatabase()
EOF- 如果新环境有启用聚合表,则也把
mdaggregationwsrows库加入要删除的 mongodb 库列表
- 如果新环境有启用聚合表,则也把
-
删除新环境的明道云 HAP 所用 mongodb 库
/usr/local/mongodb/bin/mongo mongodb://root:123456@127.0.0.1:27017/admin < dropMongodb.list -
新环境下载 mongodb
database-tools工具包,工具包中有mongorestore命令,用于恢复数据下载链接:
- RedHat / CentOS 8.0 x64
- Debian 12.0 x64
- 其他
https://fastdl.mongodb.org/tools/db/mongodb-database-tools-rhel80-x86_64-100.9.3.tgzhttps://fastdl.mongodb.org/tools/db/mongodb-database-tools-debian12-x86_64-100.9.3.tgz其他操作系统的工具包到 mongodb 官方发布历史中获取(注意下载 100.9.3 版本的,建议与
mongodump的版本一致)https://www.mongodb.com/try/download/database-tools/releases/archive- 麒麟等国产操作系统一般使用 RedHat 8.0 对应的版本即可
- 下载后上传到 mongodb 所在服务器,然后解压
-
新环境导入备份的 mongodb 数据(注意修改
mongorestore命令的实际路径 )for dbname in $(ls /data/recover/mongodb_dump/);do
/your_path/mongorestore --host 127.0.0.1 -u root -p 123456 --authenticationDatabase admin --numParallelCollections=6 --numInsertionWorkersPerCollection=2 -d $dbname --gzip --dir /data/recover/mongodb_dump/$dbname/
done-
数据量较大时,恢复较为耗时,可调整以下参数:
-
--numParallelCollections参数指定mongorestore并行处理集合的数量,默认4,文档这里示例6,如服务器性能较高可适当调整。 -
--numInsertionWorkersPerCollection参数指定每个集合同时运行的工作线程数,默认1,文档这里示例2,如服务器性能较高可适当调整。
-
-
也可以使用
nohub放后台执行此命令:nohup bash -c '
for dbname in $(ls /data/recover/mongodb_dump/); do
/your_path/mongorestore --host 127.0.0.1 -u root -p 123456 --authenticationDatabase admin --numParallelCollections=6 --numInsertionWorkersPerCollection=2 -d "$dbname" --gzip --dir "/data/recover/mongodb_dump/$dbname/"
done' > mongorestore.log 2>&1 &
-
-
修改新环境绑定的组织ID
/usr/local/mongodb/bin/mongo -u root -p 123456 --authenticationDatabase admin
> use ClientLicense;
> db.projects.updateMany({"projectID" : "新环境组 织ID"},{$set:{"projectID" : "老环境组织ID"}});
Elasticsearch 索引清理
-
在新环境微服务启动前,新环境的 elasticsearch 要删除当前所有明道云 HAP 业务索引
-
登录 elasticsearch 服务器查看新环境索引列表
$ curl -u elastic:123456 127.0.0.1:9200/_cat/indices
green open chatmessage_190329 Ed7b0fAeT2C4MT7zdxykDQ 1 1 0 0 450b 225b
green open actionlogb304361c-84ea-4f17-8ce2-bd11111115d3 SQx-1XftQ6e2Q95QSfjXZw 5 1 141 0 1.5mb 790.4kb
green open usedata 59PEzs1uSsuHU-HWRy27jA 5 1 13 0 178.4kb 89.2kb
green open actionlog9 UClpsSWkS7q1fIL6z6LxfQ 5 1 12 0 277.7kb 138.8kb
green open kcnode_190329 2Zxqp0uyQKKRLq7xjtaC1w 1 1 0 0 450b 225b
green open post_190723 0Cnp7rQjQRWb8gw5fFv9Dg 1 1 3 0 32.2kb 16.1kb
green open task_190723 PT5sEOV_Sq6AI29vhUe1bQ 1 1 1 0 15.2kb 7.6kb- 输出中的第三列就是索引名称
-
删除已有的明道云 HAP 业务索引
$ curl -XDELETE -u elastic:123456 127.0.0.1:9200/chatmessage_190329
$ curl -XDELETE -u elastic:123456 127.0.0.1:9200/actionlogb304361c-84ea-4f17-8ce2-bd11111115d3
$ curl -XDELETE -u elastic:123456 127.0.0.1:9200/usedata
$ curl -XDELETE -u elastic:123456 127.0.0.1:9200/actionlog9
$ curl -XDELETE -u elastic:123456 127.0.0.1:9200/kcnode_190329
$ curl -XDELETE -u elastic:123456 127.0.0.1:9200/post_190723
$ curl -XDELETE -u elastic:123456 127.0.0.1:9200/task_190723# 或者参考一键清理
elastic_pwd=123456
for i in $(curl -u elastic:$elastic_pwd 127.0.0.1:9200/_cat/indices|awk '{print $3}'); do
curl -XDELETE -u elastic:$elastic_pwd 127.0.0.1:9200/$i
done
# 检查
curl -u elastic:123456 127.0.0.1:9200/_cat/indices
Redis 缓存清理
-
在新环境微服务启动前,新环境的 redis 缓存数据需要清理
-
登录新环境的 redis 服务器执行清理缓存数据命令
/usr/local/redis/bin/redis-cli -a 123456 "flushall"
新环境微服务启动
-
如果新环境访问地址有变,注意分别修改微服务
config.yaml与 文件存储file.yaml中的访问地址变量值 -
启动微服务
-
通过
kubectl get pod命令观察pod状态是否都处于2/2状态-
特别关注下
actionlog服务是否处于2/2状态-
迁移后
actionlog服务会在启动前进行初始化数据,如果数据较大会在resources.livenessProbe.initialDelaySeconds限制的时间内无法启动,导致一直在重启 -
如果一直在重启,可以临时调大
actionlog服务的resources.livenessProbe.initialDelaySeconds值,让首次初始化完成,完成后pod会进入2/2状态
-
-
-
微服务启动后进入
config容器kubectl exec -it $(kubectl get pod | grep config | awk '{print $1}') bash -
在
config容器内中重刷mongodb索引source /entrypoint.sh && mongodbUpdateIndex -
在
config容器内中重刷elasticsearch索引source /entrypoint.sh && resetCollaborationIndex
至此,完成数据迁移 👏 ,接下来通过新环境访问地址登入系统验证即可