mongos,数据库集群请求的入口,所有的请求都通过mongos进行协调,不需要在应用程序添加一个路由选择器,mongos自己就是一个请求分发中心,它负责把对应的数据请求请求转发到对应的shard服务器上。在生产环境通常有多mongos作为请求的入口,防止其中一个挂掉所有的mongodb请求都没有办法操作。
config server,顾名思义为配置服务器,存储所有数据库元信息(路由、分片)的配置。mongos本身没有物理存储分片服务器和数据路由信息,只是缓存在内存里,配置服务器则实际存储这些数据。mongos第一次启动或者关掉重启就会从 config server 加载配置信息,以后如果配置服务器信息变化会通知到所有的 mongos 更新自己的状态,这样 mongos 就能继续准确路由。在生产环境通常有多个 config server 配置服务器,因为它存储了分片路由的元数据,这个可不能丢失!就算挂掉其中一台,只要还有存货, mongodb集群就不会挂掉。
shard,这就是传说中的分片了。上面提到一个机器就算能力再大也有天花板,就像军队打仗一样,一个人再厉害喝血瓶也拼不过对方的一个师。俗话说三个臭皮匠顶个诸葛亮,这个时候团队的力量就凸显出来了。在互联网也是这样,一台普通的机器做不了的多台机器来做
server1 | server2 | server3 |
mongos | mongos | mongos |
config server | config server | config server |
shard1(主节点) | shard1(从节点) | shard1(仲裁节点) |
shard2(仲裁节点) | shard2(主节点) | shard2(从节点) |
shard3(从节点) | shard3(仲裁节点) | shard3(主节点) |
应用相关端口,一定要记得在防火墙中开放对应端口:
mongos:27200
config server:27100
shard1:27001
shard2:27002
shard3:27003
在搭建集群环境之前,先创建对应目录应用于存放数据和日志,conf文件夹用于存相关配置文件,由于mongos没有数据,所以只创建日志目录
sudo mkdir -p /usr/local/mongodb/conf
sudo mkdir -p /usr/local/mongodb/mongos/log
sudo mkdir -p /usr/local/mongodb/config/data
sudo mkdir -p /usr/local/mongodb/config/log
sudo mkdir -p /usr/local/mongodb/shard1/data
sudo mkdir -p /usr/local/mongodb/shard1/log
sudo mkdir -p /usr/local/mongodb/shard2/data
sudo mkdir -p /usr/local/mongodb/shard2/log
sudo mkdir -p /usr/local/mongodb/shard3/data
sudo mkdir -p /usr/local/mongodb/shard3/log
首先添加配置文件config.conf
sudo vim /usr/local/mongodb/conf/config.conf
systemLog:
destination: file
#日志存储位置
path: "/mongodb/csvr.log"
logAppend: true
storage:
journal:
enabled: true
#数据文件存储位置
dbPath: "/mongodb/data/csvr"
#是否一个库一个文件夹
directoryPerDB: true
#WT引擎配置
wiredTiger:
engineConfig:
#WT最大使用cache(根据服务器实际情况调节)
cacheSizeGB: 1
#是否将索引也按数据库名单独存储
directoryForIndexes: true
#表压缩配置
collectionConfig:
blockCompressor: zlib
#索引配置
indexConfig:
prefixCompression: true
#端口配置
net:
bindIp: 192.168.1.14
port: 27100
replication:
oplogSizeMB: 2048
replSetName: csvr
sharding:
clusterRole: configsvr
processManagement:
fork: true
配置shard1,2,3
首先创建配置文件shard1.conf(shard2,shard3相同):
sudo vim /usr/local/mongodb/conf/shard1.conf
systemLog:
destination: file
path: "/mongodb/mongod1.log"
logAppend: true
storage:
journal:
enabled: true
dbPath: "/mongodb/data/1"
processManagement:
fork: true
net:
bindIp: 0.0.0.0
port: 27001
setParameter:
enableLocalhostAuthBypass: false
replication:
replSetName: "rs1"
sharding:
clusterRole: shardsvr
配置mongos
首先创建配置文件mongos.conf
sudo vim /usr/local/mongodb/conf/mongos.conf
#日志路径配置以及是否叠加
systemLog:
destination: file
path: "/mongodb/mongos.log"
logAppend: true
processManagement:
fork: true
#配置ip,port以及最大连接数
net:
bindIp: 192.168.1.13
port: 27200
# maxIncomingConnections:200
#监听的配置服务器,只能有1个或者3个 config为配置服务器的副本集名字
sharding:
configDB:config/server1:27100,server2:27100,server3:27100
分别启动三台服务器的config server
sudo mongod --config /usr/local/mongodb/conf/config.conf
都启动之后,任意选择一台服务器,进行以下操作:
mongo 10.202.80.149:27100
config={
_id:"config",
members:[
{_id:0,host:"server1:27100"},
{_id:1,host:"server2:27100"},
{_id:2,host:"server3:27100"}
]
}
#初始化副本集
rs.initiate(config)
其中,_id要与之前配置文件中的replSet保持一致
启动三台服务器的shard1,2,3服务,任意选一台服务器(注意:不要选择即将要设置为仲裁节点的服务器)
sudo mongod --config /usr/local/mongodb/conf/shard3.conf
mongo server1(2,3):27001(2,3)
config = {
_id : "shard1(2,3)",
members : [
{_id : 0, host : "server1:27001(2,3)" },
{_id : 1, host : "server2:27001(2,3)" , arbiterOnly: true},
{_id : 2, host : "server3:27001(2,3)" }
]
}
rs.initiate(config)
启动三台服务器mongos:
sudo mongos --config /usr/local/mongodb/conf/mongos.conf
连接mongo server1(2,3):27200
开始命令行操作:
#只有admin才有操作权限
> use admin
#增加分片命令
> db.runCommand({ addshard: 'shard1/server1:27001,server2:27001,server3:27001'})
> db.runCommand({ addshard: 'shard2/server1:27002,server2:27002,server3:27002'})
> db.runCommand({ addshard: 'shard3/server1:27003,server2:27003,server3:27003'})
#指定testdb分片生效
> db.runCommand( { enablesharding :"test"});
#重要,开启均衡器
> sh.startBalancer()
>
> use test
> db.testtable.createIndex({id:"hashed"})
> use admin
#指定数据库里需要分片的集合和片键,1表示自增长
> db.runCommand( { shardcollection : "test.testtable",key : {id: "hashed"} } )
#观看全局sharding状态
> db.printShardingStatus()
#观看单表sharding状态
> db.testtable.stats().shards
> db.testtable.getShardDistribution()
#分片集操作,操作之前先连接shard1(2,3)的主节点,查看状态:
> rs.status()
> rs.conf()
#可以通过连接primary rs节点来删从节点,改增Arb节点
> rs.remove("server3:27004")
# remove有可能导致节点shutdown,需要去服务器端检测下进程
> rs.addArb("server3:27004")
> db.adminCommand({shutdown : 1, force : true})