Mongodb 2.6.1 集群复制(Replica Set)


Replica Set

中文翻译叫做副本集,不过我并不喜欢把英文翻译成中文,总是感觉怪怪的。其实简单来说就是集群当中包含了多份数据,保证主节点挂掉了,备节点能继续提供数据服务,提供的前提就是数据需要和主节点一致。如下图:

image

  • Mongodb(M)表示主节点,Mongodb(S)表示备节点,Mongodb(A)表示仲裁节点。主备节点存储数据,仲裁节点不存储数据。客户端同时连接主节点与备节点,不连接仲裁节点。
  • 默认设置下,主节点提供所有增删查改服务,备节点不提供任何服务。但是可以通过设置使备节点提供查询服务,这样就可以减少主节点的压力,当客户端进行数据查询时,请求自动转到备节点上。这个设置叫做Read Preference Modes,同时Java客户端提供了简单的配置方式,可以不必直接对数据库进行操作。
  • 仲裁节点是一种特殊的节点,它本身并不存储数据,主要的作用是决定哪一个备节点在主节点挂掉之后提升为主节点,所以客户端不需要连接此节点。这里虽然只有一个备节点,但是仍然需要一个仲裁节点来提升备节点级别。

安装3台mongodb

使用两台服务器,主安装在一台服务器,备和仲裁安装在一台服务器.主,备mongodb使用apt-get安装,仲裁使用源码安装到/usr/local/目录

分别修改配置文件

主:
dbpath=/home/mongodb
logpath=/var/log/mongodb/mongod.log
directoryperdb=true
logappend=true
replSet=ivgmongod
port=27017
oplogSize=2048
fork=true
noprealloc=true
keyFile=/etc/mongod.key

备:
dbpath=/home/mongodb
logpath=/var/log/mongodb/mongod.log
directoryperdb=true
logappend=true
replSet=ivgmongod
port=27017
oplogSize=2048
fork=true
noprealloc=true
keyFile=/etc/mongod.key

仲裁:
dbpath=/usr/local/mongodb/data
logpath=/usr/local/mongodb/log/mongod.log

directoryperdb=true
logappend=true
replSet=ivgmongod
port=27018
oplogSize=2048
fork=true
noprealloc=true
keyFile=/etc/mongod.key

启动

主,备:/usr/bin/mongod --config /etc/mongod.conf
仲裁启动:/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/etc/mongod.conf --rest
               (-rest:表示启动mongodb 自带 http REST API)

mongodb 自带http REST API说明
MongoDB默认会开启一个HTTP协议的端口提供REST的服务,这个端口是你Server端口加上1000,
比如你的Server端口为27017,那么这个HTTP端口就是28017,默认的HTTP端口是数据库状态页面,
可以使用 --rest mongod启动参数来使用更多功能。
mongodb自带的REST,不支持 增、删、改,同时也不支持 权限认证,10gen自己也说mongodb提
供的认证很简单;要想使以上这些支持可以考虑用 sleepy.mongoose。
支持的操作:
列出databaseName数据库中的collectionName集合下的所有数据:
http://127.0.0.1:28017/databaseName/collectionName/
给上面的数据集添加一个limit参数限制返回10条
http://127.0.0.1:28017/databaseName/collectionName/?limit=-10
给上面的数据加上一个skip参数设定跳过5条记录
http://127.0.0.1:28017/databaseName/collectionName/?skip=5
同时加上limit限制和skip限制
http://127.0.0.1:28017/databaseName/collectionName/?skip=5&limit=10
按条件{a:1}进行结果筛选(在关键字filter后面接上你的字段名)
http://127.0.0.1:28017/databaseName/collectionName/?filter_a=1
加条件的同时再加上limit限制返回条数
http://127.0.0.1:28017/databaseName/collectionName/?filter_a=1&limit=-10
执行任意命令
如果你要执行特定的命令,可以通过在admin.$cmd上面执行find命令,同样的你也可以在REST API里实现,如下,执行{listDatabase:1}命令:
http://localhost:28017/admin/$cmd/?filter_listDatabases=1&limit=1
查询集合的记录个数:http://host:port/db/$cmd/?filter_count=collection&limit=1
配置参数解释:
dbpath:数据存放目录
logpath:日志存放路径
pidfilepath:进程文件,方便停止mongodb
directoryperdb:为每一个数据库按照数据库名建立文件夹存放
logappend:以追加的方式记录日志
replSet:replica set的名字
bind_ip:mongodb所绑定的ip地址
port:mongodb进程所使用的端口号,默认为27017
oplogSize:mongodb操作日志文件的最大大小。单位为Mb,默认为硬盘剩余空间的5%
fork:以后台方式运行进程
noprealloc:不预先分配存储
mongod.key:验证文件.每台机器里的验证文件内容要一致:openssl rand -base64 741 -out /etc/mongod.key;chown mongodb:mongodb /etc/mongod.key 

配置主,备,仲裁节点

连接登陆认证任意一台mongo(认证已经配置好.)
use admin  
cfg={ _id:"ivgmongod", members:[ {_id:0,host:'s07-center01-int:27017',priority:9}, {_id:1,host:'s13-center02-int:27017',priority:1}, {_id:2,host:'s13-center02-int:27018',arbiterOnly:true}] };
rs.initiate(cfg)
 cfg是可以任意的名字,当然最好不要是mongodb的关键字,conf,config都可以。最外层的_id表示replica set的名字,members里包含的是所有节点的地址以及优先级。优先级最高的即成为主节点,即这里的10.10.148.130:27017。特别注意的是,对于仲裁节点,需要有个特别的配置——arbiterOnly:true。这个千万不能少了,不然主备模式就不能生效。 配置的生效时间根据不同的机器配置会有长有短,配置不错的话基本上十几秒内就能生效,有的配置需要一两分钟。如果生效了,执行rs.status()命令会看到有如下行信息: "ok" : 1 .如果配置正在生效,其中会包含如下信息:"stateStr" : "RECOVERING"  
状态查询命令:
    rs.status()
   db.printReplicationInfo()
   db.printSlaveReplicationInfo()
数据查询:
    db.server.find().count()

测试

一是往主节点插入数据,能从备节点查到之前插入的数据。
二是停掉主节点,备节点能变成主节点提供服务。
三是恢复主节点,备节点也能恢复其备的角色,而不是继续充当主的角色。
二和三都可以通过rs.status()命令实时查看集群的变化。

Sharding(分片)

和Replica Set类似,都需要一个仲裁节点,但是Sharding还需要配置节点和路由节点。就集群搭建方式来说,这种是最复杂的。部署图如下:

image