Sharding:搭建单节点 Shard 环境

今天初步学习 MongoDB 的分片相关的内容,分片是 MongoDB 的一个非常重要的特性,将数据分散到各个子节点,分散IO,具有易分片,易扩展,易集群的特性等,以下在虚拟机环境下搭建最简单的分片环境。

基础信息

1.1 分片环境核心组件

shard 节点: 分片节点,存储数据,可以是单个进程,也可以是 replica set;
config 节点: 配置节点,仅存储集群的元数据,在生产环境上一般配置 3个 config 节点;
monos 进程:路由进程,本身不存储数据,负责将应用发出的SQL分发到各个 shard 节点,monos 进程消耗资源较少,可以部署在应用服务端,也可以部署在数据库端。

1.2 环境信息
主机名: redhatB.example.com
OS: Red Hat Enterprise Linux Server release 6.2 (Santiago)
mongo: db version v2.2.1 ( 软件安装略)

1.3 各节点端口信息
shard1 5281
shard2 5282
Config Server 7281
mongos 7282

搭建步骤

2.1 增加OS用户

1
2
3
4
5
[root@redhatB ~]# groupadd shard  
[root@redhatB ~]# useradd -g shard shard
[root@redhatB ~]# passwd shard
[root@redhatB ]# mkdir -p /shard
[root@redhatB ]# chown -R shard:shard /shard

2.2 配置 shard1 节点
2.2.1 创建目录和配置文件

1
2
3
4
5
6
7
8
mkdir -p /shard/shard1  
touch /shard/shard1/shard1_5281.conf #(包含以下内容)
fork = true
port = 5281
dbpath = /shard/shard1
logpath = /shard/shard1/shard1.log
logappend = true
journal = true

2.2.2 启动 shard1

1
mongod -f /shard/shard1/shard1_5281.conf

2.3 配置 shard2 节点
2.3.1 创建目录和配置文件

1
2
3
4
5
6
7
8
mkdir -p /shard/shard2  
touch /shard/shard2/shard2_5282.conf (包含以下内容)
fork = true
port = 5282
dbpath = /shard/shard2
logpath = /shard/shard2/shard2.log
logappend = true
journal = true

2.3.2 启动 shard2

1
mongod -f /shard/shard2/shard2_5282.conf

2.4 配置 Config Server
2.4.1 创建目录和配置文件

1
2
3
4
5
6
7
8
mkdir -p /shard/conf  
touch /shard/conf/conf_7281.conf #(包含以下内容)
configsvr = true
fork = true
port = 7281
dbpath = /shard/conf
logpath = /shard/conf/conf.log
logappend = true

2.4.2 启动 Config Server

1
mongod -f /shard/conf/conf_7281.conf

2.5 启动 mongos 进程

1
mongos --configdb redhatB.example.com:7281 --fork --logpath /shard/mongos.log --chunkSize 1 --port 7282

备注:–chunkSize 选项设置 chunk 的大小,默认64M,这里将它设置为 1M,在接下来的实验更容易看到分片效果。

2.6 增加分片结点到集群

1
2
3
4
5
6
7
8
9
10
11
[shard@redhatB shard]$ mongo 127.0.0.1:7282  
MongoDB shell version: 2.2.1
connecting to: 127.0.0.1:7282/test
mongos> show dbs;
config 0.046875GB

mongos> sh.addShard( "redhatB.example.com:5281" );
{ "shardAdded" : "shard0000", "ok" : 1 }

mongos> sh.addShard( "redhatB.example.com:5282" );
{ "shardAdded" : "shard0001", "ok" : 1 }

2.7 查看集群状态

1
2
3
4
5
6
7
8
9
mongos> sh.status();  
--- Sharding Status ---
sharding version: { "_id" : 1, "version" : 3 }
shards:
{ "_id" : "shard0000", "host" : "redhatB.example.com:5281" }
{ "_id" : "shard0001", "host" : "redhatB.example.com:5282" }
databases:
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
备注:到了这里,单节点的 Sharded Cluster 搭建完成了,接下来验证下。

测试

3.1 开启指定数据库 Sharding 功能

1
2
3
4
5
6
[shard@redhatB shard]$ mongo 127.0.0.1:7282  
MongoDB shell version: 2.2.1
connecting to: 127.0.0.1:7282/test

mongos> sh.enableSharding("francs");
{ "ok" : 1 }

3.2 开启指定集合分片

1
2
mongos> sh.shardCollection("francs.test_1", { "id": 1} );  
{ "collectionsharded" : "francs.test_1", "ok" : 1 }

3.3 查看已分片集合的索引信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mongos> db.test_1.getIndexes();  
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"ns" : "francs.test_1",
"name" : "_id_"
},
{
"v" : 1,
"key" : {
"id" : 1
},
"ns" : "francs.test_1",
"name" : "id_1"
}
]

备注:在集合上通过命令 shardCollection 开启分片后, 在分片的字段上默认创建了索引。

3.4 测试:插入数据

1
mongos> for( var i=1; i<50001; i++) db.test_1.save({id:i,name:'abc'})

3.5 看集合 test_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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
mongos> db.test_1.stats();  
{
"sharded" : true,
"ns" : "francs.test_1",
"count" : 50000,
"numExtents" : 10,
"size" : 2400128,
"storageSize" : 5849088,
"totalIndexSize" : 3049648,
"indexSizes" : {
"_id_" : 1635200,
"id_1" : 1414448
},
"avgObjSize" : 48.00256,
"nindexes" : 2,
"nchunks" : 3,
"shards" : {
"shard0000" : {
"ns" : "francs.test_1",
"count" : 11827, "size" : 567760,
"avgObjSize" : 48.005411346918066,
"storageSize" : 3055616,
"numExtents" : 5,
"nindexes" : 2,
"lastExtentSize" : 2359296,
"paddingFactor" : 1,
"systemFlags" : 1,
"userFlags" : 0,
"totalIndexSize" : 735840,
"indexSizes" : {
"_id_" : 392448,
"id_1" : 343392
},
"ok" : 1
},
"shard0001" : {
"ns" : "francs.test_1",
"count" : 38173,
"size" : 1832368,
"avgObjSize" : 48.0016765776858,
"storageSize" : 2793472,
"numExtents" : 5,
"nindexes" : 2,
"lastExtentSize" : 2097152,
"paddingFactor" : 1,
"systemFlags" : 1,
"userFlags" : 0,
"totalIndexSize" : 2313808,
"indexSizes" : {
"_id_" : 1242752,
"id_1" : 1071056
},
"ok" : 1
}
},
"ok" : 1
}

备注:”shard0000” 存储 11827条,”shard0001” 存储 38173 条,集合已分片。

参考

http://docs.mongodb.org/manual/tutorial/deploy-shard-cluster/
http://docs.mongodb.org/manual/administration/sharding/#set-up-a-sharded-cluster
http://blog.163.com/dazuiba_008/blog/static/36334981201110172191325/

原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/237928.html

(0)
上一篇 2022年1月29日
下一篇 2022年1月29日

相关推荐

发表回复

登录后才能评论