mongodb集群搭建(双机)

来源:互联网 发布:单例设计模式 java 编辑:程序博客网 时间:2024/05/23 01:15


搭建数据库集群从未如此简单过, 想起做rac的时候, raid, lv, vg, 双机互信, 建库等一大堆弄下来, 在完全不出错的情况下, 都要接近6个小时.


环境准备.

a). 操作系统, centos6.5 x86.64.

b). mongodb: mongodb-linux-x86_64-2.6.5.gz


解压好mongodb之后就可以直接开始建集群了.

1. 先创建6个文件夹.

/usr/local/mongodb-linux-x86_64-2.6.5/gmlogx/dat0

/usr/local/mongodb-linux-x86_64-2.6.5/gmlogx/dat1

/usr/local/mongodb-linux-x86_64-2.6.5/gmlogx/dat2

/usr/local/mongodb-linux-x86_64-2.6.5/gmlogx/log0

/usr/local/mongodb-linux-x86_64-2.6.5/gmlogx/log1

/usr/local/mongodb-linux-x86_64-2.6.5/gmlogx/log2

2. 因为只有一台机器, 所以使用了三个不同的端口, 开三个console, 依次运行下面的三条命令.

mongod --replSet gmlogx --dbpath=/usr/local/mongodb-2.6.5/gmlogx/dat0 --port 10000 --oplogSize=512 \
--logpath=/usr/local/mongodb-linux-x86_64-2.6.5/gmlogx/log0/log.log --logappend

mongod --replSet gmlogx --dbpath=/usr/local/mongodb-2.6.5/gmlogx/dat1 --port 10001 --oplogSize=512 \
--logpath=/usr/local/mongodb-linux-x86_64-2.6.5/gmlogx/log1/log.log --logappend

mongod --replSet gmlogx --dbpath=/usr/local/mongodb-2.6.5/gmlogx/dat2 --port 10002 --oplogSize=512 \
--logpath=/usr/local/mongodb-linux-x86_64-2.6.5/gmlogx/log2/log.log --logappend

3. 部分参数解释: 

--replSet gmlogx, 指定了集群的名称gmlogx.

--port 10000, 指的是数据库节点的服务端口为10000. 

--oplogSize=512, 指的是给mongdb的操作日志缓冲区大小, 单位是M, 即512M. 这里有个小坑. 如果不指定oplogSize的话, 两个数据库节点

就占用了90G磁盘, 如下图.


4. 我们的机器ip是192.168.1.117, 连接上其中一个接点, 依次键入下面的命令.

[root@xzw gmlogx]# mongo 192.168.1.117:10000MongoDB shell version: 2.6.5connecting to: 192.168.1.117:10000/test> var cfg = {_id: "gmlogx", members: []}> cfg.members.push({_id: 0, host: "192.168.1.117:10000"});1> cfg.members.push({_id: 1, host: "192.168.1.117:10001"});2> cfg.members.push({_id: 2, host: "192.168.1.117:10002", arbiterOnly: true});3> rs.initiate(cfg);{"info" : "Config now saved locally.  Should come online in about a minute.","ok" : 1}>
上面的arbiterOnly: true, 表示这是一个仲裁节点,  它仅用于选举和协调另外两个数据库节点的主备关系.  仲裁节点本身不承载业务数据. 事实上

这种仲裁者的集群环境不被<<mongodb权威指南>>推荐,  原话是: 如果可能, 尽量在副本集中使用奇数个数据成员, 而不要使用仲裁者.

里可能有个地方需要注意, 在敲上面的命令之前, 端口可能还没有ready, 请先确认两个数据库节点的端口已经LISTEN



5.  退出mongo-shell, 重新进入一次就可以发现, 192.168.1.117:10000已经被选举成主节点.

[root@xzw gmlogx]# mongo 192.168.1.117:10000MongoDB shell version: 2.6.5connecting to: 192.168.1.117:10000/testgmlogx:PRIMARY> rs.status(){"set" : "gmlogx","date" : ISODate("2014-11-14T04:24:45Z"),"myState" : 1,"members" : [{"_id" : 0,"name" : "192.168.1.117:10000","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 1101,"optime" : Timestamp(1415938107, 1),"optimeDate" : ISODate("2014-11-14T04:08:27Z"),"electionTime" : Timestamp(1415938116, 1),"electionDate" : ISODate("2014-11-14T04:08:36Z"),"self" : true},{"_id" : 1,"name" : "192.168.1.117:10001","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 977,"optime" : Timestamp(1415938107, 1),"optimeDate" : ISODate("2014-11-14T04:08:27Z"),"lastHeartbeat" : ISODate("2014-11-14T04:24:44Z"),"lastHeartbeatRecv" : ISODate("2014-11-14T04:24:45Z"),"pingMs" : 0,"syncingTo" : "192.168.1.117:10000"},{"_id" : 2,"name" : "192.168.1.117:10002","health" : 1,"state" : 7,"stateStr" : "ARBITER","uptime" : 977,"lastHeartbeat" : ISODate("2014-11-14T04:24:44Z"),"lastHeartbeatRecv" : ISODate("2014-11-14T04:24:45Z"),"pingMs" : 0}],"ok" : 1}gmlogx:PRIMARY>

6.  创建一个database, 并尝试插入一条记录. 

gmlogx:PRIMARY> use gmlogxswitched to db gmlogxgmlogx:PRIMARY> db.logx.insert({usr: 'usr', age: 32})WriteResult({ "nInserted" : 1 })gmlogx:PRIMARY> 

7. 通过java-driver进行查询操作, 如果你想做到读写分离的效果, 可以直接访问备节点(192.168.1.117:10001).

public static void main(String[] args) throws UnknownHostException{MongoOptions mo = new MongoOptions();List<ServerAddress> addr = Arrays.asList(new ServerAddress("192.168.1.117", 10000), new ServerAddress("192.168.1.117", 10001));mo.readPreference = ReadPreference.secondary(); /* 可从副本中读取. */Mongo mg = new Mongo(addr, mo);DBCollection coll = mg.getDB("gmlogx").getCollection("logx");DBCursor cur = coll.find();while (cur.hasNext())System.out.println(cur.next());}




0 0
原创粉丝点击