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,繼續提供服務,從而保證分片集羣中的這塊數據的完整;
相關文章
相關標籤/搜索