MongoDB4.0 搭建分布式集群 - 笔记

本贴最后更新于 2361 天前,其中的信息可能已经沧海桑田

搭建之前先了解一下 MongoDB 分片群集主要有如下三个组件:

Shard:分片服务器,用于存储实际的数据块,实际生产环境中一个 shard server 角色可以由几台服务器组成一个 Peplica Set 承担,防止主机单点故障。
Config Server:配置服务器,存储了整个分片群集的配置信息,其中包括 chunk 信息。
Routers:前端路由,客户端由此接入,且让整个群集看上去像单一数据库,前端应用可以透明使用。

系统环境

Centos7.5、MongoDB4.0.2、关闭防火墙。

IP 路由服务端口 配置服务端口 分片 1 端口 分片 2 端口 分片 3 端口
10.211.55.3 27018 27018 27001 27002 27003
10.211.55.4 27018 27018 27001 27002 27003
10.211.55.5 27018 27018 27001 27002 27003

imagepng

三台机器的配置服务(27018)形成复制集,分片 1、2、3 也在各机器都部署一个实例,它们之间形成复制集,客户端直接连接 3 个路由服务与之交互,配置服务和分片服务对客户端是透明的。

服务器的安装及配置(3 台服务器执行相同操作)

1、下载解压 MongoDB

到 MongoDB 官网下载:https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.2.tgz

解压到/home/mongodb,设置环境变量:

export PATH=$PATH:/home/mongodb/bin
保存后执行:

srouce /etc/profile
2、创建路由、配置、分片等的相关目录与文件

启动配置文件存放的文件夹:mkdir -p /home/mongodb/conf
配置服务数据存放目录:mkdir -p /home/mongodb/data/config
分片 1 服务数据存放目录:mkdir -p /home/mongodb/data/shard1
分片 2 服务数据存放目录:mkdir -p /home/mongodb/data/shard2
分片 3 服务数据存放目录:mkdir -p /home/mongodb/data/shard3
配置服务日志存放文件:mkdir -p /home/mongodb/log/config.log
路由服务日志存放文件:mkdir -p /home/mongodb/log/mongos.log
分片 1 服务日志存放文件:mkdir -p /home/mongodb/log/shard1.log
分片 2 服务日志存放文件:mkdir -p /home/mongodb/log/shard2.log
分片 3 服务日志存放文件:mkdir -p /home/mongodb/log/shard3.log

配置服务器部署(3 台服务器执行相同操作)

1、在/home/mongodb/conf 目录创建 config.conf:

dbpath=/home/mongodb/data/config
logpath=/home/mongodb/log/config.log
port=27018
logappend=true
fork=true
maxConns=5000

#复制集名称
replSet=configs

#置参数为 true
configsvr=true

#允许任意机器连接
bind_ip=0.0.0.0
2、配置复制集

分别启动三台服务器的配置服务:

mongod -f /home/mongodb/conf/config.conf
连接 mongo,只需在任意一台机器执行即可:

mongo --host 10.211.55.3 --port 27018
切换数据库:

use admin
初始化复制集:

rs.initiate({_id:"configs",members:[{_id:0,host:"10.211.55.3:27018"},{_id:1,host:"10.211.55.4:27018"}, {_id:2,host:"10.211.55.5:27018"}]})
其中_id:"configs"的 configs 是上面 config.conf 配置文件里的复制集名称,把三台服务器的配置服务组成复制集。

查看状态:

rs.status()
等几十秒左右,执行上面的命令查看状态,三台机器的配置服务就已形成复制集,其中 1 台为 PRIMARY,其他 2 台为 SECONDARY。

分片服务部署(3 台服务器执行相同操作)

1、在/home/mongodb/conf 目录创建 shard1.conf、shard2.conf、shard3.conf,内容如下:

dbpath=/home/mongodb/data/shard1 #其他 2 个分片对应修改为 shard2、shard3 文件夹
logpath=/home/mongodb/log/shard1.log #其他 2 个分片对应修改为 shard2.log、shard3.log
port=27001 #其他 2 个分片对应修改为 27002、27003
logappend=true
fork=true
maxConns=5000
storageEngine=mmapv1
shardsvr=true
replSet=shard1 #其他 2 个分片对应修改为 shard2、shard3
bind_ip=0.0.0.0
端口分别是 27001、27002、27003,分别对应 shard1.conf、shard2.conf、shard3.conf。

还有数据存放目录、日志文件这几个地方都需要对应修改。

在 3 台机器的相同端口形成一个分片的复制集,由于 3 台机器都需要这 3 个文件,所以根据这 9 个配置文件分别启动分片服务:

mongod -f /home/mongodb/conf/shard{1/2/3}.conf
2、将分片配置为复制集

连接 mongo,只需在任意一台机器执行即可:

mongo --host 10.211.55.3 --port 27001 //这里以 shard1 为例,其他两个分片则再需对应连接到 27002、27003 的端口进行操作即可
切换数据库:

use admin
初始化复制集:

rs.initiate({_id:"shard1",members:[{_id:0,host:"10.211.55.3:27001"},{_id:1,host:"10.211.55.4:27001"},{_id:2,host:"10.211.55.5:27001"}]})
以上是基于分片 1 来操作,同理,其他 2 个分片也要连到各自的端口来执行一遍上述的操作,让 3 个分片各自形成 1 主 2 从的复制集,注意端口及仲裁节点的问题即可,操作完成后 3 个分片都启动完成,并完成复制集模式。

路由服务部署(3 台服务器执行相同操作)

1、在/home/mongodb/conf 目录创建 mongos.conf,内容如下:

logpath=/home/mongodb/log/mongos.log
logappend = true
port = 27017
fork = true
configdb = configs/10.211.55.3:27018,10.211.55.4:27018,10.211.55.5:27018
maxConns=20000
bind_ip=0.0.0.0

2、启动 mongos

分别在三台服务器启动:

mongos -f /home/mongodb/conf/mongos.conf

3、启动分片功能

连接 mongo:

mongo --host 10.211.55.3 --port 27017
切换数据库:

use admin
添加分片,只需在一台机器执行即可:

sh.addShard("shard1/10.211.55.3:27001,10.211.55.4:27001,10.211.55.5:27001")
sh.addShard("shard2/10.211.55.3:27002,10.211.55.4:27002,10.211.55.5:27002")
sh.addShard("shard3/10.211.55.3:27003,10.211.55.4:27003,10.211.55.5:27003")
查看集群状态:

sh.status()

4、实现分片功能

设置分片 chunk 大小

use config
db.setting.save({"_id":"chunksize","value":1}) # 设置块大小为 1M 是方便实验,不然需要插入海量数据

5、模拟写入数据

use calon
for(i=1;i<=50000;i++){db.user.insert({"id":i,"name":"jack"+i})} #模拟往 calon 数据库的 user 表写入 5 万数据

7、启用数据库分片

sh.enableSharding("calon")

8、创建索引,对表进行分片

db.user.createIndex({"id":1}) # 以"id"作为索引
sh.shardCollection(calon.user",{"id":1}) # 根据"id"对 user 表进行分片
sh.status() # 查看分片情况

到此,MongoDB 分布式集群就搭建完毕。






扫一扫有惊喜: [![imagepng](http://itechor.top/solo/upload/bb791a58c3a84193b7f643b6849482c5_image.png) ](http://ym0214.com)
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    91 引用 • 59 回帖 • 2 关注
  • 集群
    29 引用 • 65 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    554 引用 • 675 回帖
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    35 引用 • 468 回帖 • 762 关注
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    42 引用 • 130 回帖 • 252 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    326 引用 • 1395 回帖 • 1 关注
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖 • 1 关注
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    108 引用 • 153 回帖 • 2 关注
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    32 引用 • 108 回帖
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    371 引用 • 1857 回帖 • 1 关注
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 271 关注
  • 996
    13 引用 • 200 回帖 • 4 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 2 关注
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖
  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用 • 9 关注
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 644 关注
  • CongSec

    本标签主要用于分享网络空间安全专业的学习笔记

    1 引用 • 1 回帖 • 37 关注
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 229 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖 • 1 关注
  • 招聘

    哪里都缺人,哪里都不缺人。

    188 引用 • 1057 回帖 • 2 关注
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    188 引用 • 319 回帖 • 241 关注
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    76 引用 • 1742 回帖 • 2 关注
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    6 引用 • 26 回帖 • 541 关注
  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 645 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    186 引用 • 1021 回帖 • 1 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 66 关注
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    201 引用 • 120 回帖 • 2 关注
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 74 关注