mongo分片

169 阅读9分钟

mongo分片集群的组成

一个MongoDB分片集群由以下组件组成:

  • shard: 数据片,一般将具体的单个分片叫 mongod,实质上每个分片都是一个单独的复制集群,具备负责集群的高可用特性。
  • mongos: 路由服务,不存具体数据,从 Config 获取集群配置讲请求转发到特定的分片,并且整合分片结果返回给客户端。
  • config servers: 配置,本质上是一个 MongoDB 的副本集,负责存储集群的各种元数据和配置,如分片地址、chunks 等

服务部署规划

生产集群中,为了系统的高可用,通常都为服务提供副本集(主,备,仲裁)

节点节点类型地址端口目录
mongos1192.0.0.10127017/run/mongo-cluster/mongos
mongos2192.0.0.10227017/run/mongo-cluster/mongos
mongos3192.0.0.10327017/run/mongo-cluster/mongos
config1192.0.0.11127017/run/mongo-cluster/config
config1192.0.0.11227017/run/mongo-cluster/config
config1192.0.0.11327017/run/mongo-cluster/config
configN.........增加配置节点,同上
shard1192.0.0.12127017/run/mongo-cluster/shard
shard1192.0.0.12227017/run/mongo-cluster/shard
shard1仲裁192.0.0.12327017/run/mongo-cluster/shard
shard2192.0.0.12427017/run/mongo-cluster/shard
shard2192.0.0.12527017/run/mongo-cluster/shard
shard2仲裁192.0.0.12627017/run/mongo-cluster/shard
shardN.........增加片键,同上

部署准备工作

部署步骤:

  1. 下载文件,提前创建好文件和目录,上传到服务器
  2. 根据规划,给shard,config,mongos依次添加配置文件
  3. 启动

上传文件方式

官网下载mongo 我的5.0.18 mongo目录结构如下 image.png

建议先在自己电脑上创建文件夹并修改好文件,在上传服务器,下面创建需要的目录和文件
mongo目录为/run/mongo-cluster/mongosX (或shardX或configX)
添加文件夹:

  • conf:配置目录
  • data:数据存放目录
  • logs:日志目录

增加文件:

  • mongod.pid: 进程id文件
  • keyFile.key:指定分片集或副本集成员之间身份验证的key文件存储位置。内容自定义(我设置的baicai123),同一副本集的文件内容必须一致,权限必须是600或者400
  • conf/mongo.conf: mongo配置文件,在配置目录conf中,命名没限制,同服务配置内容不同,需要单独配置

最终目录结构如下

image.png

配置文件

配置完别启动,启动有顺序不然容易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分片

分片需要的条件:

  • 库开启分片
  • 集合开启分片
  • 指定片键并设置分片规则