转:MongoDB Replica搭建和测试

环境:

目录结构

/data

|--conf

    |--config.js

    |--node1.cnf

    |--node1.cnf

    |--node1.cnf

|--db

    |--node1

    |--node2

    |--node2

|--key

    |--node1

    |--node2

    |--node3

|--log

    |--node1.log

    |--node2.log

    |--node3.log

|--run

    |--runconfig.sh

   |--runnode1.sh

   |--runnode2.sh

   |--runnode3.sh

举几个文件,其他类似:

node1.cnf:

replSet=shard1
#keyFile=/home/madding/output/mongodb/replica_set/key/r0
dbpath=/home/madding/output/mongodb/replica_set/data/r0
logpath=/home/madding/output/mongodb/replica_set/log/r0.log
port=10240

config.js:

var config_rs1={
    _id:'shard1',
    members:[
        {_id:1, host:'192.168.1.100:27011', priority:1},
        {_id:2, host:'192.168.1.100:27012'},
        {_id:3, host:'192.168.1.100:27013'}]
}

rs.initiate(config_rs1);

rs.slaveOk();

printjson('status info:');
printjson(rs.status());

printjson('result info: ');
printjson(rs.isMaster());
key/node1
ANKDIUOJHKJDLKFJHDOUDOJFKLDJ

随便复杂,保证node1,node2,node3一致即可

runconfig.sh:

#!/bin/bash
MONGODB_HOME=~/mongodb
$MONGODB_HOME/bin/mongo ../conf/config.js --port 27011 --quiet
exit

runnode1:

#!/bin/bash
MONGODB_HOME=~/mongodb
$MONGODB_HOME/bin/mongod -f ../conf/node1.cnf --logappend --fork
exit

运行顺序:

1.分别启动runnode1,runnode2,runnode3 ps看下进程是否都启动成功

2.运行runconfig 如果信息显示正常,说明已经建立成功。

测试场景:

1.kill node1进程:

    mongo客户端:

        自动切换primary; 

        node1客户端可查询,不可插入;

    java驱动:

        采用集群连接,发现可正常查询,插入,业务不受影响  

说明:如果是kill -9方式,可能会导致mongo对应实例下的lock文件还在,删除掉后才能重启,要不然会重启失败

2.恢复node1进程:

   node1 mongod数据同步

  node1没有切换为primary ,主从维持在kill时的水平

3.当两个mongod实例(包括SECONDARY和PRIMARY组合)挂掉,是否可对外提供服务:

    mongo客户端:指定端口的可以连接,但是由于两个挂了导致没办法把SECONDARY切换到PRIMARY,只能查询不能修改

    java驱动:根据现象提示

Exception in thread "main" com.mongodb.MongoException: can't find a master
	at com.mongodb.DBTCPConnector.checkMaster(DBTCPConnector.java:436)
	at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:211)
	at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:305)
	at com.mongodb.DBCursor._check(DBCursor.java:369)
	at com.mongodb.DBCursor._hasNext(DBCursor.java:504)
	at com.mongodb.DBCursor.hasNext(DBCursor.java:529)
	at ReplicaSets.main(ReplicaSets.java:57)

也就是此时没办法对外提供服务,虽然还有一个SECONDARY存活

注:如果最后一个保留下来的是PRIMARY,虽然短暂提供服务,但是一会儿后就自动切换为SECONDARY。

4.当两个实例挂掉,重启一个实例,是否可对外提供服务:

    mongo客户端:此时自动切换一台为PRIMARY,查询操作正常

   java驱动:只要设置自动重连,等待几秒即可恢复正常

注:发现在一台机器中操作,过程中出现一个实例把两一个socket端口占用现象,主要是因为web监控的端口,1000间隔。

       建议启动是先启动初始的PRIMARY最后启动

5.两个mongo实例是否可构建replica sets:

基于以上分析,虽然两个能构建复制集,但是由于一个挂掉,另一个自动切换为SECONDARY,做不到热备,因此没有价值。

6.三台同时挂掉,重启是否正常:

三台挂掉,重启后,会出现其中一台recovering,但是之后三台状态就能恢复正常,一个primary,两个secondary

转载原文地址不详,见者请告知。

猜你喜欢

转载自xiaonanforever.iteye.com/blog/2018918