参考地址:https://blog.csdn.net/weixin_43622131/article/details/105984032

已配置好的所有的配置文件下载地址:https://files.cnblogs.com/files/sanduzxcvbnm/conf.zip

MongoDB安装

配置MongoDB的yum源

  1. cd /etc/yum.repos.d
  2. vim mongodb-org-4.4.repo

添加以下内容,这里使用阿里的源,baseurl具体根据使用的操作系统来定

  1. [mngodb-org]
  2. name=MongoDB Repository
  3. baseurl=http://mirrors.aliyun.com/mongodb/yum/redhat/7Server/mongodb-org/4.4/x86_64/
  4. gpgcheck=0
  5. enabled=1

阿里云mongodb源镜像描述













安装MongoDB

  1. yum -y install mongodb-org

安装的软件有如下这些:

  1. 正在安装:
  2. mongodb-org
  3. 为依赖而安装:
  4. cyrus-sasl
  5. cyrus-sasl-gssapi
  6. cyrus-sasl-plain
  7. mongodb-database-tools
  8. mongodb-org-database-tools-extra
  9. mongodb-org-mongos
  10. mongodb-org-server
  11. mongodb-org-shell
  12. mongodb-org-tools

安装完后可以查看一下MongoDB的位置

  1. # whereis mongod
  2. mongod: /usr/bin/mongod /etc/mongod.conf /usr/share/man/man1/mongod.1
  3. # whereis mongos
  4. mongos: /usr/bin/mongos /usr/share/man/man1/mongos.1

集群的设计

由于资源有限,拿一台虚拟机做了一个伪分布式的集群,但是原理都是一样的,此方法完全可以完全分布式的集群上。

首先集群有六台机器,一共分了六个副本集,S1,S2,S3,S4,S5,S6,在这里一个副本集分了三个节点,同一副本集中的节点有一个主节点,两个从节点,从节点的数据与主节点一致;

OS为mongos进程(路由服务器);C为config server(配置服务器),设置了三个配置服务器。

按图中所示为每个进程分配一个端口,如果想实现完全分布式可以将这些进程按图分配到六台机器上,这是完全可行的。

这个图极其重要,首先要把这个图看懂,看明白是怎么设计的。

设置配置文件

创建目录结构

首先新建一个放集群数据的文件夹,我这里是在/opt目录下新建了一个mongo文件夹,下面的操作都在/opt/mongo文件夹下进行操作。

然后要为每个进程新建一个文件夹,为了模拟六台机器,我在目录中新建了六个文件夹。1号文件夹代表1号机器,2号文件夹代表2号机器。以此类推

在每个文件夹中为每个进程新建一个文件夹,比如1号机器有4个进程,则新建4个文件夹。

最终的目录结构如下所示:

  1. /opt # tree mongo
  2. mongo
  3. ├── 1
  4.    ├── 1
  5.    ├── 2
  6.    ├── 3
  7.    └── 4
  8. ├── 2
  9.    ├── 1
  10.    ├── 2
  11.    ├── 3
  12.    └── 4
  13. ├── 3
  14.    ├── 1
  15.    ├── 2
  16.    ├── 3
  17.    └── 4
  18. ├── 4
  19.    ├── 1
  20.    ├── 2
  21.    ├── 3
  22.    └── 4
  23. ├── 5
  24.    ├── 1
  25.    ├── 2
  26.    └── 3
  27. └── 6
  28. ├── 1
  29. ├── 2
  30. └── 3

修改配置文件

配置文件一共有三种,一个是路由服务器的配置文件即图中的OS进程的配置文件,一个是副本集中节点的配置文件,一个是配置服务器即图中C中节点的配置文件。

首先需要先找一个模板,在/opt/mongo目录下新建一个conf目录,将MongoDB本身带的conf文件拷贝到该目录下,然后重命名为11.conf,说明是1号机器的第一个进程。MongoDB自带配置文件的位置可以通过whereis mongod命令找到:/etc/mongod.conf

最终的目录结构如下:

  1. /opt/mongo # tree conf
  2. conf
  3. ├── 11.conf
  4. ├── 12.conf
  5. ├── 13.conf
  6. ├── 14.conf
  7. ├── 21.conf
  8. ├── 22.conf
  9. ├── 23.conf
  10. ├── 24.conf
  11. ├── 31.conf
  12. ├── 32.conf
  13. ├── 33.conf
  14. ├── 34.conf
  15. ├── 41.conf
  16. ├── 42.conf
  17. ├── 43.conf
  18. ├── 44.conf
  19. ├── 51.conf
  20. ├── 52.conf
  21. ├── 53.conf
  22. ├── 61.conf
  23. ├── 62.conf
  24. ├── 63.conf

副本集中节点的配置

首先修改的是副本集中节点的配置文件。

这一块的path要修改成刚刚创建给该进程的目录,1号机器的第一个进程所以是/opt/mongo/1/1/mongod.log

同样这里也要改dbPath

这里要改pidFilePath,同样的道理

然后是端口号,刚刚图中给1号机器的第一个进程分配的端口是9011,同时要把bindIp改为0.0.0.0

这一块原本是注释掉的,需要取消注释,并增加replSetName,后面跟的是自己的副本集的编号,与设计集群的图所对应,一定要注意replSetName前面要有缩进,冒号后面要有空格,否则会报错

这个刚开始也是被注释掉的,同样要增加clusterRole,同时也要注意缩进和空格,副本集中节点的作用为shardsvr

12.conf表示的是第一台机器的第二个进程,参考上面的样式进行相应的修改,尤其要注意的是replSetName要参考集群设计图,是S5,不是上一步的S1,其他的也都类似操作

按照集群设计图,需要这样做的有,11,12,13,21,22,23,31,32,33,41,42,43,51,52,53,61,62,63共15个配置文件,注意replSetName参考集群设计图上的

配置服务器节点的配置

由于刚刚已经配置好了11.conf,所有节点的配置文件都大致相同,所以直接将该文件复制多份,其余文件只需要略微修改即可。

下面修改配置服务器节点的配置,按照设计图应该是24,34,44共三个配置文件

以24为例。

只有这两处不同,replSetName要设置为自己所在的组名C

作用修改位configsvr,其余的只需要将路径改为为其创建的文件夹的路径,端口改为为其分配的端口号即可

路由服务器的配置

路由服务器只有一个,设计图中编号为14。

首先需要把storage这块注释掉,因为路由服务器不需要进行存储。

同样replication模块也要注释掉

sharding模块的内容需要修改

  1. sharding:
  2. configDB: C/192.168.0.253:9024,192.168.0.253:9034,192.168.0.253:9044

其中C为配置服务器的组名,后面跟上配置服务器进程的地址:端口即可,在这里配置的是三台配置服务器的地址和端口

已配置好的所有的配置文件下载地址:https://files.cnblogs.com/files/sanduzxcvbnm/conf.zip

启动mongod

逐个启动很麻烦,可以在/opt/mongo/conf目录下写一个脚本如图:

  1. #!/bin/bash
  2. mongod -f 11.conf
  3. mongod -f 12.conf
  4. mongod -f 13.conf
  5. mongod -f 21.conf
  6. mongod -f 22.conf
  7. mongod -f 23.conf
  8. mongod -f 24.conf
  9. mongod -f 31.conf
  10. mongod -f 32.conf
  11. mongod -f 33.conf
  12. mongod -f 34.conf
  13. mongod -f 41.conf
  14. mongod -f 42.conf
  15. mongod -f 43.conf
  16. mongod -f 44.conf
  17. mongod -f 51.conf
  18. mongod -f 52.conf
  19. mongod -f 53.conf
  20. mongod -f 61.conf
  21. mongod -f 62.conf
  22. mongod -f 63.conf

注意:没有14.conf文件,下面的操作会用到这个配置文件

启动成功后查看一下进程是否都成功启动,如果有未启动的可以看下配置文件是否有误,或者查看一下日志。

注意:若配置文件有错误需要批量杀死这些进程,然后再次启动:ps -ef|grep "mongod -f "|grep -v grep|cut -c 9-15|xargs kill -9

分组

然后要对节点进行分组,按照之前设计图上分组即可。首先进入该组中任意节点,声明其组内成员。

节点和端口严格按照集群设计图上的来配置

  1. mongo --port 9011
  2. cfg={_id:"S1", members:[{_id:0,host:'192.168.0.253:9011'}, {_id:1,host:'192.168.0.253:9021'}, {_id:2,host:'192.168.0.253:9031'}]};
  3. rs.initiate(cfg)
  4. mongo --port 9022
  5. cfg={_id:"S2", members:[{_id:0,host:'192.168.0.253:9022'}, {_id:1,host:'192.168.0.253:9032'}, {_id:2,host:'192.168.0.253:9041'}]};
  6. rs.initiate(cfg)
  7. mongo --port 9033
  8. cfg={_id:"S3", members:[{_id:0,host:'192.168.0.253:9033'}, {_id:1,host:'192.168.0.253:9042'}, {_id:2,host:'192.168.0.253:9051'}]};
  9. rs.initiate(cfg)
  10. mongo --port 9043
  11. cfg={_id:"S4", members:[{_id:0,host:'192.168.0.253:9043'}, {_id:1,host:'192.168.0.253:9052'}, {_id:2,host:'192.168.0.253:9061'}]};
  12. rs.initiate(cfg)
  13. mongo --port 9053
  14. cfg={_id:"S5", members:[{_id:0,host:'192.168.0.253:9053'}, {_id:1,host:'192.168.0.253:9062'}, {_id:2,host:'192.168.0.253:9012'}]};
  15. rs.initiate(cfg)
  16. mongo --port 9063
  17. cfg={_id:"S6", members:[{_id:0,host:'192.168.0.253:9063'}, {_id:1,host:'192.168.0.253:9013'}, {_id:2,host:'192.168.0.253:9023'}]};
  18. rs.initiate(cfg)
  19. mongo --port 9024
  20. cfg={_id:"C", members:[{_id:0,host:'192.168.0.253:9024'}, {_id:1,host:'192.168.0.253:9034'}, {_id:2,host:'192.168.0.253:9044'}]};
  21. rs.initiate(cfg)

启动并连接mongos

  1. mongos -f 14.conf

增加分片

下面均在mongos的命令行中进行操作

  1. sh.addShard("S1/192.168.0.253:9011")
  2. sh.addShard("S2/192.168.0.253:9022")
  3. sh.addShard("S3/192.168.0.253:9033")
  4. sh.addShard("S4/192.168.0.253:9043")
  5. sh.addShard("S5/192.168.0.253:9053")
  6. sh.addShard("S6/192.168.0.253:9063")

启动数据分片功能

  1. use admin
  2. db.runCommand({enableSharding:"stumis"})
  3. db.runCommand({shardCollection:"stumis.students",key:{"_id":"hashed"}})

批量插入数据

  1. use stumis
  2. for(var i=1; i<=100; i++) { db.students.insert( {name:"S"+i,age:i});}

查看分片效果

  1. sh.status()
  1. mongos> sh.status()
  2. --- Sharding Status ---
  3. sharding version: {
  4. "_id" : 1,
  5. "minCompatibleVersion" : 5,
  6. "currentVersion" : 6,
  7. "clusterId" : ObjectId("5fa91462ee38d319820f96ad")
  8. }
  9. shards:
  10. { "_id" : "S1", "host" : "S1/192.168.0.253:9011,192.168.0.253:9021,192.168.0.253:9031", "state" : 1 }
  11. { "_id" : "S2", "host" : "S2/192.168.0.253:9022,192.168.0.253:9032,192.168.0.253:9041", "state" : 1 }
  12. { "_id" : "S3", "host" : "S3/192.168.0.253:9033,192.168.0.253:9042,192.168.0.253:9051", "state" : 1 }
  13. { "_id" : "S4", "host" : "S4/192.168.0.253:9043,192.168.0.253:9052,192.168.0.253:9061", "state" : 1 }
  14. { "_id" : "S5", "host" : "S5/192.168.0.253:9012,192.168.0.253:9053,192.168.0.253:9062", "state" : 1 }
  15. { "_id" : "S6", "host" : "S6/192.168.0.253:9013,192.168.0.253:9023,192.168.0.253:9063", "state" : 1 }
  16. active mongoses:
  17. "4.4.0" : 1
  18. autosplit:
  19. Currently enabled: yes
  20. balancer:
  21. Currently enabled: yes
  22. Currently running: yes
  23. Collections with active migrations:
  24. config.system.sessions started at Tue Nov 10 2020 10:12:52 GMT+0800 (CST)
  25. Failed balancer rounds in last 5 attempts: 0
  26. Migration Results for the last 24 hours:
  27. 68 : Success
  28. databases:
  29. { "_id" : "config", "primary" : "config", "partitioned" : true }
  30. config.system.sessions
  31. shard key: { "_id" : 1 }
  32. unique: false
  33. balancing: true
  34. chunks:
  35. S1 956
  36. S2 14
  37. S3 13
  38. S4 14
  39. S5 14
  40. S6 13
  41. too many chunks to print, use verbose if you want to force print
  42. { "_id" : "stumis", "primary" : "S3", "partitioned" : true, "version" : { "uuid" : UUID("3b546bcb-26dc-47f2-97b0-d66f55790186"), "lastMod" : 1 } }
  43. stumis.students
  44. shard key: { "_id" : "hashed" }
  45. unique: false
  46. balancing: true
  47. chunks:
  48. S1 2
  49. S2 2
  50. S3 2
  51. S4 2
  52. S5 2
  53. S6 2
  54. { "_id" : { "$minKey" : 1 } } -->> { "_id" : NumberLong("-7686143364045646500") } on : S1 Timestamp(1, 0)
  55. { "_id" : NumberLong("-7686143364045646500") } -->> { "_id" : NumberLong("-6148914691236517200") } on : S1 Timestamp(1, 1)
  56. { "_id" : NumberLong("-6148914691236517200") } -->> { "_id" : NumberLong("-4611686018427387900") } on : S2 Timestamp(1, 2)
  57. { "_id" : NumberLong("-4611686018427387900") } -->> { "_id" : NumberLong("-3074457345618258600") } on : S2 Timestamp(1, 3)
  58. { "_id" : NumberLong("-3074457345618258600") } -->> { "_id" : NumberLong("-1537228672809129300") } on : S3 Timestamp(1, 4)
  59. { "_id" : NumberLong("-1537228672809129300") } -->> { "_id" : NumberLong(0) } on : S3 Timestamp(1, 5)
  60. { "_id" : NumberLong(0) } -->> { "_id" : NumberLong("1537228672809129300") } on : S4 Timestamp(1, 6)
  61. { "_id" : NumberLong("1537228672809129300") } -->> { "_id" : NumberLong("3074457345618258600") } on : S4 Timestamp(1, 7)
  62. { "_id" : NumberLong("3074457345618258600") } -->> { "_id" : NumberLong("4611686018427387900") } on : S5 Timestamp(1, 8)
  63. { "_id" : NumberLong("4611686018427387900") } -->> { "_id" : NumberLong("6148914691236517200") } on : S5 Timestamp(1, 9)
  64. { "_id" : NumberLong("6148914691236517200") } -->> { "_id" : NumberLong("7686143364045646500") } on : S6 Timestamp(1, 10)
  65. { "_id" : NumberLong("7686143364045646500") } -->> { "_id" : { "$maxKey" : 1 } } on : S6 Timestamp(1, 11)
  66. mongos>

其他客户端连接

只需要连接提供路由的那台主机地址和端口就行了,本文中指的是:192.168.0.253:9014

MongoDB集群搭建---副本和分片(伪集群)的更多相关文章

  1. MongoDB集群搭建-副本集

    MongoDB集群搭建-副本集 概念性的知识,可以参考本人博客地址: 一.Master-Slave方案: 主从: 二.Replica Set方案: 副本集: 步骤:(只要按步骤操作,100%成功) 1 ...

  2. Elasticsearch高级之-集群搭建,数据分片

    目录 Elasticsearch高级之-集群搭建,数据分片 一 广播方式 二 单播方式 三 选取主节点 四 什么是脑裂 五 错误识别 Elasticsearch高级之-集群搭建,数据分片 es使用两种 ...

  3. windows+mysql集群搭建-三分钟搞定集群

    注:本文来源:  陈晓婵   <  windows+mysql集群搭建-三分钟搞定集群   > 一:mysql集群搭建教程-基础篇 计算机一级考试系统要用集群,目标是把集群搭建起来,保证一 ...

  4. Mongodb集群搭建之 Sharding+ Replica Sets集群架构(2)

    参考http://blog.51cto.com/kaliarch/2047358 一.概述 1.1 背景 为解决mongodb在replica set每个从节点上面的数据库均是对数据库的全量拷贝,从节 ...

  5. Mongodb集群搭建之 Sharding+ Replica Sets集群架构

    1.本例使用1台Linux主机,通过Docker 启动三个容器 IP地址如下: docker run -d -v `pwd`/data/master:/mongodb -p 27017:27017 d ...

  6. centos7环境下zookeeper的搭建步骤之单机伪集群

    首先说明:这里是单机版的伪集群搭建 第一步:下载zookeeper:zookeeper的下载地址: http://mirror.bit.edu.cn/apache/zookeeper/ 第二步:安装: ...

  7. 【实验级】Docker-Compose搭建单服务器ELK伪集群

    本文说明 由于最近在搭ELK的日志系统,为了演示方案搭了个单台服务器的日志系统,就是前一篇文章中所记,其实这些笔记已经整理好久了,一直在解决各种问题就没有发出来.在演示过程中我提到了两个方案,其中之一 ...

  8. hadoop集群搭建——单节点(伪分布式)

    1. 准备工作: 前提:需要电脑安装VM,且VM上安装一个Linux系统 注意:本人是在学习完尚学堂视频后,结合自己的理解,在这里做的总结.学习的视频是:大数据. 为了区分是在哪一台机器做的操作,eg ...

  9. k8s集群搭建之二:etcd集群的搭建

    一 介绍 Etcd是一个高可用的 Key/Value 存储系统,主要用于分享配置和服务发现. 简单:支持 curl 方式的用户 API (HTTP+JSON) 安全:可选 SSL 客户端证书认证 快速 ...

随机推荐

  1. testNG框架,使用@BeforeClass标注的代码,执行失败不抛出异常,只提示test ignore的解决方法

    郁闷了好久的一个问题,排错调试的时候是真滴麻烦... Google一圈,发现是testNG的Bug,升级testNG>=6.9.5,就能解决.

  2. MySQL基本操作笔记

    一.数值类型 1.常量(1)字符串常量 ASCII字符串常量占一个字节 例如:'Hello Word' Unicode字符串常量占两个字节 例如:N'Hello Word' mysql> sel ...

  3. JavaWeb--基本概念、Web服务器与Tomcat

    前言 Java Web 其实就是一个技术的总和,把Web看成一个容器而已主要使用JavaEE技术来实现.在加上各种中间件. 整个javaWeb阶段的内容通过实际的案例贯穿学习, 所涉及到的技术知识点会 ...

  4. 结束语句之 continue

    C 语言自学之 continue Dome1:计算1到20之间不能被3整除的数字之和.               运算结果为: sum=147 1 #include<stdio.h> 2 ...

  5. 从贡献第一个 pr 开始,我的开源之路正式开启

    点击上方蓝字关注我们 1 我是一名开源爱好者 我是李进勇,Github Id:JinyLeeChina,目前就职于政采云,专注于大数据平台及数仓领域,是开源项目爱好者. 2 我与小海豚的不解之缘 记得 ...

  6. day20--Java集合03

    Java集合03 8.LinkedList 1)linkedList底层实现了双向链表和双端队列的特点 2)可以添加任意元素(元素可以重复),包括null 3)线程不安全,没有实现同步 LinkedL ...

  7. Redis 10 位图

    参考源 https://www.bilibili.com/video/BV1S54y1R7SB?spm_id_from=333.999.0.0 版本 本文章基于 Redis 6.2.6 概述 Redi ...

  8. 基础1:JS的原型和原型链究竟

    JS的原型和原型链究竟是什么? 1. 从JS创建一个对象开始说起: 1.1 工厂模式创建对象 (缺点是无法知道创建出来的对象是一个什么类型的对象) function createPerson(name ...

  9. CF1442D Sum (动态规划,线段树分治)

    ( 宋 体 字 看 起 来 真 舒 服 ) _{_{(宋体字看起来真舒服)}} (宋体字看起来真舒服)​​ 题 面 ( 洛 谷 翻 译 ) 题面_{_{(洛谷翻译)}} 题面(洛谷翻译)​​ 给定 n ...

  10. 【Java】学习路径50-线程死锁问题

    生活化的例子:比如说有两个人,一把刀和一把叉子: 第一个人先需要一把刀,然后还需要一把叉子: 第二个人先需要一把叉子,然后还需要一把刀. 我们理想的情况是:一个人拿着刀,然后再拿到叉子,把事情做完,然 ...