mongodb数据库replica set shard 分片 高可用 集群

一,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(); 重复这个命令,你会发现数据流的变化。

 

时间: 2024-08-03 08:18:05

mongodb数据库replica set shard 分片 高可用 集群的相关文章

MongoDB高可用集群配置的几种方案

一.高可用集群的解决方案 高可用性即HA(High Availability)指的是通过尽量缩短因日常维护操作(计划)和突发的系统崩溃(非计划)所导致的停机时间,以提高系统和应用的可用性. 计算机系统的高可用在不同的层面上有不同的表现: (1)网络高可用 由于网络存储的快速发展,网络冗余技术被不断提升,提高IT系统的高可用性的关键应用就是网络高可用性,网络高可用性与网络高可靠性是有区别的,网络高可用性是通过匹配冗余的网络设备实现网络设备的冗余,达到高可用的目的. 比如冗余的交换机,冗余的路由器等

轻松构建Mysql高可用集群系统

一. MySQL复制的实现原理 MySQL支持单向.双向复制.异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.主服务器将更新写入一个二进制日志文件中,并创建一个索引文件以跟踪日志循环.这些日志可以记录发送到从服务器的更新.当一个从服务器连接主服务器时,日志文件会通知主服务器,从服务器在日志中读取的最后一次成功更新的位置.接着,从服务器在上次成功更新的位置处开始进入更新操作.更新完成后从服务器开始进入等待状态,等待主服务器后续的更新. 需要注意的是:在进行复制时,所

CentOS 7下搭建高可用集群

CentOS 7下搭建高可用集群 本文以两台机器实现双集热备高可用集群,主机名node1的IP为192.168.122.168 ,主机名node2的IP为192.168.122.169 . 一.安装集群软件 必须软件pcs,pacemaker,corosync,fence-agents-all,如果需要配置相关服务,也要安装对应的软件 二.配置防火墙 1.禁止防火墙和selinux # systemctl disable firewalld # systemctl stop firewalld

Linux之HA高可用集群的基础概念总结

HA(High Availability)高可用集群,其特点为根据实际需求为前端Diretor,后端RS-server,数据库服务器,共享存储等集群节点做一个从备份服务器或者多个服务器互相备份,一旦主服务器挂掉,备份服务器能立马检测到并取代主服务器上的资源继续运行服务,从而最大限度避免了因服务器宕机造成的服务中止.  主节点(active/primary)备节点(passive/standby)  主调度器(Director)一般为集群中的关键节点,所以一般都有备份节点的存在:而后端RS-ser

高可用集群HA及负载均衡集群LB的实现方法

集群是个热门话题,在企业中越来越多地应用Linux操作系统提供邮件.Web.文件存储.数据库等服务,随着Linux应用的日益增长,高可用及http://www.aliyun.com/zixun/aggregation/13996.html">负载均衡Linux集群也在企业中逐步地发展起来.Linux平台的低成本.高性能.高扩展性使得Linux集群能够以低廉的价格很好地满足各种应用的需求. 本文介绍Linux集群的基础知识,集群的分类.在熟悉集群的基础知识后会以RHCS(RedHat Clu

高可用集群Heartbeat简述

一.什么是高可用集群?高可用集群是怎么工作的? 高可用集群(HA:High Availability),就是为了保证服务的持续可用性,使用1个或多个备用主机来保证主服务器宕掉后能自动接替其工作的方案. 这些主机中,正在工作的,我们称为主节点,看着主节点挂掉然后才能干活的,我们称之为备节点,一般高可用集群中,只有两个节点是很特殊的HA集群,一般都是3个或3个以上. 而主机工作一般都是提供各种服务,不管是网页服务还是邮件服务或者数据库服务等,我们将这些服务和服务所需的一些特性或者属性称为资源:(re

基于corosync+pacemaker的nginx高可用集群安装配置

  一.corosync.pacemaker介绍 corosync是用于高可用环境中的提供通讯服务的,它位于高可用集群架构中的底层(Message Layer),扮演着为各节点(node)之间提供心跳信息传递这样的一个角色; pacemaker是一个开源的高可用资源管理器(CRM),位于HA集群架构中资源管理.资源代理(RA)这个层次,它不能提供底层心跳信息传递的功能,它要想与对方节点通信需要借助底层的心跳传递服务,将信息通告给对方.通常它与corosync的结合方式有两种: pacemaker

CentOS 7下怎么搭建高可用集群?

  CentOS 7下怎么搭建高可用集群.高可用集群是指以减少服务中断时间为目的的服务器集群技术.它通过保护用户的业务程序对外不间断提供的服务,把因软件/硬件/人为造成的故障对业务的影响降低到最小程度.那么新的centos下怎么来搭建高可用集群. 环境:本文以两台机器实现双集热备高可用集群,主机名node1的IP为192.168.122.168 ,主机名node2的IP为192.168.122.169 . 一.安装集群软件必须软件pcs,pacemaker,corosync,fence-agen

ActiveMQ私有云、公有云以及Docker环境高可用集群方案汇总

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dgd2010.blog.51cto.com/1539422/1749983 ActiveMQ软件概述 ActiveMQ提供消息队列服务. ActiveMQ高可用原理 ActiveMQ高可用由三部分组成. 1.ActiveMQ的master-slave 两个运行的ActiveMQ instance如果同时使用一套持久化存储,那么这两个ActiveMQ instance就会构成ma