mongodb分布式集群

1.创建配置数据库服务

mongod --dbpath=d://path/mongodb_ds/mongodb_config --port 1234

2.创建3台分布数据库服务

mongod --dbpath=d://path/mongodb_ds/mongodb111 --port 1111

mongod --dbpath=d://path/mongodb_ds/mongodb222 --port 2222

mongod --dbpath=d://path/mongodb_ds/mongodb333 --port 3333

3.开启路由服务指定mongodb_config数据库服务为路由,负责转发客户端的数据库请求,合理分配给3台数据库服务

mongos --port 4321 --configdb=localhost:1234

4.开启一个客户端连接路由服务

mongo localhost:4321

4.1 切换到admin数据库,准备配置相关参数 use admin

4.2 为3台分布数据库服务创建分片

db.runCommand({"addshard":"localhost:1111",allowLocal:true});

db.runCommand({"addshard":"localhost:2222",allowLocal:true});

db.runCommand({"addshard":"localhost:3333",allowLocal:true});

*addshard 表示创建分片,allowLocal 表示是否允许别的客户端访问这台数据库。

4.3 允许哪个数据库使用分片

db.runCommand({"enablesharding":"test"});

4.4 指定哪个数据库的哪个集合使用分片,且分片依据是哪个字段

db.runCommand({"shardcollection":"test.person","key":{age:1}});

5.切换到test数据库,准备插入数据 use test

mongos> for(var i=0; i<10000000; i++){

db.person.insert({name:"distributedName",age:i});

}

这里插入1000w条数据到test数据库的person集合,路由服务会根据前面的配置,以age的值为分片依据,决定具体插入到哪个数据库服务的test数据库下的Person集合。

https://blog.csdn.net/qwkxq/article/details/53728244

MongoDB是最易用的NoSQL,比较适合取代MySQL做一些存储,不过不是强一致性的。本文介绍一下MongoDB各种部署方式,并分享一些感受。前两部分“单机部署”和“主从部署”是“分片部署”的基础。

MongoDB单机部署

启动下载来的MongoDB包的bin目录下的mongod.exe即可打开MongoDB服务,可以添加的基本配置是:

1

./mongod.exe --dbpath ~/db/data --port 127.0.0.1:10000 --logpath ~/db/log

默认的端口是27017。启动的时候必须有一个data目录,让mongod读写数据。写入数据后,data目录里的文件如图:

.lock文件如果在下次启动时候还存在,需要删除才能成功启动。"article"和"config"是数据库名字,可以特别注意一下每个文件块的大小(16M, 32M, 64M, 128M)。

MongoDB主从部署

主从配置是MongoDB特色之一,使之具备了容错,故障恢复等性能。主节点要声明"master",从节点们要声明"slave"和"--source"。最简单的主从配置如下:

1

./mongod.exe --dbpath ~/db/master --port 10000 --master

1

./mongod.exe --dbpath ~/db/slave --port 10001 --slave --source localhost:10001

从 节点直接从主节点同步数据,从节点之间不互相同步。容错性更强的部署是一个主从集群,互相都能成为“主节点”,叫做Replica Set。在Replica Set里会有一个活跃节点和若干个备份节点。配置的时候,整个Replica Set要取个名字,然后每台都要指明一个或几个伙伴:

1

./mongod.exe --dbpath ~/db/node1 --port 10001 --replSet setname/localhost:10002

1

./mongod.exe --dbpath ~/db/node2 --port 10002 --replSet setname/localhost:10001

1

./mongod.exe --dbpath ~/db/node3 --port 10003 --replSet setname/localhost:10001

谁成为活跃节点取决于优先级,优先级默认是1,也可以启动mongod进行设置(不具体介绍了),总之是内部的选举机制。

MongoDB分片部署

介绍完以上,组合起来就可以搭建一个比较强壮的分布式MongoDB集群。分片类似分布式,MongoDB以新增分片的方式,扩展自己的容量,并且能给读写负载均衡。

1. 每一个启动的mongod都是实际存放数据的地方,都能作为别人的sharding

2. 分片部署需要一个mongos,起路由分发的作用;需要一个配置服务器和若干个分片服务器(都是mongod)

3. 单机的时候,应用连接的是mongod;分布式的时候,应用连接的是mongos。

最简单的分片部署是单个的配置服务器,一个config(即mongod),一个mongos,几个sharding(即mongod):

1

./mongod.exe --dbpath ~/db/config --port 20000

1

./mongos.exe --configdb 127.0.0.1:20000 --port 30000

1

./mongod.exe --dbpath ~/db/shard1 --port 10001

1

./mongod.exe --dbpath ~/db/shard2 --port 10002

如果有时候启动不了某个mongod,可能和端口有关。在windows下,这样一个集群会打开很多shell窗口。这种情况下,还是三个独立的mongd,要打开上面的mongos,输入命令加入sharding片:

1 2 3

> use admin > db.runCommand({addshard : "localhost:10001", allowLocal : true}) > db.runCommand({addshard : "localhost:10002", allowLocal : true})

1

> db.runCommand({"enablesharding" : "dbname"})

还要设置片建,以提供负载均衡的依据:

1

> db.runCommand({"shardcollection" : "dbname.collection", "key" : {"_id":1}})

dbname.collection是自己的数据库的数据集。设置的"key"需要已经建立索引。

mongos下还有一些查看分片情况的命令,方便集群的管理和监控,可以自己体验下:

1 2 3

> db.shards.find() > db.chunks.find() > db.printShardingStatus()

也可以通过runCommand的其他命令添加新的片,删除已有的片,而且添加的片可以是旧的mongod。

测试开发的时候像上面这样的一组可能够了,真正健壮的集群可能要具备下面三个条件:

1. 多个配置服务器config1, config2, config3(可以都经过一个mongos来路由)

2. 每个sharding都是Replica Set

3. 每一台物理物理服务器承担若干个不同的进程(mongos, shards, config)

就像下面这种图呈现的一样:

我们可以这样理解mongos, shards, config三样东西:

1. shards是一些实际存数据的可以单独使用的db,他们能分配给任何config server,而且添加删除都很方便。

2. 每个shard里有若干个地位平等的mongods,所以每个是一个Replica Set(副本集)

3. 一个config手下带领好几个shards,目的是负载和扩容,他们之间需要mongos来路由

4. mongos是一个路由,可以路由一个或多个config servers,不需要很大的分配空间

5. 每一个客户端的应用,每一张数据库表,最好对应一个config server和一个mongos

以上内容里的"--port" 部分改为IP:port就可以分布式环境了。比较合理的节省物理服务器的配置方法可以像下图这样:

不把所有鸡蛋扔一个篮子里。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • How AET fields are retrieved from backend

    版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)

    Jerry Wang
  • 基础知识的学习,来自十年程序员的经验分享

    后来就想能不能对计算机学习方法和学习心得写个系列的文章,这篇算是第二篇。偏向基础知识部分, 比如 操作系统,数据库,网络 等。

    乔戈里
  • one order event handling - event filtering

    版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)

    Jerry Wang
  • 这几道Redis面试题都不懂,怎么拿offer?

    随着系统访问量的提高,复杂度的提升,响应性能成为一个重点的关注点。而缓存的使用成为一个重点。redis 作为缓存中间件的一个佼佼者,成为了面试必问项目。本文分享...

    java思维导图
  • Creating a Connection Between Enterprise Search and SAP HANA for ABAP CDS-Based Search Models

    版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)

    Jerry Wang
  • 【疑难杂症】windows下如何有效重装印象笔记

    重装这么简单的操作还用得着写篇文章吗??emmmm,言之有理,简单的重装就是卸载后重新下载最新的安装包然后安装就完事了,这里说的肯定是不简单的重装【滑稽】。

    弗兰克的猫
  • Mysql8中降序索引的底层实现

    asc表示的是升序,使用这种语法创建出来的索引叫做升序索引。也就是我们平时在创建索引的时候,创建的都是升序索引。

    猿天地
  • 来,一起造作吧!拥抱DDD!

    好像从从业开始之后,每每向前辈请教代码怎么写,前辈总是云淡风清的说一句,先建库建表,然后对着建的表写实体类,然后用表和实体类写DAO层,然后跟着写...

    微笑的小小刀
  • How data type handler is got for AET extension field

    版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)

    Jerry Wang
  • 现实中的路由规则,可能比你想象中复杂的多

    几乎每一个分布式系统,都会给用户提供自定义路由的功能。因为,仅通过range、mod、hash等方法,很大概率已经满足不了用户的需求。下面以一个实际场景为例,说...

    xjjdog

扫码关注云+社区

领取腾讯云代金券