文章目录
一、环境说明
- 有2台服务器,资源有限,这里部署包含2个分片的集群,每一个分片是一个由一个Primary一个Secondary和一个Arbiter组成的
副本集
配置环境如下:
服务器主机 | 服务器IP | 端口信息 |
---|---|---|
服务器1 | 192.168.13.51 | mongos1 :27017 |
192.168.13.51 | mongod Config1 :20000 | |
192.168.13.51 | mongod shard1primary :30001 (分片1的primary) | |
192.168.13.51 | mongod shard3secondary :30002 (分片3secondary) | |
192.168.13.51 | mongod shard2arbiter :30003 (分片2的仲裁) | |
服务器2 | 192.168.13.52 | mongos2 :27017 |
192.168.13.52 | mongod Config2 :20000 | |
192.168.13.52 | mongod shard2primary :30001 (分片2的primary) | |
192.168.13.52 | mongod shard1secondary :30002 (分片1的secondary) | |
192.168.13.52 | mongod shard3arbiter :30003 (分片3的仲裁) | |
服务器3 | 192.168.13.53 | mongos3 :27017 |
192.168.13.53 | mongod Config3 :20000 | |
192.168.13.53 | mongod shard3primary :30001 (分片3的primary) | |
192.168.13.53 | mongod shard2secondary :30002 (分片2secondary) | |
192.168.13.53 | mongod shard1arbiter :30003 (分片1的仲裁) |
- 这里说明一下:mongos在3台设备都是对等的,config节点需要部署副本集。3个分片,每个分片的主节点在一台设备,secondary和仲裁在另外两台设备。
二、部署
tar -zxvf ./mongodb-linux-x86_64-ubuntu1604-3.6.10-rc0.tgz
2.1 启动分片一
2.1.1 配置文件
systemLog:
destination: file
path: /opt/mongodb/log/shard1primary.log # 指定日志文件
logAppend: true
storage:
journal:
enabled: true
dbPath: /opt/mongodb/data/shard1primary # 指定数据存储路径
directoryPerDB: true
wiredTiger:
engineConfig:
cacheSizeGB: 35.0 # 指定内存限制
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
net:
bindIp: 192.168.11.201 # 指定IP
port: 30001 # 指定端口
replication:
oplogSizeMB: 2048
replSetName: sh1 # 指定分片名称
sharding:
clusterRole: shardsvr
processManagement:
fork: true
2.1.2 启动
- 有了上面的配置文件之后,在服务器1上面启动mongod -f xxx.conf即可,查看端口服务器正常运行
- 在服务器2上面依次创建2个配置文件,再启动Secondary和Arbiter,这里面配置文件除了IP和端口之外,其他的基本不需要修改,只要保证日志文件和数据保存的路径提前创建好就行了。这里我遇到有时候日志文件没有赋权限,导致命令启动失败,但是命令启动失败报的错却和权限无关,有点坑。
2.1.3 初始化
- 使用mongo --host ip --port 连接分片1的任意一个节点,进去之后初始化这个副本集,依次执行下面的命令:
先执行:
config = {
"_id" : "sh1",
"members" : [
{
"_id" : 0,
"host" : "192.168.11.201:30001"
},
{
"_id" : 1,
"host" : "192.168.12.212:30002"
},
{
"_id" : 2,
"host" : "192.168.12.212:30003",
"arbiterOnly" : true
}
]
}
再执行:
rs.initiate(config);
2.1.4 验证
- 初始化过程中如果没有报错,我们使用mongo --host ip --port 依次连接分片1的三个节点,我们会看到有一个Primary,有一个Secondary,有一个Arbiter,这就说明没有问题了。
2.2 启动分片二
- 过程和分片1类似,不赘述
2.3 启动配置副本集
- 按照顺序启动三个config,这里就不使用配置文件了,直接命令即可,注意命令中指定的数据目录和日志文件需要提前创建好,前面2个在服务器1执行,后面一个再服务器2执行,执行之后检查端口正常起来即可。
2.3.1 启动
./mongod --configsvr --replSet cfgReplSet --bind_ip 192.168.11.201 --dbpath /opt/mongodb/data/config/config1 --port 20000 --logpath /opt/mongodb/log/config20000.log --logappend --fork
./mongod --configsvr --replSet cfgReplSet --bind_ip 192.168.11.201 --dbpath /opt/mongodb/data/config/config2 --port 20001 --logpath /opt/mongodb/log/config20001.log --logappend --fork
./mongod --configsvr --replSet cfgReplSet --bind_ip 192.168.12.212 --dbpath /opt/mongodb/data/config --port 20002 --logpath /opt/mongodb/log/config20002.log --logappend --fork
2.3.2 初始化
- 使用mongo --host ip --port 连接三个config节点的任意一个,执行下面命令
首先:
config = {
_id : "cfgReplSet",
members : [
{_id : 1, host : "192.168.11.201:20000" },
{_id : 2, host : "192.168.11.201:20001" },
{_id : 3, host : "192.168.12.212:20002" }
]
}
然后:
rs.initiate(config);
2.3.3 验证
- 初始化过程中如果没有报错,我们使用mongo --host ip --port 依次连接config的三个节点,我们会看到有一个Primary,2个Secondary,这就说明没有问题了。
2.4 启动mongos
2.4.1 启动
- 使用配置文件启动mongos,配置文件如下,在2台设备执行的命令都是一样的,如下所示,2台设备的配置文件只有IP不同,同样记得提前创建好日志文件。
启动mongos的命令:
./mongos -f /xx/xx/mongos.conf
配置文件:
systemLog:
destination: file
path: /opt/mongodb/log/mongos.log
logAppend: true
net:
bindIp: 192.168.11.201
port: 27017
sharding:
configDB: cfgReplSet/192.168.11.201:20000,192.168.11.201:20001,192.168.12.212:20002
processManagement:
fork: true
2.5 启用分片
- 到此,我们创建好了2个分片,每个分片都是一个PSA的结构(Primary/Secondary/Arbiter),也初始化好了一个配置副本集,和2个mongos进程,现在我们需要将分片添加进来。
2.5.1 添加分片
执行:./mongo 192.168.11.201:27017/admin //连接mongos
执行:db.runCommand( { addshard:"sh1/192.168.11.201:30001",name:"sh1" }); //添加分片1
执行:db.runCommand( { addshard:"sh2/192.168.12.212:30001",name:"sh2" }); //添加分片2
执行: sh.status() //查询分片状态,出现如下类似信息则正确
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5caea64e92aa42a5ed521591")
}
shards:
{ "_id" : "s1", "host" : "shard1/192.168.11.189:25001", "state" : 1 }
{ "_id" : "s2", "host" : "shard2/192.168.11.189:25002", "state" : 1 }
active mongoses:
"3.6.10-rc0" : 1
autosplit:
Currently enabled: yes
balancer:
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 0
Migration Results for the last 24 hours:
No recent migrations
databases:
{ "_id" : "config", "primary" : "config", "partitioned" : true }
执行:db.runCommand( { listshards : 1 } ) //查看分片状态 //列出配置的分片信息,信息正确则配置没问题
三、验证
3.1 创建数据库
- 使用mongo命令连接27017的mongos进程,创建数据库:
mongo --host ip --port port
use ifaas_data //创建数据库
- 启用数据库分片
use admin //切换到admin数据库,才能进行开启分片操作
db.runCommand( { enablesharding : "ifaas_data" } ) //开启数据库的分片
db.runCommand({ shardcollection: "ifaas_data.multobj", key: { targetType:1,time:1 }}) //开启集合的分片,指定片键为组合片键
- 配置数据库账号密码
use ifaas_data //切换到数据库创建账号密码
db.createUser(
{
user:"ifaas_data",
pwd:"introcks1234",
roles:[{role:"readWrite",db:"ifaas_data"}]
}
)
//使用ifaas_data/introcks1234登陆dbtest数据库即可
3.2 分片验证
- 通过程序连接mongos的27017端口dbtest数据库,然后插入数据
- 连接服务器1的30001和服务器2的30001端口的mongodb实例,检查数据之和为第一步插入的数据总数
- 注意如果插入的数据很少的时候,可能不会看到分片的效果,数据都在一个片上面,当数据慢慢多起来之后才能看到,默认一个块好像是60MB,需要大于这个大小才会块分列 ,使用sh.status()可以查看数据表的分片详细情况
四、小结
4.1 注意事项
- 注意部署过程中,指定的数据目录和日志文件,尽量提前规划并创建好,在搭建之前最好规划好端口和目录结构信息
- 每一步部署好之后,检查该步起来的端口是否正常监听,
- 启用分片的命令需要切换到admin库下面执行,设置账号密码的操作在对应的库下面操作
4.2 小结
- 流程是先部署副本集,然后部署配置副本集,再启动mongos,再配置分片。部署副本集的时候就是启动一个一个的mongod进行,然后连接其中一个做一下初始化。配置必须是副本集部署,不能是单点的,因此设备有限的情况下,可以在一台设备起多个是ok的,mongos其实是路由节点。
五、参考
- [1] MongoDB 分片集群技术
六、附相关脚本
6.1 创建目录
server1:
cd /opt
sudo mkdir -p /opt/mongodb/data/conf
sudo touch /opt/mongodb/data/conf/shard1primary.conf
sudo touch /opt/mongodb/data/conf/shard3secondary.conf
sudo touch /opt/mongodb/data/conf/shard3arbiter.conf
sudo touch /opt/mongodb/data/conf/mongos.conf
sudo mkdir -p /opt/mongodb/data/config
sudo mkdir -p /opt/mongodb/data/shard1primary
sudo mkdir -p /opt/mongodb/data/shard3secondary
sudo mkdir -p /opt/mongodb/data/shard3arbiter
sudo mkdir -p /opt/mongodb/log
sudo touch /opt/mongodb/log/mongos.log
sudo touch /opt/mongodb/log/shard1primary.log
sudo touch /opt/mongodb/log/shard3secondary.log
sudo touch /opt/mongodb/log/shard3arbiter.log
sudo touch /opt/mongodb/log/config.log
chmod 777 -R /opt/mongodb
server2:
sudo mkdir -p /opt/mongodb/data/conf
sudo touch /opt/mongodb/data/conf/shard2primary.conf
sudo touch /opt/mongodb/data/conf/shard1secondary.conf
sudo touch /opt/mongodb/data/conf/shard1arbiter.conf
sudo touch /opt/mongodb/data/conf/mongos.conf
sudo mkdir -p /opt/mongodb/data/config
sudo mkdir -p /opt/mongodb/data/shard2primary
sudo mkdir -p /opt/mongodb/data/shard1secondary
sudo mkdir -p /opt/mongodb/data/shard1arbiter
sudo mkdir -p /opt/mongodb/log
sudo touch /opt/mongodb/log/mongos.log
sudo touch /opt/mongodb/log/shard2primary.log
sudo touch /opt/mongodb/log/shard1secondary.log
sudo touch /opt/mongodb/log/shard1arbiter.log
sudo touch /opt/mongodb/log/config.log
chmod 777 -R /opt/mongodb
server3:
sudo mkdir -p /opt/mongodb/data/conf
sudo touch /opt/mongodb/data/conf/shard3primary.conf
sudo touch /opt/mongodb/data/conf/shard2secondary.conf
sudo touch /opt/mongodb/data/conf/shard2arbiter.conf
sudo touch /opt/mongodb/data/conf/mongos.conf
sudo mkdir -p /opt/mongodb/data/config
sudo mkdir -p /opt/mongodb/data/shard3primary
sudo mkdir -p /opt/mongodb/data/shard2secondary
sudo mkdir -p /opt/mongodb/data/shard2arbiter
sudo mkdir -p /opt/mongodb/log
sudo touch /opt/mongodb/log/mongos.log
sudo touch /opt/mongodb/log/shard3primary.log
sudo touch /opt/mongodb/log/shard2secondary.log
sudo touch /opt/mongodb/log/shard2arbiter.log
sudo touch /opt/mongodb/log/config.log
chmod 777 -R /opt/mongodb
6.2 配置文件
- primary配置文件
systemLog:
destination: file
path: /opt/mongodb/log/shard1primary.log
logAppend: true
storage:
journal:
enabled: true
dbPath: /opt/mongodb/data/shard1primary
directoryPerDB: true
wiredTiger:
engineConfig:
cacheSizeGB: 70.0
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
net:
bindIp: 192.168.13.51
port: 30001
replication:
oplogSizeMB: 2048
replSetName: sh1
sharding:
clusterRole: shardsvr
processManagement:
fork: true
-
三台设备的primary配置文件只需要修改path,dbpath,bindIp,replSetName这四个参数即可,其他可以复制。
-
secondary配置文件
systemLog:
destination: file
path: /opt/mongodb/log/shard1secondary.log
logAppend: true
storage:
journal:
enabled: true
dbPath: /opt/mongodb/data/shard1secondary
directoryPerDB: true
wiredTiger:
engineConfig:
cacheSizeGB: 25.0
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
net:
bindIp: 192.168.13.52
port: 30002
replication:
oplogSizeMB: 2048
replSetName: sh1
sharding:
clusterRole: shardsvr
processManagement:
fork: true
- arbiter配置文件
systemLog:
destination: file
path: /opt/mongodb/log/shard1arbiter.log
logAppend: true
storage:
journal:
enabled: true
dbPath: /opt/mongodb/data/shard1arbiter
directoryPerDB: true
wiredTiger:
engineConfig:
cacheSizeGB: 3.0
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
net:
bindIp: 192.168.13.52
port: 30003
replication:
oplogSizeMB: 2048
replSetName: sh1
sharding:
clusterRole: shardsvr
processManagement:
fork: true
- mongos配置文件
systemLog:
destination: file
path: /opt/mongodb/log/mongos.log
logAppend: true
net:
bindIp: 192.168.13.51
port: 27017
sharding:
configDB: cfgReplSet/192.168.13.51:20000,192.168.13.52:20000,192.168.13.53:20000
processManagement:
fork: true