mongo分片集群的组成
一个MongoDB分片集群由以下组件组成:
- shard: 数据片,一般将具体的单个分片叫 mongod,实质上每个分片都是一个单独的复制集群,具备负责集群的高可用特性。
- mongos: 路由服务,不存具体数据,从 Config 获取集群配置讲请求转发到特定的分片,并且整合分片结果返回给客户端。
- config servers: 配置,本质上是一个 MongoDB 的副本集,负责存储集群的各种元数据和配置,如分片地址、chunks 等
服务部署规划
生产集群中,为了系统的高可用,通常都为服务提供副本集(主,备,仲裁)
| 节点 | 节点类型 | 地址 | 端口 | 目录 |
|---|---|---|---|---|
| mongos1 | 主 | 192.0.0.101 | 27017 | /run/mongo-cluster/mongos |
| mongos2 | 主 | 192.0.0.102 | 27017 | /run/mongo-cluster/mongos |
| mongos3 | 主 | 192.0.0.103 | 27017 | /run/mongo-cluster/mongos |
| config1 | 主 | 192.0.0.111 | 27017 | /run/mongo-cluster/config |
| config1 | 从 | 192.0.0.112 | 27017 | /run/mongo-cluster/config |
| config1 | 从 | 192.0.0.113 | 27017 | /run/mongo-cluster/config |
| configN | ... | ... | ... | 增加配置节点,同上 |
| shard1 | 主 | 192.0.0.121 | 27017 | /run/mongo-cluster/shard |
| shard1 | 从 | 192.0.0.122 | 27017 | /run/mongo-cluster/shard |
| shard1 | 仲裁 | 192.0.0.123 | 27017 | /run/mongo-cluster/shard |
| shard2 | 主 | 192.0.0.124 | 27017 | /run/mongo-cluster/shard |
| shard2 | 从 | 192.0.0.125 | 27017 | /run/mongo-cluster/shard |
| shard2 | 仲裁 | 192.0.0.126 | 27017 | /run/mongo-cluster/shard |
| shardN | ... | ... | ... | 增加片键,同上 |
部署准备工作
部署步骤:
- 下载文件,提前创建好文件和目录,上传到服务器
- 根据规划,给shard,config,mongos依次添加配置文件
- 启动
上传文件方式
去官网下载mongo
我的5.0.18
mongo目录结构如下
建议先在自己电脑上创建文件夹并修改好文件,在上传服务器,下面创建需要的目录和文件
mongo目录为/run/mongo-cluster/mongosX (或shardX或configX)
添加文件夹:
- conf:配置目录
- data:数据存放目录
- logs:日志目录
增加文件:
- mongod.pid: 进程id文件
- keyFile.key:指定分片集或副本集成员之间身份验证的key文件存储位置。内容自定义(我设置的baicai123),同一副本集的文件内容必须一致,权限必须是600或者400
- conf/mongo.conf: mongo配置文件,在配置目录conf中,命名没限制,同服务配置内容不同,需要单独配置
最终目录结构如下
配置文件
配置完别启动,启动有顺序不然容易bug
mongos和config,shard三个配置文件不同
mongos
systemLog:
#指定一个文件或syslog。如果指定为文件,必须同时指定systemLog.path
destination: file
#发送所有的诊断信息日志,默认重启后会覆盖。注意修改路径
path: /run/mongo-cluster/mongos/logs/mongod.log
#是否追加日志
logAppend: true
processManagement:
#守护进程在后台进行
fork: true
#指定进程的ID,与--fork配合使用,不指定则不会创建。注意修改路径
pidFilePath: /run/mongo-cluster/mongos/mongod.pid
#时区
timeZoneInfo: /usr/share/zoneinfo
net:
#实例绑定的ip,为了绑定多个ip,可以使用逗号分隔。
bindIp: 0.0.0.0
#实例监听的端口号,注意修改端口
port: 27017
#实例接受的最多连接数,如果高于操作系统接受的最大线程数,设置无效。
maxIncomingConnections: 100000
setParameter:
#本地连接mongodb中创建的第一个用户不会被安全认证所限制,可用于创建超级管理员
enableLocalhostAuthBypass: true
sharding:
#关联配置服务,指定配置数据库。可以使用逗号分隔一到三个服务器。如果处于不同的位置,需要指定最近的一个。不能移除配置服务器,即使不可用或者离线了。
configDB: config1/192.0.0.111:27017,192.0.0.112:27017,192.0.0.113:27017
security:
#指定分片集或副本集成员之间身份验证的key文件存储位置。注意修改路径 权限必须是600或者400
keyFile: /run/mongo-cluster/mongos/keyFile.key
config
config是集群部署,同一shard的replication:replSetName: XXX 必须一致
例如 config1 主从仲裁的replSetName:config1, config2 主从仲裁的replSetName:config2
systemLog:
#指定一个文件或syslog。如果指定为文件,必须同时指定systemLog.path
destination: file
#发送所有的诊断信息日志,默认重启后会覆盖。注意修改路径
path: /run/mongo-cluster/config/logs/mongod.log
#是否追加日志
logAppend: true
# Where and how to store data.
storage:
#指定数据文件的路径
dbPath: /run/mongo-cluster/config/data
journal:
#默认64bit为true,32bit为false,记录操作日志,防止数据丢失。
enabled: true
#实例的存储引擎,wiredTiger,将数据持久化存储在Disk Files中;inMemory,将数据存储在内存中;
engine: wiredTiger
wiredTiger:
engineConfig:
#实例中WiredTiger内部缓存的大小
cacheSizeGB: 12
processManagement:
#守护进程在后台进行
fork: true
#指定进程的ID,与--fork配合使用,不指定则不会创建。注意修改路径
pidFilePath: /run/mongo-cluster/config/mongod.pid
#时区
timeZoneInfo: /usr/share/zoneinfo
net:
#实例绑定的ip,为了绑定多个ip,可以使用逗号分隔。
bindIp: 0.0.0.0
#实例监听的端口号,注意修改端口
port: 27017
#实例接受的最多连接数,如果高于操作系统接受的最大线程数,设置无效。
maxIncomingConnections: 100000
setParameter:
#本地连接mongodb中创建的第一个用户不会被安全认证所限制,可用于创建超级管理员
enableLocalhostAuthBypass: true
replication:
#复制集名称
replSetName: config1
sharding:
#指定分片集的mongodb角色。configsvr,配置服务器,shardsvr,分片实例,作为配置服务
clusterRole: configsvr
security:
#string,默认为disabled,打开访问数据库和进行操作的用户角色认证。enabled,disabled ,mongos不需要
authorization: "enabled"
#指定分片集或副本集成员之间身份验证的key文件存储位置。注意修改路径 权限必须是600或者400
keyFile: /run/mongo-cluster/config/keyFile.key
shard
shard是集群部署,同一shard的replication:replSetName: XXX 必须一致
例如:shard1 主/从/仲裁的 replSetName是shard1, shard2的主/从/仲裁的replSetName是shard2
其他片改配置文件即可
systemLog:
#指定一个文件或syslog。如果指定为文件,必须同时指定systemLog.path
destination: file
#发送所有的诊断信息日志,默认重启后会覆盖。注意修改路径
path: /run/mongo-cluster/shard/logs/mongod.log
#是否追加日志
logAppend: true
# Where and how to store data.
storage:
#指定数据文件的路径
dbPath: /run/mongo-cluster/shard/data
journal:
#默认64bit为true,32bit为false,记录操作日志,防止数据丢失。
enabled: true
#实例的存储引擎,wiredTiger,将数据持久化存储在Disk Files中;inMemory,将数据存储在内存中;
engine: wiredTiger
wiredTiger:
engineConfig:
#实例中WiredTiger内部缓存的大小
cacheSizeGB: 12
processManagement:
#守护进程在后台进行
fork: true
#指定进程的ID,与--fork配合使用,不指定则不会创建。注意修改路径
pidFilePath: /run/mongo-cluster/shard/mongod.pid
#时区
timeZoneInfo: /usr/share/zoneinfo
net:
#实例绑定的ip,为了绑定多个ip,可以使用逗号分隔。
bindIp: 0.0.0.0
#实例监听的端口号,注意修改端口
port: 27017
#实例接受的最多连接数,如果高于操作系统接受的最大线程数,设置无效。
maxIncomingConnections: 100000
setParameter:
#本地连接mongodb中创建的第一个用户不会被安全认证所限制,可用于创建超级管理员
enableLocalhostAuthBypass: true
replication:
#复制集名称
replSetName: shard1
sharding:
#指定分片集的mongodb角色。configsvr,配置服务器,shardsvr,分片实例,作为配置服务
clusterRole: shardsvr
setParameter:
#本地连接mongodb中创建的第一个用户不会被安全认证所限制,可用于创建超级管理员
enableLocalhostAuthBypass: true
security:
#string,默认为disabled,打开访问数据库和进行操作的用户角色认证。enabled,disabled ,mongos不需要
authorization: "enabled"
#指定分片集或副本集成员之间身份验证的key文件存储位置。注意修改路径 权限必须是600或者400
keyFile: /run/mongo-cluster/shard/keyFile.key
启动mongo 按照shard>config>mongos
启动按照数据,有时候会有奇怪的bug 按照shard config mongos的顺序启动就行了
#后台启动shard1/shard2 的三个节点 没权限就sudo
/run/mongo-cluster/shard/bin/mongod -f /run/mongo-cluster/shard/conf/mongo.conf &
#后台启动config1的三个节点
/run/mongo-cluster/config/bin/mongod -f /run/mongo-cluster/config/conf/mongo.conf &
#后台启动mongos1 23
/run/mongo-cluster/mongos/bin/mongos -f /run/mongo-cluster/mongos/conf/mongo.conf &
#启动后查看启动状态
ps -ef | grep mongo-cluster
连接mongo
连接shard并初始化
副本集需要初始化,每一个shard和config 都任选一个节点进行连接,并进行初始化
按照顺序先初始化shard副本集,第一次配置后,可以先初始化一下root账户(可以单独连每个片,不需要可以不用配这个)
#连接按照顺序 举例为shard1
/run/mongo-cluster/shard/bin/mongo --host 127.0.0.1 --port 27017
#初始化复制集为shard1,添加三个节点 第三个为仲裁节点
rs.initiate(
{
_id: "shard1",
members: [
{ _id : 0, host : "192.0.0.121:27017" },
{ _id : 1, host : "192.0.0.122:27017" },
{ _id : 2, host : "192.0.0.123:27017","arbiterOnly":true}
]
}
)
#建一下root账号 先切管理员库
use admin;
#root必须第一个创建 roles可以指定多个角色,这里直接指定为root角色
db.createUser({user:'root',pwd:'baicai123',roles:[{role:'root',db:'admin'}]});
#权限认证
db.auth('root','baicai123');
#查看节点状态
rs.status()
连接config并初始化
config也需要配置,步骤和shard类似,区别是config没有仲裁节点
#举例为config1
/run/mongo-cluster/config/bin/mongo --host 127.0.0.1 --port 27017
#初始化复制集为config1,添加三个节点 没有仲裁节点!
rs.initiate(
{
_id: "config",
configsvr: true,
members: [
{ _id : 0, host : "192.0.0.111:27017" },
{ _id : 1, host : "192.0.0.112:27017" },
{ _id : 2, host : "192.0.0.113:27017"}
]
}
)
#查看节点状态
rs.status()
连接mongos并初始化
mongos配置一些账号和角色信息,将各个shard加入到config中
#举例为config1
/run/mongo-cluster/mongos/bin/mongo --host 127.0.0.1 --port 27017
#建一下root账号 先切管理员库
use admin;
#root必须第一个创建 roles可以指定多个角色,这里直接指定为root角色
db.createUser({user:'root',pwd:'baicai123',roles:[{role:'root',db:'admin'}]});
#权限认证
db.auth('root','baicai123');
#添加片
sh.addShard("shard1/192.0.0.121:27017,192.0.0.122:27017,192.0.0.123:27017")
sh.addShard("shard2/192.0.0.124:27017,192.0.0.125:27017,192.0.0.126:27017")
#查看mongo状态
db.adminCommand({'connPoolStats':1})
自此mongo的启动就完成了
mongo分片
分片需要的条件:
- 库开启分片
- 集合开启分片
- 指定片键并设置分片规则