在自己的虚拟机环境中,对MongoDB复制集进行了测试,整个过程如下:
MongoDB复制集简介
MongoDB支持在多个机器中通过异步复制到达故障转移和实现冗余。多个机器中同一时刻只有一台用于写操作。正是由于这个情况,为MongoDB提供了数据一致性的保障。担当primary角色的机器能把读操作分发给slave。
MongoDB高可用分两种:
Master-Slave主从复制:只需要在某一个服务启动时加上 -master参数,而另一个服务加上-slave和 -source参数,即可实现同步。这种方式与MySQL数据库的 master-slave复制方式非常类似,但MongoDB新版本已经不推荐此方案。
Replica Sets复制集:MongoDB在1.6版本的基础上开发了新功能replica set,这个功能更强大一些,增加了故障自动切换和自动修复成员节点,各个DB之间数据完全一致,大大降低了维护成本。auto shared已经明确说明不支持replication Paris,建议使用replica set故障切换完全自动。
replica sets的结构非常类似一个集群,和集群实现的作用是一样的,其中一个节点出现故障,其他节点马上回将业务接过来而无需停机操作。
复制集的架构如下:
MongoDB复制集规划
对于MongoDB的replica Sets复制集,也需要有一个规划:
replSet 复制集名称: rs1
MongoDB数据库安装安装路径为:/usr/local/mongodb/
复制集成员IP与端口:
节点1: localhost:28010 (默认的primary节点)
节点2: localhost:20811
节点3: localhost:28012
复制集各节点的数据文件,日志文件,私钥文件路径:
节点1: /data/data/r0 , /data/log/r0.log , /data/key/r0
节点2: /data/data/r1 , /data/log/r1.log , /data/key/r1
节点3: /data/data/r2 , /data/log/r2.log , /data/key/r2
场景一:部署ReplicaSets
MongoDB的复制集配置步骤还是比较简单的,整体上说,就是准备好各个节点的数据文件、日志文件、私钥文件,然后带参数启动实例,配置replica set内容并初始化就可以了。
1) 创建数据文件存储路径
mkdir -p /data02/mongors/data/r0
mkdir -p /data02/mongors/data/r1
mkdir -p /data02/mongors/data/r2
2)创建日志文件路径
mkdir -p /data02/mongors/log
3)创建主从key文件
用于标识集群的私钥的完整路径,如果各个实例的key file内容不一致,程序将不能正常使用
mkdir -p /data02/mongors/key
echo "this is rs1 super secret key" > /data02/mongors/key/r0
echo "this is rs1 super secret key" > /data02/mongors/key/r1
echo "this is rs1 super secret key" > /data02/mongors/key/r2
chmod 600 /data02/mongors/key/r*
4)启动3个实例
依次添加启动参数,其中三个MongoDB实例:
/usr/local/mongodb/bin/mongod --replSet rs1 --keyFile /data02/mongors/key/r0 --fork --port 28010 --dbpath /data02/mongors/data/r0 --logpath=/data02/mongors/log/r0.log --logappend
/usr/local/mongodb/bin/mongod --replSet rs1 --keyFile /data02/mongors/key/r1 --fork --port 28011 --dbpath /data02/mongors/data/r1 --logpath=/data02/mongors/log/r1.log --logappend
/usr/local/mongodb/bin/mongod --replSet rs1 --keyFile /data02/mongors/key/r2 --fork --port 28012 --dbpath /data02/mongors/data/r2 --logpath=/data02/mongors/log/r2.log --logappend
注:启动命令的参数分别为,mongod为主启动命令, replSet指定复制集名称为rs1,keyfile指定公钥文件 ,fork指定启动方式为deamo后台启动;port指定端口号,dbpath指定数据文件目录,logpath指定日志文件,logappend指定错误日志为日志追加模式;
实例启动过程如下:
#
#/usr/local/mongodb/bin/mongod --replSet rs1 --keyFile /data02/mongors/key/r0 --fork --port 28010 --dbpath /data02/mongors/data/r0 --logpath=/data02/mongors/log/r0.log --logappend
about to fork child process, waiting until server is ready for connections.
forked process: 10984
child process started successfully, parent exiting
#
#/usr/local/mongodb/bin/mongod --replSet rs1 --keyFile /data02/mongors/key/r1 --fork --port 28011 --dbpath /data02/mongors/data/r1 --logpath=/data02/mongors/log/r1.log --logappend
about to fork child process, waiting until server is ready for connections.
forked process: 11030
child process started successfully, parent exiting
#
#/usr/local/mongodb/bin/mongod --replSet rs1 --keyFile /data02/mongors/key/r2 --fork --port 28012 --dbpath /data02/mongors/data/r2 --logpath=/data02/mongors/log/r2.log --logappend
about to fork child process, waiting until server is ready for connections.
forked process: 11076
child process started successfully, parent exiting
#
通过进程和端口,验证启动状态:
ps -ef|grep mongo
netstat -tunlp | grep 28010
netstat -tunlp | grep 28011
netstat -tunlp | grep 28012
验证结果如下:
#ps -ef |grep mongo
root 5715 1 0 Apr09 ? 00:11:50 mongod --dbpath=/data02/mongodb/db/ --logpath=/data02/mongodb/logs/mongodb.log --fork
root 10984 1 0 14:23 ? 00:00:00 /usr/local/mongodb/bin/mongod --replSet rs1 --keyFile /data02/mongors/key/r0 --fork --port 28010 --dbpath /data02/mongors/data/r0 --logpath=/data02/mongors/log/r0.log --logappend
root 11030 1 0 14:23 ? 00:00:00 /usr/local/mongodb/bin/mongod --replSet rs1 --keyFile /data02/mongors/key/r1 --fork --port 28011 --dbpath /data02/mongors/data/r1 --logpath=/data02/mongors/log/r1.log --logappend
root 11076 1 0 14:23 ? 00:00:00 /usr/local/mongodb/bin/mongod --replSet rs1 --keyFile /data02/mongors/key/r2 --fork --port 28012 --dbpath /data02/mongors/data/r2 --logpath=/data02/mongors/log/r2.log --logappend
root 11121 10769 0 14:23 pts/1 00:00:00 grep mongo
#
#
#netstat -tunlp |grep 28010
tcp 0 0 0.0.0.0:28010 0.0.0.0:* LISTEN 10984/mongod
#
#netstat -tunlp | grep 28011
tcp 0 0 0.0.0.0:28011 0.0.0.0:* LISTEN 11030/mongod
#
#netstat -tunlp | grep 28012
tcp 0 0 0.0.0.0:28012 0.0.0.0:* LISTEN 11076/mongod
#
5)配置及初始化 Replica Sets
登录到primary服务器上:
# /usr/local/mongo/bin/mongo -port 28010
配置复制集:
> config = {_id: 'rs1', members: [
{_id: 0, host: 'localhost:28010',priority:1},
{_id: 1, host: 'localhost:28011'},
{_id: 2, host: 'localhost:28012'}]
}
{
"_id" : "rs1",
"members": [
{
"_id": 0,
"host" : "localhost:28010"
},
{
"_id": 1,
"host" : "localhost:28011"
},
{
"_id": 2,
"host" : "localhost:28012"
}
]
}
初始化配置,使上面的配置生效:
> rs.initiate(config);
实际操作过程如下:
#/usr/local/mongodb/bin/mongo -port 28010
MongoDB shell version: 2.6.5
connecting to: 127.0.0.1:28010/test
>
> show databases;
admin (empty)
local 0.078GB
>
> show collections;
2015-04-13T14:26:59.980+0800 error: { "$err" : "not master and slaveOk=false", "code" : 13435 } at src/mongo/shell/query.js:131
>
> config = {_id: 'rs1', members: [
... {_id: 0, host: 'localhost:28010',priority:1},
... {_id: 1, host: 'localhost:28011'},
... {_id: 2, host: 'localhost:28012'}]
... }
{
"_id" : "rs1",
"members" : [
{
"_id" : 0,
"host" : "localhost:28010",
"priority" : 1
},
{
"_id" : 1,
"host" : "localhost:28011"
},
{
"_id" : 2,
"host" : "localhost:28012"
}
]
}
>
> rs.initiate(config);
{
"info" : "Config now saved locally. Should come online in about a minute.",
"ok" : 1
}