创建MongoDB集群并导入测试数据

1、背景

AWS提供与MongoDB 3.6版本兼容的DocumentDB服务,但是并未在中国区提供。因此,为了快速建立MongoDB集群,可以使用AWS Solution提供的Cloudformation模版自动创建。

请访问:http://www.amazonaws.cn/solutions/ 从页面上找到MongoDB服务,点击即可开始创建。

MongoDB集群的模式有副本模式(Replica),一般是1主2副的配置;以及分片模式(Sharding),一般是包含Mongos、Config、Data节点等多个节点的集群。

本文提供的Solution方案中,CloudFormation自动创建的集群是Relica模式。本文创建3个节点,即1主2从,版本选择上可以使用3.6版本。等待数分钟后,集群创建成功,可以在Cloudformation的输出界面中,找到Primary节点的内网IP。如果集群不能连接,请修改集群的安全组,允许来自内网的连接。

2、创建客户端EC2并安装客户端

创建一个使用Amazon Linux 2的系统,使用t2.small规格即可。确保EC2客户端与MongoDB集群在同一个VPC内。

以root身份执行如下增加yum源:

echo -e "[mongodb-org-3.6] \nname=MongoDB Repository\nbaseurl=https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.6/x86_64/\ngpgcheck=1 \nenabled=1 \ngpgkey=https://www.mongodb.org/static/pgp/server-3.6.asc" | sudo tee /etc/yum.repos.d/mongodb-org-3.6.repo

以root身份执行如下命令开始安装:

yum install -y mongodb-org-shell
yum install -y mongodb-org-tools

在以上命令中,mongodb-org-shell 提供的是mongo客户端,mongodb-org-tools 是用于数据导入导出的import、export工具。

3、测试MongoDB连接和数据写入

执行如下命令连接到MongoDB集群的主节点。

mongo --host 172.31.10.18 --username admin --password

返回结果如下:

root@ip-172-31-45-202 ~]# mongo --host 172.31.10.18 --username admin --password
MongoDB shell version v3.6.20
Enter password:
connecting to: mongodb://172.31.10.18:27017/?gssapiServiceName=mongodb
WARNING: No implicit session: Logical Sessions are only supported on server versions 3.6 and greater.
Implicit session: dummy session
MongoDB server version: 3.4.24
WARNING: shell and server versions do not match
s0:PRIMARY>

即表示连接成功。

执行如下命令创建测试数据:

db.profiles.insertMany([
{ "_id" : 1, "name" : "Tim", "status": "active", "level": 12, "score":202},
{ "_id" : 2, "name" : "Justin", "status": "inactive", "level": 2, "score":9},
{ "_id" : 3, "name" : "Beth", "status": "active", "level": 7, "score":87},
{ "_id" : 4, "name" : "Jesse", "status": "active", "level": 3, "score":27}
])

返回结果则表示插入数据成功。

{ "acknowledged" : true, "insertedIds" : [ 1, 2, 3, 4 ] }

查询刚才插入的数据:

db.profiles.find({name: "Jesse"})

返回结果如下表示工作正常。

{ "_id" : 4, "name" : "Jesse", "status" : "active", "level" : 3, "score" : 27 }

4、导入测试数据集

在EC2客户端上,下载从mongodb官网获得的邮政编码的测试数据。

wget http://media.mongodb.org/zips.json

该文件包含美国各城市的地理坐标、邮编、所属州和人口数。文件体积大约 3.1MB ,数据条目约30000行,内容如下。

[root@ip-172-31-45-202 ~]# head zips.json
{ "_id" : "01001", "city" : "AGAWAM", "loc" : [ -72.622739, 42.070206 ], "pop" : 15338, "state" : "MA" }
{ "_id" : "01002", "city" : "CUSHMAN", "loc" : [ -72.51564999999999, 42.377017 ], "pop" : 36963, "state" : "MA" }
{ "_id" : "01005", "city" : "BARRE", "loc" : [ -72.10835400000001, 42.409698 ], "pop" : 4546, "state" : "MA" }
{ "_id" : "01007", "city" : "BELCHERTOWN", "loc" : [ -72.41095300000001, 42.275103 ], "pop" : 10579, "state" : "MA" }
{ "_id" : "01008", "city" : "BLANDFORD", "loc" : [ -72.936114, 42.182949 ], "pop" : 1240, "state" : "MA" }
{ "_id" : "01010", "city" : "BRIMFIELD", "loc" : [ -72.188455, 42.116543 ], "pop" : 3706, "state" : "MA" }
{ "_id" : "01011", "city" : "CHESTER", "loc" : [ -72.988761, 42.279421 ], "pop" : 1688, "state" : "MA" }
{ "_id" : "01012", "city" : "CHESTERFIELD", "loc" : [ -72.833309, 42.38167 ], "pop" : 177, "state" : "MA" }
{ "_id" : "01013", "city" : "CHICOPEE", "loc" : [ -72.607962, 42.162046 ], "pop" : 23396, "state" : "MA" }
{ "_id" : "01020", "city" : "CHICOPEE", "loc" : [ -72.576142, 42.176443 ], "pop" : 31495, "state" : "MA" }
[root@ip-172-31-45-202 ~]#

执行如下命令导入。

mongoimport --host 172.31.10.18 --authenticationDatabase admin --username admin --db zips --collection zips --file zips.json

这里需要的注意的是要添加 --authenticationDatabase admin 参数,否则会报告认证失败。

插入数据后,返回如下结果表示成功。

2020-11-07T08:37:46.037+0000    connected to: 172.31.10.18
2020-11-07T08:37:46.757+0000    imported 29353 documents

由此可以看到,写入了29353条数据。

5、查询测试数据集

执行如下命令查询。

use zips
db.zips.aggregate( [
   { $group: { _id: { state: "$state", city: "$city" }, pop: { $sum: "$pop" } } },
   { $group: { _id: "$_id.state", avgCityPop: { $avg: "$pop" } } }
] )

查询返回结果如下。

{ "_id" : "DC", "avgCityPop" : 303450 }
{ "_id" : "DE", "avgCityPop" : 14481.91304347826 }
{ "_id" : "RI", "avgCityPop" : 19292.653846153848 }
{ "_id" : "NJ", "avgCityPop" : 15775.89387755102 }
{ "_id" : "MT", "avgCityPop" : 2593.987012987013 }
{ "_id" : "CA", "avgCityPop" : 27756.42723880597 }
{ "_id" : "KS", "avgCityPop" : 3819.884259259259 }
{ "_id" : "MO", "avgCityPop" : 5672.195338512764 }
{ "_id" : "NH", "avgCityPop" : 5232.320754716981 }
{ "_id" : "OK", "avgCityPop" : 6155.743639921722 }
{ "_id" : "NE", "avgCityPop" : 3034.882692307692 }
{ "_id" : "CO", "avgCityPop" : 9981.075757575758 }
{ "_id" : "LA", "avgCityPop" : 10465.496277915632 }
{ "_id" : "ID", "avgCityPop" : 4320.811158798283 }
{ "_id" : "IL", "avgCityPop" : 9954.334494773519 }
{ "_id" : "AL", "avgCityPop" : 7907.2152641878665 }
{ "_id" : "OR", "avgCityPop" : 8262.561046511628 }
{ "_id" : "MD", "avgCityPop" : 12615.775725593667 }
{ "_id" : "AR", "avgCityPop" : 4175.355239786856 }
{ "_id" : "FL", "avgCityPop" : 27400.958963282937 }
Type "it" for more
s0:PRIMARY>

这个查询结果表示美国各州每个城市的平均人口数。查询结果超出一个屏幕可以显示的范围,在mongo的控制台上输入it即可显示更多。

输入exit即可退出mongodb的console。

6、导出数据

以上测试执行了mongodb的导入和查询,接下来测试导出。

执行如下命令。

mkdir dump
mongodump --host 172.31.10.18 --authenticationDatabase admin --username admin --db zips --collection zips -o dump

以上命令在当前目录下创建了一个dump目录,然后将mongo的数据dump到目录中。返回结果如下。

2020-11-07T08:52:34.570+0000    writing zips.zips to
2020-11-07T08:52:34.646+0000    done dumping zips.zips (29353 documents)

随后可以使用ls命令查看dump出来的数据。

ls -lh dump/zips/

返回结果如下。

total 2.7M
-rw-r--r-- 1 root root 2.7M Nov  7 08:52 zips.bson
-rw-r--r-- 1 root root   81 Nov  7 08:52 zips.metadata.json

表示数据导出成功。

7、参考文档

MongoDB在中国区的自动化部署Solution:https://www.amazonaws.cn/solutions/mongodb-quickstart/

MongoDB测试数据集:https://docs.aws.amazon.com/dms/latest/sbs/CHAP_MongoDB2DocumentDB.02.html