MongoDB 分片+副本 集群配置

Mongodb分块+副本 简单示意图


服务器

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.11
port=27018
fork=true
dbpath=/data/db/shard0/rs0-0
logpath=/data/log/mongod.log
logappend=true
journal=true
profile=1
replSet=rs0
#keyFile=/data/mongodb-keyfile
(2) 15的mongod配置文件 mongo.conf
   
   
bind_ip=192.168.0.15
port=27018
fork=true
dbpath=/data/db/shard0/rs0-1
logpath=/data/log/mongod.log
logappend=true
journal=true
profile=1
replSet=rs0
#keyFile=/data/mongodb-keyfile
(3) 在15上配置arbiter服务,创建目录/data/arb, 配置文件  arb.conf
  
  
port=30000
bind_ip=192.168.0.15
fork=true
dbpath=/data/arb
logpath=/data/log/arb.log
logappend=true
journal=false
smallfiles=true
replSet=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=10
rs.initiate(rsconf);
#create admin user
use admin
db.createUser(
{
user:"admin",
pwd:"admin",
roles:["readWrite","root"]
}
)
二.配置Shard1
shard1 是12和16这两台服务器
(1) 12的mongod配置文件mongo.conf
   
   
bind_ip=192.168.0.12
port=27018
fork=true
dbpath=/data/db/shard1/rs1-0
logpath=/data/log/mongod.log
logappend=true
journal=true
profile=1
replSet=rs1
#keyFile=/data/mongodb-keyfile
(2) 15的mongod配置文件 mongo.conf
   
   
bind_ip=192.168.0.15
port=27018
fork=true
dbpath=/data/db/shard1/rs1-1
logpath=/data/log/mongod.log
logappend=true
journal=true
profile=1
replSet=rs1
#keyFile=/data/mongodb-keyfile
(3)在15上配置arbiter服务,配置文件arb.conf
   
   
port=30000
bind_ip=192.168.0.15
fork=true
dbpath=/data/arb
logpath=/data/log/arb.log
logappend=true
journal=false
smallfiles=true
replSet=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=10
rs.initiate(rsconf);
#create admin user
use admin
db.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=true
port=27019
bind_ip=192.168.0.11
dbpath=/data/configdb
logpath=/data/log/configsrv.log
logappend=true
configsvr=true
#keyFile=/data/mongodb-keyfile
分别启动config server 
   
   
bin/mongod -f configsvr.conf
配置mongos,由于服务器没那么多的原因,此处配置三个mongos路由,分别配置到11,12,13上,下面是11上的例子,12,13相同,略
   
   
fork=true
port=27017
bind_ip=192.168.0.11
configdb=192.168.0.11:27019,192.168.0.12:27019,192.168.0.13:27019
logpath=/data/log/mongos.log
logappend=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 admin
use admin
db.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 admin
use testdb
for(var i=0;i<100000;i++){
db.user.insert({"name":"test","num":i,"age":10,"comment":"test})
}
#check
sh.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,继续提供服务,从而保证分片集群中的这块数据的完整;

转载于:https://my.oschina.net/u/1387007/blog/383218

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值