mongodb采用的分片原理,其实很简单,说白了就是,一个蛋糕特别大,需要非常非常大的盒子才能装下,就算装下了存储也不方便,所以把大蛋糕切成小蛋糕进行存储.这种思想在其他应用或数据库中也有应用.例如:

一,mongodb分片,常用的二种架构

1,每一个客户端系统上包含一个路由器mongos,

每个客户端都有一个路由

服务器的数量从十几台增长到几百台,mongos路由和mongod分片服务器之间建立了几百、有时候甚至是几千个连接,负载非常重。这意味着每当chunk平衡(MongoDB分片集群为了保持数据均匀分布所必须使用的平衡措施)发生的时候传送存储在配置数据库中的chunk位置信息都需要花费相当长的时间。这是因为每一个mongos路由都必须清楚地知道每一个chunk都存在于集群中的哪些位置.

2,路由器独立

路由服务器单独出来

路由独立就很好的解决了上面提到的问题,路由越少,拓扑图越简单.

这里的路由器,包含了连接池的功能.上面二张图片,来源于网络

二,服务器说明

1,mongodb 分片存储

Server1 二片:Shard1/Shard2 ip:192.168.10.103

Server2 二片:Shard1/Shard2 ip:192.168.10.219

2,路由

Server3 ip:192.168.10.209

从路由器分配置上面就可以看出,才用的是独立路由的方案.

三,mongodb replica sets shard 安装配置

1,mongodb安装

下载地址: http://www.mongodb.org/downloads

解压后就能使用

2,分别在三台服务器上创建目录

# mkdir /usr/local/mongodb26/configsvr/ -p

# mkdir /usr/local/mongodb26/log/ -p

# mkdir /usr/local/mongodb26/shard1/ -p

# mkdir /usr/local/mongodb26/shard2/ -p

# mkdir /usr/local/mongodb26/key/ -p

# mkdir /usr/local/mongodb26/conf/ -p

为什么要创建目录,因为解压后的mongodb就一个目录bin目录,太少了.

3,192.168.10.103和192.168.10.219创建分片配置文件

# cat /usr/local/mongodb26/conf/shard1.conf

dbpath = /usr/local/mongodb26/shard1 //数据库路径

directoryperdb = true //设置每个数据库将被保存在一个单独的目录

shardsvr = true //启动分片

replSet = shard1 //设置富本集的名字为shard1,replSet是让服务器知道在这个"shard1"副本集中还有别的机器

port = 20001 //端口号

oplogSize = 100 //复制日志大小 MB

pidfilepath = /usr/local/mongodb26/shard1/mongodb.pid //pid文件路径

logpath = /usr/local/mongodb26/log/shard1.log //日志路径

logappend = true //以追加方式写入

profile = 1 //数据库分析,1表示仅记录较慢的操作

slowms = 5 //认定为慢查询的时间设置,根mysql慢查询有点像

fork = true //以守护进程的方式运行,创建服务器进程

shard2根shard1基本一样

# cat /usr/local/mongodb26/conf/shard2.conf

dbpath = /usr/local/mongodb26/shard2

directoryperdb = true

shardsvr = true

replSet = shard2

port = 20002

oplogSize = 100

pidfilepath = /usr/local/mongodb26/shard2/mongodb.pid

logpath = /usr/local/mongodb26/log/shard2.log

logappend = true

profile = 1

slowms = 5

fork = true

分片存储的二台机器,分别创建这二个文件.

4,192.168.10.209路由服务器

路由有二个配置文件

# cat /usr/local/mongodb26/conf/configsvr.conf //路由配置,配置文件

pidfilepath = /usr/local/mongodb26/configsvr/mongodb.pid

dbpath = /usr/local/mongodb26/configsvr

directoryperdb = true

configsvr = true //声明这是一个集群的config服务,默认端口27019,默认目录/data/configdb

port = 20000

logpath =/usr/local/mongodb26/log/configsvr.log

logappend = true

fork = true

# cat /usr/local/mongodb26/conf/mongos.conf //路由配置,配置文件

configdb = 192.168.10.209:20000 //监听的配置服务器,只能有1个或者3个

port = 30000

chunkSize = 1 //单位 mb 生成环境请使用 100 或删除,删除后默认是64

logpath =/usr/local/mongodb26/log/mongos.log

logappend = true

fork = true

四,启动mongodb进程

1,192.168.10.103和192.168.10.219分片存储节点的启动

/usr/local/mongodb26/bin/mongod -f /usr/local/mongodb26/conf/shard1.conf

/usr/local/mongodb26/bin/mongod -f /usr/local/mongodb26/conf/shard2.conf

2,在192.168.10.209路由节点上的启动

/usr/local/mongodb26/bin/mongod -f /usr/local/mongodb26/conf/configsvr.conf

/usr/local/mongodb26/bin/mongos -f /usr/local/mongodb26/conf/mongos.conf

在这里如果报以下错误:

# /usr/local/mongodb26/bin/mongos -f /usr/local/mongodb26/conf/mongos.conf

BadValue need either 1 or 3 configdbs

try '/usr/local/mongodb26/bin/mongos --help' for more information

原因以及解决办法:

mongos.conf文件中configdb参数有误,在这里路由个数,只能为1或3。configdb = 192.168.10.209:20000

五,查看是否启动成功

1,192.168.10.103和192.168.10.219分片存储节点的启动

[root@localhost conf]# netstat -tpnl |grep mongod

tcp 0 0 0.0.0.0:20001 0.0.0.0:* LISTEN 21556/mongod

tcp 0 0 0.0.0.0:20002 0.0.0.0:* LISTEN 21976/mongod

2,在192.168.10.209路由节点上的启动

[root@localhost mongodb26]# netstat -tpnl |grep mon

tcp 0 0 0.0.0.0:30000 0.0.0.0:* LISTEN 3521/mongos

tcp 0 0 0.0.0.0:20000 0.0.0.0:* LISTEN 3946/mongod

如果监听的端口都已启动,说明已添加成功.

六,配置mongodb replica set节点

1,port 20001端口进行配置

# /usr/local/mongodb26/bin/mongo --port 20001

> use admin

> config = {_id:"shard1", members: [

{_id: 0, host:"192.168.10.103:20001"},

{_id: 1, host:"192.168.10.219:20001"}

]

};

{

"_id" : "shard1",

"members" : [

{

"_id" : 0,

"host" : "192.168.10.103:20001"

},

{

"_id" : 1,

"host" : "192.168.10.219:20001"

}

]

}

> rs.initiate(config);

> exit;

2,port 20002端口进行配置

# /usr/local/mongodb26/bin/mongo --port 20002

> use admin

> config = {_id:"shard2", members: [

{_id: 0, host:"192.168.10.103:20002"},

{_id: 1, host:"192.168.10.219:20002"}

]

};

{

"_id" : "shard2",

"members" : [

{

"_id" : 0,

"host" : "192.168.10.103:20002"

},

{

"_id" : 1,

"host" : "192.168.10.219:20002"

}

]

}

> rs.initiate(config);

> exit;

在分片,192.168.10.103和192.168.10.219任何一台机器上都行,二个端口各配置一次

七,mongos路由节配置

# /usr/local/mongodb26/bin/mongo --port 30000

mongos> use admin

mongos> db.runCommand({addshard:"shard1/192.168.10.103:20001,192.168.10.219:20001",name:"shard1", maxsize:20480} )

mongos> db.runCommand({addshard:"shard2/192.168.10.103:20002,192.168.10.219:20002",name:"shard2", maxsize:20480} );

mongos> db.runCommand( {listshards : 1 } )

{

"shards" : [

{

"_id" : "shard1",

"host" : "shard1/192.168.10.103:20001,192.168.10.219:20001"

},

{

"_id" : "shard2",

"host" : "shard2/192.168.10.103:20002,192.168.10.219:20002"

}

],

"ok" : 1

}

到这儿,replica set + shard功能就配置好了,注意:虽然配置好了,但是还要声明库和表要进行分片。

八,声明库和表要分片

mongos> use admin //切换到admin库

mongos> db.runCommand({enablesharding:"test2"}); //声明test2库允许分片

{ "ok" : 1 }

mongos> db.runCommand( { shardcollection : "test2.books", key : { id : 1 } } ); //声明books表要分片

{ "collectionsharded" : "test2.books", "ok" : 1 }

mongos> use test2 //切换到test2

mongos> db.stats(); //查看数据库状态

mongos> db.books.stats(); //查看表状态

如果报以下错误:

{ "ok" : 0, "errmsg" : "sharding not enabled for db" },原因是库还不允许分片

九,测试

1,测试脚本

mongos> for (var i = 1; i <= 20000; i++) db.books.save({id:i,name:"12345678",sex:"male",age:27,value:"test"});

2,测试结果

mongos> db.books.stats();

{

"sharded" : true,

"systemFlags" : 1,

"userFlags" : 1,

"ns" : "test2.books",

"count" : 20000,

"numExtents" : 10,

"size" : 2240000,

"storageSize" : 5586944,

"totalIndexSize" : 1267280,

"indexSizes" : {

"_id_" : 678608,

"id_1" : 588672

},

"avgObjSize" : 112,

"nindexes" : 2,

"nchunks" : 4,

"shards" : {

"shard1" : {

"ns" : "test2.books",

"count" : 5499,

"size" : 615888,

"avgObjSize" : 112,

"storageSize" : 2793472,

"numExtents" : 5,

"nindexes" : 2,

"lastExtentSize" : 2097152,

"paddingFactor" : 1,

"systemFlags" : 1,

"userFlags" : 1,

"totalIndexSize" : 367920,

"indexSizes" : {

"_id_" : 196224,

"id_1" : 171696

},

"ok" : 1

},

"shard2" : {

"ns" : "test2.books",

"count" : 14501,

"size" : 1624112,

"avgObjSize" : 112,

"storageSize" : 2793472,

"numExtents" : 5,

"nindexes" : 2,

"lastExtentSize" : 2097152,

"paddingFactor" : 1,

"systemFlags" : 1,

"userFlags" : 1,

"totalIndexSize" : 899360,

"indexSizes" : {

"_id_" : 482384,

"id_1" : 416976

},

"ok" : 1

}

},

"ok" : 1

}

3,测试结果,数据分析

1),2W条数据,全部插入到shard2

2),shard2数据不变,shard1的数据开始增加

3),shard1数据不变,shard2的数据开始减少

一次插入2W条数据,5秒左右才能平衡,你可以db.book.stats(); 重复这个命令,你会发现数据流的变化。

mongodb 集群shard_mongodb replica set shard 分片 高可用 集群相关推荐

  1. keepalived mysql集群_mysql双主+keepalived实现高可用集群

    master-a端: 1)安装keepalived [[email protected] ~]# [[email protected] ~]# yum install keepalived 安装kee ...

  2. linux集群-keepalived介绍-用keepalived配置高可用集群

    2019独角兽企业重金招聘Python工程师标准>>> linux集群介绍: 以功能划分:高可用和负载均衡 高可用集群:通常为两台服务器,一台工作,另外一台作为冗余.实现高可用的开源 ...

  3. HA集群实现原理 切换 JAVA_HA(一)高可用集群原理

    高可用集群原理 LVS集群DR模式简单的架构图如下所示: 在上图的架构中,当Director服务器因软件.硬件.人为原因造成故障时,整个集群服务不可用,因此,需要再添加一台服务器实现Director服 ...

  4. mongodb 集群shard_mongodb单机配置shard分片集群

    ##################################################### 操作系统:[root@zxl-node3 logs]# cat /etc/issue Cen ...

  5. mysql 集群切换_完美起航-MySQLMHA高可用集群部署及故障切换(图文详解)

    MySQL MHA 一.MHA概念 MHA(MasterHigh Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件. MHA 的出现就是解决MySQL 单点的问题. ...

  6. n9e体验.以及部分高可用集群测试验证

    1.docker 环境 , docker-compose 参考1 参考2 参考3 下载二进制docker(离线内网安装) linux下载docker包地址 wget https://download. ...

  7. 16、Kubernetes搭建高可用集群

    文章目录 前言 一.高可用集群 1.1 高可用集群技术细节 二.部署高可用集群 2.1 准备环境 2.2 所有master节点部署keepalived 2.2.1 安装相关包和keepalived 2 ...

  8. linux高可用集群(HA)原理详解

    高可用集群 一.什么是高可用集群 高可用集群就是当某一个节点或服务器发生故障时,另一个节点能够自动且立即向外提供服务,即将有故障节点上的资源转移到另一个节点上去,这样另一个节点有了资源既可以向外提供服 ...

  9. corosync+pacemaker高可用集群

    简介 高可用集群,是指以减少服务中断(如因服务器宕机等引起的服务中断)时间为目的的服务器集群技术.简单的说,集群就是一组计算机,它们作为一个整体向用户提供一组网络资源.这些单个的计算机系统就是集群的节 ...

最新文章

  1. Spring-AOP 通过配置文件实现 前置增强
  2. python面向对象中的类
  3. 字符串匹配问题(信息学奥赛一本通-T1355)
  4. select自定义箭头样式
  5. 【java】java getOrDefault 方法的一个坑,容易导致OOM
  6. php键名相加,php二维数组相同键名相加实例
  7. 操作系统中死锁的概念
  8. 判断系统是64位还是32位的bat方法
  9. linux initrd usb热插拔,8.3 发行注记 Red Hat Enterprise Linux 8 | Red Hat Customer Portal
  10. 隐藏桌面图标通过命令行启动
  11. python3日期时间运算_马克的Python学习笔记#数字,日期和时间3
  12. 【详细】阿里云Accesskey创建步骤记录
  13. EXT.JS 学习笔记
  14. canvas-球体动画运动
  15. 【网络】DPDK的基本原理|DPDK和RDMA的区别
  16. 易佰关键词查询工具 2013 V2.0
  17. automake编译工程
  18. 2022年乡村医生考试练习题及答案
  19. 操作系统服务器的安全性,服务器操作系统安全性
  20. Webbench源码分析之多进程(三)

热门文章

  1. STM32CubeMX GCC工程Makefile内容详解
  2. 预祝VR、AR、XR、MR等早日成熟普及
  3. 如何测量电源的噪声(有视频)
  4. 编程神器 VS Code,只要这一篇就够了!
  5. freeCodeCamp | Survey Form
  6. leetcode589
  7. 大数据的技术包括什么?
  8. PAT-1052 卖个萌--乙级
  9. 使用Calendar类得到一年中的二月有多少天
  10. Hybris阶段总结(2)hybris架构