MongoDB 支持在多个机器中通过异步复制达到故障转移和实现冗余。多机器中同一时刻只 有一台是用于写操作。正是由于这个情况,为 MongoDB 提供了数据一致性的保障。担当 Primary 角色的机器能把读操作分发给slave。
MongoDB 高可用可用分两种 :
Master-Slave 主从复制 :只需要在某一个服务启动时加上–master 参数, 而另一个服务加上–slave 与–source参数, 即可实现同步。MongoDB 的最新版本已不再推荐此方案。
Replica Sets 复制集 :MongoDB 在 1.6 版本对开发了新功能 replica set,这比之前的 replication 功能要强大一 些,增加了故障自动切换和自动修复成员节点,各个 DB 之间数据完全一致,大大降低了维 护成功。auto shard已经明确说明不支持 replication paris,建议使用 replica set,replica set 故障切换完全自动。
![Replica Sets (复制集) - sheperd - 牧羊人的博客](http://img0.ph.126.net/3WKAxXTCv8UJQe1He1V3YA==/1295347842839444910.png)
Replica Sets 的结构非常类似一个集群 ,其中一个节点如果出现故障, 其它节点马上会将业务 接过来而无须停机操作。
1 部署 Replica Sets
1.1创建数据文件存储路径
分别创建三个存储路径
mkdir -p /data/data/r0
mkdir -p /data/data/r1
mkdir -p /data/data/r2
1.2 创建日志路径
mkdir -p /data/log
1.3 创建主从 key 文件
创建主从 key 文件,用于标识集群的私钥的完整路径,如果各个实例的 key file 内容不一 致,程序将不能正常用。
mkdir -p /data/key
echo "this is rs1 super secret key" > /data/key/r0
echo "this is rs1 super secret key" > /data/key/r1
echo "this is rs1 super secret key" > /data/key/r2
chmod 600 /data/key/r* 权限不正确,会出现too open的异常。
1.4 启动 3 个实例
APP_PATH=`pwd`
echo $APP_PATH
KEY_PATH=$APP_PATH/replicatset/keyfile
DATA_PATH=$APP_PATH/replicatset
LOG_PATH=$APP_PATH/logs
mongod --replSet rs1 --keyFile "$KEY_PATH/key0" --fork --port 28010 --dbpath "$DATA_PATH/data0" --logpath "$LOG_PATH/r0.log" --logappend
mongod --replSet rs1 --keyFile "$KEY_PATH/key1" --fork --port 28011 --dbpath "$DATA_PATH/data1" --logpath "$LOG_PATH/r1.log" --logappend
mongod --replSet rs1 --keyFile "$KEY_PATH/key2" --fork --port 28012 --dbpath "$DATA_PATH/data2" --logpath "$LOG_PATH/r2.log" –logappend
1.5 配置及初始化 Replica Sets
config_rs1 = {_id: 'rs1', members: [{_id: 0, host: 'localhost:28010', priority:1},{_id: 1, host: 'localhost:28011'},{_id: 2, host: 'localhost:28012'}]}
rs.initiate(config_rs1);
1.6 查看复制集状态
用rs.status() 查看复制集状态,还可以用 isMaster 查看 Replica Sets 状态
2 主从操作日志 oplog
MongoDB 的 Replica Set 架构是通过一个日志来存储写操作的,这个日志就叫做”oplog”。 oplog.rs 是一个固定长度的 capped collection,它存在于”local”数据库中,用于记录 Replica Sets 操作日志。在默认情况下,对于 64位的 MongoDB,oplog 是比较大的,可以达到 5%的磁 盘空间。oplog 的大小是可以通过 mongod 的参数”—oplogSize”来改变 oplog 的日志大小。
![Replica Sets (复制集) - sheperd - 牧羊人的博客](http://img2.ph.126.net/Bu_jnNJWUmVTkjoaBqmG-w==/2528489715808829752.png)
ts: 某个操作的时间戳
op: 操作类型,如下:
i: insert
d: delete
u: update
ns: 命名空间,也就是操作的 collection name
o: document 的内容
查看 master 的 oplog 元数据信息
![Replica Sets (复制集) - sheperd - 牧羊人的博客](http://img3.ph.126.net/aOgos8w6WH66BPkg-arghQ==/3106920792949226343.png)
configured oplog size:配置的 oplog 文件大小
log length start to end:oplog 日志的启用时间段
oplog first event time:第一个事务日志的产生时间
oplog last event time:最后一个事务日志的产生时间
now:现在的时间
查看 slave 的同步状态:
![Replica Sets (复制集) - sheperd - 牧羊人的博客](http://img9.ph.126.net/_npsgepaWSszdqlPlOP7wA==/1000362067246678229.png)
字段说明 :
source:从库的 IP 及端口
syncedTo:目前的同步情况,延迟了多久等信息
3 主从配置信息
在 local 库中不仅有主从日志 oplog 集合 ,还有一个集合用于记录主从配置信息 system.replset
db.system.replset.find()Replica Sets 的配置信息,也可以在任何一个成员实例上执行 rs.conf()来查看配置信息
4 管理维护 Replica Sets
4.1 读写分离
让从库可以读,分担主库的压力 ,在slave上执行db.getMongo().setSlaveOk() 即可。
如果不设置,在slave上查询会报异常。
4.2 故障转移
复制集比传统的 Master-Slave 有改进的地方就是他可以进行故障的自动转移, 如果我们停掉 复制集中的一个成员,那么剩余成员会再自动选举出一个成员,做为主库。
4.3 增减节点
4.3.1 增加节点
rs.add("localhost:28013") ,使用rs.status()查看下rs的状态。
4.3.2 减少节点
rs.remove("localhost:28014")
PS: http://sheperd.blog.163.com/blog/static/195255119201191233517393/