MongoDB分片

主机

ip

服务和端口

mydb1

192.168.1.101

Shard1 master 7001

Shard2 slave 7002

Shard3 slave 7003

Config Server 27001

mongos 37001

mydb2

192.168.1.102

Shard1 slave 7001

Shard2 master 7002

Shard3 slave 7003

Config Server 27001

mongos 37001

mydb3

192.168.1.103

Shard1 slave 7001

Shard2 slave 7002

Shard3 master 7003

Config Server 27001

mongos 37001

 

1、创建三个复制集

安装略

以复制集模式启动

三个副本集分别取名为shard1shard2shard3,每台机器需要使用不同端口启动三个MongoDB实例

使用命令:

# /usr/local/mongodb/bin/mongod -f /app/mongodb/7001/mongodb.config

# /usr/local/mongodb/bin/mongod -f /app/mongodb/7002/mongodb.config

# /usr/local/mongodb/bin/mongod -f /app/mongodb/7003/mongodb.config

注意参数,注意端口

# cat mongodb.config

fork=true

port=7001

quiet=true

dbpath=/app/mongodb/7001/db

logpath=/app/mongodb/7001/log/mongodb.log

logappend=true

journal=true

directoryperdb=true

wiredTigerDirectoryForIndexes=true

maxConns=65535

profile=1

slowms=500

replSet=shard1      #指定副本集

oplogSize=40960

storageEngine=wiredTiger

wiredTigerCacheSizeGB=1

wiredTigerCollectionBlockCompressor=snappy

shardsvr=true       #配置节点角色(>=3.4 shard节点专用)

#configsvr=true     #指定config节点角色(>=3.4 config节点专用)

#configdb=MSCHOST   #指定config

#keyFile=/app/mongodb/7001/keyFile

setParameter=enableLocalhostAuthBypass=1

 

初始化复制集

mydb1登录到mongo客户端初始化shard1副本集,使用命令如下:

# /usr/local/mongodb/bin/mongo --port 7001

进入mongos>后输入

>rs.initiate()

>rs.add("192.168.1.102:7001")

>rs.add("192.168.1.103:7001")

mydb2登录到mongo客户端初始化shard2副本集,使用命令如下:

# /usr/local/mongodb/bin/mongo --port 7002

进入mongos>后输入

>rs.initiate()

>rs.add("192.168.1.101:7002")

>rs.add("192.168.1.103:7002")

mydb3登录到mongo客户端初始化shard3副本集,使用命令如下:

# /usr/local/mongodb/bin/mongo --port 7003

进入mongos>后输入

>rs.initiate()

>rs.add("192.168.1.101:7003")

>rs.add("192.168.1.102:7003")

rs.status();

 

2、创建分片需要的Config ServerRoute Process

启动Config ServerRoute Process

mydb1使用命令启动Config Server:

# /usr/local/mongodb/bin/mongod -f /app/mongodb/27001/mongodb.config

mydb2使用命令启动Config Server:

# /usr/local/mongodb/bin/mongod -f /app/mongodb/27001/mongodb.config

mydb3使用命令启动Config Server:

# /usr/local/mongodb/bin/mongod -f /app/mongodb/27001/mongodb.config

注意参数,注意端口

# cat mongodb.config

fork=true

port=27001

quiet=true

dbpath=/app/mongodb/27001/db

logpath=/app/mongodb/27001/log/mongodb.log

logappend=true

journal=true

directoryperdb=true

wiredTigerDirectoryForIndexes=true

maxConns=65535

profile=1

slowms=500

replSet=configReplSet      #指定副本集

oplogSize=40960

storageEngine=wiredTiger

wiredTigerCacheSizeGB=1

wiredTigerCollectionBlockCompressor=snappy

#shardsvr=true      #配置节点角色(>=3.4 shard节点专用)

configsvr=true     #指定config节点角色(>=3.4 config节点专用)

#configdb=MSCHOST   #指定config

#keyFile=/app/mongodb/27001/keyFile

setParameter=enableLocalhostAuthBypass=1

 

因为MongoDB 3.4版本多个Config Server必须要以副本集的形式才能添加,所以mydb1登录到mongo客户端初始化config副本集,使用命令如下:

# /usr/local/mongodb/bin/mongo --port 27001

进入mongos>后输入

>rs.initiate()

>rs.add("192.168.1.102:27001")

>rs.add("192.168.1.103:27001")

 

mydb1使用命令启动mongos:

# /usr/local/mongodb/bin/mongos -f /app/mongodb/37001/mongodb.config

mydb2使用命令启动mongos:

# /usr/local/mongodb/bin/mongos -f /app/mongodb/37001/mongodb.config

mydb3使用命令启动mongos:

# /usr/local/mongodb/bin/mongos -f /app/mongodb/37001/mongodb.config

注意参数,注意端口

# cat mongodb.config

fork=true

port=37001

quiet=true

logpath=/app/mongodb/37001/log/mongodb.log

logappend=true

configdb=configReplSet/192.168.1.101:27001,192.168.1.102:27001,192.168.1.103:27001

#keyFile=/app/mongodb/37001/keyFile

setParameter=enableLocalhostAuthBypass=1

 

3、配置分片

配置分片也就是把复制集添加为分片节点,这是分片+副本集区别与分片集群的重要步骤,在其中一台机子中进入mongos>执行配置命令,使用命令如下:

# /usr/local/mongodb/bin/mongo --port 37001  

进入mongos>后输入

>use admin

>db.runCommand({addshard:"shard1/mydb1:7001,192.168.1.102:7001,192.168.1.103:7001" })

>db.runCommand({addshard:"shard2/192.168.1.101:7002,mydb2:7002,192.168.1.103:7002" })

>db.runCommand({addshard:"shard3/192.168.1.101:7003,192.168.1.102:7003,mydb3:7003" })

添加成功后输出信息为:

{ "shardAdded" : "shard1", "ok" : 1 }

{ "shardAdded" : "shard2", "ok" : 1 }

{ "shardAdded" : "shard3", "ok" : 1 }

注意shard1shard2以及shard3分别对应我们上面创建的三个复制集中创建的副本集名称以及下属的name。需要注意的是nameip与主机名不能自动识别替换,所以name要与副本集中rs.status()命令查看的一致,具体的名称可以用如下命令查看:

# /usr/local/mongodb/bin/mongo --port 7001  

# /usr/local/mongodb/bin/mongo --port 7002

# /usr/local/mongodb/bin/mongo --port 7003

进入PRIMARY>

输入命令

>rs.status()

 

4、对数据库mytest启用分片

在任意机子中进入mongos,比如在mydb1机子中使用命令:

# /usr/local/mongodb/bin/mongo --port 37001

然后切换到admin数据库,对mytset数据库设置分片,因为MongoDB中的数据库都会自动创建,所以我们这里不需要先新建mytest数据库。

>use admin

>sh.enableSharding("mytest")

 

5、集合启用分片

对数据库mytest中的集合student启用分片,设置片键。

在任意机子中进入mongos,比如在mydb1机子中使用命令:

# /usr/local/mongodb/bin/mongo --port 37001

mytest数据库中的student集合启用分片和设置片键,因为MongoDB中的集合会自动创建,所以我们这里不需要先新建student集合。

区间片键方式

mytest数据库student集合的_id字段设置为区间片键,使用命令:

>sh.shardCollection( "mytest.student", { _id:1 } )

哈希片键方式

mytest数据库teacher集合的_id字段设置为哈希片键,使用命令:

>sh.shardCollection( "mytest.teacher", { _id: "hashed" } )

 

6、分片集群插入数据测试

mongos>中使用命令:

>use mytest

>for(var i=1; i<=60000; i++) db.student.insert({age:i,name:"marry",addr:"bj",country:"China"})

>for(var i=1; i<=60000; i++) db.teacher.insert({age:i,name:"allen",addr:"sh",country:"China"})

执行可能需要一小会时间,我们直接在工具中查看config集合中的chunks元数据信息,就可以看到随着数据的写入分了多少片,以及片键的最小到最大的范围。

3shard服务器里可以看到都有了mytest数据库以及student,teacher集合。

 

7增加安全认证机制KeyFile,集群添加用户

keyFile复制到其他机器上,shard,configserver,mongos都要做

配置文件加keyFile部分

mongos>中使用命令:

>use admin

>db.createUser(

  {

    user: "root",

    pwd: "abc123",

    roles: [ { role: "root", db: "admin" } ]

  }

)

>use mytest

>db.createUser(

  {

    user: "myTester",

    pwd: "xyz123",

    roles: [ { role: "readWrite", db: "mytest" },

          { role: "read", db: "reporting" } ]

  }

)

重启

 

8、集群管理

启动时先启动Config Server

# /usr/local/mongodb/bin/mongod -f /app/mongodb/27001/mongodb.config

再启动shard节点

# /usr/local/mongodb/bin/mongod -f /app/mongodb/7001/mongodb.config

# /usr/local/mongodb/bin/mongod -f /app/mongodb/7002/mongodb.config

# /usr/local/mongodb/bin/mongod -f /app/mongodb/7003/mongodb.config

最后启动mongos

# /usr/local/mongodb/bin/mongos -f /app/mongodb/37001/mongodb.config

客户端连接

# /usr/local/mongodb/bin/mongo 192.168.1.101:37001/admin -u root -p abc123

# /usr/local/mongodb/bin/mongo 192.168.1.101:37001/mytest -u myTester -p xyz123

 

 

分片键:手动分片,自动分片

以范围为基础的分片

基于哈希的分片

 

片键的选择决定了三个重要的方面:

  1. 读和写的分布
  2. 数据块的大小
  3. 每个查询命中的分片数目

 

数据均衡的维护:

分裂

均衡

在集群中增加或者删除分片

 

https://www.cnblogs.com/littleatp/p/8563273.html

https://www.cnblogs.com/vadim/p/7100683.html

posted @ 2019-08-12 14:44  AllenHU320  阅读(183)  评论(0编辑  收藏  举报