MongoDB 分片(sharding)
🏷️ MongoDB
按值的范围进行横向分片,简称分片(sharding)
创建两个 mongo 服务器并分别启动;
bash
cd /mongodb/
mkdir ./mongo4 ./mongo5
cd /mongodb/
./bin/mongod --shardsvr --dbpath ./mongo4 --port 27014
cd /mongodb/
./bin/mongod --shardsvr --dbpath ./mongo5 --port 27015
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
创建一个 config(配置)服务器;
bash
cd /mongodb/
mkdir ./mongoconfig
./bin/mongod --configsvr --dbpath ./mongoconfig --port 27016
1
2
3
2
3
创建一个 mongos 服务器,它是对客户的一个单点入口;
bash
cd /mongodb/
./bin/mongos --configdb localhost:27016 --chunkSize 1 --port 27020
1
2
2
连接 mongos 服务器,进入 admin 数据库并配置分片;
bash
[liujj@localhost ~]$ cd /mongodb/
[liujj@localhost mongodb]$ ./bin/mongo localhost:27020/admin
MongoDB shell version: 3.2.4
connecting to: localhost:27020/admin
mongos> db.runCommand( { addshard : "localhost:27014" } )
{ "shardAdded" : "shard0000", "ok" : 1 }
mongos> db.runCommand( { addshard : "localhost:27015" } )
{ "shardAdded" : "shard0001", "ok" : 1 }
mongos> db.runCommand( { enablesharding : "test" } )
{ "ok" : 1 }
mongos> db.runCommand( { shardcollection : "test.cities", key : {name : 1} } )
{ "collectionsharded" : "test.cities", "ok" : 1 }
mongos>
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
从 json 文件导入 cities 数据;
bash
[liujj@localhost ~]$ cd /mongodb/
[liujj@localhost mongodb]$ ./bin/mongoimport -h localhost:27020 --db test --collection cities --type json /mongodb/scripts/mongo_cities1000.json
2016-04-07T07:07:29.561-0700 connected to: localhost:27020
2016-04-07T07:07:32.420-0700 [#######.................] test.cities 3.7 MB/12.3 MB (30.1%)
2016-04-07T07:07:35.419-0700 [############............] test.cities 6.3 MB/12.3 MB (50.7%)
2016-04-07T07:07:38.423-0700 [################........] test.cities 8.6 MB/12.3 MB (69.7%)
2016-04-07T07:07:41.434-0700 [####################....] test.cities 10.7 MB/12.3 MB (86.4%)
2016-04-07T07:07:44.105-0700 [########################] test.cities 12.3 MB/12.3 MB (100.0%)
2016-04-07T07:07:44.105-0700 imported 99838 documents
[liujj@localhost mongodb]$
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
分别连接两个分片服务器并统计 name 的第一个字符,看看分别存储了哪些数据及数据件数;
点击查看统计结果
bash
localhost:27014
[liujj@localhost mongodb]$ ./bin/mongo localhost:27014
MongoDB shell version: 3.2.4
connecting to: localhost:27014/test
> db.cities.group({
... initial: { names: {} },
... reduce: function(city, output) {
... output.names[city.name.substr(0,1)] = 1;
... },
... finalize: function (out) {
... var ary = ;
... for(var p in out.names) { ary.push(p); }
... out.names = ary;
... }
... })
[
{
"names" : [
"S",
"P",
"O",
"l",
"U",
"R",
"M",
"`",
"T",
"Z",
"Y",
"Q",
"N",
"L",
"Ḩ",
"Ā",
"Ç",
"V",
"W",
"İ",
"X",
"Ş",
"Ə",
"Ž",
"Š",
"Č",
"Ć",
"É",
"Á",
"v",
"О",
"Ü",
"Í",
"Ú",
"Ř",
"Ö",
"‘",
"Ø",
"Å",
"e",
"Ţ",
"Ṭ",
"Ó",
"s",
"Ò",
"Ä",
"Œ",
"È",
"h",
"Ý",
"Μ",
"Ő",
"d",
"Ẕ",
"m",
"Ḥ",
"Ū",
"k",
"p",
"Ī",
"Þ",
"Ō",
"Ŭ",
"Ķ",
"Ж",
"З",
"В",
"Т",
"С",
"Ш",
"Р",
"П",
"Н",
"М",
"Л",
"К",
"Ј",
"И",
"Г",
"Д",
"Ч",
"Ц",
"Б",
"А",
"Ż",
"Ħ",
"f",
"Ñ",
"Ś",
"Ł",
"Î",
"b",
"Ð",
"Ḑ",
"Ľ",
"ك",
"g"
]
}
]
> db.cities.count()
54150
localhost:27015
[liujj@localhost mongodb]$ ./bin/mongo localhost:27015
MongoDB shell version: 3.2.4
connecting to: localhost:27015/test
> db.cities.group({
... initial: { names: {} },
... reduce: function(city, output) {
... output.names[city.name.substr(0,1)] = 1;
... },
... finalize: function (out) {
... var ary = ;
... for(var p in out.names) { ary.push(p); }
... out.names = ary;
... }
... })
[
{
"names" : [
"‘",
"城",
"东",
"’",
"A",
"B",
"E",
"C",
"D",
"연",
"옥",
"진",
"'",
"F",
"H",
"G",
"K",
"J",
"I",
"L"
]
}
]
> db.cities.count()
45688
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
可以看出数据差不多平均分布在两个服务器上,而且开头的字母都不相同。