Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >mongodb高可用集群部署

mongodb高可用集群部署

作者头像
jeremyxu
发布于 2019-03-13 06:36:15
发布于 2019-03-13 06:36:15
2.8K10
代码可运行
举报
运行总次数:0
代码可运行

计划分几篇文章把近一个月技术上的一些实践记录一下,这第一篇记录一下mongodb的高可用集群部署。

环境准备

操作系统信息

系统系统:centos7.2

三台服务器:10.211.55.11/12/13

安装包:https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.0/x86_64/RPMS/

服务器规划

服务器mongo11

服务器mongo12

服务器mongo13

mongos

mongos

mongos

mongo config server

mongo config server

mongo config server

shard server1 复制集节点1

shard server1 复制集节点2

shard server1 复制集节点3

shard server2 复制集节点1

shard server2 复制集节点2

shard server2 复制集节点3

shard server3 复制集节点1

shard server3 复制集节点2

shard server3 复制集节点3

端口分配

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mongos:27088
config:27077
shard1:27017
shard2:27018
shard3:27019

集群搭建

安装mongodb

3台服务器上均安装mongodb的rpm包

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yum install -y https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.0/x86_64/RPMS/mongodb-org-4.0.3-1.el7.x86_64.rpm \
  https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.0/x86_64/RPMS/mongodb-org-mongos-4.0.3-1.el7.x86_64.rpm \
  https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.0/x86_64/RPMS/mongodb-org-server-4.0.3-1.el7.x86_64.rpm \
  https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.0/x86_64/RPMS/mongodb-org-shell-4.0.3-1.el7.x86_64.rpm \
  https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.0/x86_64/RPMS/mongodb-org-tools-4.0.3-1.el7.x86_64.rpm

分别在每台机器建立conf、mongos、config、shard1、shard2、shard3六个目录,因为mongos不存储数据,只需要建立日志文件目录即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mkdir -p /etc/mongodb/conf
mkdir -p /var/lib/mongodb/mongos/log
mkdir -p /var/lib/mongodb/config/data
mkdir -p /var/lib/mongodb/config/log
mkdir -p /var/lib/mongodb/shard1/data
mkdir -p /var/lib/mongodb/shard1/log
mkdir -p /var/lib/mongodb/shard2/data
mkdir -p /var/lib/mongodb/shard2/log
mkdir -p /var/lib/mongodb/shard3/data
mkdir -p /var/lib/mongodb/shard3/log

关闭selinux

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
setenforce 0
sed -i -e 's/^SELINUX=.*$/SELINUX=disabled/g' /etc/selinux/config

初始化分片的复制集

首先初始化分片shard1的复制集,在每台服务器上创建其配置文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cat <<EOF > /etc/mongodb/conf/shard1.conf
systemLog:
  destination: file
  logAppend: true
  path: /var/lib/mongodb/shard1/log/mongod.log
 
# Where and how to store data.
storage:
  dbPath: /var/lib/mongodb/shard1/data
  journal:
    enabled: true
 
# how the process runs
processManagement:
  fork: true  # fork and run in background
  pidFilePath: /var/lib/mongodb/shard1/log/mongod.pid  # location of pidfile
 
# network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0  # Listen to local interface only, comment to listen on all interfaces.

replication:
  replSetName: shard1

sharding:
    clusterRole: "shardsvr"
EOF

在每台服务器上创建该分片复制节点的systemd启动脚本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cat <<EOF > /usr/lib/systemd/system/mongod-shard1.service
[Unit]
Description=MongoDB Database shard1 Service
Wants=network.target
After=network.target

[Service]
Type=forking
PIDFile=/var/lib/mongodb/shard1/log/mongod.pid
ExecStart=/usr/bin/mongod -f /etc/mongodb/conf/shard1.conf
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
StandardOutput=syslog
StandardError=syslog

[Install]
WantedBy=multi-user.target
EOF

在每台服务器上启动该分片的复制集各节点:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
systemctl enable mongod-shard1
systemctl start mongod-shard1

在任意一台服务上初始化复制集配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#连接
$ mongo --port 27017
> use admin
switched to db admin
> config = { 
... _id : "shard1",
... members : [
...... {_id : 0, host : "10.211.55.11:27017" },
...... {_id : 1, host : "10.211.55.12:27017" },
...... {_id : 2, host : "10.211.55.13:27017" }
... ]
... }
> rs.initiate(config)
> rs.status()
> exit

稍微等一会儿,复制集就初始化好了。

以同样的方法安装配置分片shard2、shard3的复制集。

初始化配置服务的复制集

这个过程跟初始化某一个分片的复制集类似,这里就直接贴配置命令了。

在每台服务器上执行下面的命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cat <<EOF > /etc/mongodb/conf/config.conf
systemLog:
  destination: file
  logAppend: true
  path: /var/lib/mongodb/config/log/mongod.log
 
# Where and how to store data.
storage:
  dbPath: /var/lib/mongodb/config/data
  journal:
    enabled: true
 
# how the process runs
processManagement:
  fork: true  # fork and run in background
  pidFilePath: /var/lib/mongodb/config/log/mongod.pid  # location of pidfile
 
# network interfaces
net:
  port: 27077
  bindIp: 0.0.0.0  # Listen to local interface only, comment to listen on all interfaces.

replication:
  replSetName: config

sharding:
    clusterRole: "configsvr"
EOF

cat <<EOF > /usr/lib/systemd/system/mongod-config.service
[Unit]
Description=MongoDB Database config Service
Wants=network.target
After=network.target

[Service]
Type=forking
PIDFile=/var/lib/mongodb/config/log/mongod.pid
ExecStart=/usr/bin/mongod -f /etc/mongodb/conf/config.conf
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
StandardOutput=syslog
StandardError=syslog

[Install]
WantedBy=multi-user.target
EOF

systemctl enable mongod-config
systemctl start mongod-config

在任意一台服务上初始化复制集配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#连接
$ mongo --port 27077
> use admin
switched to db admin
> config = { 
... _id : "config",
... members : [
...... {_id : 0, host : "10.211.55.11:27077" },
...... {_id : 1, host : "10.211.55.12:27077" },
...... {_id : 2, host : "10.211.55.13:27077" }
... ]
... }
> rs.initiate(config)
> rs.status()
> exit

稍微等一会儿,复制集就初始化好了。

配置路由服务器

最后配置路由服务器,比较简单,在每台服务器初始化其的配置文件并启动:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cat <<EOF > /etc/mongodb/conf/mongos.conf
systemLog:
  destination: file
  logAppend: true
  path: /var/lib/mongodb/mongos/log/mongod.log
 
# how the process runs
processManagement:
  fork: true  # fork and run in background
  pidFilePath: /var/lib/mongodb/mongos/log/mongod.pid  # location of pidfile
 
# network interfaces
net:
  port: 27088
  bindIp: 0.0.0.0  # Listen to local interface only, comment to listen on all interfaces.

sharding:
    configDB: "config/10.211.55.11:27077,10.211.55.12:27077,10.211.55.13:27077"
EOF

cat <<EOF > /usr/lib/systemd/system/mongos.service
[Unit]
Description=MongoDB Database mongos Service
Wants=network.target
After=network.target

[Service]
Type=forking
PIDFile=/var/lib/mongodb/mongos/log/mongod.pid
ExecStart=/usr/bin/mongos -f /etc/mongodb/conf/mongos.conf
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
StandardOutput=syslog
StandardError=syslog

[Install]
WantedBy=multi-user.target
EOF

systemctl enable mongos
systemctl start mongos

再在任意一台服务器上依次将3个分片加入到集群中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#连接
$ mongo --port 27088
> use admin
switched to db admin
> sh.addShard( "shard1/10.211.55.11:27017,10.211.55.12:27017,10.211.55.13:27017")
> sh.addShard( "shard2/10.211.55.11:27018,10.211.55.12:27018,10.211.55.13:27018")
> sh.addShard( "shard3/10.211.55.11:27019,10.211.55.12:27019,10.211.55.13:27019")
> sh.status()
> exit

启用用户认证登录

创建一个超级管理员用户,在任意一台服务器上执行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ mongo --port 27088
> use admin
> db.createUser({
  user: "superadmin",
  pwd: "123456",
  roles: [
    { role: "userAdminAnyDatabase", db: "admin" },
    { role: "clusterManager", db : "admin" }
  ],
  passwordDigestor: "server"
})
> exit

创建mongod、mongos之间通信所使用的key文件,在任意一台服务器上执行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
openssl rand -base64 756 > /etc/mongodb/conf/mongo.key
chmod 400 /etc/mongodb/conf/mongo.key
# 将/etc/mongodb/conf/mongo.key文件拷贝到其它服务器上,保持文件权限不变

修改每台服务器上的/etc/mongodb/conf/shard*.conf/etc/mongodb/conf/config.conf/etc/mongodb/conf/mongos.conf,其中shard*.confconfig.conf文件中加入以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
security:
    keyFile: "/etc/mongodb/conf/mongo.key"
    authorization: "enabled"

mongos.conf文件中加入以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
security:
    keyFile: "/etc/mongodb/conf/mongo.key"

在每台服务器上依次执行以下命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
systemctl restart mognod-shard1
systemctl restart mognod-shard2
systemctl restart mognod-shard3
systemctl restart mognod-config
systemctl restart mognos

至此,整个mongodb高可用集群就搭建好了。

部署测试

先建一个database及user测试一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 创建一个database的访问用户
$ mongo --username superadmin --password 123456 --authenticationDatabase admin --port 27088  admin
> use test
> db.createUser({
  user: "testadmin",
  pwd: "123456",
  roles: [
    { role: "dbOwner", db: "test" },
  ],
  passwordDigestor: "server"
})
> exit

# 使用该用户访问database,并插入数据,创建索引
$ mongo --username testadmin --password 123456 --authenticationDatabase test --port 27088  test
> db.col1.insert({"name": "xxj"})
> db.col1.createIndex( { "name": 1 } )
> exit

# 启用该database的分片及对某个collection分片
$ mongo --username superadmin --password 123456 --authenticationDatabase admin --port 27088  admin
> use admin
> sh.enableSharding("test")
> sh.shardCollection("test.col1", { "name" : 1 } )
> exit

总结

手工部署mongodb集群还是比较麻烦的,所以如果图省事儿,还是使用云厂商提供的PaaS服务好了,比如云数据库 MongoDB。如果一定要自己搭建,还是建议用现成的ansible-mongodb-cluster脚本好了。

参考

  1. https://zhuanlan.zhihu.com/p/28600032
  2. https://gist.github.com/guileen/e2ebc1f7de2d2039fed2
  3. https://gist.github.com/jwilm/5842956
  4. https://docs.mongodb.com/manual/tutorial/enforce-keyfile-access-control-in-existing-replica-set/
  5. https://docs.mongodb.com/manual/tutorial/deploy-shard-cluster/
  6. https://docs.mongodb.com/manual/reference/method/js-collection/
  7. https://docs.mongodb.com/manual/reference/method/js-sharding/
  8. https://docs.mongodb.com/manual/reference/built-in-roles/#database-administration-roles
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-10-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
用户认证登录配置文件改后好,要先重启每台服务器上的mongod-config,之后才能重启shard和mongos,不然服务起不起来的,昨晚被这坑了好久
用户认证登录配置文件改后好,要先重启每台服务器上的mongod-config,之后才能重启shard和mongos,不然服务起不起来的,昨晚被这坑了好久
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
MongoDB分布式集群分片
©著作权归作者所有:来自51CTO博客作者hzde0128的原创作品,如需转载,请注明出处,否则将追究法律责任
拓荒者
2019/09/12
5050
mongodb4.0.2分片集群部署
2018年11月14日 11:05:50 Full Stack Developer 阅读数 331
拓荒者
2019/09/18
6020
mongodb4.0.2分片集群部署
Mongodb7.0.14集群分片部署
MongoDB 集群分片是一种水平扩展数据库的方法,通过将数据分布在多个物理服务器上,提高系统的性能和可扩展性。分片的核心思想是将数据分成多个部分(称为“分片”),每个分片存储在不同的服务器上,从而分散负载,提高查询和写入性能。
DBA实战
2024/10/10
2290
Mongodb7.0.14集群分片部署
MongoDB4.0搭建分布式集群
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
拓荒者
2019/09/08
4200
009.MongoDB分片群集部署
shard:每个分片是分片数据的子集。从MongoDB 3.6开始,必须将分片部署为副本集。
木二
2019/07/01
1.6K0
高可用mongodb集群(分片+副本):规划及部署
mongodb是最常用的nosql数据库,以下记录如何搭建高可用mongodb集群(分片+副本)
雪人
2022/10/13
3.6K0
MongoDB分片集群部署(六)
创建用户,该用户在集群环境中可见(相当于单机版root用户,用于创建用户,数据库等操作)
堕落飞鸟
2022/02/24
3960
MongoDB分片集群搭建 原
©著作权归作者所有:来自51CTO博客作者三和梁朝伟的原创作品,如需转载,请注明出处,否则将追究法律责任
拓荒者
2019/09/16
1.2K0
搭建高可用MongoDB集群(分片)
MongoDB基础请参考:http://blog.51cto.com/kaliarch/2044423
KaliArch
2018/05/30
5.4K2
搭建高可用MongoDB集群(分片)
史上最详细的 MongoDB4.0搭建分布式集群(亲测有效)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
拓荒者
2019/09/19
6.9K0
史上最详细的 MongoDB4.0搭建分布式集群(亲测有效)
MongoDB分片集群搭建
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
用户8826052
2021/07/12
1.6K0
【最佳实践】高可用mongodb集群(1分片+3副本):规划及部署
结合我们的生产需求,本次详细整理了最新版本 MonogoDB 7.0 集群的规划及部署过程,具有较大的参考价值,基本可照搬使用。
雪人
2023/10/11
2.4K1
搭建 MongoDB分片(sharding) / 分区 / 集群环境
分别在每台机器建立conf、mongos、config、shard1、shard2、shard3六个目录,因为mongos不存储数据,只需要建立日志文件目录即可。
程序员鹏磊
2018/02/02
3.4K0
搭建高可用mongodb集群(四)—— 分片
按照上一节中《搭建高可用mongodb集群(三)—— 深入副本集》搭建后还有两个问题没有解决:
九州暮云
2019/08/21
8800
搭建高可用mongodb集群(四)—— 分片
MongoDB4.0构建分布式分片群集
分片的优势在于提供类似线性增长的架构,提高数据可用性,提高大型数据库查询服务器的性能。当MongoDB单点数据库服务器存储成为瓶颈、单点数据库服务器的性能成为瓶颈或需要部署大型应用以充分利用内存时,可以使用分片技术。
拓荒者
2019/09/19
6340
Mongodb分片集群部署
对于单台数据库服务器,庞大的数据量及高吞吐量的应用程序对它而言无疑是个巨大的挑战。频繁的CRUD操作能够耗尽服务器的CPU资源,快速的数据增长也会让硬盘存储无能为力,最终内存无法满足数据需要导致大量的I/O,主机负载严重。为了解决这种问题,对于数据库系统一般有两种方法:垂直扩展和分片(水平扩展)。
拓荒者
2019/09/10
2K0
Mongodb分片集群部署
MongoDB分片集群搭建
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
子润先生
2021/07/08
6000
MongoDB3.6集群搭建(分片+副本集) 原
分片则指为处理大量数据,将数据分开存储,不同服务器保存不同的数据,它们的数据总和即为整个数据集。追求的是高性能。 在生产环境中,通常是这两种技术结合使用,分片+副本集
拓荒者
2019/09/16
1.2K0
MongoDB的集群模式–Sharding(分片)
分片是数据跨多台机器存储,MongoDB使用分片来支持具有非常大的数据集和高吞吐量操作的部署。
星哥玩云
2022/08/18
1.3K0
MongoDB的集群模式–Sharding(分片)
Mongodb集群部署(中)
mongodb3.4以后要求配置服务器也创建副本集,不然集群搭建不成功。 vim /usr/local/mongodb/conf/config.conf
陈不成i
2021/06/17
6300
相关推荐
MongoDB分布式集群分片
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验