高可用mongodb集群的学习记录(四mongodb分片集群搭建)

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介:

无论oracle还是mysql数据库都有分区的概念,即同一张表物理上不在同一台机器上,有效缓解了表都集中存在一台机器的压力。当然,mongodb也有类似的机制,即是分片。具体理论知识大家可以参考网上文档,我这里只记录下具体操作步骤

dc166a30dd685af75d234808f3f9cdf6.png

参考网络上一个图。我选用的是2个副本集+1个仲裁。实际上我这里分片集群需要3mongos3config server,数据分片3shard server,对应着还有3个副本,3个仲裁节点,总共需要15个实例。因为我资源确实紧张,又不想影响实验效果。冥思苦想了一阵,索性在一台机器上实现得了,分给不同的实例以不同的端口就好了。

闲话少说,开始搞起!!!

1. 资源划分(感觉这是最纠结的一步)

1543bdd4f7373a4801f4961af2d317dc.png 

2. mongdb的安装

这个可以参考博主的前一篇章进行安装高可用mongodb集群的学习记录(一安装配置MongoDB)

3.创建所需要的目录

1
2
3
4
5
6
#创建所需要的目录
[root@DB mongodb] # mkdir -p mongos{1..3}/log
[root@DB mongodb] # mkdir -p config{1..3}/log
[root@DB mongodb] # mkdir -p config{1..3}/data
[root@DB mongodb] # mkdir -p shard{1..3}_{1..3}/log
[root@DB mongodb] # mkdir -p shard{1..3}_{1..3}/data


4. 启动每一个配置服务器

1
2
3
4
#启动配置服务器
mongod --configsvr --dbpath config1 /data  --port 21001 --logpath config1 /log/config .log --fork
mongod --configsvr --dbpath config2 /data  --port 21002 --logpath config2 /log/config .log --fork
mongod --configsvr --dbpath config3 /data  --port 21003 --logpath config3 /log/config .log --fork


5.启动mongos服务器

1
2
3
mongos --configdb 192.168.221.160:21001,192.168.221.160:21002,192.168.221.160:21003 --port 20001 --logpath mongos1 /log/mongos .log --fork
mongos --configdb 192.168.221.160:21001,192.168.221.160:21002,192.168.221.160:21003 --port 20002 --logpath mongos2 /log/mongos .log --fork
mongos --configdb 192.168.221.160:21001,192.168.221.160:21002,192.168.221.160:21003 --port 20003 --logpath mongos3 /log/mongos .log --fork


6.启动分片的副本集

 

1
2
3
4
5
6
7
8
9
   mongod --shardsvr --replSet shard1 --port 21101 --dbpath shard1_1 /data  --logpath shard1_1 /log/shard .log --fork --nojournal --oplogSize 10 
   mongod --shardsvr --replSet shard1 --port 21201 --dbpath shard1_2 /data  --logpath shard1_2 /log/shard .log --fork --nojournal --oplogSize 10 
   mongod --shardsvr --replSet shard1 --port 21301 --dbpath shard1_3 /data  --logpath shard1_3 /log/shard .log --fork --nojournal --oplogSize 10 
   mongod --shardsvr --replSet shard2 --port 21102 --dbpath shard2_1 /data  --logpath shard2_1 /log/shard .log --fork --nojournal --oplogSize 10 
   mongod --shardsvr --replSet shard2 --port 21202 --dbpath shard2_2 /data  --logpath shard2_2 /log/shard .log --fork --nojournal --oplogSize 10 
   mongod --shardsvr --replSet shard2 --port 21302 --dbpath shard2_3 /data  --logpath shard2_3 /log/shard .log --fork --nojournal --oplogSize 10 
   mongod --shardsvr --replSet shard3 --port 21103 --dbpath shard3_1 /data  --logpath shard3_1 /log/shard .log --fork --nojournal --oplogSize 10 
   mongod --shardsvr --replSet shard3 --port 21203 --dbpath shard3_2 /data  --logpath shard3_2 /log/shard .log --fork --nojournal --oplogSize 10 
   mongod --shardsvr --replSet shard3 --port 21303 --dbpath shard3_3 /data  --logpath shard3_3 /log/shard .log --fork --nojournal --oplogSize 10


7.分别对每个分片配置副本集,任意登录一个节点

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
#设置第一个分片副本集
[root@DB ~] # mongo 192.168.221.160:21101
MongoDB shell version: 3.0.6
connecting to: 192.168.221.160:21101 /test
> use admin
switched to db admin
#定义副本集配置信息
> config = {_id: "shard1" ,members:[{_id:0,host: "192.168.221.160:21101" },{_id:1,host: "192.168.221.160:21201" },{_id:2,host: "192.168.221.160:21301" ,arbiterOnly: true }]}
{
"_id"  "shard1" ,
"members"  : [
{
"_id"  : 0,
"host"  "192.168.221.160:21101"
},
{
"_id"  : 1,
"host"  "192.168.221.160:21201"
},
{
"_id"  : 2,
"host"  "192.168.221.160:21301" ,
"arbiterOnly"  true
}
]
}
#初始化副本集信息
> rs.initiate(config)
"ok"  : 1 }
shard1:OTHER> 
  
#设置第二个分片副本集
[root@DB ~] # mongo 192.168.221.160:21102
MongoDB shell version: 3.0.6
connecting to: 192.168.221.160:21102 /test
> use admin
switched to db admin
> config = {_id: "shard2" ,members:[{_id:0,host: "192.168.221.160:21102" },{_id:1,host: "192.168.221.160:21202" },{_id:2,host: "192.168.221.160:21302" ,arbiterOnly: true }]}
{
"_id"  "shard2" ,
"members"  : [
{
"_id"  : 0,
"host"  "192.168.221.160:21102"
},
{
"_id"  : 1,
"host"  "192.168.221.160:21202"
},
{
"_id"  : 2,
"host"  "192.168.221.160:21302" ,
"arbiterOnly"  true
}
]
}
> rs.initiate(config)
"ok"  : 1 }
shard2:OTHER> 
#设置第三个分片副本集
[root@DB ~] # mongo 192.168.221.160:21103
MongoDB shell version: 3.0.6
connecting to: 192.168.221.160:21103 /test
> use admin
switched to db admin
> config = {_id: "shard3" ,members:[{_id:0,host: "192.168.221.160:21103" },{_id:1,host: "192.168.221.160:21203" },{_id:2,host: "192.168.221.160:21303" ,arbiterOnly: true }]}
{
"_id"  "shard3" ,
"members"  : [
{
"_id"  : 0,
"host"  "192.168.221.160:21103"
},
{
"_id"  : 1,
"host"  "192.168.221.160:21203"
},
{
"_id"  : 2,
"host"  "192.168.221.160:21303" ,
"arbiterOnly"  true
}
]
}
> rs.initiate(config)
"ok"  : 1 }
shard3:OTHER>


8.登录到每一个mongos,设置分片配置,让分片生效

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
#串联路由服务器与分片副本集1
[root@DB ~] # mongo 192.168.221.160:20001
MongoDB shell version: 3.0.6
connecting to: 192.168.221.160:20001 /test
Server has startup warnings: 
2017-11-15T13:51:20.732+0800 I CONTROL  ** WARNING: You are running this process as the root user,  which  is not recommended.
2017-11-15T13:51:20.733+0800 I CONTROL  
mongos> use admin
switched to db admin
mongos> db.runCommand({addshard: "shard1/192.168.221.160:21101,192.168.221.160:21201,192.168.221.160:21301" })
"shardAdded"  "shard1" "ok"  : 1 }
mongos> 
#串联路由服务器与分片副本集2
[root@DB ~] # mongo 192.168.221.160:20002
MongoDB shell version: 3.0.6
connecting to: 192.168.221.160:20002 /test
Server has startup warnings: 
2017-11-15T13:51:43.660+0800 I CONTROL  ** WARNING: You are running this process as the root user,  which  is not recommended.
2017-11-15T13:51:43.661+0800 I CONTROL  
mongos> use admin
switched to db admin
mongos> db.runCommand({addshard: "shard2/192.168.221.160:21102,192.168.221.160:21202,192.168.221.160:21302" })
"shardAdded"  "shard2" "ok"  : 1 }
mongos> 
  
#串联路由服务器与分片副本集3
[root@DB ~] # mongo 192.168.221.160:20003
MongoDB shell version: 3.0.6
connecting to: 192.168.221.160:20003 /test
Server has startup warnings: 
2017-11-15T13:51:59.589+0800 I CONTROL  ** WARNING: You are running this process as the root user,  which  is not recommended.
2017-11-15T13:51:59.589+0800 I CONTROL  
mongos> use admin
switched to db admin
mongos> db.runCommand({addshard: "shard3/192.168.221.160:21103,192.168.221.160:21203,192.168.221.160:21303" })
"shardAdded"  "shard3" "ok"  : 1 }
mongos>


9.查看分片服务器的配置信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mongos> db.runCommand({listshards:1})
{
"shards"  : [
{
"_id"  "shard1" ,
"host"  "shard1/192.168.221.160:21101,192.168.221.160:21201"
},
{
"_id"  "shard2" ,
"host"  "shard2/192.168.221.160:21102,192.168.221.160:21202"
},
{
"_id"  "shard3" ,
"host"  "shard3/192.168.221.160:21103,192.168.221.160:21203"
}
],
"ok"  : 1
}
mongos>


    仲裁节点不储存数据,没有在这里显示出来

10.连接mongos上,指定数据库、指定集合让分片生效

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@DB ~] # mongo 192.168.221.160:20001
MongoDB shell version: 3.0.6
connecting to: 192.168.221.160:20001 /test
mongos> db.runCommand({enablesharding: "testdb" })
{
"ok"  : 0,
"errmsg"  "enableSharding may only be run against the admin database." ,
"code"  : 13
}
mongos> use admin
switched to db admin
mongos> db.runCommand({enablesharding: "testdb" })
"ok"  : 1 }
mongos> db.runCommand({shardcollection: "testdb.table1" ,key:{ id :1}})
"collectionsharded"  "testdb.table1" "ok"  : 1 }
mongos>


设置testdb的 table1 表需要分片,根据 id 自动分片到 shard1 shard2shard3 上面去。要这样设置是因为不是所有mongodb 的数据库和表都需要分片

 

11.测试分片片配置效果

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
[root@DB ~] # mongo 192.168.221.160:20001
MongoDB shell version: 3.0.6
connecting to: 192.168.221.160:20001 /test
Server has startup warnings: 
2017-11-15T13:51:20.732+0800 I CONTROL  ** WARNING: You are running this process as the root user,  which  is not recommended.
2017-11-15T13:51:20.733+0800 I CONTROL  
mongos> use testdb;
switched to db testdb
mongos>  for  (var i = 1;i<=10000;i++) db.table1.save({ id :i, "test1" : "item1" })
WriteResult({  "nInserted"  : 1 })
mongos> db.table1.stats()
{
"sharded"  true ,
"paddingFactorNote"  "paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only." ,
"userFlags"  : 1,
"capped"  false ,
"ns"  "testdb.table1" ,
"count"  : 10000,
"numExtents"  : 7,
"size"  : 1120000,
"storageSize"  : 2809856,
"totalIndexSize"  : 654080,
"indexSizes"  : {
"_id_"  : 351568,
"id_1"  : 302512
},
"avgObjSize"  : 112,
"nindexes"  : 2,
"nchunks"  : 3,
"shards"  : {
"shard1"  : {
"ns"  "testdb.table1" ,
"count"  : 9991,
"size"  : 1118992,
...
"ok"  : 1,
"$gleStats"  : {
"lastOpTime"  : Timestamp(0, 0),
"electionId"  : ObjectId( "5a0bd9cf86a6b76e11b5d820" )
}
},
"shard2"  : {
"ns"  "testdb.table1" ,
"count"  : 1,
"size"  : 112,
...
"ok"  : 1,
"$gleStats"  : {
"lastOpTime"  : Timestamp(0, 0),
"electionId"  : ObjectId( "5a0bdadd74c5945a33a4ae46" )
}
},
"shard3"  : {
"ns"  "testdb.table1" ,
"count"  : 8,
"size"  : 896,
...
"ok"  : 1,
"$gleStats"  : {
"lastOpTime"  : Timestamp(0, 0),
"electionId"  : ObjectId( "5a0bdb6f1c75115f41ff92f9" )
}
}
},
"ok"  : 1
}
mongos>


可以看到testdb.table1数据已经被分到三个分片,各自分片数量为 shard1 “count” : 9991shard2 “count” : 1shard3 “count” : 8我也不知道为啥分配的不均匀。纳闷ing

好了,实验到此结束,关于mongodb的学习会继续进行...

 



本文转自 青苗飞扬 51CTO博客,原文链接:http://blog.51cto.com/qingmiao/1982044

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
6月前
|
NoSQL Cloud Native MongoDB
MongoDB 主从集群 2
MongoDB 主从集群 2
|
3天前
|
存储 负载均衡 NoSQL
MongoDB分片技术:实现水平扩展的利器
【4月更文挑战第30天】MongoDB的分片技术是应对数据增长和复杂业务需求的解决方案,它将数据水平拆分存储在多个实例上,实现数据库的水平扩展。分片带来水平扩展性、负载均衡、高可用性和灵活的数据管理。分片工作涉及mongos路由进程、config server和shard实例。设置分片包括部署配置服务器、添加分片、启动mongos、配置分片键和开始分片。选择合适的分片键和有效管理能确保系统性能和稳定性。
|
6月前
|
存储 NoSQL 网络协议
MongoDB 主从集群 1
MongoDB 主从集群 1
|
2月前
|
NoSQL MongoDB
搭建MongoDB分片式集群
搭建MongoDB分片式集群
16 0
|
3月前
|
存储 缓存 NoSQL
MongoDB详解(三)——MongoDB集群
MongoDB详解(三)——MongoDB集群
36 4
|
5月前
|
NoSQL MongoDB Docker
docker搭建mongodb集群
docker搭建mongodb集群
102 0
|
5月前
|
Kubernetes NoSQL MongoDB
k8s教程(pod篇)-使用StatefulSet搭建MongoDB集群
k8s教程(pod篇)-使用StatefulSet搭建MongoDB集群
495 1
|
6月前
|
监控 NoSQL MongoDB
轻松掌握组件启动之MongoDB(番外篇):高可用复制集架构环境搭建-mtools
mtools是一个基于Python实现的MongoDB工具集,旨在提供一系列功能,包括MongoDB日志分析、报表生成以及简易的数据库安装等。它由MongoDB原生的工程师单独发起并进行开源维护。mtools包含了一些常用的组件,如mlaunch、mlogfilter、mplotqueries和mlogvis等,可以帮助我们更方便地启动和创建MongoDB数据库。
|
6月前
|
监控 NoSQL 安全
轻松掌握组件启动之MongoDB(下):高可用复制集架构环境搭建
本章介绍了MongoDB复制集的配置和使用方法,如何初始化和添加节点到复制集,验证主节点的写入和从节点的读取功能。了解如何查询复制集的状态,包括成员的健康状况、同步信息和角色等。最后,我们介绍了如何配置复制集的安全认证,包括创建用户和生成keyFile文件,并演示了使用认证信息连接复制集的方式。通过本章的学习,你将掌握MongoDB复制集的基本使用和配置方法。
|
10天前
|
NoSQL MongoDB 数据库
MongoDB数据恢复—MongoDB数据库文件被破坏的数据恢复案例
服务器数据恢复环境: 一台Windows Server操作系统服务器,服务器上部署MongoDB数据库。 MongoDB数据库故障&检测: 工作人员在未关闭MongoDB数据库服务的情况下,将数据库文件拷贝到其他分区。拷贝完成后将原MongoDB数据库所在分区进行了格式化操作,然后将数据库文件拷回原分区,重新启动MongoDB服务,服务无法启动。