一、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();
}
}
}