Skip to main content

单机迁移集群

停止单机版本老环境

  1. 检查单机版本老环境的 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 代表当前队列中有工作流消息待消费

    • 如果在队列中有未消费的数据时停止了微服务,在做完数据迁移,新环境会有某些工作流一直显示排队数字不消失,这些显示排队的流程不会继续消费
  2. 在安装管理器所在目录执行停止微服务命令

    bash service.sh stopall

启动临时容器

  1. 单独启动挂载明道云数据目录的容器

    docker run -itd --entrypoint bash --rm -v /data/mingdao/script/volume/data/:/data/ 788b6f437789
    • 788b6f437789 为存储组件 mingdaoyun-sc 的镜像ID,可通过 docker images 查看

    • 如果单机环境的明道云数据目录有修改,则以实际为准

  2. 进入刚启动的临时容器

    docker exec -it 363625b14db6 bash
    • 363625b14db6 为刚启动的容器ID,可通过 docker ps 查看
  3. 在临时容器内分别启动 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 &

文件存储迁移

单机环境中内置的文件存储版本可能有所不同,根据实际情况选择对应版本的迁移文档。

  1. 在临时创建的容器内配置集群环境文件存储信息

    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 服务的访问地址与认证信息

  2. 拷贝单机环境中的文件存储数据到集群环境的 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 数据导出

  1. 在临时创建的容器内创建 mysql 数据导出目录

    mkdir -p /data/backup/mysql_dump
  2. 进入 backup 目录

    cd /data/backup/
  3. 导出 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
  4. 导出的数据会持久化保存在宿主机 /data/mingdao/script/volume/data/backup/mysql_dump

MongoDB 数据导出

  1. 在临时创建的容器内创建 mongodb 数据导出目录

    mkdir -p /data/backup/mongodb_dump
  2. 进入 backup 目录

    cd /data/backup/
  3. 创建导出的 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
    EOF
    • 如果老环境有启用聚合表,则也把 mdaggregationwsrows 库加入要导出的 mongodb 库列表
  4. 导出 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,如服务器性能较高可适当调整。

  5. 导出的数据会持久化保存在宿主机 /data/mingdao/script/volume/data/backup/mongodb_dump

数据传输

MySQL 数据传输

  1. 在新环境 mysql master 节点启动一个接收端

    mkdir /data/recover && cd /data/recover 

    nc -l 9900 | tar -zxvf -
  2. 老环境在宿主机中进入导出的数据所在目录启动发送端

    cd /data/mingdao/script/volume/data/backup

    tar -zcvf - mysql_dump | nc 192.168.1.1 9900

MongoDB 数据传输

  1. 在新环境 mongodb primary 节点启动一个接收端

    mkdir /data/recover && cd /data/recover

    nc -l 9900 | tar -zxvf -
  2. 老环境在宿主机中进入导出的数据所在目录启动发送端

    cd /data/mingdao/script/volume/data/backup

    tar -zcvf - mongodb_dump | nc 192.168.1.2 9900

数据库还原

提示
  • MySQL 与 MongoDB 数据在新环境还原前,会先删除新环境当前 MySQL 与 MongoDB 的业务库进行清空数据,如新环境有数据请提前备份导出!

  • 数据还原前,请提前停止新环境的微服务

MySQL 数据还原

  1. 删除新环境的明道云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;'
  2. 新环境创建明道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;'
  3. 修改 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
  4. 新环境导入备份的 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 数据还原

  1. 创建要删除新环境的明道所用 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()
    EOF
    • 如果新环境有启用聚合表,则也把 mdaggregationwsrows 库加入要删除的 mongodb 库列表
  2. 删除新环境的明道所用 mongodb 库

    /usr/local/mongodb/bin/mongo mongodb://root:123456@127.0.0.1:27017/admin < dropMongodb.list
  3. 新环境下载 mongodb database-tools 工具包,工具包中有 mongorestore 命令,用于恢复数据

    下载链接:

    https://fastdl.mongodb.org/tools/db/mongodb-database-tools-rhel80-x86_64-100.9.3.tgz
    • 下载后上传到 mongodb 所在服务器,然后解压
  4. 新环境导入备份的 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,如服务器性能较高可适当调整。

  5. 修改新环境绑定的组织ID

    /usr/local/mongodb/bin/mongo -u root -p 123456 --authenticationDatabase admin

    > use ClientLicense;
    > db.projects.updateMany({"projectID" : "新环境组织ID"},{$set:{"projectID" : "老环境组织ID"}});

Elasticsearch 索引清理

  1. 在新环境微服务启动前,新环境的 elasticsearch 要删除当前所有明道业务索引

  2. 登录 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
    • 输出中的第三列就是索引名称
  3. 删除已有的明道业务索引

    $ 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 缓存清理

  1. 在新环境微服务启动前,新环境的 redis 缓存数据需要清理

  2. 登录新环境的 redis 服务器执行清理缓存数据命令

    /usr/local/redis/bin/redis-cli -a 123456 "flushall"

新环境微服务启动

  1. 如果新环境访问地址有变,注意分别修改微服务 config.yaml 与 文件存储 file.yaml 中的访问地址变量值

  2. 启动微服务

  3. 通过 kubectl get pod 命令观察 pod 状态是否都处于 2/2 状态

    • 特别关注下 actionlog 服务是否处于 2/2 状态

      • 迁移后 actionlog 服务会在启动前进行初始化数据,如果数据较大会在 resources.livenessProbe.initialDelaySeconds 限制的时间内无法启动,导致一直在重启

      • 如果一直在重启,可以临时调大 actionlog 服务的 resources.livenessProbe.initialDelaySeconds 值,让首次初始化完成,完成后 pod 会进入 2/2 状态

  4. 微服务启动后进入 config 容器

    kubectl exec -it $(kubectl get pod | grep config | awk '{print $1}') bash
  5. config 容器内中重刷 mongodb 索引

    source /entrypoint.sh && mongodbUpdateIndex
  6. config 容器内中重刷 elasticsearch 索引

    source /entrypoint.sh && resetCollaborationIndex

至此,完成数据迁移 👏 ,接下来通过新环境访问地址登入系统验证即可