mongodb分布式集群搭建手记,你可能没用过的mon

作者: 数据库信息  发布:2019-10-04

mtools是什么

mtools 是由MongoDB 官方工程师实现的一套工具集,可以很快速的日志查询分析、统计功能,此外还支持本地集群部署管理,非常便于新手学习。
github地址,该套工具非官方公司维护,仅由作者做开源维护,目前项目的更新频度并不高,但已经有大量的使用者。

mtools使用python编写完成,可通过pipy网站 获取;
该工具包含了以下几个关键组件

mlaunch
支持快速搭建本地测试环境,可以是单机、副本集、分片集群。
mlogfilter
日志过滤组件,支持按时间检索慢查询、全表扫描操作,支持通过多个属性进行信息过滤,支持输出为JSON格式。
mplotqueries
支持将日志分析结果转换为图表形式,依赖于tkinter(python图形模块)、和matplotlib模块。
mlogvis
支持将日志分析结果转换为一个独立的HTML页面,实现与mplotqueries同样的功能。

网上关于mtools的资料已经不少,包括其官方文档的说明都比较详细,这里仅对工具的使用场景做简单介绍

总结

  • Mongodb集群架构由Mongos、Config副本集和多个分片组成;
    安装过程中先初始化Config副本集、分片副本集,最后通过Mongos添加分片
  • Config副本集存储了集群访问的用户及角色权限,为了方便管理,可以给分片副本集添加本地用户
  • Mongodb提供了LocalException机制,首次安装数据库时可以在本机直接添加用户

3. 日志过滤

mlogfilter是一个强大的日志过滤模块,相比linux 的grep/egrep的文本过滤,该组件可以对日志内容进行解析,并按我们想要的结果进行过滤。

查看超过10s的慢操作

# mlogfilter mongo.log --slow 10000 --shorten 200
2018-05-18T21:49:04.069 0800 I REPL [ReplicationExecutor] Starting an election, since we've seen no PRIMARY in the past 10000ms
2018-05-18T21:50:22.988 0800 I COMMAND [conn31] command dmspace.fs.chunks appName: "Mong...quireCount: { w: 46 } }, oplog: { acquireCount: { w: 46 } } } protocol:op_command 10804ms
2018-05-18T21:50:22.988 0800 I COMMAND [conn44] command dmspace.DeviceInfo command: inse...quireCount: { w: 16 } }, oplog: { acquireCount: { w: 16 } } } protocol:op_command 10931ms
2018-05-18T21:50:22.988 0800 I COMMAND [conn157] command dmspace.Lwm2mDevice command...quireCount: { w: 16 } }, oplog: { acquireCount: { w: 16 } } } protocol:op_command 10762ms
2018-05-18T21:50:22.988 0800 I COMMAND [conn156] command dmspace.TaskHistory command: in...quireCount: { w: 16 } }, oplog: { acquireCount: { w: 16 } } } protocol:op_command 10927ms
2018-05-18T21:50:50.104 0800 I COMMAND [conn31] command dmspace.DeviceInfo appName: "Mon...quireCount: { w: 16 } }, oplog: { acquireCount: { w: 16 } } } protocol:op_command 10020ms
2018-05-18T21:50:51.203 0800 I COMMAND [conn156] command dmspace.fs.chunks command: inse...quireCount: { w: 51 } }, oplog: { acquireCount: { w: 51 } } } protocol:op_command 10823ms

查看慢扫描操作
慢扫描是指该操作需要扫描过多的记录(超过1w行),且返回数量不足扫描数量的1/100,这样的操作通常对CPU消耗很高,也比较低效,

# mlogfilter mongo.log --scan --shorten 200
2018-05-18T21:57:09.123 0800 I COMMAND [conn683] command cmspace.USER_LOGIN_HISTORY command: find ...e: { acquireCount: { r: 95 } }, Collection: { acquireCount: { r: 95 } } } protocol:op_command 556ms
2018-05-18T21:57:17.381 0800 I COMMAND [conn784] getmore nsspace.StatisticsDay query: { aggre...nt: { r: 10 }, timeAcquiringMicros: { r: 1667 } }, Collection: { acquireCount: { r: 890 } } } 214ms
2018-05-18T22:06:16.148 0800 I COMMAND [conn764] getmore nsspace.StatisticsHour query: { aggr...} }, Database: { acquireCount: { r: 69128 } }, Collection: { acquireCount: { r: 69128 } } } 12053ms
2018-05-18T22:06:24.962 0800 I COMMAND [conn764] getmore nsspace.StatisticsHour query: { aggr... } }, Database: { acquireCount: { r: 69106 } }, Collection: { acquireCount: { r: 69106 } } } 8782ms
2018-05-18T22:06:33.787 0800 I COMMAND [conn764] getmore nsspace.StatisticsHour query: { aggr... } }, Database: { acquireCount: { r: 69111 } }, Collection: { acquireCount: { r: 69111 } } } 8822ms

根据名称空间过滤

# mlogfilter mongo.log --namespace dmspace.DeviceInfo
2018-05-18T21:50:58.105 0800 I COMMAND [conn31] command dmspace.DeviceInfo appName: "MongoDB Shell...adata: { acquireCount: { w: 16 } }, oplog: { acquireCount: { w: 16 } } } protocol:op_command 2963ms
2018-05-18T21:50:59.195 0800 I COMMAND [conn31] command dmspace.DeviceInfo appName: "MongoDB Shell...tadata: { acquireCount: { w: 16 } }, oplog: { acquireCount: { w: 16 } } } protocol:op_command 936ms
2018-05-18T21:51:00.173 0800 I COMMAND [conn44] command dmspace.DeviceInfo command: insert { inser...tadata: { acquireCount: { w: 16 } }, oplog: { acquireCount: { w: 16 } } } protocol:op_command 745ms
2018-05-18T21:51:00.433 0800 I COMMAND [conn44] command dmspace.DeviceInfo command: insert { inser...tadata: { acquireCount: { w: 16 } }, oplog: { acquireCount: { w: 16 } } } protocol:op_command 252ms

根据操作类型过滤

# mlogfilter mongo.log --operation update
2018-05-18T21:56:25.114 0800 I WRITE [conn156] update dmspace.PolicyTask query: { _id: "###" } pla...Count: { w: 2 } }, Metadata: { acquireCount: { w: 1 } }, oplog: { acquireCount: { w: 1 } } } 2630ms
2018-05-18T21:56:25.114 0800 I WRITE [conn92] update nsspace.TimerTask query: { _id: "###" } planS...Count: { w: 2 } }, Metadata: { acquireCount: { w: 1 } }, oplog: { acquireCount: { w: 1 } } } 1264ms
2018-05-18T21:56:25.125 0800 I WRITE [conn43] update dmspace.TaskHistory query: { _id: "###" } pla...Count: { w: 2 } }, Metadata: { acquireCount: { w: 1 } }, oplog: { acquireCount: { w: 1 } } } 2643ms
2018-05-18T21:56:30.027 0800 I WRITE [conn532] update dmspace.TaskHistory query: { _id: "###" } pl...eCount: { w: 2 } }, Metadata: { acquireCount: { w: 1 } }, oplog: { acquireCount: { w: 1 } } } 868ms
2018-05-18T21:56:32.115 0800 I WRITE [conn517] update dmspace.TaskHistory query: { _id: "###" } pl...eCount: { w: 2 } }, Metadata: { acquireCount: { w: 1 } }, oplog: { acquireCount: { w: 1 } } } 497ms

获取某时间点之后1小时的日志

# mlogfilter mongo.log --from Apr 6 0:00 --to " 1h" | tail -n3
2018-05-19T00:59:59.876 0800 I COMMAND [conn16386] command nsspace.StatisticsHour command: find { find: "###", filter: { user: "###", region: "###", appKey: "###", recordTime: { $lte: "###" }, $and: [ { recordTime: { $gte: "###" } } ] }, shardVersion: [ "###", "###" ] } planSummary: ### keysExamined:249767 docsExamined:249767 cursorExhausted:1 numYields:1952 nreturned:84 reslen:29748 locks:{ Global: { acquireCount: { r: 3906 } }, Database: { acquireCount: { r: 1953 } }, Collection: { acquireCount: { r: 1953 } } } protocol:op_command 319ms
2018-05-19T00:59:59.879 0800 I COMMAND [conn15998] command nsspace.StatisticsHour command: find { find: "###", filter: { user: "###", region: "###", appKey: "###", recordTime: { $lte: "###" }, $and: [ { recordTime: { $gte: "###" } } ] }, shardVersion: [ "###", "###" ] } planSummary: ### keysExamined:249767 docsExamined:249767 cursorExhausted:1 numYields:1954 nreturned:84 reslen:29833 locks:{ Global: { acquireCount: { r: 3910 } }, Database: { acquireCount: { r: 1955 } }, Collection: { acquireCount: { r: 1955 } } } protocol:op_command 321ms

mlogfilter提供了非常灵活的日期条件设置,除了可以指定起始、结束时间之外,还能通过偏移量划分范围。

时区转换

# mlogfilter mongo.log --tiemzone 2 > mongo-correct.log

以上命令将日期调大2个时区,输出到mongo-correct.log,这在处理国际化系统的场景中非常有用。

更多详情戳这里

4. 初始化用户

接入其中一个mongos实例,添加管理员用户

use admin
db.createUser({
    user:'admin',pwd:'Admin@01',
    roles:[
        {role:'clusterAdmin',db:'admin'},
        {role:'userAdminAnyDatabase',db:'admin'},
        {role:'dbAdminAnyDatabase',db:'admin'},
        {role:'readWriteAnyDatabase',db:'admin'}
]})

当前admin用户具有集群管理权限、所有数据库的操作权限。
需要注意的是,在第一次创建用户之后,localexception不再有效,接下来的所有操作要求先通过鉴权。

use admin
db.auth('admin','Admin@01')

检查集群状态

mongos> sh.status()
--- Sharding Status --- 
  sharding version: {
    "_id" : 1,
    "minCompatibleVersion" : 5,
    "currentVersion" : 6,
    "clusterId" : ObjectId("5aa39c3e915210dc501a1dc8")
}
  shards:
    {  "_id" : "shard1",  "host" : "shard1/127.0.0.1:27001,127.0.0.1:27002,127.0.0.1:27003",  "state" : 1 }
    {  "_id" : "shard2",  "host" : "shard2/127.0.0.1:27004,127.0.0.1:27005,127.0.0.1:27006",  "state" : 1 }
  active mongoses:
    "3.4.7" : 3
autosplit:
    Currently enabled: yes

集群用户
分片集群中的访问都会通过mongos入口,而鉴权数据是存储在config副本集中的,即config实例中system.users数据库存储了集群用户及角色权限配置。mongos与shard实例则通过内部鉴权(keyfile机制)完成,因此shard实例上可以通过添加本地用户以方便操作管理。在一个副本集上,只需要在Primary节点上添加用户及权限,相关数据会自动同步到Secondary节点。
关于集群鉴权
在本案例中,我们为两个分片副本集都添加了本地admin用户。

通过mongostat工具可以显示集群所有角色:

          host insert query update delete getmore command dirty used flushes mapped vsize  res faults qrw arw net_in net_out conn    set repl                time
127.0.0.1:27001    *0    *0    *0    *0      0    6|0  0.1% 0.1%      0        1.49G 44.0M    n/a 0|0 0|0  429b  56.1k  25 shard1  PRI Mar 10 19:05:13.928
127.0.0.1:27002    *0    *0    *0    *0      0    7|0  0.1% 0.1%      0        1.43G 43.0M    n/a 0|0 0|0  605b  55.9k  15 shard1  SEC Mar 10 19:05:13.942
127.0.0.1:27003    *0    *0    *0    *0      0    7|0  0.1% 0.1%      0        1.43G 43.0M    n/a 0|0 0|0  605b  55.9k  15 shard1  SEC Mar 10 19:05:13.946
127.0.0.1:27004    *0    *0    *0    *0      0    6|0  0.1% 0.1%      0        1.48G 43.0M    n/a 0|0 0|0  546b  55.8k  18 shard2  PRI Mar 10 19:05:13.939
127.0.0.1:27005    *0    *0    *0    *0      0    6|0  0.1% 0.1%      0        1.43G 42.0M    n/a 0|0 0|0  540b  54.9k  15 shard2  SEC Mar 10 19:05:13.944
127.0.0.1:27006    *0    *0    *0    *0      0    6|0  0.1% 0.1%      0        1.46G 44.0M    n/a 0|0 0|0  540b  54.9k  17 shard2  SEC Mar 10 19:05:13.936

参考文档

Mongodb干货系列-定期巡检之Mtools
关于mtools的介绍
mtools安装指导

1. 下载安装包

官方地址:

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.6.3.tgz

可以做什么

一、架构简介

目标
单机搭建mongodb分布式集群(副本集 分片集群),演示mongodb分布式集群的安装部署、简单操作。

图片 1

说明
在同一个vm启动由两个分片组成的分布式集群,每个分片都是一个PSS(Primary-Secondary-Secondary)模式的数据副本集;
Config副本集采用PSS(Primary-Secondary-Secondary)模式。

1. 简易集群管理

执行以下命令,可以启动一个单节点的mongod进程。

# mlaunch init --single
launching: "mongod" on port 27017

可对比单节点手工搭建

再执行另外一个稍复杂点的命令:

# mlaunch init --sharded 2 --replicaset --nodes 3 --config 3 --csrs --mongos 3 --port 27050 --auth --username admin --password admin@2016 --auth-db admin 
launching: "mongod" on port 27053
launching: "mongod" on port 27054
launching: "mongod" on port 27055
launching: "mongod" on port 27056
launching: "mongod" on port 27057
launching: "mongod" on port 27058
launching: config server on port 27059
launching: config server on port 27060
launching: config server on port 27061
replica set 'configRepl' initialized.
replica set 'shard01' initialized.
replica set 'shard02' initialized.
launching: mongos on port 27050
launching: mongos on port 27051
launching: mongos on port 27052
adding shards. can take up to 30 seconds...
Username "admin", password "admin@2016"

什么?已经完成了一个双副本集分片集群的搭建!27050是起始端口,--sharded 2 表示有两个分片,--replicaset 表示启用副本集,
--config 3 --csrs 表示config 使用CSRS结构的3节点副本集,--auth 表示启用鉴权, --username --password 为初始化的用户,默认该用户将拥有所有库的管理权限。
整个集群的架构如下图所示:
图片 2

可以通过以下命令进行管理

]# mlaunch list
PROCESS PORT STATUS PID
()
mongos 27050 running 13017
mongos 27051 running 13059
mongos 27052 running 13093
()
config server 27059 running 12134
config server 27060 running 12217
config server 27061 running 12261
()
shard01
    primary 27053 running 12404
    secondary 27055 running 12559
    mongod 27054 running 12509
()
shard02
    secondary 27057 running 12793
    secondary 27058 running 12845
    mongod 27056 running 12697
()
()
 auth: "admin:admin@2016"

启动停止

# mlaunch stop
sent signal 15 to 12 processes.
# mlaunch start
launching: config server on port 27059
...

这是相当方便的,可以对比分布式集群搭建手记 这篇文章所描述的流程,相比手工搭建,该工具可缩减几十倍时间。

2. 部署目录

解压压缩文件,将bin目录拷贝到目标路径/opt/local/mongo-cluster,参考以下命令:

tar -xzvf mongodb-linux-x86_64-rhel70-3.6.3.tgz
mkdir -p  /opt/local/mongo-cluster
cp -r mongodb-linux-x86_64-rhel70-3.6.3/bin  /opt/local/mongo-cluster

4. 图表呈现

mplotqueries 是基于tkinter实现的图表组件,可以将日志中扁平的文字信息转换为图表形式。
输入以下命令:

mplotqueries mongo.log --group operations --output-file operations.png

你可以得到一个按操作分组输出的散点图,如下图:
图片 3

左侧的Y轴是duration,即操作的执行时长,下边的X轴是时间。每个操作在图中都会有一个描点,因此散点图会存在许多重叠。
当然,你也可以通过集合名称进行分组输出,如下面的命令:

mplotqueries mongo.log --group namespace --group-limit 20 --type scatter --yaxis nscanned --output-file namespace_nscan.png

输出的图表将按名称空间进行分组(限显示20个),y轴为nscanned值,即扫描记录数量
图片 4

默认情况下,y轴的呈现为时长(during),可指定为其他指标:

指标名称 说明
nscanned 扫描数
nupdated 更新数
ninserted 插入数
ntoreturn 返回数
numYields 让步次数
r 读锁
w 写锁

有时候你并不关系具体的某个操作,而是希望看到某个时间段,某类操作或某个集合的操作占比。
比如每小时,每个集合的操作比例分布,此时可以采用直方图

mplotqueries mongo.log --group namespace --bucketsize 3600 --group-limit 10 --type histogram --output-file namespaces_perhour.png

图片 5

在前面已经讲过,连接数的监测工作非常重要,mplotqueries也提供了连接变更统计类型

mplotqueries mongo.log --type connchurn --bucketsize 3600 --output-file connchurn_perhour.png

图片 6

在大部分情况下,低效的操作往往来自大量的scan扫描,尤其当return数远小于scan时会更加低效。
可以通过指定 nscanned/n 参数输出该维度的图表,即扫描数/返回数

mplotqueries mongo.log --type nscanned/n --group-limit 20 --output-file nscan.png

图片 7

输出事件持续图
往往在跟踪某一类耗时操作或事件时需要用到,比如oplog的同步、创建索引等,我们希望看到事件的执行时段。
同时还需要伴随一些操作统计,用于配合做资源监控分析。具体一点就是,你执行了一个耗时操作,在某些情况下对业务访问可能
产生了影响,如业务访问超时并伴随DB服务器资源的告警,如CPU飙高,在后续的分析中希望通过耗时操作、以及同时段业务访问的分布进行综合分析。

以下的命令展示了一个典型用法

# 创建一个overlay
grep "index" mongo.log | mplotqueries --type durline --overlay
# 叠加overlay输出图表
mplotqueries mongo.log --group operation --output-file duration.png

图片 8

By the way,如果不希望生成那么多的图表,mtools还提供了一个偷懒的工具 mlogvis。可以直接生成html页面,内置强大的脚本
基本上覆盖了mplotqueries的绝大多数图表功能。

# mlogvis mongo.log

图片 9

查看更多用法

希望你已经开始喜欢mtools,并已经跃跃欲试。下面提供了简单的安装方法

二、配置说明

  • 端口通讯
    当前集群中存在shard、config、mongos共12个进程节点,端口矩阵编排如下:
编号 实例类型
1 mongos
2 mongos
3 mongos
4 config
5 config
6 config
7 shard1
8 shard1
9 shard1
10 shard2
11 shard2
12 shard2
  • 内部鉴权
    节点间鉴权采用keyfile方式实现鉴权,mongos与分片之间、副本集节点之间共享同一套keyfile文件。 官方说明

  • 账户设置
    管理员账户:admin/Admin@01,具有集群及所有库的管理权限
    应用账号:appuser/AppUser@01,具有appdb的owner权限

关于初始化权限
keyfile方式默认会开启鉴权,而针对初始化安装的场景,Mongodb提供了localhost-exception机制,
可以在首次安装时通过本机创建用户、角色,以及副本集初始操作。

2. 日志统计

mloginfo 是一个用于做日志信息统计的工具,输入以下命令:

# mloginfo mongo.log
     source: mongo.log
       host: MongoDB_1:10001
        start: 2018 May 18 16:33:11.692
        end: 2018 May 19 01:13:08.290
date format: iso8601-local
     length: 144480
     binary: mongod
    version: 3.4.10
    storage: wiredTiger

可以看到日志的起止时间范围、主机端口、版本、数据库引擎等概要信息。

连接数
当我们希望检查客户端的连接数情况时,可以执行以下命令:

# mloginfo mongo.log --connections
CONNECTIONS
     total opened: 14282
     total closed: 14358
    no unique IPs: 4
socket exceptions: 0
127.0.0.1 opened: 12886 closed: 12889
172.21.0.29 opened: 658 closed: 716
172.21.0.28 opened: 461 closed: 490
172.21.0.27 opened: 277 closed: 263

通过这样的信息,进一步判断是否存在连接过载等异常情况。

事件统计
又或者,你希望统计出当前某些事件的发生频次。

# mloginfo mongo.log --distinct
DISTINCT
   14358 end connection ... ( ... now open)
   14281 connection accepted from ... # ... ( ... now open)
   13075 received client metadata from ... :
    5340 Successfully authenticated as principal ... on
    1194 Use of the aggregate command without the 'cursor'
     338 build index on: ... properties:
     244 building index using bulk method; build may temporarily use up to ... megabytes of RAM
     234 ns: ... key: ... name:
     219 Refreshing chunks for collection ... based on version
     218 Refresh for collection ... took ... ms and found version
     179 Index ... :

慢查询
在业务问题分析中,慢查询是最常见的问题。

# mloginfo mongo.log --queries --sort count
QUERIES
namespace                  operation      pattern                              count      min (ms)    max (ms)  mean (ms)    95%-ile (ms) sum (ms)
nsspace.StatisticsHour   find             {"$and": [{"recordTime": 1}]..}     22331      276       747          345          414.0            7720736
nsspace.StatisticsHour   getmore       {"aggregate": 1, "cursor": ...}]}    231          200      304          227          272.0             52587
dmspace.DeviceInfo      remove          {"_id": 1}                              109        205      1786          420          771.0            45860
cmspace.DeviceData     update          {"appId": 1, "deviceId": 1}          95          201      1802          431          824.5            40966
dmspace.TaskHistory    update          {"_id": 1}                                54          268      2643          692          2019.0          37413
nsspace.StatisticsDay     find              {"$and": [{"recordTime": 1}], ..}   31          201      348            241          345.0            7472

如上面的命令,将显示所有慢查询,并按出现次数排序。

重启信息

# mloginfo mongo.log --restart
RESTARTS
   May 18 21:37:51 version 3.4.10
   May 18 21:48:33 version 3.4.10

通过检测重启信息,对系统潜在的故障进行评估分析。

副本集切换
同样,主备切换可能导致一定的业务失败,需要定期监测。

# mloginfo mongo.log --rsstate
RSSTATE
date host state/message
()
May 18 21:48:53 172.21.0.29:10001 ARBITER
May 18 21:49:26 172.21.0.28:10001 SECONDARY

2. 创建分片

按以下脚本启动Shard1的3个实例

WORK_DIR=/opt/local/mongo-cluster
KEYFILE=$WORK_DIR/keyfile/mongo.key
CONFFILE=$WORK_DIR/conf/mongo_node.conf
MONGOD=$WORK_DIR/bin/mongod

echo "start shard1 replicaset"

$MONGOD --port 27001 --shardsvr --replSet shard1 --keyFile $KEYFILE --dbpath $WORK_DIR/nodes/shard1/n1/data --pidfilepath $WORK_DIR/nodes/shard1/n1/db.pid --logpath $WORK_DIR/nodes/shard1/n1/db.log --config $CONFFILE
$MONGOD --port 27002 --shardsvr --replSet shard1 --keyFile $KEYFILE --dbpath $WORK_DIR/nodes/shard1/n2/data --pidfilepath $WORK_DIR/nodes/shard1/n2/db.pid --logpath $WORK_DIR/nodes/shard1/n2/db.log --config $CONFFILE
$MONGOD --port 27003 --shardsvr --replSet shard1 --keyFile $KEYFILE --dbpath $WORK_DIR/nodes/shard1/n3/data --pidfilepath $WORK_DIR/nodes/shard1/n3/db.pid --logpath $WORK_DIR/nodes/shard1/n3/db.log --config $CONFFILE

待成功启动后,输出日志如下:

about to fork child process, waiting until server is ready for connections.
forked process: 5976
child process started successfully, parent exiting

此时通过ps 命令也可以看到3个启动的Shard进程实例。

连接其中一个Shard进程,执行副本集初始化

./bin/mongo --port 27001 --host 127.0.0.1
> MongoDB server version: 3.4.7
> cfg={
    _id:"shard1", 
    members:[
        {_id:0, host:'127.0.0.1:27001'},
        {_id:1, host:'127.0.0.1:27002'}, 
        {_id:2, host:'127.0.0.1:27003'}
    ]};
rs.initiate(cfg);

参考以上步骤,启动Shard2的3个实例进程,并初始化副本集。

如何安装

由于篇幅所限,这里仅提供Centos下的安装方式

  • 准备Python的环境(2.7或3.5),目前大多数发行版本的linux都包含了python。
    如果没有Python,执行yum install python python-devel 完成安装
    确保pip已经安装,执行pip进行检测,如果没有安装可参考官方说明进行安装。

  • 安装python-tk
    执行命令如下:

yum install python-tools

其他linux系统(如ubuntu/opensuse)则需要安装python-tk软件包

  • 安装依赖模块
pip install psutil
pip install pymongo
pip install matplotlib
pip install numpy

说明
每个模块的作用可以参考下表:

模块名称 作用
psutil 用于管理进程的工具
pymongo mongodb python驱动
matplotlib python的2D图表渲染模块
numpy 支持科学计算的工具
  • 安装mtools
pip install mtools

至此,你应该获得了一个已安装好的mtools环境,如果希望安装最新的非稳定版本,可以通过源码安装

五、数据操作

在案例中,创建appuser用户、为数据库实例appdb启动分片。

use appdb
db.createUser({user:'appuser',pwd:'AppUser@01',roles:[{role:'dbOwner',db:'appdb'}]})
sh.enableSharding("appdb")

创建集合book,为其执行分片初始化。

use appdb
db.createCollection("book")
db.device.ensureIndex({createTime:1})
sh.shardCollection("appdb.book", {bookId:"hashed"}, false, { numInitialChunks: 4} )

继续往device集合写入1000W条记录,观察chunks的分布情况

use appdb
var cnt = 0;
for(var i=0; i<1000; i  ){
    var dl = [];
    for(var j=0; j<100; j  ){
        dl.push({
                "bookId" : "BBK-"   i   "-"   j,
                "type" : "Revision",
                "version" : "IricSoneVB0001",
                "title" : "Jackson's Life",
                "subCount" : 10,
                "location" : "China CN Shenzhen Futian District",
                "author" : {
                      "name" : 50,
                      "email" : "RichardFoo@yahoo.com",
                      "gender" : "female"
                },
                "createTime" : new Date()
            });
      }
      cnt  = dl.length;
      db.book.insertMany(dl);
      print("insert ", cnt);
}

执行db.book.getShardDistribution(),输出如下:

Shard shard1 at shard1/127.0.0.1:27001,127.0.0.1:27002,127.0.0.1:27003
data : 13.41MiB docs : 49905 chunks : 2
estimated data per chunk : 6.7MiB
estimated docs per chunk : 24952

Shard shard2 at shard2/127.0.0.1:27004,127.0.0.1:27005,127.0.0.1:27006
data : 13.46MiB docs : 50095 chunks : 2
estimated data per chunk : 6.73MiB
estimated docs per chunk : 25047

Totals
data : 26.87MiB docs : 100000 chunks : 4
Shard shard1 contains 49.9% data, 49.9% docs in cluster, avg obj size on shard : 281B
Shard shard2 contains 50.09% data, 50.09% docs in cluster, avg obj size on shard : 281B

本文由金沙澳门官网发布于数据库信息,转载请注明出处:mongodb分布式集群搭建手记,你可能没用过的mon

关键词: 金沙澳门官网