文章目录

  • 一、环境说明
  • 二、部署
  • 2.1 启动分片一
  • 2.1.1 配置文件
  • 2.1.2 启动
  • 2.1.3 初始化
  • 2.1.4 验证
  • 2.2 启动分片二
  • 2.3 启动配置副本集
  • 2.3.1 启动
  • 2.3.2 初始化
  • 2.3.3 验证
  • 2.4 启动mongos
  • 2.4.1 启动
  • 2.5 启用分片
  • 2.5.1 添加分片
  • 三、验证
  • 3.1 创建数据库
  • 3.2 分片验证
  • 四、小结
  • 4.1 注意事项
  • 4.2 小结
  • 五、参考
  • 六、附相关脚本
  • 6.1 创建目录
  • 6.2 配置文件


一、环境说明

  • 有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其实是路由节点。

五、参考

六、附相关脚本

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