结合我们的生产需求,本次详细整理了最新版本 MonogoDB 7.0 集群的规划及部署过程,具有较大的参考价值,基本可照搬使用。

适应数据规模为T级的场景,由于设计了分片支撑,后续如有大数据量需求,可分片横向扩展。

■■■ 分片集群规划

■ Configure hostname、hosts file、ip address

vim /etc/hosts
7.7.7.11 node1
7.7.7.12 node2
7.7.7.13 node3

注:规划、实施、运维均采用host解析的方式判定各个节点,因此需确保该配置文件需正确解析node1、node2、node3.

■ 节点的角色及端口分配

┌────node1────┬────node2────┬────node3────┬port─┐
│mongos server│mongos server│mongos server│20000│
├─────────────┼─────────────┼─────────────┼─────┤
│config server│config server│config server│21000│
│(Primary) │(Secondary) │(Secondary) │ │
├─────────────┼─────────────┼─────────────┼─────┤
│shard server1│shard server1│shard server1│27001│
│(Primary) │(Secondary) │(Secondary) │ │
└─────────────┴─────────────┴─────────────┴─────┘

■■■ Pre-task preparation

■ 依赖包

yum install -y libcurl openssl [3.6.23]
yum install -y xz-libs [6.0.0另需]

■ 用户及用户组

groupadd mongod
groupadd mongodb
useradd -g mongod -G mongodb mongod
echo "passwd"|passwd mongod --stdin

■ mongodb 下载、安装

官方所有介质均从这个入口下载:

https://www.mongodb.com/try/download

#20230911 最新版本,选择合适的平台介质
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-7.0.1.tgz
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel80-7.0.1.tgz mkdir -p /u01
KDR=/u01
cd ${KDR}
TGZ=mongodb-linux-x86_64-rhel70-7.0.1 #cp_unzip_chown_ln:
cp /u01/nfs/MongoDB/${TGZ}.tgz .
tar zxvf ${TGZ}.tgz
chown -R mongod:mongod ${TGZ}
ln -s ${KDR}/${TGZ}/bin/* /usr/local/bin/

■ database-tools 下载、安装

6.0版本开始,将数据库相关的工具单独管理,以利于实时升级、发布

wget https://fastdl.mongodb.org/tools/db/mongodb-database-tools-rhel70-x86_64-100.8.0.tgz

wget https://fastdl.mongodb.org/tools/db/mongodb-database-tools-rhel80-x86_64-100.8.0.tgz

KDR=/u01
cd ${KDR}
TGZ=mongodb-database-tools-rhel70-x86_64-100.8.0
【后续步骤同上】
#cp_unzip_chown_ln:

■ mongosh 下载、安装

https://downloads.mongodb.com/compass/mongosh-2.0.0-linux-x64.tgz

KDR=/u01
cd ${KDR}
#TGZ=mongosh-1.10.6-linux-x64
TGZ=mongosh-2.0.0-linux-x64
【后续步骤同上】
#cp_unzip_chown_ln:

■ chronyd

配置时间同步

■ selinux

关闭selinux

■ firewalld

配置防火墙,确保放行这几个端口

firewall-cmd --add-port=20000/tcp --permanent
firewall-cmd --add-port=21000/tcp --permanent
firewall-cmd --add-port=27001-27003/tcp --permanent
firewall-cmd --reload

■ 3个节点创建mongodb数据库文件目录

MongoDir=/u01/mongodb
mkdir -p ${MongoDir}
chown -R mongod:mongod ${MongoDir}
cat >> /etc/profile << EOF
export MongoDir=${MongoDir}
EOF

■ 以下均用mongod用户操作

su - mongod
echo ${MongoDir}

■ 3个节点均建立6个目录:conf、mongos、config、shard1、shard2、shard3

mkdir -p ${MongoDir}/conf
mkdir -p ${MongoDir}/mongos/log
mkdir -p ${MongoDir}/config/data
mkdir -p ${MongoDir}/config/log
mkdir -p ${MongoDir}/shard1/data
mkdir -p ${MongoDir}/shard1/log
mkdir -p ${MongoDir}/shard2/data
mkdir -p ${MongoDir}/shard2/log
mkdir -p ${MongoDir}/shard3/data
mkdir -p ${MongoDir}/shard3/log

■ 检查目录结构

tree ${MongoDir} -L 2 --dirsfirst
├── conf
│   ├── config.conf
│   ├── mongos.conf
│   ├── shard1.conf
│   ├── shard2.conf
│   └── shard3.conf
├── config
│   ├── data
│   └── log
├── mongos
│   └── log
├── shard1
│   ├── data
│   └── log
├── shard2
│   ├── data
│   └── log
└── shard3
   ├── data
   └── log

■■■ config server

mongodb3.4以后要求配置服务器也创建副本集,不然集群搭建不成功

■ 配置文件

【3个节点执行】

cat > ${MongoDir}/conf/config.conf << EOF
processManagement:
fork: true
pidFilePath: ${MongoDir}/config/log/configsvr.pid
net:
bindIpAll: true
port: 21000
ipv6: true
maxIncomingConnections: 20000
storage:
dbPath: ${MongoDir}/config/data
wiredTiger:
engineConfig:
cacheSizeGB: 1
systemLog:
destination: file
path: ${MongoDir}/config/log/configsvr.log
logAppend: true
sharding:
clusterRole: configsvr
replication:
replSetName: configs
setParameter:
connPoolMaxConnsPerHost: 20000
EOF

■ 启动3个 config server

mongod -f ${MongoDir}/conf/config.conf

■ 登录任意一台配置服务器,初始化配置副本集

mongosh node1:21000

定义config变量:
config = {_id: "configs", members: [
{_id: 0, host: "node1:21000"},
{_id: 1, host: "node2:21000"},
{_id: 2, host: "node3:21000"} ]
}
其中,_id: "configs"应与配置文件中的配置一致,"members" 中的 "host" 为三个节点的 ip 和 port 初始化副本集:
rs.initiate(config) 查看此时状态:
rs.status()

■■■ shard server

■ shard server1

【3个节点执行】

【注意】如果数据量并不大,分片需求不明显,可以先只创建shard server1,另外的分片2、分片3先不创建,后续根据实际需求可随时创建。

cat > ${MongoDir}/conf/shard1.conf << EOF
processManagement:
fork: true
pidFilePath: ${MongoDir}/shard1/log/shard1.pid
net:
bindIpAll: true
port: 27001
ipv6: true
maxIncomingConnections: 20000
storage:
dbPath: ${MongoDir}/shard1/data
wiredTiger:
engineConfig:
cacheSizeGB: 5
systemLog:
destination: file
path: ${MongoDir}/shard1/log/shard1.log
logAppend: true
sharding:
clusterRole: shardsvr
replication:
replSetName: shard1
security:
keyFile: ${MongoDir}/conf/mongo.keyfile
setParameter:
connPoolMaxConnsPerHost: 20000
maxNumActiveUserIndexBuilds: 6
EOF

启动3个 shard1 server:

mongod -f ${MongoDir}/conf/shard1.conf

登陆任意节点,初始化副本集:

注:初始化副本集的操作不能在仲裁节点上执行!在哪个节点初始化,则哪个节点默认是副本集的主节点。

mongosh --port 27001
使用admin数据库,定义副本集配置,"arbiterOnly":true 代表其为仲裁节点:
use admin
#模式选择 P/S/S
config = {_id: "shard1", members: [
{_id: 0, host: "node1:27001"},
{_id: 1, host: "node2:27001"},
{_id: 2, host: "node3:27001"}
]
}
#模式选择 P/S/A
config = {_id: "shard1", members: [
{_id: 0, host: "node1:27001"},
{_id: 1, host: "node2:27001"},
{_id: 2, host: "node3:27001", arbiterOnly:true}
]
}
rs.initiate(config);
rs.status()

■ shard server2 【备用,暂不执行】

■ shard server3 【备用,暂不执行】

■■■ mongos server

【3个节点执行】

注:需先启动 config server 和 shard server, 后启动 mongos server (3个节点)

cat > ${MongoDir}/conf/mongos.conf << EOF
processManagement:
fork: true
pidFilePath: ${MongoDir}/mongos/log/mongos.pid
net:
bindIpAll: true
port: 20000
ipv6: true
maxIncomingConnections: 20000
systemLog:
destination: file
path: ${MongoDir}/mongos/log/mongos.log
logAppend: true
sharding:
configDB: configs/node1:21000,node2:21000,node3:21000
EOF

启动3个 mongos server:

mongos -f ${MongoDir}/conf/mongos.conf

■■■ 启用分片机制

以上配置过程可见,mongos server 只有 configsvr 配置信息,并无 shardsvr 的信息,因此还需设置使分片可用,否则是无法使用分片的,就是说:shardsvr 无法直接操作,只能通过 mongos server 启用分片机制后,才能操作

问题:如果只有一个分片,还需要设置吗?答案是:需要,原因见上。

■ 3.6.23 / 7.0.0

登陆任一 mongos server, 使用 admin 数据库,串联路由服务器与分配副本集:

mongosh node1:20000
use admin
sh.addShard("shard1/node1:27001,node2:27001,node3:27001")
查看集群状态:
sh.status()
sh.removeShard("shard2")

■■■ 使用分片机制

暂不涉及,后续可视需要再配置。

■■■ 用户权限配置

对于搭建好的mongodb分片集群,为了安全,需启动安全认证,使用账号密码登录。

默认的mongodb是不设置认证的。只要ip和端口正确就能连接,这样是很不安全的。

mongodb官网声称,为了能保障mongodb的安全可以做以下几个步骤:

1、使用新的端口,默认的27017端口如果一旦知道了ip就能连接上,不太安全

2、设置mongodb的网络环境,最好将mongodb部署到公司服务器内网,这样外网是访问不到的。公司内部访问使用vpn等

3、开启安全认证。认证要同时设置服务器之间的内部认证方式,同时要设置客户端连接到集群的账号密码认证方式

以下详细描述如何配置安全认证。

■ node1 创建副本集认证的key文件

用openssl生成密码文件,然后使用chmod来更改文件权限,仅为文件所有者提供读取权限

cd ${MongoDir}/conf
openssl rand -out mongo.keyfile -base64 90
chmod 600 mongo.keyfile
ll mongo.keyfile
-r-------- 1 mongod mongod 122 Aug 4 08:33 mongo.keyfile

提示:所有副本集节点都必须要用同一份keyfile,一般是在一台机器上生成,然后拷贝到其他机器上,且必须有读的权限,否则将来会报错:

permissions on ${MongoDir}/conf/mongo.keyfile are too open

■ node1 修改配置文件指定keyfile

编辑配置文件,添加如下内容:

for FILE in ${MongoDir}/conf/{config,shard1,mongos}.conf
do
cat >> ${FILE} << EOF
security:
keyFile: /u01/mongodb/conf/mongo.keyfile
EOF
done

■ node1 将修改后的配置文件和key文件拷贝到 node2、node3

scp ${MongoDir}/conf/{config.conf,shard[1-3].conf,mongos.conf,mongo.keyfile} node2:${MongoDir}/conf
scp ${MongoDir}/conf/{config.conf,shard[1-3].conf,mongos.conf,mongo.keyfile} node3:${MongoDir}/conf

■ 重新启动节点

依次启动配置节点、分片节点、路由节点

■ 创建帐号和认证

客户端mongosh,通过localhost或127.0.0.1登录任意一个mongos路由,可以执行创建操作

提示:此时相当于一个后门,只能在 admin 下添加用户

提示:通过mongos添加的账号信息,只会保存到配置节点的服务中,具体的数据节点不保存账号信息,因此分片中的账号信息不涉及到同步问题

建议:先创建超管用户和普通用户,然后再开启安全配置

创建管理员帐号:

use admin
db.createUser({user: "admin", pwd: "passwd!2#", roles: ["root"]})
db.createUser({user: "inspur", pwd: "passwd!2#", roles: ["userAdminAnyDatabase"]})
db.dropUser("inspur")
鉴权操作:
db.auth("admin", "passwd!2#")
db.auth("inspur", "passwd!2#")

创建一个普通权限帐号:

use testdb
db.createUser({user: "liking", pwd: "passwd!2#", roles: ["readWrite"]})
db.auth("liking", "passwd!2#")

■ 用管理员帐号可查看整体的分片情况

use admin
db.auth("admin", "passwd!2#")
sh.status()

■ 用普通帐号访问数据

use testdb
db.auth("liking", "passwd!2#")

■ 客户端连接多个mongos的标准格式

mongosh mongodb://'admin':'passwd%212%23'@node1:20000,node2:20000,node3:20000/testdb?authSource=admin

【最佳实践】高可用mongodb集群(1分片+3副本):规划及部署的更多相关文章

  1. [转]搭建高可用mongodb集群(二)—— 副本集

    在上一篇文章<搭建高可用MongoDB集群(一)——配置MongoDB> 提到了几个问题还没有解决. 主节点挂了能否自动切换连接?目前需要手工切换. 主节点的读写压力过大如何解决? 从节点 ...

  2. 搭建高可用mongodb集群(二)—— 副本集

    在上一篇文章<搭建高可用MongoDB集群(一)——配置MongoDB> 提到了几个问题还没有解决. 主节点挂了能否自动切换连接?目前需要手工切换. 主节点的读写压力过大如何解决? 从节点 ...

  3. 搭建高可用mongodb集群(二)—— 副本集

    在上一篇文章<搭建高可用MongoDB集群(一)--配置MongoDB> 提到了几个问题还没有解决. 主节点挂了能否自动切换连接?目前需要手工切换. 主节点的读写压力过大如何解决? 从节点 ...

  4. 搭建高可用mongodb集群(三)—— 深入副本集内部机制

    在上一篇文章<搭建高可用mongodb集群(二)—— 副本集> 介绍了副本集的配置,这篇文章深入研究一下副本集的内部机制.还是带着副本集的问题来看吧! 副本集故障转移,主节点是如何选举的? ...

  5. 搭建高可用mongodb集群(转)

    搭建高可用mongodb集群(一)——配置mongodb 搭建高可用mongodb集群(二)—— 副本集 搭建高可用mongodb集群(三)—— 深入副本集内部机制 搭建高可用mongodb集群(四) ...

  6. 搭建高可用mongodb集群—— 分片

    从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的时候能否做到自动扩展? 在系统早期,数据量还小的时候不会引起太大的问题,但是随着数据量持续增多,后续迟早会出 ...

  7. 搭建高可用mongodb集群(三)—— 深入副本集内部机制

    在上一篇文章<搭建高可用mongodb集群(二)-- 副本集> 介绍了副本集的配置,这篇文章深入研究一下副本集的内部机制.还是带着副本集的问题来看吧! 副本集故障转移,主节点是如何选举的? ...

  8. 搭建高可用mongodb集群(四)—— 分片(经典)

    转自:http://www.lanceyan.com/tech/arch/mongodb_shard1.html 按照上一节中<搭建高可用mongodb集群(三)-- 深入副本集>搭建后还 ...

  9. [转]搭建高可用mongodb集群(四)—— 分片

    按照上一节中<搭建高可用mongodb集群(三)—— 深入副本集>搭建后还有两个问题没有解决: 从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的 ...

  10. 搭建高可用mongodb集群(四)—— 分片

    按照上一节中<搭建高可用mongodb集群(三)—— 深入副本集>搭建后还有两个问题没有解决: 从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的 ...

随机推荐

  1. 2023-06-23:redis中什么是缓存击穿?该如何解决?

    2023-06-23:redis中什么是缓存击穿?该如何解决? 答案2023-06-23: 缓存击穿是指一个缓存中的热点数据非常频繁地被大量并发请求访问,当该热点数据失效的瞬间,持续的大并发请求无法通 ...

  2. 基于生成式预训练Transformer的跨语言文本摘要与情感分析

    目录 1. 引言 2. 技术原理及概念 2.1 基本概念解释 2.2 技术原理介绍 2.3 相关技术比较 3. 实现步骤与流程 3.1 准备工作:环境配置与依赖安装 3.2 核心模块实现 3.3 集成 ...

  3. React组件三大属性state,props,refs

    1. React组件定义 1.1 函数组件(Function Components) 函数组件是一种简单的定义组件的方式,通过一个JavaScript函数来定义组件.函数接收一个props对象作为参数 ...

  4. 【WALT】WALT入口 update_task_ravg() 代码详解

    目录 [WALT]WALT入口 update_task_ravg() 代码详解 代码展示 代码逻辑 ⑴ 判断是否进入 WALT 算法 ⑵ 获取 WALT 算法中上一个窗口的开始时间 ⑶ 如果任务刚初始 ...

  5. P5752 [NOI1999] 棋盘分割题解

    本文来自我的洛谷博客. 这个题解思路虽然与其他人的思路相同, 但力求使用清晰易懂的图片和文字,讲解最简洁的道理. 请大家耐心地看完,注意要结合图片一起哦~~ 2022-8-24 更改了格式与错别字. ...

  6. T-star高校挑战赛部分wp

    web-1签到 checkin还是很基础的 网站上传存在js检测,禁用js即可上传 写PHP一句话木马上传,http://588f25a5.yunyansec.com/upload/test.php连 ...

  7. Hexo博客Next主题配置加载优化性能提升

    主题源加载优化 把在NexT主题的_config.yml里面的: # Uri of fonts host. E.g. //fonts.googleapis.com (Default) host: 改为 ...

  8. 你知道.NET的字符串在内存中是如何存储的吗?

    毫无疑问,字符串是我们使用频率最高的类型.但是如果我问大家一个问题:"一个字符串对象在内存中如何表示的?",我相信绝大部分人回答不上来.我们今天就来讨论这个问题. 一.字符串对象的 ...

  9. Reactjs学习笔记

    本篇是关于React的简介 ReactJS是Facebook推出的一款前端框架,2013年开源,提供了一种函数式编程思想,拥有比较健全的文档和完善的社区,在React16的版本中对算法进行了革新,称之 ...

  10. CSP-S复习列表

    DP:序列,区间,背包,多维,状压,树型 优化:滚动,单调性,树状数组 数据结构:栈,队,链,deque,priority_queue,vector,set,map 树状数组,分块思想 前缀和,差分思 ...