MongoDB 分片+副本 集群配置

Mongodb分块+副本 简单示意图


服务器java

192.168.0.11
192.168.0.12
192.168.0.13

192.168.0.15
192.168.0.16
192.168.0.17

分片+副本(每个分片既是一个副本)
    Shard0
         192.168.0.11     primary
         192.168.0.15     secondary+arbiter
    Shard1
         192.168.0.12     primary
         192.168.0.16     secondary+arbiter
    Shard2     
         192.168.0.13     primary
         192.168.0.17     secondary+arbiter

三个 Config Server 和三个mongos路由分别部署在11,12,13上

端口明细:
Config Server -----> 27019
Mongos           -----> 27017
Shard mongod-----> 27018
Arbiter mongod---->30000

准备工做
1)确保网络畅通
2)关闭防火墙,或者在每台机器上开启 端口明细中的端口
3)确保这些服务其上没有运行其余mongod实例
4)分别拷贝下载好的mongodb安装文件到 /usr/local下
5)分别建立目录 /data/db,/data/log ,目录
6)生成keyFile文件,分别拷贝到/data目录下
    keyFile文件生成命令  
   
   
   
   
   
   
   
openssl rand -base64 741 > mongodb-keyfile


一.配置Shard0
Shard0 是11 和 15 这两台机器
(1) 11的mongod 配置文件 mongo.conf
  
  
  
  
  
  
  
bind_ip=192.168.0.11port=27018fork=truedbpath=/data/db/shard0/rs0-0logpath=/data/log/mongod.loglogappend=truejournal=trueprofile=1replSet=rs0#keyFile=/data/mongodb-keyfile
(2) 15的mongod配置文件 mongo.conf
   
   
   
   
   
   
   
bind_ip=192.168.0.15port=27018fork=truedbpath=/data/db/shard0/rs0-1logpath=/data/log/mongod.loglogappend=truejournal=trueprofile=1replSet=rs0#keyFile=/data/mongodb-keyfile
(3) 在15上配置arbiter服务,建立目录/data/arb, 配置文件  arb.conf
  
  
  
  
  
  
  
port=30000bind_ip=192.168.0.15fork=truedbpath=/data/arblogpath=/data/log/arb.loglogappend=truejournal=falsesmallfiles=truereplSet=rs0#keyFile=/data/mongodb-keyfile
分别启动mongod进程
   
   
   
   
   
   
   
bin/mongod -f mongo.conf
    
    
    
    
    
    
    
bin/mongod -f arb.conf
链接11的mongod实例
   
   
   
   
   
   
   
bin/mongo --host 192.168.0.11 --port 27018
在mongo shell中配置 replica set ,并添加管理员用户
   
   
   
   
   
   
   
rsconf={ _id:"rs0", members:[ {_id:0,host:"192.168.0.11:27018"}, {_id:1,host:"192.168.0.15:27018"}, {_id:2,host:"192.168.0.15:30000"} ]}rsconf.members[0].priority=10rs.initiate(rsconf);#create admin user use admindb.createUser( { user:"admin", pwd:"admin", roles:["readWrite","root"] })
二.配置Shard1
shard1 是12和16这两台服务器
(1) 12的mongod配置文件mongo.conf
   
   
   
   
   
   
   
bind_ip=192.168.0.12port=27018fork=truedbpath=/data/db/shard1/rs1-0logpath=/data/log/mongod.loglogappend=truejournal=trueprofile=1replSet=rs1#keyFile=/data/mongodb-keyfile
(2) 15的mongod配置文件 mongo.conf
   
   
   
   
   
   
   
bind_ip=192.168.0.15port=27018fork=truedbpath=/data/db/shard1/rs1-1logpath=/data/log/mongod.loglogappend=truejournal=trueprofile=1replSet=rs1#keyFile=/data/mongodb-keyfile
(3)在15上配置arbiter服务,配置文件arb.conf
   
   
   
   
   
   
   
port=30000bind_ip=192.168.0.15fork=truedbpath=/data/arblogpath=/data/log/arb.loglogappend=truejournal=falsesmallfiles=truereplSet=rs1#keyFile=/data/mongodb-keyfile
一样分别启动mongod进程 同上
链接12的mongo实例
   
   
   
   
   
   
   
bin/mongo --host 192.168.0.12 --port 27018
在mongo shell中配置Replica set 并添加管理员
   
   
   
   
   
   
   
rsconf={ _id:"rs1", members:[ {_id:0,host:"192.168.0.12:27018"}, {_id:1,host:"192.168.0.16:27018"}, {_id:2,host:"192.168.0.16:30000"} ]}rsconf.members[0].priority=10rs.initiate(rsconf);#create admin user use admindb.createUser( { user:"admin", pwd:"admin", roles:["readWrite","root"] })
三.配置Shard2
同上, Shard2中的Replica set 的名称为 rs2


四.配置mongos路由和 config server
config server的配置文件 configsvr.conf
config server 应该在11,12,13上分别配置一个,下面是11上配置的例子,12,13相同,略
   
   
   
   
   
   
   
fork=trueport=27019bind_ip=192.168.0.11dbpath=/data/configdblogpath=/data/log/configsrv.loglogappend=trueconfigsvr=true#keyFile=/data/mongodb-keyfile
分别启动config server 
   
   
   
   
   
   
   
bin/mongod -f configsvr.conf
配置mongos,因为服务器没那么多的缘由,此处配置三个mongos路由,分别配置到11,12,13上,下面是11上的例子,12,13相同,略
   
   
   
   
   
   
   
fork=trueport=27017bind_ip=192.168.0.11configdb=192.168.0.11:27019,192.168.0.12:27019,192.168.0.13:27019logpath=/data/log/mongos.loglogappend=true#keyFile=/data/mongodb-keyfile
链接到mongos添加shard
   
   
   
   
   
   
   
bin/mongos --port 27017 --host 192.168.0.11
在mongo shell中添加shard
   
   
   
   
   
   
   
sh.addShard("rs0/192.168.0.11:27018,192.168.0.15:27018")sh.addShard("rs1/192.168.0.12:27018,192.168.0.16:27018")sh.addShard("rs2/192.168.0.13:27018,192.168.0.17:27018") #for test sh.enableSharding("testdb")sh.shardCollection("testdb.user",{_id:1,num:1})#create cluster adminuse admindb.createUser( { user:"admin", pwd:"admin", roles:["readWrite","root","clusterAdmin"] })
最后,关闭全部的mongo实例,将配置文件中的 keyFile注释去掉,再次启动,此时mongodb添加了权限管理
使用刚才建立的集群管理员帐户链接到mongos中 验证配置
   
   
   
   
   
   
   
bin/mongos --port 27017 --host 192.168.0.11 -u admin -p admin adminuse testdbfor(var i=0;i<100000;i++){ db.user.insert({"name":"test","num":i,"age":10,"comment":"test})}#checksh.status();db.user.stats();db.printShardingStatus();
关于 shard key的选择,参见官网文档

使用Java 进行链接单元测试
   
   
   
   
   
   
   
package com.jttx.export; import com.mongodb.*;import org.junit.*;import org.junit.Test;import org.junit.runner.RunWith;import org.junit.runners.JUnit4; import java.net.UnknownHostException;import java.util.Arrays;import java.util.Collections;import java.util.Set; import static org.junit.Assert.assertNotNull;import static org.junit.Assert.assertTrue; /** * Created by louis on 2015/1/26. */@RunWith(JUnit4.class)public class ConnectMongoWithAuth { private static MongoClient mongoClient; private static final String username="jt_admin"; private static final String pwd="admin"; private static final String database="dnt_mongodb2"; private static final String ip="192.168.0.10"; private static final int port=27017;  @BeforeClass public static void setUp() throws UnknownHostException { MongoCredential credential = MongoCredential.createMongoCRCredential(username, database, pwd.toCharArray()); MongoClientOptions options = MongoClientOptions.builder() .connectionsPerHost(3000) .threadsAllowedToBlockForConnectionMultiplier(10) .readPreference(ReadPreference.nearest()) .build();  mongoClient = new MongoClient(Arrays.asList(new ServerAddress(ip, port)), Arrays.asList(credential),options); assertNotNull(mongoClient); }  @org.junit.Test// @Ignore public void testConnection() { DB db = mongoClient.getDB(database); assertNotNull(db); Set<String> set=db.getCollectionNames(); assertTrue(set.size()>0); for (String str : set) { System.out.println(str); } try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } }  @Test @Ignore public void testReadWrite(){ DB db = mongoClient.getDB(database); DBCollection dbCollection=db.getCollection("test"); DBObject dbObject = new BasicDBObject("aa", "cc"); dbCollection.insert(dbObject); DBObject readObject=dbCollection.findOne(dbObject); assertNotNull(readObject); System.out.println(readObject);   } @AfterClass public static void tearDown(){ mongoClient.close(); }}

后记:之前一直不明白文档上说的一句话:“A shard is a replica set" ,如今终于看明白了,其实就是将一个副本集群做为一个总体,而这个总体承担了分片中的一片;例如上述配置,11和15是一个副本集,11是primary,15是secondary,15即备份了11上的数据,而11和15做为一个总体存储的仅仅是整个分片集群中的一部分数据,当11挂掉后,15自动变为primary,继续提供服务,从而保证分片集群中的这块数据的完整;
相关文章
相关标签/搜索