MongoDB 集群分片(涉及分片、副本集等)

     # MongoDB 的命令对大小写是比较敏感的,所以,注意命令大小写问题:
一、MongoDB 集群分片的组成:
mongodb 的集群分片包括 4 个部分:mongos、config server、shard、replica set。
     mongos:
          数据库集群请求的入口,所有的请求都通过mongos进行协调,不需要在应用程序添加一个路由选择器;
          mongos自己就是一个请求分发中心,它负责把对应的数据请求请求转发到对应的shard服务器上;
          在生产环境,通常有多mongos作为请求的入口,防止其中一个挂掉所有的mongodb请求都没有办法操作。
     config server:
          顾名思义为配置服务器,存储所有数据库元信息(路由、分片)的配置;
          mongos本身没有物理存储分片服务器和数据路由信息,只是缓存在内存里,配置服务器则实际存储这些数据;
          mongos第一次启动或者关掉重启就会从 config server 加载配置信息,以后,如果配置服务器信息变化会通知到所有的 mongos 更新自己的状态;
          这样, mongos 就能继续准确路由;
          在生产环境通常有多个 config server 配置服务器,因为它存储了分片路由的元数据,这个可不能丢失!就算挂掉其中一台,只要还有存货, mongodb集群就不会挂掉。
     shard:
          这就是传说中的分片了。
          一台机器的一个数据表 Collection1 存储了 1T 数据,压力太大了;
          在分给4个机器后,每个机器都是256G,则分摊了集中在一台机器的压力;
          也许有人问一台机器硬盘加大一点不就可以了,为什么要分给四台机器呢?不要光想到存储空间,实际运行的数据库还有硬盘的读写、网络的IO、CPU和内存的瓶颈;
          在mongodb集群只要设置好了分片规则,通过mongos操作数据库就能自动把对应的数据操作请求转发到对应的分片机器上;
          在生产环境中分片的片键可要好好设置,这个影响到了怎么把数据均匀分到多个分片机器上,不要出现其中一台机器分了1T,其他机器没有分到的情况,这样还不如不分片!
     replica set:
          分片如果没有 replica set 是个不完整架构;
          假设,其中的一个分片挂掉那四分之一的数据就丢失了,所以,在高可用性的分片架构,还需要对于每一个分片构建 replica set 副本集保证分片的可靠性;
          生产环境通常是 2个副本 + 1个仲裁。
二、MongoDB 集群分片部署规划和集群架构图:
     1.机器或实例数量:
     下面,我们确定一下,机器的大体数量:
          mongos 3个, config server 3个,数据分3片 shard server 3个,每个shard 有一个副本一个仲裁也就是 3 * 2 = 6 个,总共需要部署15个实例
          但是,我们这里只是模拟测试,就准备 4 台机器:
172.16.10.53;172.16.10.54;172.16.10.55;172.16.10.56;
     2.实例端口配置部分:
          这里,由于有的实例部署在同一台机器上,所以进行了端口规划:
          mongos:          20000
          config server:   21000
          shard1:             22001
          shard2:             22002
          shard3:             22003
     3.MongoDB 集群分片架构图:
                  3
三、MongoDB 集群分片部署
     1.MongoDB 部署:
          默认,已经初始安装好了,安装在 /usr/local/mongodb
     2.MongoDB 多实例 部署:
        # 以下操作,在 172.16.10.54,172.16.10.55 上执行
        (1).新建 MongoDB分片 的 data 目录:(切换到 mongodb 用户下,新建目录)
               mkdir -p   /usr/local/mongodb/data/share_0{1..3}
        (2).在conf 目录,新建并编辑 3份 配置文件(可用root用户新建编辑)
               vim  /usr/local/mongodb/conf/mongodb_01.conf
                    port=22001
                    dbpath=/usr/local/mongodb/data/share_01
                    logpath=/usr/local/mongodb/log/mongodb_01.log
                    logappend=true
                    fork=true
                    oplogSize=4096
                   # replSet=share_01/172.16.10.56:22001,172.16.10.55:22001   # 在10.54 上配置文件,去掉此行前面的注释
                   # replSet=share_01/172.16.10.56:22001,172.16.10.54:22001   # 在10.55 上配置文件,去掉此行前面的注释
               vim  /usr/local/mongodb/conf/mongodb_02.conf
                    port=22002
                    dbpath=/usr/local/mongodb/data/share_02
                    logpath=/usr/local/mongodb/log/mongodb_02.log
                    logappend=true
                    fork=true
                    oplogSize=4096
                   # replSet=share_02/172.16.10.56:22002,172.16.10.55:22002   # 在10.54 上配置文件,去掉此行前面的注释
                   # replSet=share_02/172.16.10.56:22002,172.16.10.54:22002   # 在10.55 上配置文件,去掉此行前面的注释
               vim  /usr/local/mongodb/conf/mongodb_03.conf
                    port=22003
                    dbpath=/usr/local/mongodb/data/share_03
                    logpath=/usr/local/mongodb/log/mongodb_03.log
                    logappend=true
                    fork=true
                    oplogSize=4096
                   # replSet=share_03/172.16.10.56:22003,172.16.10.55:22003   # 在10.54 上配置文件,去掉此行前面的注释
                   # replSet=share_03/172.16.10.56:22003,172.16.10.54:22003   # 在10.55 上配置文件,去掉此行前面的注释
 
        (3).MongoDB 启动测试:
             # 切换用户:
               su – mongodb
             # 启动:
               /usr/local/mongodb/bin/mongod –config /usr/local/mongodb/conf/mongodb_01.conf
               /usr/local/mongodb/bin/mongod –config /usr/local/mongodb/conf/mongodb_02.conf
               /usr/local/mongodb/bin/mongod –config /usr/local/mongodb/conf/mongodb_03.conf
             # 查看是否启动:
                 ps -ef | grep mongodb   或    netstat -tulnap | grep mongo
     3.MongoDB 仲裁配置:【 这个操作在 172.16.10.56 】
        (1).MongoDB 仲裁的安装:
             MongoDB arbiter 安装  和 mongodb 的安装一样(请参照mongodb安装),只需要修改一下配置文件;
             我们,这里修改 mongodb 仲裁的名字叫 mongodb_arbiter,安装在 /usr/local/mongodb_arbiter 目录下;
        (2).MongoDB 仲裁多实例部署 和 上面 mongodb 的多实例部署一致:
             新建 MongoDB的 data 目录:(切换到 mongodb 用户下,新建目录)
               mkdir -p   /usr/local/mongodb/data/arbiter_0{1..3}
        (3).在conf 目录,新建并编辑 3份 配置文件(可用root用户新建编辑)
               vim /usr/local/mongodb_arbiter/conf/mongodb_01.conf
                    port=22001
                    dbpath=/usr/local/mongodb_arbiter/data/arbiter_01
                    logpath=/usr/local/mongodb_arbiter/log/arbiter_01.log
                    logappend=true
                    fork=true
                    replSet=share_01/172.16.10.54:22001,172.16.10.55:22001
               vim /usr/local/mongodb_arbiter/conf/mongodb_02.conf
                    port=22002
                    dbpath=/usr/local/mongodb_arbiter/data/arbiter_02
                    logpath=/usr/local/mongodb_arbiter/log/arbiter_02.log
                    logappend=true
                    fork=true
                    replSet=share_02/172.16.10.54:22002,172.16.10.55:22002
               vim /usr/local/mongodb_arbiter/conf/mongodb_03.conf
                    port=22003
                    dbpath=/usr/local/mongodb_arbiter/data/arbiter_03
                    logpath=/usr/local/mongodb_arbiter/log/arbiter_03.log
                    logappend=true
                    fork=true
                    replSet=share_03/172.16.10.54:22003,172.16.10.55:22003
        (4).mongodb_arbiter启动:
               /usr/local/mongodb_arbiter/bin/mongod –config /usr/local/mongodb_arbiter/conf/mongodb_01.conf
               /usr/local/mongodb_arbiter/bin/mongod –config /usr/local/mongodb_arbiter/conf/mongodb_02.conf
               /usr/local/mongodb_arbiter/bin/mongod –config /usr/local/mongodb_arbiter/conf/mongodb_03.conf
     4.MongoDB 备份集配置:
          # 修改 172.16.10.54,172.16.10.55  三个 mongodb 实例的 配置:
          # 注:
                    修改的部分,就是实例 注释掉的部分,根据需要,去掉需要部分前面的“ # ” ,重启即可;
          # 以上配置修改完成后,需要重启 54,55 上的实例;
          # 在 仲裁端 登录,初始化副本集:
              登录到172.16.10.54:22001 (mongodb master)上,执行如下操作:
                     /usr/local/mongodb/bin/mongo –port 22001
                     /usr/local/mongodb/bin/mongo>use admin
                     /usr/local/mongodb/bin/mongo>config_share01={_id:’share_01‘,members:[
                                                                                                     {_id:0,host:’172.16.10.54:22001‘,priority:10},
                                                                                                     {_id:1,host:’172.16.10.55:22001‘,priority:9},
                                                                                                     {_id:2,host:’172.16.10.56:22001‘,”arbiterOnly”:true} ]}
                     /usr/local/mongodb/bin/mongo>rs.initiate(config_share01)
                     /usr/local/mongodb/bin/mongo>rs.status()
                     /usr/local/mongodb/bin/mongo>rs.config()
          # 其它实例,修改 红色部分端口,和分片号; 这里就不做副本集测试
     5.MongoDB config 服务 和 mongos(路由) 服务部署:
#   在172.16.10.53 上部署;
        #   配置服务和路由服务的安装,只需要正常安装mongodb, 修改相应的配置文件即可:
        #   新建配置服务数据目录(以mongodb身份新建)
             mkdir -p /usr/local/mongodb/data/config_server
        (1).修改 MongoDB  配置服务器的配置文件:
             vim /usr/local/mongodb/conf/config_server.conf
               pidfilepath = /usr/local/mongodb/config/mongodb_config.pid 
               logpath =/usr/local/mongodb/log/config_server.log  
               dbpath = /usr/local/mongodb/data/config_server
               directoryperdb = true  
               configsvr = true  
               port = 21000  
               logappend = true  
               fork = true 
 
        (2).修改 MongoDB  路由服务器的配置文件:
             vim /usr/local/mongodb/conf/mongos.conf
               # 监听的配置服务器,只能有1个或者3个
               configdb = 172.168.10.53:21000   
               port = 20000  
               # 单位 mb 生成环境请使用 100 或删除,删除后默认是64
               chunkSize = 1 
               logpath =/usr/local/mongodb/log/mongos.log  
               logappend = true  
               fork = true  
        (3).启动配置服务器和路由服务器:
               A.配置服务器的启动:
                    /usr/local/mongodb/bin/mongod –config /usr/local/mongodb/conf/config_server.conf
               B.路由服务器的启动:
                    /usr/local/mongodb/bin/mongos –config /usr/local/mongodb/conf/mongos.conf
      6.MongoDB 路由节点配置:
          /usr/local/mongodb/bin/mongo –port 20000
          mongos> use admin
          mongos> db.runCommand({addshard:”share_02/172.16.10.54:22002,172.16.10.55:22002,172.16.10.56:22002″,name:”share_02″,maxsize:20480})
          mongos> db.runCommand({addshard:”share_01/172.16.10.54:22001,172.16.10.55:22001,172.16.10.56:22001″,name:”share_01″,maxsize:20480})
mongos> db.runCommand({addshard:”share_03/172.16.10.54:22003,172.16.10.55:22003,172.16.10.56:22003″,name:”share_03″,maxsize:20480})
mongos> db.runCommand({listshards:1})
               {
          “shards” : [
     {
“_id” : “share_02”,
“host” : “share_02/172.16.10.54:22002,172.16.10.55:22002”
     },
     {
“_id” : “share_01”,
“host” : “share_01/172.16.10.54:22001,172.16.10.55:22001”
     },
     {
“_id” : “share_03”,
“host” : “share_03/172.16.10.54:22003,172.16.10.55:22003”
     }
          ],
          “ok” : 1
               }
               #  注:
                     replica set + shard 功能就配置好了,注意:虽然配置好了,但是还要声明库和表要进行分片
      7.MongoDB 声明库 和 表 分片:
          mongos> use admin  # 切换到admin库
          mongos> db.runCommand({enablesharding:”test2″});   # 声明test2库允许分片
          mongos> db.runCommand( { shardcollection : “test2.books”, key : { id : 1 } } );   # 声明books表要分片
          mongos> use test2    # 切换到test2
          mongos> db.stats();   # 查看数据库状态
          mongos> db.books.stats();   # 查看表状态
四、MongoDB 集群分片测试:
     1.测试脚本:
          mongos> for ( var i=1;i<=20000;i++) db.books.save({id:i,name:”haowu”,sex:”male”,age:28,value:”haowu”});
     2.测试结果:
          (1).这个插入分片数据前的信息:
mongos> db.books.stats();
{
“sharded” : true,
“paddingFactorNote” : “paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.”,
“userFlags” : 1,
“capped” : false,
“ns” : “test2.books”,
“count” : 0,
“numExtents” : 1,
“size” : 0,
“storageSize” : 8192,
“totalIndexSize” : 16352,
“indexSizes” : {
“_id_” : 8176,
“id_1” : 8176
},
“avgObjSize” : 0,
“nindexes” : 2,
“nchunks” : 1,
“shards” : {
“share_01” : {
“ns” : “test2.books”,
“count” : 0,
“size” : 0,
“numExtents” : 1,
“storageSize” : 8192,
“lastExtentSize” : 8192,
“paddingFactor” : 1,
“paddingFactorNote” : “paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.”,
“userFlags” : 1,
“capped” : false,
“nindexes” : 2,
“totalIndexSize” : 16352,
“indexSizes” : {
“_id_” : 8176,
“id_1” : 8176
},
“ok” : 1,
“$gleStats” : {
“lastOpTime” : Timestamp(0, 0),
“electionId” : ObjectId(“5551b02945399f93109d3a39”)
}
}
},
“ok” : 1
}
          (2).这个插入分片数据后的信息:
mongos> db.books.stats();
{
“sharded” : true,
“paddingFactorNote” : “paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.”,
“userFlags” : 1,
“capped” : false,
“ns” : “test2.books”,
“count” : 20000,
“numExtents” : 11,
“size” : 2240000,
“storageSize” : 5595136,
“totalIndexSize” : 1267280,
“indexSizes” : {
          “_id_” : 678608,
“id_1” : 588672

},
“avgObjSize” : 112,
“nindexes” : 2,
“nchunks” : 5,
“shards” : {
“share_01” : {
“ns” : “test2.books”,
    “count” : 10028,
“size” : 1123136,
“avgObjSize” : 112,
“numExtents” : 5,
“storageSize” : 2793472,
“lastExtentSize” : 2097152,
“paddingFactor” : 1,
“paddingFactorNote” : “paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.”,
“userFlags” : 1,
“capped” : false,
“nindexes” : 2,
“totalIndexSize” : 629552,
“indexSizes” : {
“_id_” : 335216,
“id_1” : 294336
},
“ok” : 1,
“$gleStats” : {
“lastOpTime” : Timestamp(0, 0),
“electionId” : ObjectId(“5551b02945399f93109d3a39”)
}
},
“share_02” : {
“ns” : “test2.books”,
    “count” : 9964,
“size” : 1115968,
“avgObjSize” : 112,
“numExtents” : 5,
“storageSize” : 2793472,
“lastExtentSize” : 2097152,
“paddingFactor” : 1,
“paddingFactorNote” : “paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.”,
“userFlags” : 1,
“capped” : false,
“nindexes” : 2,
“totalIndexSize” : 621376,
“indexSizes” : {
“_id_” : 335216,
“id_1” : 286160
},
“ok” : 1,
“$gleStats” : {
“lastOpTime” : Timestamp(0, 0),
“electionId” : ObjectId(“5551af01cfe537190558b164”)
}
},
“share_03” : {
“ns” : “test2.books”,
        “count” : 8,
“size” : 896,
“avgObjSize” : 112,
“numExtents” : 1,
“storageSize” : 8192,
“lastExtentSize” : 8192,
“paddingFactor” : 1,
“paddingFactorNote” : “paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.”,
“userFlags” : 1,
“capped” : false,
“nindexes” : 2,
“totalIndexSize” : 16352,
“indexSizes” : {
“_id_” : 8176,
“id_1” : 8176
},
“ok” : 1,
“$gleStats” : {
“lastOpTime” : Timestamp(0, 0),
“electionId” : ObjectId(“5551af39bc340be250ae0cb4”)
}
}
},
“ok” : 1
}
     # 注:
          从上面看,我们这个插入的数据,分配很不均衡,至于何解,有待研究
     3.集群分片信息的查看:
mongos> sh.status();
— Sharding Status —
sharding version: {
“_id” : 1,
“minCompatibleVersion” : 5,
“currentVersion” : 6,
“clusterId” : ObjectId(“5551bfe62d6d99e8bbbc8840”)
}
shards:
{  “_id” : “share_01”,  “host” : “share_01/172.16.10.54:22001,172.16.10.55:22001” }
{  “_id” : “share_02”,  “host” : “share_02/172.16.10.54:22002,172.16.10.55:22002” }
{  “_id” : “share_03”,  “host” : “share_03/172.16.10.54:22003,172.16.10.55:22003” }
balancer:
Currently enabled:  yes
Currently running:  no
Failed balancer rounds in last 5 attempts:  0
Migration Results for the last 24 hours:
3 : Success
1 : Failed with error ‘migration already in progress’, from share_01 to share_02
databases:
{  “_id” : “admin”,  “partitioned” : false,  “primary” : “config” }
{  “_id” : “test”,  “partitioned” : false,  “primary” : “share_01” }
{  “_id” : “test2”,  “partitioned” : true,  “primary” : “share_01” }
test2.books
shard key: { “id” : 1 }
chunks:
share_01     2
share_02     2
share_03     1
{ “id” : { “$minKey” : 1 } } –>> { “id” : 2 } on : share_02 Timestamp(2, 0)
{ “id” : 2 } –>> { “id” : 10 } on : share_03 Timestamp(3, 0)
{ “id” : 10 } –>> { “id” : 4691 } on : share_01 Timestamp(4, 1)
{ “id” : 4691 } –>> { “id” : 10038 } on : share_01 Timestamp(3, 3)
{ “id” : 10038 } –>> { “id” : { “$maxKey” : 1 } } on : share_02 Timestamp(4, 0)

MongoDB 特性:副本集

一、Mongodb的主从模式种类:

     1.master/slave模式(这种结构无法实现自动 failover,MongoDB 官方已经不建议使用主从模式)
     2.Replicat sets模式
二、Mongodb Replicat sets模式 简介:
     MongoDB官方已经不建议使用主从模式了,替代方案是采用副本集的模式。
     主从模式其实就是一个单副本的应用,没有很好的扩展性和容错性。而副本集具有多个副本保证了容错性,就算一个副本挂掉了还有很多副本存在,并且解决了上面第一个问题“主节点挂掉了,整个集群内会自动切换”。
     其架构图如下:
1=故障后=>
2     由图可以看到,客户端连接到整个副本集,不关心具体哪一台机器是否挂掉。
     主服务器负责整个副本集的读写,副本集定期同步数据备份,一但主节点挂掉,副本节点就会选举一个新的主服务器,这一切对于应用服务器不需要关心。
     副本集中的副本节点,在主节点挂掉后,通过心跳机制检测到后,就会在集群内发起主节点的选举机制,自动选举一位新的主服务器。
     注:
          使用副本集时,如果 PRIMARY 挂掉,SECONDARY 会成为 PRIMARY, Mongodb 的访问地址是会改变的。
          但是,Mongodb 提供了各种开发语言访问 Mongodb replica sets 的驱动程序,所以,访问地址的高可用在客户端访问代码中实现。
三、Mongodb Replicat sets 部署规划:
          172.16.10.55:27017     (mongodb master)
          172.16.10.56:27017     (mongodb slave)
          172.16.10.56:27018     (mongodb 仲裁点)
四、Mongodb Replicat sets 配置文件修改:
     1.修改172.16.10.55:27017(mongodb master) 的配置文件如下:
          vim /usr/local/mongodb/conf/mongodb.conf
               port=27017
               dbpath=/usr/local/mongodb/data
               logpath=/usr/local/mongodb/log/mongodb.log
               logappend=true
               fork=true
               oplogSize=4096
               replSet=haowu/172.16.10.56:27017,172.16.10.56:27018
     2.修改172.16.10.56:27017(mongodb slave) 的配置文件如下:
          vim /usr/local/mongodb/conf/mongodb.conf
               port=27017
               dbpath=/usr/local/mongodb/data
               logpath=/usr/local/mongodb/log/mongodb.log
               logappend=true
               fork=true
               oplogSize=4096
               replSet=haowu/172.16.10.55:27017,172.16.10.56:27018
     3.修改172.16.10.56:27018(mongodb 仲裁点) 的配置文件如下:
          vim /usr/local/mongodb_arbirer/conf/mongodb.conf
               port=27018
               dbpath=/usr/local/mongodb_arbirer/data
               logpath=/usr/local/mongodb_arbirer/log/mongodb.log
               logappend=true
               fork=true
 
     # oplogSize:
               用于指定复制时的日志大小,默认大小是磁盘剩余空间的5%,其实就是一个缓存,缓存PRIMARY产生的日志。
     # replSet:
               设置副本集的命令,名字后跟其他的实例地址。实例地址也可以不指定或者指定一个,mongodb可以自动去发现其他节点。为了使配置清晰,指定了节点地址。
五、Mongodb Replicat sets 启动:
      1.172.16.10.55:27017(mongodb master)启动:
          /usr/local/mongodb/bin/mongod –config /usr/local/mongodb/conf/mongodb.conf
      2.172.16.10.56:27017(mongodb slave)启动:
         /usr/local/mongodb/bin/mongod –config /usr/local/mongodb/conf/mongodb.conf
      3.172.16.10.56:27018(mongodb 仲裁点)启动:
          /usr/local/mongodb_arbirer/bin/mongod –config /usr/local/mongodb_arbirer/conf/mongodb.conf
          # 在启动集群后,需要对集群做初始化配置,初始化配置需要所有的节点都在启动状态
六、Mongodb Replicat sets 集群初始化:
     登录到172.16.10.55:27017(mongodb master)上,执行如下操作:
      /usr/local/mongodb/bin/mongo>config_rs1={_id:’haowu’,members:[
                                                                      {_id:0,host:’172.16.10.55:27017′,priority:10},
                                                                      {_id:1,host:’172.16.10.56:27017′,priority:9},
                                                                      {_id:2,host:’172.16.10.56:27018′,”arbiterOnly”:true}
                                                                      ]}
        /usr/local/mongodb/bin/mongo>rs.initiate(config_rs1)
        /usr/local/mongodb/bin/mongo>rs.status()
        /usr/local/mongodb/bin/mongo>rs.config()
        /usr/local/mongodb/bin/mongo>rs.initiate(config_rs1)
七、Mongodb Replicat sets 同步测试:
      1. 登录 mongodb master 上,插入数据:
          haowu:PRIMARY> show collections;
haowu:PRIMARY> db.haowu.insert({name:”haowu”,age:28})
haowu:PRIMARY> db.haowu.find();
      2. 登录 mongodb slave 上,执行如下操作,看是否同步:
          # mongodb默认是从主节点读写数据的,副本节点上不允许读,下面,设置副本节点可读
          haowu:SECONDARY> rs.slaveOk()
haowu:SECONDARY> db.haowu.find();

八、Mongodb Replicat sets 故障切换测试:
      1. 登录 mongodb master 上,关闭master:
          haowu:PRIMARY> use admin、
haowu:PRIMARY> db.shutdownserver();
      2. 登录 mongodb slave 上,查看slave日志切换信息:
          其实,登录slave,你会发现slave的标识由:haowu:SECONDARY>  变为  haowu:PRIMARY>
          haowu:SECONDARY> rs.isMaster()
      3.我们这里,因为设置了副本集成员的优先级,所以,当宕机的master 重新启动后,会自动再次成为 master;
         因此,如果想避免此类事件发生,我们可以去掉优先级设置
九、Mongodb Replicat sets 读写分离配置:
     读写分离,将读压力分散到副本集的副本节点上,可以减轻主节点的读写压力
     (1)设置读写分离,需要先在副本节点SECONDARY ,设置 setSlaveOk。
     (2)在程序中设置副本节点负责读操作,

MongoDB 单实例部署 [ 非源码编译安装 ]

MongoDB 官方网址:
http://www.mongodb.org

本文,主要介绍 MongoDB 单实例的安装部署~

1.下载MongoDB的安装包并解压,安装相关依赖包 [ 这里不采用源码编译安装 ]
yum -y install net-snmp.x86_64 net-snmp-devel.x86_64 net-snmp-libs.x86_64
mkdir /usr/local/mongodb
tar -xf mongodb-linux-x86_64-enterprise-rhel62-3.0.2.tgz
mv mongodb-linux-x86_64-enterprise-rhel62-3.0.2 /usr/local/mongodb

2. 创建数据目录,日志目录,配置目录等相关目录
cd /usr/local/mongodb
mkdir data conf log

3.编辑MongoDB 的配置文件:
vim conf/mongodb.conf
port=27017
dbpath=/usr/local/mongodb/data
logpath=/usr/local/mongodb/log/mongodb.log
logappend=true
fork=true

4.启动/关闭MongoDB:
(1).启动MongoDB:
/usr/local/mongodb/bin/mongod –config /usr/local/mongodb/conf/mongodb.conf

(2).关闭MongoDB:
/usr/local/mongodb/bin/mongod –config /usr/local/mongodb/conf/mongodb.conf –shutdown

(3).主从启动的相关要点: [也可将其参数写入配置文件 master=true ]
A. 如果mongodb 做为 master 的话,只要在启动时,加 –master 参数即可:
ex:
/usr/local/mongodb/bin/mongod –config /usr/local/mongodb/conf/mongodb.conf –master
# 同时,查看日志,日志会有相关master 的信息

B. 如果mongodb 做为 SLAVE 的话,只要在启动时,加 –slave –source ip:端口 参数即可:
ex:
/usr/local/mongodb/bin/mongod –config /usr/local/mongodb/conf/mongodb.conf –slave –source 172.16.10.55:27017
# 同时,查看日志,日志会有相关slave 的信息

C.主从数据源信息的变更:
> db.printSlaveReplicationInfo();
source: 172.16.10.5627017
doing initial sync
> use local
> db.sources.find();
{ “_id” : ObjectId(“5549957a542399f1888879b2”), “host” : “172.16.10.5627017”, “source” : “main” }
> db.sources.insert({“host”: “172.16.10.56:27017”}); # 添加一个新的主数据源
WriteResult({ “nInserted” : 1 })
> db.sources.find();
{ “_id” : ObjectId(“5549957a542399f1888879b2”), “host” : “172.16.10.5627017”, “source” : “main” }
{ “_id” : ObjectId(“5549c25670656588c7058016”), “host” : “172.16.10.56:27017” }
> db.sources.remove({“host”: “172.16.10.5627017”}); # 删除一个已存在的数据源
WriteResult({ “nRemoved” : 1 })
> db.sources.find();
{ “_id” : ObjectId(“5549c25670656588c7058016”), “host” : “172.16.10.56:27017” }

D.查看主从复制信息:
> db.printReplicationInfo();
configured oplog size: 1550MB
log length start to end: 72993secs (20.28hrs)
oplog first event time: Tue May 05 2015 17:27:01 GMT+0800 (CST)
oplog last event time: Wed May 06 2015 13:43:34 GMT+0800 (CST)
now: Wed May 06 2015 14:24:21 GMT+0800 (CST)
> db.printSlaveReplicationInfo();
source: 172.16.10.55:27017
syncedTo: Wed May 06 2015 14:24:24 GMT+0800 (CST)
13 secs (0 hrs) behind the freshest member (no primary available at the moment)

5.注意事项:
启动后,日志信息如下,红色警告部分,是我们需要进行调整的地方:
2015-05-05T15:14:48.310+0800 I JOURNAL [initandlisten] journal dir=/usr/local/mongodb/data/journal
2015-05-05T15:14:48.311+0800 I JOURNAL [initandlisten] recover : no journal files present, no recovery needed
2015-05-05T15:14:48.368+0800 I JOURNAL [durability] Durability thread started
2015-05-05T15:14:48.368+0800 I JOURNAL [journal writer] Journal writer thread started
2015-05-05T15:14:48.369+0800 I CONTROL [initandlisten] MongoDB starting : pid=8874 port=27017 dbpath=/usr/local/mongodb/data 64-bit host=Templet
2015-05-05T15:14:48.369+0800 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2015-05-05T15:14:48.369+0800 I CONTROL [initandlisten]
2015-05-05T15:14:48.370+0800 I CONTROL [initandlisten]
2015-05-05T15:14:48.370+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is ‘always’.
2015-05-05T15:14:48.370+0800 I CONTROL [initandlisten] ** We suggest setting it to ‘never’
2015-05-05T15:14:48.370+0800 I CONTROL [initandlisten]
2015-05-05T15:14:48.370+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is ‘always’.
2015-05-05T15:14:48.370+0800 I CONTROL [initandlisten] ** We suggest setting it to ‘never’
2015-05-05T15:14:48.370+0800 I CONTROL [initandlisten]
2015-05-05T15:14:48.370+0800 I CONTROL [initandlisten] db version v3.0.2
2015-05-05T15:14:48.370+0800 I CONTROL [initandlisten] git version: 6201872043ecbbc0a4cc169b5482dcf385fc464f modules: enterprise
2015-05-05T15:14:48.370+0800 I CONTROL [initandlisten] OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013
2015-05-05T15:14:48.370+0800 I CONTROL [initandlisten] build info: Linux ip-10-171-117-53 2.6.32-220.el6.x86_64 #1 SMP Wed Nov 9 08:03:13 EST 2011 x86_64 BOOST_LIB_VERSION=1_49
2015-05-05T15:14:48.370+0800 I CONTROL [initandlisten] allocator: tcmalloc
2015-05-05T15:14:48.370+0800 I CONTROL [initandlisten] options: { config: “/usr/local/mongodb/conf/mongodb.conf”, net: { port: 27017 }, processManagement: { fork: true }, storage: { dbPath: “/usr/local/mongodb/data” }, systemLog: { destination: “file”, logAppend: true, path: “/usr/local/mongodb/log/mongodb.log” } }
2015-05-05T15:14:48.372+0800 I INDEX [initandlisten] allocating new ns file /usr/local/mongodb/data/local.ns, filling with zeroes…
2015-05-05T15:14:48.435+0800 I STORAGE [FileAllocator] allocating new datafile /usr/local/mongodb/data/local.0, filling with zeroes…
2015-05-05T15:14:48.435+0800 I STORAGE [FileAllocator] creating directory /usr/local/mongodb/data/_tmp
2015-05-05T15:14:48.439+0800 I STORAGE [FileAllocator] done allocating datafile /usr/local/mongodb/data/local.0, size: 64MB, took 0 secs
2015-05-05T15:14:48.450+0800 I NETWORK [initandlisten] waiting for connections on port 27017

下面,我们进行调整:
(1).创建mongodb用户
注:Mongodb不建议使用root用户来运行
# groupadd -g 1010 mongodb
# useradd -g 1010 -u 1010 mongodb
调整目录和文件权限
# cd /usr/local/mongodb
# chown -R mongodb. data/ log/

(2).内核参数调整
调整前:
# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] never
# cat /sys/kernel/mm/transparent_hugepage/defrag
[always] never
调整方法:
# echo “never” > /sys/kernel/mm/transparent_hugepage/enabled
# echo “never” > /sys/kernel/mm/transparent_hugepage/defrag
调整后:
# cat /sys/kernel/mm/transparent_hugepage/enabled
always [never]
# cat /sys/kernel/mm/transparent_hugepage/defrag
always [never]

(3).调整限制参数
启动日志,提示启动mongodb的这个用户能打开的进程数不到能打开的文件数的二分之一;
建议调整该用户能打开进程数为能打开的文件数的二分之一以上;
在CentOS系统中,默认情况用户能打开的进程数和文件数都为1024,因此不会出现该提示;
至于限制参数可以通过ulimit命令和/etc/security/limits.conf来设置
设置完毕后重启服务(切换到 mongodb 用户,启动mongodb)

MongoDB的日常使用

一、 查看collection和db信息:
1.查看DB以及DB空间大小:
show dbs
2.选择DB:
use hoss
3.查看DB中的collections:
show collections

二、查看collection使用大小:
1.查看DB给collection分配的大小。相当于oracle的segment大小:
db.fs.files.storageSize()
2.查看collection实际使用的大小。相当于oracle的HWR之下的:
db.fs.files.dataSize()
block,即已使用的block
3.查看collection的大小(storageSize)与索引大小的总和:
db.fs.files.totalSize()
4.查看collection的详细信息:
db.fs.files.stats()

三、 删除collection和db:
1.删除当前数据库:
db.dropDatabase()
2.删除当前collection的索引:
db.mycoll.dropIndexes()
3.删除当前collection
db.mycoll.drop()

四、检查同步状态
db.printReplicationInfo()
db.printSlaveReplicationInfo()
haowu:SECONDARY> db.printReplicationInfo()
configured oplog size: 4096MB
log length start to end: 449727secs (124.92hrs)
oplog first event time: Thu Dec 11 2014 11:00:40 GMT+0800 (CST)
oplog last event time: Tue Dec 16 2014 15:56:07 GMT+0800 (CST)
now: Tue Dec 16 2014 15:56:57 GMT+0800 (CST)

haowu:SECONDARY> db.printSlaveReplicationInfo()
source: 172.16.10.40:27017
syncedTo: Tue Dec 16 2014 15:56:07 GMT+0800 (CST)
= 55 secs ago (0.02hrs)
source: 172.16.10.22:27017
no replication info, yet. State: ARBITER

只要 oplog last event time 和 syncedTo 一致,就代表没有同步延迟

五、备份和恢复操作:
1.备份:mongodump
mongodump使用的是普通的查询机制(无锁定),所以产生的备份不一定是服务器数据的实时快照,即当运行备份同时有客户端写入数据,该数据就不会备份到磁盘,备份时的查询会对其他客户端的性能产生不利的影响。即可对运行的数据库使用,也可对未运行的数据使用。
如果想要获取一致的备份,可以使用命令 db.fsyncLock() 给数据库加锁,阻塞写操作,备份结束后使用命令 db.fsyncUnlock() 解锁。
例:
备份数据库:
mongodump -d test -o ./backup

2.恢复:mongorestore
使用 mongorestore 命令来恢复数据,数据源是 mongodump 命令产生的文件
恢复所有数据:
./mongorestore –drop /opt/backup/mongodb
恢复数据库:
./mongorestore -d test –drop /opt/backup/mongodb/test/
恢复集合:
./mongorestore -d test -c wu –drop /opt/backup/mongodb/test/wu.bson

六、导入和导出操作:
1.导出:mongoexport
使用mongoexport命令导出的数据是文本模式,用户可读的。
导出的粒度就是集合,也只是集合,不能导出某个数据库。
导出的数据格式可以有三种:json,csv,jsonArray。
使用最多的就是json和csv。
例:
mongoexport –port 27018 -d test -c test -o test.json

2.导入:mongoimport
mongoimport命令也只能导入集合。
默认导入json格式的文件。
如果是csv,需要使用–type来指定,并配合–headerline参数。
例:
mongoimport -d test -c test –drop –type csv –headerline –file ~/test.csv

分布式文档存储数据库:MongoDB

MongoDB官网:http://www.mongodb.org/

       MongoDB:简称分布式文档存储数据库
 
1.概述:
     MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。
     Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引
     它的特点是高性能、易部署、易使用,存储数据非常方便。
2.主要功能特性有:
     (1).面向集合存储,易存储对象类型的数据。
     (2).模式自由。
     (3).支持动态查询。
     (4).支持完全索引,包含内部对象。
     (5).支持查询。
     (6).支持复制和故障恢复
     (7).使用高效的二进制数据存储,包括大型对象(如视频等)。
     (8).自动处理碎片,以支持云计算层次的扩展性
     (9).支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
     (10).文件存储格式为BSON(一种JSON的扩展)
     (11).可通过网络访问
3.相关名词解释:
      面向集合(Collenction-Orented):
             意思是数据被分组存储在数据集中,被称为一个集合(Collenction)。
             每个 集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档
             集合的概念类似关系型数据库(RDBMS)里的表(table),不同的是它不需要定 义任何模式(schema)。
      模式自由(schema-free):
             意味着对于存储在mongodb数据库中的文件,我们不需要知道它的任何结构定义。
             如果需要的话,你完全可以把不同结构的文件存储在同一个数据库里。
             存储在集合中的文档,被存储为键-值对的形式。
             用于唯一标识一个文档,为字符串类型,而则可以是各中复杂的文件类型
             我们称这种存储形式为BSON(Binary Serialized dOcument Format)。
         注:MongoDB服务端可运行在Linux、Windows或OS X平台,支持32位和64位应用,默认端口为27017。
                推荐运行在64位平台,因为MongoDB在32位模式运行时支持的最大文件尺寸为2GB。
                MongoDB把数据存储在文件中(默认路径为:/data/db),为提高效率使用内存映射文件进行管理。