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

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

搭建之前先了解一下 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 回帖 • 1 关注
  • 集群
    29 引用 • 65 回帖 • 1 关注

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    63 引用 • 289 回帖 • 1 关注
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 27 关注
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 11 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 548 关注
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 838 关注
  • 微信

    腾讯公司 2011 年 1 月 21 日推出的一款手机通讯软件。用户可以通过摇一摇、搜索号码、扫描二维码等添加好友和关注公众平台,同时可以将自己看到的精彩内容分享到微信朋友圈。

    135 引用 • 798 回帖 • 2 关注
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    188 引用 • 833 回帖 • 2 关注
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    168 引用 • 598 回帖
  • CodeMirror
    2 引用 • 17 回帖 • 197 关注
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    203 引用 • 4024 回帖
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    15 引用 • 7 回帖
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 404 关注
  • webpack

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

    43 引用 • 130 回帖 • 259 关注
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    695 引用 • 538 回帖 • 2 关注
  • Outlook
    1 引用 • 5 回帖 • 1 关注
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    200 引用 • 545 回帖
  • Visio
    1 引用 • 2 回帖
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 430 关注
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    599 引用 • 3541 回帖
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 429 关注
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    293 引用 • 4496 回帖 • 688 关注
  • JetBrains

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

    18 引用 • 54 回帖
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 99 关注
  • Folo

    Folo 是一个 RSS 阅读和信息聚合应用,整合多种内容源到统一时间线。

    项目地址:https://github.com/RSSNext/Folo

    1 引用 • 3 回帖 • 2 关注
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有机会重制。

    14 引用 • 258 回帖
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    21 引用 • 31 回帖 • 1 关注