Mongodb Replica Sets + Sharding 分片集群架构部署
MongoDB Auto-Sharding 解决了海量存储和动态扩容的问题但离实际生产环境所需的高可
靠、高可用还有些距离所以有了” Replica Sets + Sharding”的解决方案。
1、Shard:
使用 Replica Sets确保每个数据节点都具有备份、自动容错转移、自动恢复能力。
2、Config:
使用3 个配置服务器确保元数据完整性
3、Route:
使用3 个路由进程实现负载平衡提高客户端接入性能
以下我们配置一个 Replica Sets + Sharding 的环境架构图如下
开放的端口如下
主机ip服务及端口Server A192.168.3.231mongod shard1_1:27017
mongod shard2_1:27018
mongod shard3_1:27019
mongod config1:20000
mongs1:30000Server B192.168.3.232mongod shard1_2:27017
mongod shard2_2:27018
mongod shard3_2:27019
mongod config2:20000
mongs2:30000Server C192.168.3.233mongod shard1_3:27017
mongod shard2_3:27018
mongod shard3_3:27019
mongod config3:20000
mongs3:30000
创建数据目录
Server A
/data/shard1_1
/data/shard2_1
/data/shard3_1
/data/config
Server B
/data/shard1_2
/data/shard2_2
/data/shard3_2
/data/config
Server C
/data/shard1_3
/data/shard2_3
/data/shard3_3
/data/config
配置Replica Sets
1、配置shard1所用到的Replica Sets(此处以命令行方式启动,生产环境建议用配置文件方式启动)
在Server A 上:
mongodb/bin/mongod --shardsvr --replSet shard1 --port 27017 --dbpath /data/shard1_1 --logpath /data/shard1_1/shard1_1.log --logappend --fork
在Server B 上:
mongodb/bin/mongod --shardsvr --replSet shard1 --port 27017 --dbpath /data/shard1_2 --logpath /data/shard1_2/shard1_2.log --logappend --fork
在Server C 上:
mongodb/bin/mongod --shardsvr --replSet shard1 --port 27017 --dbpath /data/shard1_3 --logpath /data/shard1_3/shard1_3.log --logappend --fork
用mongo 连接其中一台机器的27017 端口的mongod
初始化Replica Sets“shard1”
用mongo 连接其中一台机器的 27017 初始化 副本集 shard1
>config={ _id:"repsethqtest", members:[ {_id:0,host:'192.168.20.1:27017',priority:10}, {_id:1,host:'192.168.20.2:27017',priority:1}, {_id:2,host:'192.168.20.3:27017',arbiterOnly:true}] }
>rs.initiate(config)
>rs.status()
配置shard2所用到的Replica Sets
在Server A 上:
mongodb/bin/mongod --shardsvr --replSet shard2 --port 27018 --dbpath /data/shard2_1 --logpath /data/shard2_1/shard2_1.log --logappend --fork
在Server B 上:
mongodb/bin/mongod --shardsvr --replSet shard2 --port 27018 --dbpath /data/shard2_2 --logpath /data/shard2_2/shard2_2.log --logappend --fork
在Server C 上:
mongodb/bin/mongod --shardsvr --replSet shard2 --port 27018 --dbpath /data/shard2_3 --logpath /data/shard2_3/shard2_3.log --logappend --fork
用mongo 连接其中一台机器的27018 端口的mongod,初始化Replica Sets “shard2”,执行:
用mongo 连接其中一台机器的 27018 初始化 副本集 shard2
>config={ _id:"shard2", members:[ {_id:0,host:'192.168.20.1:27018',priority:1}, {_id:1,host:'192.168.20.2:27018',priority:10},
{_id:2,host:'192.168.20.3:27018',arbiterOnly:true}] }
>rs.initiate(config)
>rs.status()
分片3 shard3类似,略
配置3 台Config Server
在Server A、B、C上执行:
mongodb/bin/mongod --configsvr --dbpath /data/config --port 20000 --logpath /data/config/config.log --logappend --fork
配置3 台Route Process
在Server A、B、C上执行:
mongodb/bin/mongos --configdb 192.168.3.231:20000,192.168.3.232:20000,192.168.3.233:20000 --port 30000 chunkSize 1 --logpath /data/mongos.log --logappend --fork
配置Shard Cluster
登录一台路由服务器
mongodb/bin/mongo --ip -- port 30000
>use admin
>db.runCommand({addshard:'shard1/192.168.3.231:27017,192.168.3.232:27017,192.168.3.233:27017'})
>db.runCommand({addshard:'shard2/192.168.3.231:27018,192.168.3.232:27018,192.168.3.233:27018'})
>db.runCommand({addshard:'shard3/192.168.3.231:27019,192.168.3.232:27019,192.168.3.233:27019'})
激活数据库及集合的分片
>db.runCommand({enablesharding:'dbname'})
db.runCommand({shardcollection:'dbname.colname',key:{keyname:1}})
验证分片
连接到其中一台服务器的30000,切换到数据库test
for(var i=1;i<200000;i++)
{
db.users.insert({_id:i,addr_1:"beijin",addr_2:"shanghai"})
}
查看数据的分布
>db.users.stats()
可以看到Sharding搭建成功了,跟我们期望的结果一致。
#查看分片服务器的配置
db.runCommand( { listshards : 1 } );
对于只有三台服务器时比较好的架构如下图
这样三个分片的每个副本集的主节点分布在不同的三台服务器上,分担了压力。
java程序调用分片集群,因为我们配置了三个mongos作为入口,就算其中哪个入口挂掉了都没关系,使用集群客户端程序如下:
public class TestMongoDBShards {
public static void main(String[] args) {
try {
List<ServerAddress> addresses = new ArrayList<ServerAddress>();
ServerAddress address1 = new ServerAddress("192.168.3.231" , 30000);
ServerAddress address2 = new ServerAddress("192.168.3.232" , 30000);
ServerAddress address3 = new ServerAddress("192.168.3.233" , 30000);
addresses.add(address1);
addresses.add(address2);
addresses.add(address3);
MongoClient client = new MongoClient(addresses);
DB db = client.getDB( "testdb" );
DBCollection coll = db.getCollection( "table1" );
BasicDBObject object = new BasicDBObject();
object.append( "id" , 1);
DBObject dbObject = coll.findOne(object);
System. out .println(dbObject);
} catch (Exception e) {
e.printStackTrace();
}
}
}
ava驱动的机制是选择一个ping 最快的机器来作为所有请求的入口,如果这台机器挂掉会使用下一台机器。所以ping最快的应该始终都会是最快的,只有部分网络io跳跃的时候会路由到其他机器。按照这个方式不是一个好做法,所以文章中不推荐。当然lvs+mongos可以解决
0 0