MongoDB 搭建分片集群

摘要:
在MongoDB中,分片是指在不同的服务器上分散存储集合。每个服务器只存储集合的一部分。所有服务于分片的服务器都形成一个分片集群。Mongos将在读取分区元数据后在本地缓存该元数据。从应用程序的角度来看,Mongos扮演着MongoDBInstance的角色,它隐藏了从碎片中查询和组合数据的复杂过程。默认情况下,MongoDB将删除任何现有的日志文件,而不是覆盖它。若要将其附加到该文件,请设置--logappend选项。3、 设置碎片集群1.碎片用于存储数据。它们可以是ReplicaSet或Standalone。因为每个碎片都将部分数据保存在集合中,如果碎片失败,集合将变得不完整。

在MongoDB(版本 3.2.9)中,分片是指将collection分散存储到不同的Server中,每个Server只存储collection的一部分,服务分片的所有服务器组成分片集群。分片集群(Sharded Clustered)的服务器分为三中类型:Router(mongos),Config Server 和 Shard(Replica Set 或 Standalone mongod)。使用分片集群,不需要使用强大的计算机,就能存储更多的数据,处理更大的负载。分布式数据库系统的设计目的是:水平分片,将负载分配到多台Server,减少单机查询的负载。

MongoDB 搭建分片集群第1张

一,配置服务器

config server 存储分片的元数据,元数据包括每个分片的块(chunk)列表和每个chunk包含数据的范围。路由服务区(Router)从config server上获取分片的元数据,使用元数据将读写操作路由到正确的分片上。

The metadata includes the list of chunks on every shard and the ranges that define the chunks. The mongos instances cache this data and use it to route read and write operations to the correct shards.

config server的读写操作是非常少的,config server将分片的元数据存储在config 数据库中,只有当分片的元数据变化时,比如 chunk migration,chunk split,才会修改config server中的数据。只有在mongos 第一次启动或重启时,或者分片的元数据变化时,mongos才会读取config server中的数据。mongos在读取分片的元数据之后,会缓存在本地。

Config servers store the cluster’s metadata in the config database. The mongos instances cache this data and use it to route reads and writes to shards. MongoDB only writes data to the config servers when the metadata changes, such as

  • after a chunk migration, or
  • after a chunk split.

MongoDB reads data from the config server in the following cases:

  • A new mongos starts for the first time, or an existing mongos restarts.
  • After change in the cluster metadata, such as after a chunk migration.

实际上,config server是mongod,只不过设置 --configsvr 选项。

--configsvr 指定mongod作为一个config server

二,mongos 路由服务器

mongos 为MongoDB提供路由服务,处理从application layer发送的查询请求,定位数据所在的分片,对分片上的查询结果进行combine,以完成分布式数据查询。从Application来看,mongos担当的角色是一个MongoDB Instance,隐藏了从分片上query和combine数据的复杂过程。

mongos 的重要参数

--config <filename>, -f <filename> 指定mongos 运行的参数

--configdb 指定config server列表,格式是:config-svr:port,config-svr:port

--chunkSize 指定data block的大小,单位是MB,默认值是64

--port 指定mongos 监听的TCP的端口号,默认值是27017

--logpath 指定mongos 记录日志的路径,默认情况下,MongoDB将现存的日志文件重命名,而不是重写。By default, MongoDB will move any existing log file rather than overwrite it. To instead append to the log file, set the --logappend option.

三,搭建分片集群

1,Shard

分片(Shard)用于存储数据,可以是Replica Set,也可以是Standalone,由于每个Shard都保存collection的一部分数据,如果shard 出现故障,那么collection就会变得不完整。在产品环境中,每一个shard都是一个replica set。

2,config server

config server 保存着每个分片和数据之间的映射,即数据存储在哪个分片上,或者说,每个分片上存储哪些数据,一个doc只能存储在一个分片上。分片的元数据极端重要,必须为config server 启用日志功能,确保元数据保存到disk中。最好使用3台config server,每台config server都应该位于单独的物理机上,最好是分布在不同地理位置的机器。

创建三台config server:cfg-srv1,cfg-svr2,cfg-svr3,其配置文件分别位于:

  • cfg-svr1,C:dataconfigcfgsvr_1.conf
  • cfg-svr2,C:dataconfigcfgsvr_2.conf
  • cfg-svr3,C:dataconfigcfgsvr_3.conf
复制代码
--config server 1
dbpath=C:dataconfig
logpath=C:dataconfigcfgsvr_1.log
journal=true
port=50001
configsvr=true

--config server 2
dbpath=C:dataconfig
logpath=C:dataconfigcfgsvr_2.log
journal=true
port=50002
configsvr=true

--config server 3
dbpath=C:dataconfig
logpath=C:dataconfigcfgsvr_3.log
journal=true
port=50003
configsvr=true
复制代码

启动 config server,启动配置服务器时,不要使用--replset参数,config server不是replica set;--configsvr 参数指定mongod为config server。

复制代码
--config server 1
mongod -f C:dataconfigcfgsvr_1.conf
--config server 2
mongod -f C:dataconfigcfgsvr_2.conf
--config server 3
mongod -f C:dataconfigcfgsvr_3.conf
复制代码

3,Router
mongos是路由服务器(Router),mongos需要config server的地址列表,通过--configdb 指定 router 能够访问的 config server列表。mongos 不保存数据,不需要指定dbpath参数,mongos在启动时从config server加载集群数据,可以启动任意数量的mongos,每个mongos使用相同的config server 列表。

在router-svr1 上创建mongos,将配置文档存储在C:datamongoscfg_mongos.conf,使用--port 参数指定mongos 进程监听的端口。

--mongos 1
logpath=C:datamongosmongos_log.log port=60001 configdb=cfg-svr1:50001,cfg-svr2:50002,cfg-svr2:50003

启动mongos

mongos -f C:datamongoscfg_mongos.conf

四,增加Shard

1,连接到mongos

mongo --host router-svr1 --port 60001

查看分片的状态,分片集群中并没有任何一个shard

sh.status()

2,增加Shard

每一个shard 用于存储数据的一个分片,存储数据的Server可以是Replica Set,也可以是Standalone mongod。

为分片集群增加一个Replica Set 分片

sh.addShard("replica_set_name/host:port")

为分片集群增加一个Standalone mongod

sh.addShard("host:port")

3,使数据库启用分片存储

sh.enableSharding("database name")

4,使数据库中的一个集合启用分片存储
在将collection启用分片存储之前,必须在collection上创建单键或双键index。

db.collection_name.createIndex({field:1})

sh.shardCollection("dbname.collection_name",{field:1})

5,向集合中插入,MongoDB将自动管理分片

db.collection_name.insert({....})

Application连接mongos,写入或读取数据,由mongos 路由到相应的shard,这个过程是自动完成的。

参考文档:

Sharded Cluster Administration

Sharding

MongoDB - Sharding

免责声明:文章转载自《MongoDB 搭建分片集群》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Ceph部署(二)RGW搭建JVisualVM简介与内存泄漏实战分析下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

微信内 H5 页面自定义分享

起源: 最近公司在做一个活动的h5页面,在微信内打开时需要进行微信授权,然后后端会重定向到这个页面并且携带了一些参数(openid等)。问题是点击微信的原生分享时,会把携带的这些参数一起分享出去,等于把用户信息泄露了。所以为了解决这个问题,只能实现自定义微信分享的功能,可以自定义分享的地址、标题、图标还有简介。 事先需要做的: 1.微信公众号:必须是经过...

Windows10系统服务优化及分析(批处理)

对于Win10来说,除了UI的变动外,微软还根据用户体验做了一些功能的增强和更改,在我看来,Win10本身启动的服务都是为了系统运作更加完美而增加的,但是对于很多人来说,Win10的很多功能很少用,甚至用不到,对于这样的功能如果不关闭的话,只能占用我们的系统资源。 如何用批处理对系统的服务进行开关? 服务停止 net stop "服务名称"   停止服务...

Spring Boot加载配置文件的完整步骤

这篇文章主要给大家介绍了关于Spring Boot加载配置文件的完整步骤,文中通过示例代码介绍的非常详细,对大家的学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧 前言 本文针对版本2.2.0.RELEASE来分析SpringBoot的配置处理源码,通过查看SpringBoot的源码来弄清楚一些常见的问题比如:...

thinkphp5.0 配置格式

ThinkPHP支持多种格式的配置格式,但最终都是解析为PHP数组的方式。 PHP数组定义 返回PHP数组的方式是默认的配置定义格式,例如: //项目配置文件 return [ // 默认模块名 'default_module' => 'index', // 默认控制器名 'default_control...

05 UCI

/etc/config/dropbear为SSH的配置 1.1 uci与config的关系 1.2 uci命令 add增加指定配置文件 add_list对已存在的list选项增加字符串 commit对给定的配置写入修改。如果没有指定参数,则将配置文件写入文件系统。所有的uci set,uci add,uci rename,uci delete都是...

webpack 4.0 配置文件 webpack.config.js文件的放置位置

  一般webpack.config.js是默认放在根目录的,不在根目录的时候需要在package.json中制定位置,我的配置文件目录是config/webpack.config.js,在package.json文件中的配置为: "scripts": { "build": "webpack --mode production --config ./...