DTS,让迁移MongoDB上云从未如此顺滑

2021-12-06 18:08:00 浏览数 (1)

MongoDB是目前游戏行业越来越热门的数据库,使用场景囊括玩家数据、日志、社区等业务。经过多次交流,一个客户同意将IDC中的游戏迁移上云,一个核心数据库MongoDB集群如何平滑上云,成为客户关心的焦点问题。下文是自己做了一个DTS迁移MongoDB的Demo,让客户提前体验数据库上云迁移的过程。

一、架构

Mongo复制集迁移.pngMongo复制集迁移.png

二、源集群搭建

  1. 在腾讯云购买3台CVM云服务器,操作系统选择CentOS7.9 x64

内网ip分别为10.21.0.5、10.21.0.2、10.21.0.8

  1. 在3台服务器上下载MongoDB安装包并安装
代码语言:txt复制
   cd /usr/local/src/

   wget --no-check-certificate [https://mirror.tuna.tsinghua.edu.cn/mongodb/yum/el7-3.2/RPMS/mongodb-org-3.2.10-1.el7.x86_64.rpm](https://mirror.tuna.tsinghua.edu.cn/mongodb/yum/el7-3.2/RPMS/mongodb-org-3.2.10-1.el7.x86_64.rpm)

   wget --no-check-certificate [https://mirror.tuna.tsinghua.edu.cn/mongodb/yum/el7-3.2/RPMS/mongodb-org-mongos-3.2.10-1.el7.x86_64.rpm](https://mirror.tuna.tsinghua.edu.cn/mongodb/yum/el7-3.2/RPMS/mongodb-org-mongos-3.2.10-1.el7.x86_64.rpm)

   wget --no-check-certificate [https://mirror.tuna.tsinghua.edu.cn/mongodb/yum/el7-3.2/RPMS/mongodb-org-server-3.2.10-1.el7.x86_64.rpm](https://mirror.tuna.tsinghua.edu.cn/mongodb/yum/el7-3.2/RPMS/mongodb-org-server-3.2.10-1.el7.x86_64.rpm)

   wget --no-check-certificate [https://mirror.tuna.tsinghua.edu.cn/mongodb/yum/el7-3.2/RPMS/mongodb-org-shell-3.2.10-1.el7.x86_64.rpm](https://mirror.tuna.tsinghua.edu.cn/mongodb/yum/el7-3.2/RPMS/mongodb-org-shell-3.2.10-1.el7.x86_64.rpm)

   wget --no-check-certificate [https://mirror.tuna.tsinghua.edu.cn/mongodb/yum/el7-3.2/RPMS/mongodb-org-tools-3.2.10-1.el7.x86_64.rpm](https://mirror.tuna.tsinghua.edu.cn/mongodb/yum/el7-3.2/RPMS/mongodb-org-tools-3.2.10-1.el7.x86_64.rpm)

   yum install ./*.rpm -y
  1. 配置MongoDB

修改Mongo 配置文件/etc/mongod.conf

监听IP 127.0.0.1改为CVM的内网IP,如果改成0.0.0.0,可能会对公网暴露造成风险。

代码语言:txt复制

local_ip=ip addr | grep "global eth0" | awk '{print $2}' |awk -F '/' '{print $1}'

sed -i 's/127.0.0.1/'"${local_ip}"'/g' /etc/mongod.conf

//配置复制集,名字是rs0

cat << EOF >> /etc/mongod.conf

replication:

replSetName: "rs0"

EOF

代码语言:txt复制
1. 启动MongoDB

systemctl start mongod

代码语言:txt复制
1. 初始化MongoDB复制集,如果想体验分片,可以参考官网操作流程。

   登录一台CVM的mongod

rs.initiate( {

_id : "rs0",

members: [

代码语言:txt复制
 { _id: 0, host: "10.21.0.5:27017" },
代码语言:txt复制
 { _id: 1, host: "10.21.0.2:27017" },
代码语言:txt复制
 { _id: 2, host: "10.21.0.8:27017" }

]

})

rs0:SECONDARY>

rs0:PRIMARY>

代码语言:txt复制
# 三、准备存量数据模拟

在Mongo服务器上、或其他可以访问mongo实例的实例上,准备环境:

Requirements.txt

Faker==9.8.0

pymongo==3.12.0

代码语言:txt复制

yum install python3 -y

pip3 install -r Requirements.txt

代码语言:txt复制
复制下列代码到Mongo_fake.py文件

from pymongo import MongoClient

from faker import Faker

from faker.providers import internet

from faker.providers import address

import time

db_name = 'sword'

collection_name = 'player_data'

client = MongoClient('mongodb://10.21.0.5:27017')

database = clientdb_name

collection = databasecollection_name

fake = Faker('zh_CN')

fake.add_provider(internet)

fake.add_provider(address)

def gen_fake_data():

代码语言:txt复制
for num in range(10000):
代码语言:txt复制
    datarow = {
代码语言:txt复制
        "timestamp":time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())),
代码语言:txt复制
        "name":fake.name(),
代码语言:txt复制
        "access_ip": fake.ipv4_public(),
代码语言:txt复制
        "city": fake.city()
代码语言:txt复制
      }
代码语言:txt复制
    print(datarow)
代码语言:txt复制
    collection.insert(datarow)
代码语言:txt复制
    #控制写入频率
代码语言:txt复制
    #time.sleep(1)

if name == "main":

代码语言:txt复制
gen_fake_data()
代码语言:txt复制
启动下面python脚本,在sword库中player_data表中写入1000条模拟数据,大约1分钟。

python Mongo_fake.py

代码语言:txt复制
在mongo中查询,我们可以发现,已经写入10000条数据

use sword; switched to db sword

db.player_data.count() 10000

db.player_data.findOne() {

代码语言:txt复制
    "_id" : ObjectId("61ac3be88c7790520490bf75"),
代码语言:txt复制
    "timestamp" : "2021-12-05 12:11:20",
代码语言:txt复制
    "name" : "龚丹",
代码语言:txt复制
    "access_ip" : "135.64.220.189",
代码语言:txt复制
    "city" : "贵阳县"

}

代码语言:txt复制

四、模拟迁移操作

在云上购买一个MongoDB实例,过程略,实例id为cmgo-0cv8pnxr

新建并配置DTS

source.pngsource.png
dest.pngdest.png
check_source.pngcheck_source.png
check_dest.pngcheck_dest.png
select_db.pngselect_db.png
check_last.pngcheck_last.png
start.pngstart.png

修改Mongo_fake.py,并启动,频率改为每秒1条,观察DTS目标实例数据会仅实时和线下自建实例同步。

0 人点赞