redhat7.0下 Mongodb 3.6.3 Replica Sets + Sharding 分片集群架构部署

一、mongo安装

参考: redhat7.0下MongoDB3.6.3 安装配置详解与集群搭建

https://blog.csdn.net/zhengguo38/article/details/79791274


二、

MongoDB Auto-Sharding 解决了海量存储和动态扩容的问题但离实际生产环境所需的高可靠、高可用还有些距离所以有了Replica Sets + Sharding”的解决方案。
1、Shard:
使用 Replica Sets确保每个数据节点都具有备份、自动容错转移、自动恢复能力。
2、Config:
使用3 个配置服务器确保元数据完整性
3、Route:
使用3 个路由进程实现负载平衡提高客户端接入性能
以下我们配置一个 Replica Sets + Sharding 的环境架构图如下:

              

开放端口如下:

主机

IP

服务及端口

Server A

10.91.250.141

Shard1 主节点

Shard2 副本

Shard2 仲裁

 

mongod shard1_1:27017

mongod shard2_1:27018

mongod shard3_1:27019

mongod config1:20000

mongs1:30000

Server B

10.91.250.142

Shard1 副本

Shard2 主节点

Shard2 副本

 

mongod shard1_2:27017

mongod shard2_2:27018

mongod shard3_2:27019

mongod config2:20000

mongs2:30000

Server C

10.91.250.143

Shard1 仲裁

Shard2 仲裁

Shard2 主节点

 

mongod 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 上:

vim /mongodb/conf/mongodb.conf

dbpath = /data/shard1_1 #数据文件存放目录

logpath = /data/shard1_1/shard1_1.log #日志文件存放目录

port = 27017  #端口

fork = true  #以守护程序的方式启用,即在后台运行

bind_ip=127.0.0.1,10.91.250.141#局域远程访问本机IP

replSet=shard1  # 节点所属副本集的名称

shardsvr = true

logappend = true

 

 

mongod -f /mongodb/conf/mongodb.conf

Server B 上:

vim /mongodb/conf/mongodb.conf

dbpath = /data/shard1_2 #数据文件存放目录

logpath = /data/shard1_2/shard1_2.log #日志文件存放目录

port = 27017  #端口

fork = true  #以守护程序的方式启用,即在后台运行

bind_ip=127.0.0.1,10.91.250.142#局域远程访问本机IP

replSet=shard1  # 节点所属副本集的名称

shardsvr = true

logappend = true

mongod -f /mongodb/conf/mongodb.conf

Server C 上:

vim /mongodb/conf/mongodb.conf

dbpath = /data/shard1_3 #数据文件存放目录

logpath = /data/shard1_3/shard1_3.log #日志文件存放目录

port = 27017  #端口

fork = true  #以守护程序的方式启用,即在后台运行

bind_ip=127.0.0.1,10.91.250.143#局域远程访问本机IP

replSet=shard1  # 节点所属副本集的名称

shardsvr = true

logappend = true

 

mongod -f /mongodb/conf/mongodb1.conf

 

mongo 连接其中一台机器的27017 端口的mongod

mongo -port 27017
初始化Replica Sets“shard1”

mongo 连接其中一台机器的 27017 初始化 副本集 shard1
>config={ _id:"shard1", members:[ {_id:0,host:'10.91.250.141:27017',priority:10}, {_id:1,host:'10.91.250.142:27017',priority:1}, {_id:2,host:'10.91.250.143:27017',arbiterOnly:true}] }
>rs.initiate(config)
>rs.status()

 

 

配置shard2所用到的Replica Sets

Server A 上:

vim /mongodb/conf/mongodb2.conf

dbpath = /data/shard2_1 #数据文件存放目录

logpath = /data/shard2_1/shard2_1.log #日志文件存放目录

port = 27018  #端口

fork = true  #以守护程序的方式启用,即在后台运行

bind_ip=127.0.0.1,10.91.250.141#局域远程访问本机IP

replSet=shard2  # 节点所属副本集的名称

shardsvr = true

logappend = true

mongod -f /mongodb/conf/mongodb2.conf

 在Server B 上:

vim /mongodb/conf/mongodb2.conf

dbpath = /data/shard2_2 #数据文件存放目录

logpath = /data/shard2_2/shard2_2.log #日志文件存放目录

port = 27018  #端口

fork = true  #以守护程序的方式启用,即在后台运行

bind_ip=127.0.0.1,10.91.250.142#局域远程访问本机IP

replSet=shard2  # 节点所属副本集的名称

shardsvr = true

logappend = true

Mongod -f /mongodb/conf/mongodb2.conf

Server C 上:

vim /mongodb/conf/mongodb2.conf

dbpath = /data/shard2_3 #数据文件存放目录

logpath = /data/shard2_3/shard2_3.log #日志文件存放目录

port = 27018  #端口

fork = true  #以守护程序的方式启用,即在后台运行

bind_ip=127.0.0.1,10.91.250.143#局域远程访问本机IP

replSet=shard2  # 节点所属副本集的名称

shardsvr = true

logappend = true

mongod -f /mongodb/conf/mongodb2.conf

 用mongo 连接其中一台机器的27018 端口的mongod,初始化Replica Sets “shard2”,执行:

mongo -port 27018

mongo 连接其中一台机器的 27018 初始化 副本集 shard2
>config={ _id:"shard2", members:[ {_id:0,host:'10.91.250.141:27018',priority:1}, {_id:1,host:'10.91.250.142:27018',priority:10}, {_id:2,host:'10.91.250.143:27018',arbiterOnly:true}] }
>rs.initiate(config)
>rs.status()

分片3 shard3类似,略

mongo 连接其中一台机器的27019 端口的mongod,初始化Replica Sets “shard3”,执行:

mongo -port 27019

mongo 连接其中一台机器的 27019 初始化 副本集 shard3
>config={ _id:"shard3", members:[ {_id:0,host:'10.91.250.141:27019',arbiterOnly:true}, {_id:1,host:'10.91.250.142:27019',priority:1}, {_id:2,host:'10.91.250.143:27019',priority:10}] }
>rs.initiate(config)
>rs.status()

 

配置3 台Config Server

Server A、B、C上执行(类似上面,就不重复了:

 vim /mongodb/conf/config.conf

logpath = /data/config/config.log #日志文件存放目录

port = 20000  #端口

fork = true  #以守护程序的方式启用,即在后台运行

bind_ip = 127.0.0.1,10.91.250.141#局域远程访问本机IP

replSet = configs

logappend = true

configsvr = true

 

mongod -f /mongodb/conf/config.conf

mongo 连接其中一台机器的20000 端口的mongod,初始化Replica Sets “configdb”,执行:

mongo -port 20000

mongo 连接其中一台机器的 20000 初始化 副本集 configdb
>config={ _id:"configs", members:[ {_id:0,host:'10.91.250.141:20000',priority:3}, {_id:1,host:'10.91.250.142:20000',priority:1}, {_id:2,host:'10.91.250.143:20000',priority:2}] }
>rs.initiate(config)
>rs.status()

 

配置3 台Route Process

Server A、B、C上执行(类似上面,就不重复了:

vim /mongodb/conf/mongos.conf

 

logpath = /data/mongos.log #日志文件存放目录

port = 30000  #端口

fork = true  #以守护程序的方式启用,即在后台运行

bind_ip=127.0.0.1,10.91.250.142#局域远程访问本机IP

configdb=configs/10.91.250.141:20000,10.91.250.142:20000,10.91.250.143:20000

logappend = true

mongos -f mongos.conf 

配置Shard Cluster

登录一台路由服务器
mongodb/bin/mongo --ip -- port 30000
>use admin
>db.runCommand({addshard:'shard1/10.91.250.141:27017,10.91.250.142:27017,10.91.250.143:27017'})
>db.runCommand({addshard:'shard2/10.91.250.141:27018,10.91.250.142:27018,10.91.250.143:27018'})
>db.runCommand({addshard:'shard3/10.91.250.141:27019,10.91.250.142:27019,10.91.250.143: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"})}

连接到其中一台服务器的30000,切换到数据库mantix
for(var i=1;i<200000;i++){db.users.insert({_id:i,addr_1:"beijin",addr_2:"shanghai"})}

连接到其中一台服务器的30000,切换到数据库MDT
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 } );

对于只有三台服务器时比较好的架构如下图

 

主机

IP

服务及端口

Server A

10.91.250.141

Shard1 主节点

Shard2 副本

Shard2 仲裁

 

mongod shard1_1:27017

mongod shard2_1:27018

mongod shard3_1:27019

mongod config1:20000

mongs1:30000

Server B

10.91.250.142

Shard1 副本

Shard2 主节点

Shard2 副本

 

mongod shard1_2:27017

mongod shard2_2:27018

mongod shard3_2:27019

mongod config2:20000

mongs2:30000

Server C

10.91.250.143

Shard1 仲裁

Shard2 仲裁

Shard2 主节点

 

mongod shard1_3:27017

mongod shard2_3:27018

mongod shard3_3:27019

mongod config3:20000

mongs3:30000

这样三个分片的每个副本集的主节点分布在不同的三台服务器上,分担了压力。

java程序调用分片集群,因为我们配置了三个mongos作为入口,就算其中哪个入口挂掉了都没关系,使用集群客户端程序如下:
public class TestMongoDBShards {
       public static void main(String[] args) {
             try {
                  List<ServerAddress> addresses = new ArrayList<ServerAddress>();
                  ServerAddress address1 = new ServerAddress("10.91.250.141" , 30000);
                  ServerAddress address2 = new ServerAddress("10.91.250.142" , 30000);
                  ServerAddress address3 = new ServerAddress("10.91.250.143" , 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();
            }
      }
}

 


猜你喜欢

转载自blog.csdn.net/zhengguo38/article/details/80193554