Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【最佳实践】高可用mongodb集群(1分片+3副本):规划及部署

【最佳实践】高可用mongodb集群(1分片+3副本):规划及部署

原创
作者头像
雪人
发布于 2023-10-11 02:39:13
发布于 2023-10-11 02:39:13
2.5K0
举报
文章被收录于专栏:DataOpsDataOps

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

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

■■■ 分片集群规划

■ Configure hostname、hosts file、ip address

代码语言:txt
AI代码解释
复制
vim /etc/hosts
7.7.7.11 node1
7.7.7.12 node2
7.7.7.13 node3

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

■ 节点的角色及端口分配

代码语言:txt
AI代码解释
复制
┌────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

■ 依赖包

代码语言:txt
AI代码解释
复制
yum install -y libcurl openssl [3.6.23]
yum install -y xz-libs [6.0.0另需]

■ 用户及用户组

代码语言:txt
AI代码解释
复制
groupadd mongod
groupadd mongodb
useradd -g mongod -G mongodb mongod
echo "passwd"|passwd mongod --stdin

■ mongodb 下载、安装

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

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

代码语言:txt
AI代码解释
复制
#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

代码语言:txt
AI代码解释
复制
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

代码语言:txt
AI代码解释
复制
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

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

代码语言:txt
AI代码解释
复制
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数据库文件目录

代码语言:txt
AI代码解释
复制
MongoDir=/u01/mongodb
mkdir -p ${MongoDir}
chown -R mongod:mongod ${MongoDir}
cat >> /etc/profile << EOF
export MongoDir=${MongoDir}
EOF

■ 以下均用mongod用户操作

代码语言:txt
AI代码解释
复制
su - mongod
echo ${MongoDir}

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

代码语言:txt
AI代码解释
复制
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

■ 检查目录结构

代码语言:txt
AI代码解释
复制
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个节点执行】

代码语言:txt
AI代码解释
复制
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

代码语言:txt
AI代码解释
复制
mongod -f ${MongoDir}/conf/config.conf

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

代码语言:txt
AI代码解释
复制
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先不创建,后续根据实际需求可随时创建。

代码语言:txt
AI代码解释
复制
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

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

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

代码语言:txt
AI代码解释
复制
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个节点)

代码语言:txt
AI代码解释
复制
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 数据库,串联路由服务器与分配副本集:

代码语言:txt
AI代码解释
复制
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来更改文件权限,仅为文件所有者提供读取权限

代码语言:txt
AI代码解释
复制
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

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

代码语言:txt
AI代码解释
复制
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

代码语言:txt
AI代码解释
复制
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添加的账号信息,只会保存到配置节点的服务中,具体的数据节点不保存账号信息,因此分片中的账号信息不涉及到同步问题

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

创建管理员帐号:

代码语言:txt
AI代码解释
复制
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#")

创建一个普通权限帐号:

代码语言:txt
AI代码解释
复制
use testdb
db.createUser({user: "liking", pwd: "passwd!2#", roles: ["readWrite"]})
db.auth("liking", "passwd!2#")

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

代码语言:txt
AI代码解释
复制
use admin
db.auth("admin", "passwd!2#")
sh.status()

■ 用普通帐号访问数据

代码语言:txt
AI代码解释
复制
use testdb
db.auth("liking", "passwd!2#")

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

代码语言:txt
AI代码解释
复制
mongosh mongodb://'admin':'passwd%212%23'@node1:20000,node2:20000,node3:20000/testdb?authSource=admin

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
LeakCanary万字源码解析,干货满满
LeakCanary是Android面试中备受瞩目的一环,各大厂商如腾讯Matrix和快手Koom都自研内存泄漏检测框架,其原理分析也常被引述于帮助文档中。本文旨在抛却浮躁情绪,深入探究该框架的思想。
Coder昊白
2023/11/22
6680
LeakCanary万字源码解析,干货满满
为什么各大厂自研的内存泄漏检测框架都要参考 LeakCanary?因为它是真强啊!
LeakCanary 是我们非常熟悉内存泄漏检测工具,它能够帮助开发者非常高效便捷地检测 Android 中常见的内存泄漏。在各大厂自研的内存泄漏检测框架(如腾讯 Matrix 和快手 Koom)的帮助文档中,也会引述 LeakCanary 原理分析。
用户9995743
2022/09/26
1.2K0
为什么各大厂自研的内存泄漏检测框架都要参考 LeakCanary?因为它是真强啊!
全解系列:内存泄漏定位工具LeakCanary!
在日常开发中,不可避免的会遇到内存泄漏的问题,从而导致App的内存使用紧张,严重的情况还会导致App的卡顿甚至是奔溃,所以需要开发人员解决这些内存泄漏的问题。
胡飞洋
2020/09/17
5.6K0
LeakCanary看这一篇文章就够了
LeakCanary是Square公司基于MAT开源的一个内存泄漏检测工具,在发生内存泄漏的时候LeakCanary会自动显示泄漏信息。
用户1269200
2018/07/30
6.5K0
LeakCanary看这一篇文章就够了
Android内存泄露检测 LeakCanary2.0(Kotlin版)的实现原理
LeakCanary是一款非常常见的内存泄漏检测工具。经过一系列的变更升级,LeakCanary来到了2.0版本。2.0版本实现内存监控的基本原理和以往版本差异不大,比较重要的一点变化是2.0版本使用了自己的hprof文件解析器,不再依赖于HAHA,整个工具使用的语言也由Java切换到了Kotlin。本文结合源码对2.0版本的内存泄漏监控基本原理和hprof文件解析器实现原理做一个简单地分析介绍。
2020labs小助手
2021/03/30
1.9K0
由浅入深,聊聊 LeakCanary 的那些事
关于内存泄漏,Android 开发的小伙伴应该都再熟悉不过了,比如最常见的静态类间接持有了某个 Activity 对象,又比如某个组件库的订阅在页面销毁时没有及时清理等等,这些情况下多数时都会造成内存泄漏,从而对我们App的 流畅度 造成影响,更有甚者造成了 OOM 的情况。
Petterp
2023/01/31
4930
由浅入深,聊聊 LeakCanary 的那些事
LeakCanary源码浅析
在Android开发中最让人们头疼的就是内存泄漏了,今天来介绍一个查看内存是否泄漏的工具LeakCanary,并通过研究源码明白它是如何分析和查找存在泄漏信息的 首先送上LeakCanary文档链接:[LeakCanary中文使用说明](https://www.liaohuqiu.net/cn/posts/leak-canary-read-me/) Part1. 知识回顾 常用工具 1. Mat 2. LeakCanary(Square) 原理
用户1337002
2018/04/18
7430
锦囊篇|一文摸懂LeakCanary
LeakCanary想来也是我们的一个老朋友了,但是它是如何做到对我们的App进行内存泄漏分析的呢?这也是我们今天要去研究的主题了。
ClericYi
2020/06/23
6870
LeakCanary源码解析
LeakCanary : https://github.com/square/leakcanary
俞其荣
2019/07/09
7250
LeakCanary2.6抽丝剥茧-源码分析
作为一个小Android,之前分析项过目中LeakCanary1.6.3的源码,今天在好奇心的驱使下,刷新了下maven发现,LeakCanary已经更新到2.6版本,今天对2.6的版本也进行源码的解析。
包子388321
2021/04/02
1.1K0
「Leakcanary 源码分析」看这一篇就够了
Reference 把内存分为 4 种状态,Active 、 Pending 、 Enqueued 、 Inactive。
程序亦非猿
2019/08/16
7610
「Leakcanary 源码分析」看这一篇就够了
全新 LeakCanary 2 ! 完全基于 Kotlin 重构升级 !
大概一年以前,写过一篇 LeakCanary 源码解析 ,当时是基于 1.5.4 版本进行分析的 。Square 公司在今年四月份发布了全新的 2.0 版本,完全使用 Kotlin 进行重构,核心原理并没有太大变化,但是做了一定的性能优化。在本文中,就让我们通过源码来看看 2.0 版本发生了哪些变化。本文不会过多的分析源码细节,详细细节可以阅读我之前基于 1.5.4 版本写的文章,两个版本在原理方面并没有太大变化。
路遥TM
2021/08/31
5460
LeakCanary笔记
RefWatcher 的代理类。通过注册 ActivityLifecycleCallbacks 回调,当 Activity 调用 onDestroy() 时进行一次内存泄漏检查,执行 RefWatcher 的 watch 方法,检测该 Activity 是否发生内存泄露。
续写经典
2018/08/28
3210
LeakCanary原理分析
概述 LeakCanary是一个开源的内存泄漏检测库,极大简化了内存泄漏的检测流程。了解其工作原理,有助于我们更好的理解Android的内存管理机制。 使用示例 在 build.gradle中添加配置: dependencies { debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.6.3' releaseImplementation 'com.squareup.leakcanary:leakcanary-androi
用户1205080
2019/03/11
1.5K0
LeakCanary原理分析
Leakcanary 详解
LeakCanary的使用从LeakCanary.install(this)开始,
大发明家
2021/12/15
4210
内存泄露分析工具:LeakCanary 原理分析
内存泄漏指的是程序在向系统申请分配内存空间,使用完毕后未释放,结果导致一直占据该 内存单元,程序无法再使用该内存单元。在Android系统中,一般指的是对象在超出自身生命周期后, 该对象仍然没有被回收。泄漏包括的种类有:
胡飞洋
2022/02/25
5.3K0
内存泄露分析工具:LeakCanary 原理分析
了解LeakCanary1.6.3来龙去脉--源码分析
可达性分析法 根据是否被GC Root引用确认是否是垃圾对象要被GC回收。 常见可以作为GC Root的对象有:
包子388321
2021/03/25
5890
一步步拆解 LeakCanary
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/80752876
程序员徐公
2018/09/17
5210
一步步拆解 LeakCanary
带你学开源项目:LeakCanary-如何检测活动是否泄漏
为了简单方便的检测内存泄漏,Square开源了LeakCanary,它可以实时监测活动是否发生了泄漏,一旦发现就会自动弹出提示及相关的泄漏信息供分析。
陈宇明
2020/12/15
7900
带你学开源项目:LeakCanary-如何检测活动是否泄漏
LeakCanary源码解析
LeakCanary是Android开发中非常常用的一个内存泄漏监测和分析工具。了解其工作原理,有助于对Android的内存泄漏有更深层次的认识。
Oceanlong
2019/03/15
1K0
相关推荐
LeakCanary万字源码解析,干货满满
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档