超简单mongodb 4.2分片集群搭建指南

  • Post author:
  • Post category:其他

本文以三台虚拟机为例搭建mongodb分片集群实验环境。由于config节点和mongos路由节点为单实例方式,所以现网部署不推荐此方式部署,仅供参考。

现网部署应考虑config节点和mongos路由节点的高可用。

1.部署环境:

三台虚拟机
硬件配置:16核CPU 32GB内存 200GB硬盘
软件配置:
centos 6.9
mongodb 4.2.0

2.集群结构

分片集群整体架构
计划创建三个分片,每个分片采用一主一副一仲裁构建副本集,搭建一个config实例和一个mongos路由实例。建议:config实例和mongos路由实例可部署多个,构建高可用模式。

3.前期准备:

虚拟机时间同步:

yum install ntpdate -y
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime  #转换时区
ntpdate -u ntp.ntsc.ac.cn  #从国家授时中心同步系统时间

配置hosts(可选)

/etc/hosts追加服务器ip信息
172.28.81.229 mongo-shard1
172.28.81.228 mongo-shard2
172.28.81.226 mongo-shard3

防火墙开启相应端口

每台服务器防火墙开启2200~22004端口

下载包

官网选择合适的操作系统版本下载tgz包
https://www.mongodb.com/download-center/community
示例安装:mongodb-linux-x86_64-rhel62-4.2.3.tgz

4.创建副本集

副本集节点之间通信需要秘钥认证,生成秘钥和配置过程见章节8,此处可以按文章所述继续操作,如果启动副本集后,日志报错connection refused,各节点迟迟没有通信成功,极大可能是没有配置秘钥认证机制导致的。

为每个分片创建副本集节点实例,每个分片有两个副本和一个仲裁者节点。
创建副本集的数据存储位置:
mkdir /home/data/shard1
mkdir /home/data/shard2
mkdir /home/data/shard3

副本集节点实例配置参考:

本示例在/home/config中创建各mongo实例的配置文件。shard1.conf参考:

storage:
  #mongodb数据存储位置
  dbPath: /home/data/shard1
  journal:
    enabled: true
  engine: wiredTiger
  wiredTiger:
    engineConfig:
      # 存储引擎使用的内存大小
      cacheSizeGB: 6
      # 为true,索引和collection信息将保存在dbPath下
      directoryForIndexes: true
# 日志配置
systemLog:
  destination: file
  logAppend: true
  path: /home/logs/shard1.log
# network interfaces
net:
  #监听端口
  port: 22000
  # 允许所有连接
  bindIp: 0.0.0.0
# how the process runs
processManagement:
  fork: true
  pidFilePath: /home/pid/shard1
  timeZoneInfo: /usr/share/zoneinfo
#一个复制集中的所有实例replSetName相同
replication:
  oplogSizeMB: 7000
  replSetName: shard1
sharding:
  clusterRole: shardsvr

在各虚拟机分别创建shard1.conf,shard2.conf,shard3.conf

启动mongo副本集

命令示例:

./mongod -f config/shard1.conf
./mongod -f config/shard2.conf
./mongod -f config/shard3.conf

在其他虚拟机启动所有副本集实例。

副本集节点初始化脚本:

创建副本集初始化脚本shard1.js,shard2.js,shard3.js

shard1.js:
cfg={_id:"shard1", members:[{_id:0, host:'172.28.81.229:22000', arbiterOnly:true},{_id:1, host:'172.28.81.228:22000', priority:2},{_id:2, host:'172.28.81.226:22000', priority:1}]};
rs.initiate(cfg);

shard2.js:
cfg={_id:"shard2", members:[{_id:0, host:'172.28.81.229:22001', priority:2},{_id:1, host:'172.28.81.228:22001', arbiterOnly:true},{_id:2, host:'172.28.81.226:22001', priority:1}]};
rs.initiate(cfg);

shard3.js:
cfg={_id:"shard3", members:[{_id:0, host:'172.28.81.229:22002', priority:1},{_id:1, host:'172.28.81.228:22002', priority:2},{_id:2, host:'172.28.81.226:22002', arbiterOnly:true}]};
rs.initiate(cfg);

初始化副本集:

请在非仲裁者实例执行上述js脚本

./mongo 127.0.0.1:22000/admin shard1.js
./mongo 127.0.0.1:22001/admin shard2.js
./mongo 127.0.0.1:22002/admin shard3.js

在mongo控制台查看各副本集创建状态:

rs.status()

更多副本集操作:

https://www.cnblogs.com/xibuhaohao/p/11320218.html

5.创建mongo分片集群的config节点(用于保存分片的元数据)

config节点必须是副本集模式,否则在启动mongos路由节点时会启动失败,示例副本集只包含一个mongo实例,也可创建多个mongo实例的副本集。

config实例配置参考:

# mongod.conf
# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/
# Where and how to store data.
storage:
  journal:
    enabled: true
  engine: wiredTiger
  wiredTiger:
    engineConfig:
      # 存储引擎使用的内存大小
      cacheSizeGB: 2
      # 为true,索引和collection信息将保存在dbPath下
      directoryForIndexes: true
# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /home/logs/config.log
net:
  port: 22003
  # 允许所有连接
  bindIp: 0.0.0.0
processManagement:
  fork: true
  pidFilePath: /home/pid/config
  timeZoneInfo: /usr/share/zoneinfo
sharding:
  #分片角色是config节点用于保存各分片的元数据
  clusterRole: configsvr
replication:
  oplogSizeMB: 7000
  replSetName: config

启动config实例节点:

./mongod -f config/config.js

创建config单节点副本集

config节点副本集初始化脚本:

config.js:
cfg={_id:"config", members:[{_id:0, host:'172.28.81.229:22003', priority:2}]};
rs.initiate(cfg);

初始化

./mongo 127.0.0.1:22003 config.js

6.创建mongo分片集群mongos路由实例

mongos是整个分片集群的读写入口,也是客户端进行交互的入口,本示例创建一个单节点,也可创建多个节点,分担读写压力。

添加mongos路由实例配置

systemLog:
  destination: file
  logAppend: true
  path: /home/logs/mongos.log
# network interfaces
net:
  port: 22004
  # 允许所有连接
  bindIp: 0.0.0.0
# how the process runs
processManagement:
  fork: true
sharding:
  configDB: config/172.28.81.229:22003

启动mongos路由实例

本次安装仅启动一个

./mongod -f config/router.conf

7.添加分片

打开mongos路由实例mongo控制台:

./mongo 127.0.0.1:22004

执行命令,添加分片:

use admin;
sh.addShard("shard1/172.28.81.229:22000");
sh.addShard("shard1/172.28.81.228:22000");
sh.addShard("shard1/172.28.81.226:22000");
sh.addShard("shard2/172.28.81.229:22001");
sh.addShard("shard2/172.28.81.228:22001");
sh.addShard("shard2/172.28.81.226:22001");
sh.addShard("shard3/172.28.81.229:22002");
sh.addShard("shard3/172.28.81.228:22002");
sh.addShard("shard3/172.28.81.226:22002");

查看分片状态

sh.status()

移除分片(可选)

db.runCommand({removeshard:"shard1/172.28.81.229:22002"});

验证分片

进入mongos控制台

use config;
db.shards.find()

8.mongo分片集群添加秘钥认证

生成秘钥文件

openssl rand 700 -base64 > /home/config/mongodb.keyfile
chmod 600 /home/config/mongodb.keyfile

将秘钥拷贝到其他服务器:

scp /home/config/mongodb.keyfile root@172.28.81.226:/home/config/
scp /home/config/mongodb.keyfile root@172.28.81.228:/home/config/

在每个实例的配置文件中追加配置项

security:
   keyFile: /home/config/mongodb.keyfile

添加用户

启动所有实例。
打开mongos控制台:

use admin
db.createUser({user:"family",pwd:"l79bv2PA",roles:["root"]})
db.auth("family","l79bv2PA");

以认证方式登录mongo分片集群

进入mongos控制台:

./mongo 127.0.0.1:22004 -ufamily -pl79bv2PA --authenticationDatabase=admin

mongodb分片集群构建完成


版权声明:本文为newCheng原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。