@ Replica set 多服务器 高可用 配置 (添加删除节点方法)

一: 配置所有节点/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 脚本启动,或者通过配置文件启动
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值