Fork me on GitHub

mongodb分片配置

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。这里废话不多说,直接开始配置mongodb分片

yum安装mongodb(配置好yum源)


1
# yum -y install mongodb-server mongodb

创建所需要的目录


1
2
# mkdir /home/mongdb/config/{log,data} -pv
# mkdir /home/mongdb/shard{1,2,3}/{data,log} -pv

分别启动config服务器


1
# mongod --configsvr --dbpath=/home/mongdb/config/data/ --port 27100 --logpath=/home/mongdb/config/log/confdb.log --fork --directoryperdb

启动路由服务器


1
# mongos --configdb 192.168.16.90:27100,192.168.16.91:27100,192.168.16.92:27100 --port 27000 --logpath=/home/mongdb/config/confdb.log --fork

每台服务器上分别启动多个副本集


1
2
3
# mongod --shardsvr --replSet shard1 --port 27001 --dbpath /home/mongdb/shard1/data --logpath /home/mongdb/shard1/log/shard1.log --directoryperdb --fork
# mongod --shardsvr --replSet shard2 --port 27002 --dbpath /home/mongdb/shard2/data --logpath /home/mongdb/shard1/log/shard2.log --directoryperdb --fork
# mongod --shardsvr --replSet shard3 --port 27003 --dbpath /home/mongdb/shard3/data --logpath /home/mongdb/shard1/log/shard3.log --directoryperdb --fork

配置shard1


登陆90,没有显式指定主节点时,会选择登陆的机器为主节点
1
2
3
4
5
6
7
8
9
10
11
mongo --port 27001
> use admin
switched to db admin
> rs.initiate({
... _id: 'shard1',
... members: [
... {_id: 90,host: '192.168.16.90:27001'},
... {_id: 91,host: '192.169.16.91:27001'},
... {_id: 92,host: '192.168.16.92:27001',arbiterOnly: true}
... ]
... });

配置shard2


登录91
1
2
3
4
5
6
7
8
9
10
11
mongo --port 27002
shard1:SECONDARY> use admin
switched to db admin
shard1:SECONDARY> rs.initiate({
... _id: 'shard2',
... members: [
... {_id: 90,host: '192.168.16.90:27001',arbiterOnly: true},
... {_id: 91,host: '192.169.16.91:27001'},
... {_id: 92,host: '192.168.16.92:27001'}
... ]
... });

配置shard3


登录92
1
2
3
mongo --port 27003
shard1:SECONDARY> use admin
rs.initiate({ _id: 'shard3', members: [ {_id: 90,host: '192.168.16.90:27003'}, {_id: 91,host: '192.169.16.91:27003',arbiterOnly: true}, {_id: 92,host: '192.168.16.92:27003'} ] });

设置路由到分片集群配置


1
2
3
4
5
db.runCommand({addShard: 'shard2/192.168.16.90:27002,192.168.16.91:27002,192.168.16.92:27002'});
{ "shardAdded" : "shard2", "ok" : 1 }
mongos> db.runCommand({addShard: 'shard3/192.168.16.90:27003,192.168.16.91:27003,192.168.16.92:27003'});
{ "shardAdded" : "shard3", "ok" : 1 }
mongos> db.runCommand({addShard: 'shard1/192.168.16.90:27001,192.168.16.91:27001,192.168.16.92:27001'});

查看配置好的shard


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mongos> db.runCommand({listshards: 1});
{
true"shards" : [
truetrue{
truetruetrue"_id" : "shard1",
truetruetrue"host" : "shard1/192.168.16.90:27001,192.168.16.91:27001"
truetrue},
truetrue{
truetruetrue"_id" : "shard2",
truetruetrue"host" : "shard2/192.168.16.91:27002,192.168.16.92:27002"
truetrue},
truetrue{
truetruetrue"_id" : "shard3",
truetruetrue"host" : "shard3/192.168.16.90:27003,192.168.16.92:27003"
truetrue}
true],
true"ok" : 1
}

测试分片


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
mongos> use admin
mongos> db.runCommand({enablesharding: 'dbtest'});
mongos> db.runCommand({shardcollection: 'dbtest.coll1', key: {id: 1}});
mongos> use dbtest;
mongos> for(var i=0; i<10000; i++) db.coll1.insert({id: i, s: 'str_' + i});
mongos> db.coll1.stats()
true"shard1" : {
true"ns" : "dbtest.coll1",
true"count" : 1,
true"size" : 47,
true"avgObjSize" : 47,
true"storageSize" : 4096,
true"capped" : false,
true"wiredTiger" : {
true"shard2" : {
true"ns" : "dbtest.coll1",
true"count" : 9979,
true"size" : 497892,
true"avgObjSize" : 49,
true"storageSize" : 4096,
true"capped" : false,
true"wiredTiger" : {
true
true"shard3" : {
true"ns" : "dbtest.coll1",
true"count" : 20,
true"size" : 951,
true"avgObjSize" : 47,
true"storageSize" : 16384,
true"capped" : false,
true"wiredTiger" : {

可以看到,这里分片已经生效,只是分配不均匀,所有的数据都存在了shard2中了

使用hashed shard key算法保证文档均匀分布


1
2
3
mongo --port 27000
use admin
sh.shardCollection('dbtest.coll1', {id: 'hashed'});

客户端可以通过连接路由节点来实现数据的分片


这里连接任何一台服务器的27000端口都行。



    本文标题   :   mongodb分片配置

    文章作者   :   火柴

    发布时间   :   2016年8月5日 - 11时08分

    本文链接   :   http://www.chen-hao.com.cn/mongodb分片配置.html

    本文字数   :   本文一共有789字

    许可协议   :   Attribution-NonCommercial 4.0

    © 转载请保留以上信息,谢谢合作。