一: 配置所有节点/etc/hosts 下
二: 配置好时间同步服务器 /etc/ntp.conf , /etc/sysconfig/ntpd 文件配置
三: 配置单独的mongodb 用户,并设置其权限组等
四: 创建对应的db_soft, data, log,等目录
mkdir -pv /mongodb/{data,log}
实战MongoDB
Master-Slave
MongoDB支持不同服务之间的异步的数据复制,来实现failover(故障转移,故障切换,故障恢复) and redundancy(数据冗余)。
同一时间,只有一个服务节点(primary或者master)支持写入。
MongoDB支持两种复制的模式:
1. Master/Slave,主从复制,角色包括master和slave。
2. Replica Set,复制集复制,角色包括primary和secondary。
Mongodb replica set,也就是复制集复制。
- replica set可以实现自动的failover和自动的recovery。
- replica set由两个或者更多的节点组成,实现彼此的复制。
- replica set自动选择primary节点,没有一个节点是固定的primary。
- mongos会自动发现一个replica set的primary节点发生变化,并将写操作发送给这个新的primary节点。
通常用于下面几个场景
- 数据冗余。
- 自动failover,提供高可用性的服务。
- 分散读的负载。
- 简化维护(相对于master-slave来说)。
- 灾难恢复。
首先还是启动mongod,用于replica set的参数有两个:
--replSet <setname>,复制集的名称。
--oplogSize <MB>,操作日志的大小,单位为MB。
这回我们在ubuntu下面配置replica set,先启动两个mongod节点。
以下测试,先以2个节点 搭建,最后添加一个节点:
EG:
一:
服务器地址:(当然也可以在同一台服务器下,通过不同的端口控制)
mongodb_01 : 192.168.3.24 hostname => dominic4
mongodb_02: 192.168.3.25 hostname => dominic5
mongodb_03: 192.168.3.26 hostname => dominic6
对应的 路径:
/cifpay/mong_db01 --dbpath
/cifpay/mong_log/log.dbf --logpath
启动方式:
----primary
[root@dominic4 bin]# ./mongod -dbpath /cifpay/mong_db01 --logpath /cifpay/mong_log/log.dbf --replSet shard01 --port 10001 --bind_ip 192.168.3.24 --fork (/* 参数可以参照 《1 MongoDB基本命令使用》 去完善 */》)
----secondary
[root@dominic5 bin]# ./mongod -dbpath /cifpay/mong_db02 --logpath /cifpay/mong_log/log.dbf --replSet shard01 --port 10001 --bind_ip 192.168.3.25 --fork
-------192.168.3.26 是在24,25 完成replica set 完成之后,再添加进来的 secondary
[root@dominic6 bin]# ./mongod -dbpath /cifpay/mong_db03 --logpath /cifpay/mong_log/log.dbf --replSet shard01 --port 10001 --bind_ip 192.168.3.26 --fork
你会注意到,上面两个mongod的启动参数replSet指定了相同的值shard1,也就是两个个mongod节点处于同一个replica set中。
二:
Replica Set的初始化
光启动了两个个mongod节点,还不能提供任何的服务,这时候你使用mongo连接之后,进行db.book.insert会提示你no master,也就是说没有primary节点,所以他不知道往哪一个节点写入数据。
在启动了两个个mongod节点之后,需要进行初始化。
首先用mongo连接到任意一个mongod节点,然后执行下面的命令。
[root@dominic4 bin]# ./mongo --port 10001 --host 192.168.3.24
MongoDB shell version: 2.4.10
connecting to: 192.168.3.24:10001/test
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
http://docs.mongodb.org/
Questions? Try the support group
http://groups.google.com/group/mongodb-user
>cfg={_id:'shard01',members:[{_id:0,host:'192.168.3.24:10001'},{_id:1,host:'192.168.3.25:10001'}]}
{
"_id" : "shard01",
"members" : [
{
"_id" : 0,
"host" : "192.168.3.24:10001"
},
{
"_id" : 1,
"host" : "192.168.3.25:10001"
}
]
}
> rs.initiate(cfg) / * 出现下面的提示信息就代表成功了,如果没有成功,可以google一下错误提示,会找到很多的答案的。 */
{
"info" : "Config now saved locally. Should come online in about a minute.",
"ok" : 1
}
shard01:STARTUP2> rs.status() /* 通过 上命令之后, 标头会变成 这样的标注:shard01:STARTUP2 ,*/
{
"set" : "shard01",
"date" : ISODate("2014-07-10T05:44:05Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" : "192.168.3.24:10001",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 8817,
"optime" : Timestamp(1404970906, 1),
"optimeDate" : ISODate("2014-07-10T05:41:46Z"),
"self" : true
},
{
"_id" : 1,
"name" : "192.168.3.25:10001",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 139,
"optime" : Timestamp(1404970906, 1),
"optimeDate" : ISODate("2014-07-10T05:41:46Z"),
"lastHeartbeat" : ISODate("2014-07-10T05:44:04Z"),
"lastHeartbeatRecv" : ISODate("2014-07-10T05:44:04Z"),
"pingMs" : 0,
"syncingTo" : "192.168.3.24:10001"
}
],
"ok" : 1
}
可以查看replica set的状态,包括名称,时间,当前登录的mongod是primary还是secondary,以及成员的信息等。
在replica set的信息中,其中重要的是:
- myState的值,如果是1代表当前登录的是primary;如果是2代表当前登录的是secondary。
成员信息中包括地址,健康状态,是primary还是secondary等。
成员信息中比较重要的是
- state:1表示该host是当前可以进行读写,2:不能读写
- health:1表示该host目前是正常的,0:异常
这时候登录primary的mongod,插入一条数据。
shard01:PRIMARY> db.dominic.insert({'titile':'computer'})
shard01:PRIMARY> db.dominic.find()
{ "_id" : ObjectId("53be30fd0c6364aa43934dc8"), "titile" : "computer" }
通过日志查询,发现有复制行为:
三: 启动同步查询
这时候登录secondary,use test,db.book.find(),可以报错了。
[root@dominic5 bin]# ./mongo --port 10001 --host 192.168.3.25
shard01:SECONDARY> db.dominic.find()
error: { "$err" : "not master and slaveOk=false", "code" : 13435 }
没有关系,在secondary读取数据还需要我们做最后的一步,在需要读取数据的secondary上执行。
shard01:SECONDARY> rs.slaveOK()
这时候再次db.book.find(),正常显示结果了,没有问题了。
四 :
添加节点
[root@dominic6 bin]# ./mongod -dbpath /cifpay/mong_db03 --logpath /cifpay/mong_log/log.dbf --replSet shard01 --port 10001 --bind_ip 192.168.3.26 --fork
连接primary节点,执行下面的命令
。
1. rs.add('192.168.3.26:10001')
2. rs.addArb('192.168.3.26:10001')
3. //重新配置
4. rs.reconfig(rs.conf()) --使之生效
五,故障测试
前面我说过,mongodb replica set有故障转移功能,下面就模拟一下,这个过程
1,故障转移
1.1,关闭主服务器
1.
[root@localhost mongodb]# ps aux |grep mongod //查看所有的mongod
2.
root 16977 0.2 1.1 3153692 44464 ? Sl 04:31 0:02 mongod -f /etc/mongodb.conf
3.
root 17032 0.2 1.1 3128996 43640 ? Sl 04:31 0:02 mongod -f /etc/mongodb_2.conf
4.
root 17092 0.2 0.9 3127976 38324 ? Sl 04:31 0:02 mongod -f /etc/mongodb_3.conf
5.
root 20400 0.0 0.0 103248 860 pts/2 S+ 04:47 0:00 grep mongod
6.
[root@localhost mongodb]# kill 16977 //关闭主服务器进程
7.
[root@localhost mongodb]# ps aux |grep mongod
8.
root 17032 0.2 1.1 3133124 43836 ? Sl 04:31 0:02 mongod -f /etc/mongodb_2.conf
9.
root 17092 0.2 0.9 3127976 38404 ? Sl 04:31 0:02 mongod -f /etc/mongodb_3.conf
10.
root 20488 0.0 0.0 103248 860 pts/2 S+ 04:47 0:00 grep mongod
1.2 在主库执行命令
1.
repmore:PRIMARY> show dbs;
2.
Tue Dec 17 04:48:02.392 DBClientCursor::init call() failed
1.3 故障恢复,可以重启一下 mongod 进程
config = {_id:"shard01",members:[{_id:0,host:'192.168.3.26:10001',priority:2},{_id:1,host:'192.168.3.27:10001',priority:1}]};
----- (26为主,27为备)
PS: 初始化时,不指定priority默认id 0 为primary
生产库上默认使用 shell 脚本启动,或者通过配置文件启动