MongoDB是目前游戏行业越来越热门的数据库,使用场景囊括玩家数据、日志、社区等业务。经过多次交流,一个客户同意将IDC中的游戏迁移上云,一个核心数据库MongoDB集群如何平滑上云,成为客户关心的焦点问题。下文是自己做了一个DTS迁移MongoDB的Demo,让客户提前体验数据库上云迁移的过程。
一、架构
二、源集群搭建
- 在腾讯云购买3台CVM云服务器,操作系统选择CentOS7.9 x64
内网ip分别为10.21.0.5、10.21.0.2、10.21.0.8
- 在3台服务器上下载MongoDB安装包并安装
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
- 配置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条数据
代码语言:txt复制use sword; switched to db sword
db.player_data.count() 10000
db.player_data.findOne() {
"_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
修改Mongo_fake.py,并启动,频率改为每秒1条,观察DTS目标实例数据会仅实时和线下自建实例同步。