Mongodb Replica Sets + Sharding 分片集群架构部署

来源:互联网 发布:虚拟网络交易平台 编辑:程序博客网 时间:2024/06/10 04:27

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