本人博客同步发表,排版更佳
本文主要介绍MongoDB集群部署的过程,对于其中涉及的组件概念,不做解释。
服务器规划
三台服务器:xxx.xxx.xxx.234、xxx.xxx.xxx.235、xxx.xxx.xxx.236
服务器 | 234 | 235 | 235 |
---|---|---|---|
组件1 | mongos | mongos | mongos |
组件2 | config server | config server | config server |
组件3 | shard server1主 | shard server1副 | shard server1仲裁 |
组件4 | shard server2仲裁 | shard server2主 | shard server2副 |
组件5 | shard server3副 | shard server3仲裁 | shard server3主 |
三台机器的端口配置都采用如下方式:
- mongos:20000
- config:21000
- shard1:27001
- shard2:27002
- shard3:27003
安装mongodb
解压,重命名
#解压
tar -xzvf mongodb-linux-x86_64-3.6.3.tgz -C /root/mongo
#改名
mv mongodb-linux-x86_64-3.6.3 mongodb
配置环境变量 vim /etc/profile
# /etc/profile添加内容
export MONGODB_HOME=/root/mongo/mongodb
export PATH=$MONGODB_HOME/bin:$PATH
# 使立即生效
source /etc/profile
分别在每台机器建立conf、mongos、config、shard1、shard2、shard3六个目录,因为mongos不存储数据,只需要建立日志文件目录即可。
mkdir -p /root/mongo/data/conf
mkdir -p /root/mongo/ data /mongos/log
mkdir -p /root/mongo/ data /config/data
mkdir -p /root/mongo/ data /config/log
mkdir -p /root/mongo/ data /shard1/data
mkdir -p /root/mongo/ data /shard1/log
mkdir -p /root/mongo/ data /shard2/data
mkdir -p /root/mongo/ data /shard2/log
mkdir -p /root/mongo/ data /shard3/data
mkdir -p /root/mongo/ data /shard3/log
config server
mongodb3.4以后要求配置服务器也创建副本集,不然集群搭建不成功。
添加配置文件
pidfilepath = /root/mongo/data/config/log/configsrv.pid
dbpath = /root/mongo/data/config/data
logpath = /root/mongo/data/config/log/congigsrv.log
logappend = true
bind_ip = 0.0.0.0
port = 21000
fork = true
#declare this is a config db of a cluster;
configsvr = true
#副本集名称
replSet=configs
#设置最大连接数
maxConns=20000
分别启动三台服务器的config server
mongod -f /root/mongo/data/conf/config.conf
登录任意一台配置服务器,初始化配置副本集
#连接
mongo --port 21000
#config变量
config = {
... _id : "configs",
... members : [
... {_id : 0, host : "xxx.xxx.xxx.234:21000" },
... {_id : 1, host : "xxx.xxx.xxx.235:21000" },
... {_id : 2, host : "xxx.xxx.xxx.236:21000" }
... ]
... }
#初始化副本集
rs.initiate(config)
其中,”_id” : “configs”应与配置文件中配置的 replicaction.replSetName 一致,”members” 中的 “host” 为三个节点的 ip 和 port
shard分片副本集
第1个分片副本集
在/root/mongo/data/conf中新增配置文件
- vi shard1.conf
pidfilepath = /root/mongo/data/shard1/log/shard1.pid
dbpath = /root/mongo/data/shard1/data
logpath = /root/mongo/data/shard1/log/shard1.log
logappend = true
bind_ip = 0.0.0.0
port = 27001
fork = true
directoryperdb = true
#副本集名称
replSet=shard1
#declare this is a shard db of a cluster;
shardsvr = true
#设置最大连接数
maxConns=20000
启动三台服务器的shard1 server
mongod -f /root/mongo/data/conf/shard1.conf
登陆任意一台服务器(非仲裁节点),初始化副本集
mongo --port 27001
#使用admin数据库
use admin
#定义副本集配置,第三个节点的 "arbiterOnly":true 代表其为仲裁节点。
config = {
... _id : "shard1",
... members : [
... {_id : 0, host : "xxx.xxx.xxx.234:27001" },
... {_id : 1, host : "xxx.xxx.xxx.235:27001" },
... {_id : 2, host : "xxx.xxx.xxx.236:27001” , arbiterOnly: true }
... ]
... }
#初始化副本集配置
rs.initiate(config);
第2个分片副本集
在/root/mongo/data/conf中新增配置文件
- vi shard2.conf
pidfilepath = /root/mongo/data/shard2/log/shard2.pid
dbpath = /root/mongo/data/shard2/data
logpath = /root/mongo/data/shard2/log/shard2.log
logappend = true
bind_ip = 0.0.0.0
port = 27002
fork = true
directoryperdb = true
#副本集名称
replSet=shard2
#declare this is a shard db of a cluster;
shardsvr = true
#设置最大连接数
maxConns=20000
分别启动三台服务器的shard2 server
mongod -f /root/mongo/data/conf/shard2.conf
登陆任意一台服务器(非仲裁节点),初始化副本集
mongo --port 27002
#使用admin数据库
use admin
#定义副本集配置
config = {
... _id : "shard2",
... members : [
... {_id : 0, host : "xxx.xxx.xxx.234:27002" , arbiterOnly: true },
... {_id : 1, host : "xxx.xxx.xxx.235:27002" },
... {_id : 2, host : "xxx.xxx.xxx.236:27002" }
... ]
... }
#初始化副本集配置
rs.initiate(config);
第3个分片副本集
在/root/mongo/data/conf中新增配置文件
- vi shard3.conf
pidfilepath = /root/mongo/data/shard3/log/shard3.pid
dbpath = /root/mongo/data/shard3/data
logpath = /root/mongo/data/shard3/log/shard3.log
logappend = true
bind_ip = 0.0.0.0
port = 27003
fork = true
directoryperdb = true
#副本集名称
replSet=shard3
#declare this is a shard db of a cluster;
shardsvr = true
#设置最大连接数
maxConns=20000
启动三台服务器的shard3 server
mongod -f /root/mongo/data/conf/shard3.conf
登陆任意一台服务器(非仲裁节点),初始化副本集
mongo --port 27003
#使用admin数据库
use admin
#定义副本集配置
config = {
... _id : "shard3",
... members : [
... {_id : 0, host : "xxx.xxx.xxx.234:27003" },
... {_id : 1, host : "xxx.xxx.xxx.235:27003" , arbiterOnly: true},
... {_id : 2, host : "xxx.xxx.xxx.236:27003" }
... ]
... }
#初始化副本集配置
rs.initiate(config);
mongos路由服务器
先启动配置服务器和分片服务器,后启动路由实例:(三台机器)
在/root/mongo/data/conf中新增配置文件
- vi mongos.conf
pidfilepath = /root/mongo/data/mongos/log/mongos.pid
logpath = /root/mongo/data/mongos/log/mongos.log
logappend = true
bind_ip = 0.0.0.0
port = 20000
fork = true
#监听的配置服务器,只能有1个或者3个 configs为配置服务器的副本集名字
configdb = configs/xxx.xxx.xxx.234:21000,xxx.xxx.xxx.235:21000,xxx.xxx.xxx.236:21000
#设置最大连接数
maxConns=20000
启动三台服务器的mongos server
mongos -f /root/mongo/data/conf/mongos.conf
启用分片与测试
目前搭建了mongodb配置服务器、路由服务器,各个分片服务器,不过应用程序连接到mongos路由服务器并不能使用分片机制,还需要在程序里设置分片配置,让分片生效。
登陆任意一台mongos
mongo --port 20000
#使用admin数据库
use admin
#串联路由服务器与分配副本集
sh.addShard("shard1/xxx.xxx.xxx.234:27001,xxx.xxx.xxx.235:27001, xxx.xxx.xxx.236:27001")
sh.addShard("shard2/xxx.xxx.xxx.234:27002,xxx.xxx.xxx.235:27002, xxx.xxx.xxx.236:27002")
sh.addShard("shard3/xxx.xxx.xxx.234:27003,xxx.xxx.xxx.235:27003, xxx.xxx.xxx.236:27003")
#查看集群状态
sh.status()
目前配置服务、路由服务、分片服务、副本集服务都已经串联起来了,但我们的目的是希望插入数据,数据能够自动分片。连接在mongos上,准备让指定的数据库、指定的集合分片生效。
默认的chunkSize为64M,这里的数据量没有达到64M,可以修改一下chunkSize的大小为1M,方便测试分片效果:
mongo --port 20000
mongos> use config
switched to db config
mongos> db.settings.save( { _id:"chunksize", value: 1 } )
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : "chunksize" })
mongos> db.settings.find();
{ "_id" : "balancer", "stopped" : false, "mode" : "full" }
{ "_id" : "chunksize", "value" : 1 }
指定testdb分片生效
#指定testdb分片生效
mongos> db.runCommand( { enablesharding :"testdb"});
#指定数据库里需要分片的集合和片键
mongos> db.runCommand( { shardcollection : "testdb.table1",key : {id: 1} } )
mongos> use testdb
switched to db testdb
使用java代码插入10W调数据测试分片效果
//创建客户端连接
MongoClient mongoClient = new MongoClient( "xxx.xxx.xxx.234" , 20000 );
MongoDatabase database = mongoClient.getDatabase("testdb");
MongoCollection<Document> collection = database.getCollection("table1");
//插入文档
for (int i=1;i<100000;i++){
Document doc = new Document("id", i)
.append("type", "database")
.append("test","testval");
System.out.println(i);
collection.insertOne(doc);
}
使用db.table1.stats();命令查看集合分片状态,部分无关信息省掉,可以看到数据分到3个分片。