共计 19335 个字符,预计需要花费 49 分钟才能阅读完成。
@[toc]
一、MongoDB 的外围概念
-
概念
MongoDB 是文档数据库,存储都是相似 json 的 Bosn 文件。
json 与 Bosn 区别- 相同点
格局一摸一样。 - 不同点
json 无奈定义数据类型。Bosn 能够定义具体的数据类型。
- 相同点
- MongoDB 与传统数据库的比照
| SQL 术语 / 概念 | MongoDB 术语 / 概念 | 解释阐明 |
| — | — | — |
| database |database | 数据库 |
|table|collection| 数据库表 \ 汇合 |
|row|document| 行 \ 文档 |
|colum|field| 数据字段 \ 域 |
|index|index| 索引 |
|table joins|| 表连贯 \MongoDB 没有表连贯 |
|primary key|primary key| 主键 \MongoDB 主动将_id 字段设置主键 |
二、MongoDB 的利用场景
- 场景
次要利用在微服务零碎中。 -
微服务 + 数据库的形式
如图:![在这里插入图片形容](https://img-blog.csdnimg.cn/cc5c471d6e80465fa78044ebb33e4fee.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQEDnpZ7lhpzlhpnku6PnoIE=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
- 缺点
如果客户端同时取得商品信息和订单信息,会同时收回两次微服务查问能力获取到数据。
1、如果其中的一个微服务宕机,无奈查问数据
2、如果客户端查问数据的并大量比拟大,这样会导致系统呈现性能问题。 - 计划
应用 MongoDB;如图:
三、MongoDB 的我的项目落地
-
条件
- Demo 微服务项目
- MongoDB
链接:https://pan.baidu.com/s/15WGk…
提取码:gevi - MongoDB Compass
链接:https://pan.baidu.com/s/14PQm…
提取码:cul2
-
步骤
- 装置 MongoDB
- 装置 MongoDB
-
运行 Mongodb
D:\SoftWare\MogoDB\bin>mongod.exe --config "D:\SoftWare\MogoDB\bin\mongod.cfg"
运行后果如图:
- MongoDB Compass 免装置
间接到根目录下,运行 MongoDBCompass.exe 即可。
点击 Connect,如图: -
装置 Nuget 包
MongoDB.Driver
-
我的项目实现
-
新建 Person 类和 IPersonServer 接口类
PersonServer 实现类using MongoDB.Driver; namespace MongoDB.Demo.Server { public class PersonServer : IPersonServer { private readonly IMongoCollection<Person> mongoCollection; public PersonServer() {var client = new MongoClient("mongodb://localhost:27017"); mongoCollection = client.GetDatabase("PersonDB").GetCollection<Person>("person"); } /// <summary> /// 增加数据 /// </summary> /// <param name="per"></param> public void Create(Person per) {mongoCollection.InsertOne(per); } } }
IPersonServer 接口类
namespace MongoDB.Demo.Server { public interface IPersonServer {void Create(Person per); } }
-
新建实例类 Person
using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; using System; namespace MongoDB.Demo { public class Person { // 设置自增长 ID [BsonId] [BsonRepresentation(BsonType.ObjectId)] public string Id {get; set;} public string Name {get; set;} public string Sex {get; set;} public int Age {get; set;} public string CreateById {get; set;} public DateTime CreateByTime {get;set;} } }
-
在我的项目 Startup 类中注册
public void ConfigureServices(IServiceCollection services) {services.AddControllers(); services.AddSwaggerGen(c => {c.SwaggerDoc("v1", new OpenApiInfo { Title = "MongoDB.Demo", Version = "v1"}); }); services.AddTransient<IPersonServer, PersonServer>();}
-
控制器中调用
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using MongoDB.Demo.Server; namespace MongoDB.Demo.Controllers {[Route("api/[controller]")] [ApiController] public class HomeController : ControllerBase { private readonly IPersonServer personServer; public HomeController(IPersonServer _personServer) {personServer = _personServer;} /// <summary> /// 增加数据到 MongoDB /// </summary> /// <param name="per"></param> /// <returns></returns> [HttpPost] public IActionResult Post(Person per) {personServer.Create(per); return Ok(per); } } }
-
四、MongoDB 的运行原理
- 原理
所有的模块之间是分档次的,MongoDB 官网共有五大类型模块:外围模块、配置模块、事件模块、HTTP 模块、mail 模块、stream 模块,它们之间的关系如图:
在这 5 个模块中,配置模块和外围模块是与 MongoDB 框架密切相关的。而事件模块则是 HTTP 模块与 mail 模块的根底。HTTP 模块和 mail 模块的“位置”相似,它们都是更关注利用层面。
-
WiredTiger 架构设计
-
原理
当 MongoDB 接收数据并转换成 Bosn 文件后发动申请到 WiredTiger 引擎,WiredTiger 接管申请并解决申请将数据存储到缓存中,在将缓存中的数据隔 60s 或者数据达到 2G 的时候同步到磁盘中。
次要是做了两件事件:
1、将数据保留到缓存中为什么将数据保留到缓存中?缩小 IO 操作,晋升性能。
2、将缓存同步到磁盘中
为什么隔 60s 或者 2G 的时候同步数据?当并发量大时候,避免缓存解决数据的性能大于磁盘的时候,导致同步是数据呈现失落。
-
-
WiredTiger 避免数据失落原理
应用双写架构
如图:新增一个缓冲区。相当于音讯队列的角色。
当上游和上游性能不统一的时候能够应用缓冲区。【RabbitMQ,kafka 等】 -
WiredTiger 的索引构造
如图:
MongoDB 中缓存和磁盘存储数据是通过 B +tree 的数据结构存储的,Root 节点和 Internal 是存储索引数据【相当于一本书中的目录】,而 leaf 节点是用来存储数据的【相当于书中的页】。
五、MongoDB 的 CURD 操作
-
前提
using MongoDB.Driver; namespace MongoDB.Demo.Server { public class PersonServer : IPersonServer { private readonly IMongoCollection<Person> mongoCollection; public PersonServer() {var client = new MongoClient("mongodb://localhost:27017"); mongoCollection = client.GetDatabase("PersonDB").GetCollection<Person>("person"); } } }
-
增加数据
/// <summary> /// 增加数据 /// </summary> /// <param name="per"></param> public void Create(Person per) {mongoCollection.InsertOne(per); }
-
查问数据
/// <summary> /// 获取汇合数据 /// </summary> /// <returns></returns> public IEnumerable<Person> GetList() {return mongoCollection.Find(p => true).ToList();}
-
分页查问
/// <summary> /// 分页查问 /// </summary> /// <param name="pagesize"> 行数 </param> /// <param name="index"> 页数 </param> /// <returns></returns> public IEnumerable<Person> GetDataByPage(int pagesize,int index) {return mongoCollection.Find(p => true).Skip((index - 1) * pagesize).Limit(pagesize).ToList();}
-
排序
/// <summary> /// 获取汇合数据并排序 /// </summary> /// <returns></returns> public IEnumerable<Person> GetList() {return mongoCollection.Find(p => true).SortBy(per => per.CreateByTime).ToList();}
-
批改数据
/// <summary> /// 批改数据并增加新字段 /// </summary> /// <param name="id"></param> /// <param name="per"></param> public void Update(string id, Person per) { var update = Builders<Person>.Update; // update.AddToSet("modifybyid","admin");// 新增字段 实体中必须有这个字段 否则查问的时候会报错 //mongoCollection.UpdateOne((p) => p.Id == id, update.AddToSet("modifybyid", "admin")); // 批改字段 mongoCollection.UpdateOne((p) => p.Id == id, update.Set("Name", per.Name)); }
-
删除数据
/// <summary> /// 删除数据 /// </summary> /// <param name="id"></param> public void delete(string id) {mongoCollection.DeleteOne((p) => p.Id == id); }
-
创立索引
/// <summary> /// 创立索引 /// </summary> /// <returns></returns> public string CreateIndex() { var indexKeys = Builders<Person>.IndexKeys; return _products.Indexes.CreateOne(indexKeys.Descending("字段名称")); }
六、MongoDB 的复制集
- 概念
MongoDB 的复制集就是一份数据复制多份而已。如图:
- 作用
当一个 MongoDB 宕机后,还有其余的 MongoDB 实例能够提供应用。保障 MongoDB 的高可用。 -
MongoDB 主从节点架构图
- 主节点:primary
负责数据的读和写。 -
从节点:secondary 倡议至多有 3 个节点
- 当主节点宕机后,客户端能够从从节点中读取数据,保障 MongoDB 的高可用。
- 实现数据的读写拆散。
- 主节点:primary
-
实现
-
条件
- MongoDB 3 个节点
- MongoDB 的 Demo 我的项目
-
MongoDB 配置步骤
-
新建三个节点配置文件,新建节点数据文件存储文件夹和日志文件夹
-
27018 配置文件将 replication 关上, 并定义集群名称
# mongod.conf # for documentation of all options, see: # http://docs.mongodb.org/manual/reference/configuration-options/ # Where and how to store data. storage: dbPath: D:\SoftWare\MogoDB\ReplicaSet-data\data-27018 journal: enabled: true # engine: # wiredTiger: # where to write logging data. systemLog: destination: file logAppend: true path: D:\SoftWare\MogoDB\ReplicaSet-log\mongodb-27018.log # network interfaces net: port: 27018 bindIp: 127.0.0.1 #processManagement: #security: #operationProfiling: replication: replSetName: rs0 #sharding: ## Enterprise-Only Options: #auditLog: #snmp:
-
27019 配置文件将 replication 关上, 并定义集群名称
# mongod.conf # for documentation of all options, see: # http://docs.mongodb.org/manual/reference/configuration-options/ # Where and how to store data. storage: dbPath: D:\SoftWare\MogoDB\ReplicaSet-data\data-27019 journal: enabled: true # engine: # wiredTiger: # where to write logging data. systemLog: destination: file logAppend: true path: D:\SoftWare\MogoDB\ReplicaSet-log\mongodb-27019.log # network interfaces net: port: 27019 bindIp: 127.0.0.1 #processManagement: #security: #operationProfiling: replication: replSetName: rs0 #sharding: ## Enterprise-Only Options: #auditLog: #snmp:
-
27020 配置文件将 replication 关上, 并定义集群名称
# mongod.conf # for documentation of all options, see: # http://docs.mongodb.org/manual/reference/configuration-options/ # Where and how to store data. storage: dbPath: D:\SoftWare\MogoDB\ReplicaSet-data\data-27020 journal: enabled: true # engine: # wiredTiger: # where to write logging data. systemLog: destination: file logAppend: true path: D:\SoftWare\MogoDB\ReplicaSet-log\mongodb-27020.log # network interfaces net: port: 27020 bindIp: 127.0.0.1 #processManagement: #security: #operationProfiling: replication: replSetName: rs0 #sharding: ## Enterprise-Only Options: #auditLog: #snmp:
-
-
运行实例(3)
mongod.exe -f D:\SoftWare\MogoDB\bin\ReplicaSet\mongod-27018.cfg mongod.exe -f D:\SoftWare\MogoDB\bin\ReplicaSet\mongod-27019.cfg mongod.exe -f D:\SoftWare\MogoDB\bin\ReplicaSet\mongod-27020.cfg 运行后果如图:![在这里插入图片形容](https://img-blog.csdnimg.cn/dd00e1a161df4f8ca0a51a21efe51a5c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQEDnpZ7lhpzlhpnku6PnoIE=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center) ![在这里插入图片形容](https://img-blog.csdnimg.cn/92362ee9d93d45d497ef0be88f8b0490.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQEDnpZ7lhpzlhpnku6PnoIE=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
-
设置 27018 建设连贯并设置为主节点,并增加从节点
#建设连贯 在 bin 目录下 mongo.exe --host 127.0.0.1 --port 27018 #应用命令设置主节点 rs.initiate()
如图:
增加其余节点到 Member 中rs.add("127.0.0.1:27019") rs.add("127.0.0.1:27020")
如图:
-
查看状态命令
rs.status()
日志文件:
"members" : [ { "_id" : 0, "name" : "127.0.0.1:27018", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 308, "optime" : {"ts" : Timestamp(1649306184, 3), "t" : NumberLong(1) }, "optimeDate" : ISODate("2022-04-07T04:36:24Z"), "lastAppliedWallTime" : ISODate("2022-04-07T04:36:24.437Z"), "lastDurableWallTime" : ISODate("2022-04-07T04:36:24.437Z"), "syncSourceHost" : "","syncSourceId": -1,"infoMessage":"", "electionTime" : Timestamp(1649306012, 2), "electionDate" : ISODate("2022-04-07T04:33:32Z"), "configVersion" : 5, "configTerm" : 1, "self" : true, "lastHeartbeatMessage" : "" }, { "_id" : 1, "name" : "127.0.0.1:27019", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 137, "optime" : {"ts" : Timestamp(1649306184, 3), "t" : NumberLong(1) }, "optimeDurable" : {"ts" : Timestamp(1649306184, 3), "t" : NumberLong(1) }, "optimeDate" : ISODate("2022-04-07T04:36:24Z"), "optimeDurableDate" : ISODate("2022-04-07T04:36:24Z"), "lastAppliedWallTime" : ISODate("2022-04-07T04:36:24.437Z"), "lastDurableWallTime" : ISODate("2022-04-07T04:36:24.437Z"), "lastHeartbeat" : ISODate("2022-04-07T04:36:30.077Z"), "lastHeartbeatRecv" : ISODate("2022-04-07T04:36:29.665Z"), "pingMs" : NumberLong(0), "lastHeartbeatMessage" : "","syncSourceHost":"127.0.0.1:27018","syncSourceId": 0,"infoMessage":"", "configVersion" : 5, "configTerm" : 1 }, { "_id" : 2, "name" : "127.0.0.1:27020", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 129, "optime" : {"ts" : Timestamp(1649306184, 3), "t" : NumberLong(1) }, "optimeDurable" : {"ts" : Timestamp(1649306184, 3), "t" : NumberLong(1) }, "optimeDate" : ISODate("2022-04-07T04:36:24Z"), "optimeDurableDate" : ISODate("2022-04-07T04:36:24Z"), "lastAppliedWallTime" : ISODate("2022-04-07T04:36:24.437Z"), "lastDurableWallTime" : ISODate("2022-04-07T04:36:24.437Z"), "lastHeartbeat" : ISODate("2022-04-07T04:36:30.077Z"), "lastHeartbeatRecv" : ISODate("2022-04-07T04:36:30.169Z"), "pingMs" : NumberLong(0), "lastHeartbeatMessage" : "","syncSourceHost":"127.0.0.1:27019","syncSourceId": 1,"infoMessage":"", "configVersion" : 5, "configTerm" : 1 }
-
-
我的项目连贯 MongoDB 集群
- 建设连贯代码
// 只能从主节点中读取数据 var client = new MongoClient("mongodb://localhost:27018,localhost:27019,localhost:27020"); // 能够从从节点读取数据 var client = new MongoClient("mongodb://localhost:27018,localhost:27019,localhost:27020/?readPreference=secondaryPreferred"); // 或者 var client = new MongoClient("mongodb://localhost:27018,localhost:27019,localhost:27020"); client.WithReadPreference(ReadPreference.PrimaryPreferred); //Primary:默认参数 只从主节点上读取数据 // PrimaryPreferred: 大部分从主节点上读取数据,只有主节点不可用时从 Secondary 上读取数据 //Secondary:只从 Secondary 节点上读取数据操作,存在的问题是 Secondary 节点的数据会比 Primary 节点的数据旧,如果没有可用的从节点,读申请会抛出异样。//SecondaryPreferred:优先从 Secondary 节点上读取数据,Secondary 节点不可用时从主节点读取数据。
-
-
主节点宕机后从节点如何变成主节点
-
条件
- Heartbeat
- Vote(投票)
如图:
当主主节点宕机后,从节点会给本人先投一票,而后再去其余节点拉票,谁的票数多,谁就是主节点。
如果从节点的票数一样多,外部会有一个心跳检测机制,再次进行选举、投票。
投票规定:票数超过半数能力成为主节点;【节点数量为奇数最佳】- 节点数为奇数的长处
晋升集群的高可用性 -
选举的准则
1、奇数节点
2、票数过半七、MongoDB 的分片集群
-
-
概念
MongoDB 外部拆分数据,离开存储。
如图:外围角色:
- 分片角色 shard
- 路由角色 Routers
- 配置角色 config 相当于微服务中注册核心
-
落地
-
条件
- MongoDB(总共 10 个实例)
- Demo 我的项目
-
步骤
-
搭建分片复制集(6 个实例)
- mongod-27021.cfg 配置文件
-
# mongod.conf # for documentation of all options, see: # http://docs.mongodb.org/manual/reference/configuration-options/ # Where and how to store data. storage: dbPath: D:\SoftWare\MogoDB\shards-data\shard-27021 journal: enabled: true # engine: # wiredTiger: # where to write logging data. systemLog: destination: file logAppend: true path: D:\SoftWare\MogoDB\shards-log\mongodb-27021.log # network interfaces net: port: 27021 bindIp: 127.0.0.1
-
#processManagement:
#security:
#operationProfiling:
replication:
replSetName: sharding1
sharding:
#分片集群名称 以后实例的角色(configsvr:配置核心实例,shardsvr:分片实例)clusterRole: shardsvr
## Enterprise-Only Options:
#auditLog:
#snmp:
```
- mongod-27022.cfg 配置文件
```
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# Where and how to store data.
storage:
dbPath: D:\SoftWare\MogoDB\shards-data\shard-27022
journal:
enabled: true
# engine:
# wiredTiger:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: D:\SoftWare\MogoDB\shards-log\mongodb-27022.log
# network interfaces
net:
port: 27022
bindIp: 127.0.0.1
#processManagement:
#security:
#operationProfiling:
replication:
replSetName: sharding1
sharding:
#分片集群名称 以后实例的角色(configsvr:配置核心实例,shardsvr:分片实例)clusterRole: shardsvr
#sharding:
## Enterprise-Only Options:
#auditLog:
#snmp:
```
- mongod-27023.cfg 配置文件
```
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# Where and how to store data.
storage:
dbPath: D:\SoftWare\MogoDB\shards-data\shard-27023
journal:
enabled: true
# engine:
# wiredTiger:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: D:\SoftWare\MogoDB\shards-log\mongodb-27023.log
# network interfaces
net:
port: 27023
bindIp: 127.0.0.1
#processManagement:
#security:
#operationProfiling:
replication:
replSetName: sharding1
sharding:
#分片集群名称 以后实例的角色(configsvr:配置核心实例,shardsvr:分片实例)clusterRole: shardsvr
## Enterprise-Only Options:
#auditLog:
#snmp:
```
- 备注
三个配置文件的 replSetName: sharding1 名称必须是统一的,代表着一组分片复制集。十个配置文件的 clusterRole:shardsvr 名称必须是统一的,代表着是一组集群。- 启动服务,并调配主从节点
```
#在 MongoDB 的 bin 目录下执行
#启动服务
mongod.exe -f D:\SoftWare\MogoDB\bin\shards\mongod-27021.cfg
mongod.exe -f D:\SoftWare\MogoDB\bin\shards\mongod-27022.cfg
mongod.exe -f D:\SoftWare\MogoDB\bin\shards\mongod-27023.cfg
#连贯 27021,弄调配主从节点
mongo.exe --host 127.0.0.1 --port 27021
#初始化 27021 为主节点
rs.initiate()
#增加子节点
rs.add("127.0.0.1:27022")
rs.add("127.0.0.1:27023")
#查看节点状态
rs.status()
```
- mongod-27024.cfg 配置文件
```
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# Where and how to store data.
storage:
dbPath: D:\SoftWare\MogoDB\shards-data\shard-27024
journal:
enabled: true
# engine:
# wiredTiger:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: D:\SoftWare\MogoDB\shards-log\mongodb-27024.log
# network interfaces
net:
port: 27024
bindIp: 127.0.0.1
#processManagement:
#security:
#operationProfiling:
replication:
replSetName: sharding2
sharding:
#分片集群名称 以后实例的角色(configsvr:配置核心实例,shardsvr:分片实例)clusterRole: shardsvr
## Enterprise-Only Options:
#auditLog:
#snmp:
```
- mongod-27025.cfg 配置文件
```
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# Where and how to store data.
storage:
dbPath: D:\SoftWare\MogoDB\shards-data\shard-27025
journal:
enabled: true
# engine:
# wiredTiger:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: D:\SoftWare\MogoDB\shards-log\mongodb-27025.log
# network interfaces
net:
port: 27025
bindIp: 127.0.0.1
#processManagement:
#security:
#operationProfiling:
replication:
replSetName: sharding2
sharding:
#分片集群名称 以后实例的角色(configsvr:配置核心实例,shardsvr:分片实例)clusterRole: shardsvr
## Enterprise-Only Options:
#auditLog:
#snmp:
```
- mongod-27026.cfg 配置文件
```
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# Where and how to store data.
storage:
dbPath: D:\SoftWare\MogoDB\shards-data\shard-27026
journal:
enabled: true
# engine:
# wiredTiger:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: D:\SoftWare\MogoDB\shards-log\mongodb-27026.log
# network interfaces
net:
port: 27026
bindIp: 127.0.0.1
#processManagement:
#security:
#operationProfiling:
replication:
replSetName: sharding2
sharding:
#分片集群名称 以后实例的角色(configsvr:配置核心实例,shardsvr:分片实例)clusterRole: shardsvr
## Enterprise-Only Options:
#auditLog:
#snmp:
```
- 备注
三个配置文件的 replSetName: sharding2 名称必须是统一的,代表着一组分片复制集。十个配置文件的 clusterRole:shardsvr 名称必须是统一的,代表着是一组集群。- 启动服务,并调配主从节点
```
#在 MongoDB 的 bin 目录下执行
#启动服务
mongod.exe -f D:\SoftWare\MogoDB\bin\shards\mongod-27024.cfg
mongod.exe -f D:\SoftWare\MogoDB\bin\shards\mongod-27025.cfg
mongod.exe -f D:\SoftWare\MogoDB\bin\shards\mongod-27026.cfg
#连贯 27024,弄调配主从节点
mongo.exe --host 127.0.0.1 --port 27024
#初始化 27024 为主节点
rs.initiate()
#增加子节点
rs.add("127.0.0.1:27025")
rs.add("127.0.0.1:27026")
#查看节点状态
rs.status()
```
- 搭建配置核心
- mongod-27010.cfg 配置文件
```
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# Where and how to store data.
storage:
dbPath: D:\SoftWare\MogoDB\shards-data\ConfigServer\configserver-27010
journal:
enabled: true
# engine:
# wiredTiger:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: D:\SoftWare\MogoDB\shards-log\ConfigServer\configserver-27010.log
# network interfaces
net:
port: 27010
bindIp: 127.0.0.1
#processManagement:
#security:
#operationProfiling:
replication:
#集群名称,如果不是同一个集群内的机器,请不要配置反复
replSetName: confset
sharding:
#分片集群名称 以后实例的角色(configsvr:配置核心实例,shardsvr:分片实例)clusterRole: shardsvr
## Enterprise-Only Options:
#auditLog:
#snmp:
```
- mongod-27011.cfg 配置文件
```
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# Where and how to store data.
storage:
dbPath: D:\SoftWare\MogoDB\shards-data\ConfigServer\configserver-27011
journal:
enabled: true
# engine:
# wiredTiger:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: D:\SoftWare\MogoDB\shards-log\ConfigServer\configserver-27011.log
# network interfaces
net:
port: 27011
bindIp: 127.0.0.1
#processManagement:
#security:
#operationProfiling:
replication:
#集群名称,如果不是同一个集群内的机器,请不要配置反复
replSetName: confset
sharding:
#分片集群名称 以后实例的角色(configsvr:配置核心实例,shardsvr:分片实例)clusterRole: shardsvr
## Enterprise-Only Options:
#auditLog:
#snmp:
```
- mongod-27012.cfg 配置文件
```
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# Where and how to store data.
storage:
dbPath: D:\SoftWare\MogoDB\shards-data\ConfigServer\configserver-27012
journal:
enabled: true
# engine:
# wiredTiger:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: D:\SoftWare\MogoDB\shards-log\ConfigServer\configserver-27012.log
# network interfaces
net:
port: 27012
bindIp: 127.0.0.1
#processManagement:
#security:
#operationProfiling:
replication:
#集群名称,如果不是同一个集群内的机器,请不要配置反复
replSetName: confset
sharding:
#分片集群名称 以后实例的角色(configsvr:配置核心实例,shardsvr:分片实例)clusterRole: shardsvr
## Enterprise-Only Options:
#auditLog:
#snmp:
```
- 备注
三个配置文件的 replSetName: confset 名称必须是统一的,代表着一组配置核心集群。十个配置文件的 clusterRole:shardsvr 名称必须是统一的,代表着是一组分片集群。- 启动服务,并调配组主从节点
```
#在 MongoDB 的 bin 目录下执行
#启动服务
mongod.exe -f D:\SoftWare\MogoDB\bin\shards\mongod-27010.cfg
mongod.exe -f D:\SoftWare\MogoDB\bin\shards\mongod-27011.cfg
mongod.exe -f D:\SoftWare\MogoDB\bin\shards\mongod-27012.cfg
#连贯 27010,弄调配主从节点
mongo.exe --host 127.0.0.1 --port 27010
#初始化 27021 为主节点
rs.initiate()
#增加子节点
rs.add("127.0.0.1:27011")
rs.add("127.0.0.1:27012")
#查看节点状态
rs.status()
```
- 搭建路由(1 个实例)- mongod-27000.cfg
```
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# Where and how to store data.
#storage:
#dbPath: D:\SoftWare\MogoDB\ReplicaSet-data\data-27021
#journal:
#enabled: true
# engine:
# wiredTiger:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: D:\SoftWare\MogoDB\shards-log\Router\Router-27000.log
# network interfaces
net:
port: 27000
bindIp: 127.0.0.1
#processManagement:
#security:
#operationProfiling:
#replication:
#replSetName: rs0
sharding:
configDB: confset/127.0.0.1:27011,127.0.0.1:27010,127.0.0.1:27012
## Enterprise-Only Options:
#auditLog:
#snmp:
```
- 备注
- 启动服务 / 连贯服务,并注册
```
#在 bin 目录下启动服务
mongos.exe -f D:\SoftWare\MogoDB\bin\shards\Router\mongod-27000.cfg
#建设连贯
mongo.exe --host 127.0.0.1 --port 27000
#注册复制集【6 个实例 127.0.0.1:27021\27022\27023\27024\27025\27026】到配置服务中
#用复制集名称批量注册 配置文件中的 replSetName: sharding1
sh.addShard("sharding1/127.0.0.1:27021,127.0.0.1:27022,127.0.0.1:27023")
#查看状态
sh.status()
sh.addShard("sharding2/127.0.0.1:27024,127.0.0.1:27025,127.0.0.1:27026")
#查看状态
sh.status()
```
- Demo 我的项目连贯 MongoDB 集群
```C#
#多个路由 外部自带了负载平衡
var client = new MongoClient("mongodb://127.0.0.1:27000,,,,,,");
```
- 数据分片规定
依据分片键来均分数据。- 分片规定
- 范畴分片
- HASH 分片
应用路由来设置分片键。```
#启动路由服务,建设连贯后,应用命令
#语法
sh.shardCollection("数据库名称. 汇合名称",{"分片键":"分片类型【hashed,默认是范畴分片】"})
#如果回车这样执行会报错,设置分片规定是不容许用代码创立数据库,须要在路由里创立数据库才行,命令如下
sh.enableSharding("数据库名称")
sh.shardCollection("数据库名称. 汇合名称",{"分片键":"分片类型【hashed/(1 或者 -1),默认是范畴分片(1 为升序 - 1 为降序)】"})
#一个汇合只能由一个分片键
```