文章目录
本文以三台虚拟机为例搭建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.创建副本集
为每个分片创建副本集节点实例,每个分片有两个副本和一个仲裁者节点。
创建副本集的数据存储位置:
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分片集群构建完成
转载:https://blog.csdn.net/newCheng/article/details/104972150