学习笔记-MongoDB(复制集,分片集集群搭建)

复制集群搭建

基本介绍

什么是复制集?
在这里插入图片描述
复制集是由一组拥有相同数据集的MongoDB实例做组成的集群。
复制集是一个集群,它是2台及2台以上的服务器组成,以及复制集成员包括Primary主节点,Secondary从节点和投票节点。
复制集提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性,保证数据的安全性。
有一台Master机器,负责客户端的写入操作,然后有一台或者多台的机器做Slave,用来同步Master机器数据。一旦Master宕机,集群会快速的在Slave机器中选出一台机器来切换成为Master。这样使用多台服务器来维护相同的数据副本,提高MongoDB的可用性。
整个复制集中,只有主节点负责write操作,read操作不限制。

集群搭建

1 创建目录和配置文件

#创建目录及日志文件
mkdir -p /env/mogosets/data/server1
mkdir -p /env/mogosets/data/server2
mkdir -p /env/mogosets/data/server3
mkdir -p /env/mogosets/logs
touch server1.log server2.log server3.log
# 主节点配置
dbpath=/env/mogosets/data/server1
bind_ip=0.0.0.0
port=37017
fork=true
logpath=/env/mogosets/logs/server1.log
# 集群名称
replSet=heroMongoCluster#从节点1
dbpath=/env/mogosets/data/server2
bind_ip=0.0.0.0
port=37018
fork=true
logpath=/env/mogosets/logs/server2.log
# 集群名称
replSet=heroMongoCluster#从节点2
dbpath=/env/mogosets/data/server3
bind_ip=0.0.0.0
port=37019
fork=true
logpath=/env/mogosets/logs/server3.log
# 集群名称
replSet=heroMongoCluster

分别新建三个mogo的配置文件:
在这里插入图片描述
2 编辑启动脚本和关闭脚本
2-1 启动脚本

/env/liyong/install/mongodb/mongodb/bin/mongod -f /env/mogosets/mongocluster/mongo_37017.conf
/env/liyong/install/mongodb/mongodb/bin/mongod -f /env/mogosets/mongocluster/mongo_37018.conf
/env/liyong/install/mongodb/mongodb/bin/mongod -f /env/mogosets/mongocluster/mongo_37019.conf
echo "start mongo cluster..."
ps -ef | grep mongodb

2-2 关闭脚本

/env/liyong/install/mongodb/mongodb/bin/mongod --shutdown -f /env/mogosets/mongocluster/mongo_37017.conf
/env/liyong/install/mongodb/mongodb/bin/mongod --shutdown -f /env/mogosets/mongocluster/mongo_37018.conf
/env/liyong/install/mongodb/mongodb/bin/mongod --shutdown -f /env/mogosets/mongocluster/mongo_37019.conf
echo "stop mongo cluster..."
ps -ef | grep mongodb

3 初始化集群

var cfg ={"_id":"heroMongoCluster", "protocolVersion" : 1, "members":[ {"_id":1,"host":"127.0.0.1:37017","priority":10}, {"_id":2,"host":"127.0.0.1:37018"} ] } #_id要和replSet=heroMongoCluster保持一致rs.initiate(cfg) #初始化集群 这里可以将下面的37019加入members 这里放到后面试演示节点的动态增加和删除
rs.status() #查询集群的变化

3-1 关于配置里面我们可以指定下面这些参数
在这里插入图片描述

4 节点的动态增删

rs.add("127.0.0.1:37019") #添加节点
rs.remove("127.0.0.1:37019") #删除节点
rs.status()

5 测试集群
5-1 primary节点

#连接primary节点
mongo --host 127.0.0.1 --port=37017
db.users.insert({"name":"liyong","age":11});
db.users.find();

可以看到集群搭建成功以后连接

5-2 secondary节点

mongo --host 127.0.0.1 --port=37018
db.users.insert({"name":"liyong","age":11});

插入数据的时候提示我们了,不是主节点,这也验证了前面提到的再从节点是只读的,主节点可读可写
在这里插入图片描述

db.users.find(); #在从节点进行查询数据

我们可以看到这也一个错误,需要执行rs.slaveOk();
在这里插入图片描述

rs.slaveOk(); #执行此命令以后我们就可以进行查询数据了

6 关闭primary节点,演示主节点重新选取

/env/liyong/install/mongodb/mongodb/bin/mongod --shutdown -f /env/mogosets/mongocluster/mongo_37017.conf

可以看到18这个从节点变成了主节点
在这里插入图片描述
然后我们再启动17节点

/env/liyong/install/mongodb/mongodb/bin/mongod -f /env/mogosets/mongocluster/mongo_37017.conf #可以看到我们的17又成为了主节点 因为我们再初始化配置的时候指定了它的优先级会高一点

在这里插入图片描述

7 仲裁节点
用于管理集群的主从节点
7-1 新增一个节点为仲裁节点

rs.addArb("127.0.0,1:37020"); #添加仲裁节点到当前集群
rs.status() # 查询集群的状态

在这里插入图片描述
7-2 也可以在一开始就初始化为仲裁节点

var cfg ={"_id":"heroMongoCluster",
"protocolVersion" : 1,
"members":[
{"_id":1,"host":"127.0.0.1:37017","priority":10},
{"_id":2,"host":"127.0.0.1:37018","priority":0},
{"_id":3,"host":"127.0.0.1:37019","priority":5},
{"_id":4,"host":"127.0.0.1:37020","arbiterOnly":true}
]
};
# 重新装载配置,并重新生成集群节点。
rs.reconfig(cfg)
# 重新查看集群状态
rs.status()

分片集群

基本介绍

为什么要分片?
存储容量需求超出单机磁盘容量
活跃的数据集超出单机内存容量,导致很多请求都要从磁盘读取数据,影响性能
IOPS超出单个MongoDB节点的服务能力,随着数据的增长,单机实例的瓶颈会越来越明显
副本集具有节点数量限制

分片集群由以下3个服务组成:
Shards Server:每个shard由一个或多个mongod进程组成,用于存储数据
Router Server:数据库集群的请求入口,所有请求都通过Router(mongos)进行协调,不需要在应用程序添加一个路由选择器,就是一个请求分发中心它负责把应用程序的请求转发到对应的Shard服务器
Config Server:配置服务器。存储所有数据库元信息(路由、分片)的配置
片键(Shard Key): 为了在数据集合中分配文档,MongoDB使用分片主键分割集合。
区块(Chunk):在一个Shards Server内部,MongoDB还是会把数据分为区块chunk,每个chunk代表这个Shards Server内部一部分数据,包含基于分片主键的左闭右开的区间范围chunk。

怎么合理选择分片?
当我们在选择分片方式的时候,从数据的查询和写入,关键在于权衡性能和负载
最好的效果:
数据查询时能命中更少的分片
数据写入时能够随机的写入每个分片

数据库中没有合适的 Shard Key 供选择,或者使用的Shard Key基数太小,即变化少(如:星期,只有7天可变化),可以选择使用组合键(A + B),甚至可以添加冗余字段组合。一般是粗粒度 + 细粒度进行组合。

常见发分片方式
1)范围分片
在这里插入图片描述

范围分片是基于分片Shard Key的值切分数据,每一个Chunk将会分配到一个范围
范围分片适合满足在一定范围内的查找
例如:查找X的值在[20,30)之间的数据,mongo 路由根据Config Server中存储的元数据,直接定位到指定的Shards的Chunk
缺点:如果Shard Sey有明显递增(或者递减)趋势,则新插入的文档多会分布到同一个chunk,所以并发写入会出现明显瓶颈

hash分片(Hash based sharding)
在这里插入图片描述
Hash分片是计算一个分片Shard Key的hash值,每一个区块将分配一个范围的hash值
Hash分片与范围分片互补,能将文档随机的分散到各个Chunk,充分的利用分布式写入能力,弥补了范围分片的不足
缺点:范围查询性能不佳,所有范围查询要分发到后端所有的Shard才能找出满足条件的文档

搭建实战

1 架构图
在这里插入图片描述
2 这里分片节点集群我们可以复用上面的那个集群,这里我们按照上面的方式在搭建一个分片集群和节点集群,这里不再赘述了

#节点集群
var cfg ={"_id":"configsvr", # _id要和mongo.conf replSet=configcluster保持一致
"protocolVersion" : 1,
"members":[
{"_id":1,"host":"127.0.0.1:17017","priority":10},
{"_id":2,"host":"127.0.0.1:17018","priority":0},
{"_id":3,"host":"127.0.0.1:17019","priority":5},
]
};
rs.initiate(cfg);
rs.status();
#分片集群1
```bash
var cfg ={"_id":"shad1", "protocolVersion" : 1, "members":[ {"_id":1,"host":"127.0.0.1:37017","priority":10}, {"_id":2,"host":"127.0.0.1:37018","priority":0}, {"_id":3,"host":"127.0.0.1:37019","priority":5}, ] };
#分片集群2
var cfg ={"_id":"shad2", 
"protocolVersion" : 1,
"members":[
{"_id":1,"host":"127.0.0.1:47017","priority":10},
{"_id":2,"host":"127.0.0.1:47018","priority":0},
{"_id":3,"host":"127.0.0.1:47019","priority":5},
]
};
rs.initiate(cfg);
rs.status();

特别注意配置节点的配置文件有所不同

# 数据库文件位置
dbpath=/data/mongo/config2
#日志文件位置
logpath=/data/mongo/logs/config2.log
# 以追加方式写入日志
logappend=true
# 是否以守护进程方式运行
fork = true
bind_ip=0.0.0.0
port = 17017
# 表示是一个配置服务器
configsvr=true
#配置服务器副本集名称
replSet=configsvr

分片节点的配置也不相同

shardsvr=true #配置为shardServer

3 配置和启动路由节点
路由节点的配置

port=17117
bind_ip=0.0.0.0
fork=true
logpath=/env/mogosets/route/route.log
configdb=configsvr/127.0.0.1:17017,127.0.0.1:17018,127.0.0.1:17019
#特别注意这里的命令和上面的启动命令不一样/env/liyong/install/mongodb/mongodb/bin/mongos -f ./route-17117.conf

4 连接

mongo --host 127.0.0.1 --port 17117
sh.status()
sh.addShard("shad1/127.0.0.1:37017,127.0.0.1:37018,127.0.0.1:37019");
sh.addShard("shad2/127.0.0.1:47017,127.0.0.1:47018,127.0.0.1:47019");
sh.status()

在这里插入图片描述

5 开启分片

# 为数据库开启分片功能
use admin
db.runCommand( { enablesharding :"myRangeDB"});
# 为指定集合开启分片功能
db.runCommand( { shardcollection : "myRangeDB.coll_shard",key : {_id: 1} } )

6 插入数据并查看情况

use myRangeDB;
for(var i=1;i<= 1000;i++){
db.coll_shard.insert({"name":"test"+i,salary:
(Math.random()*20000).toFixed(2)});
}
db.coll_shard.stats();
sharded true
# 可以观察到当前数据全部分配到了一个shard集群上。这是因为MongoDB并不是按照文档的级别将数据散落在各个分片上的,而是按照范围分散的。也就是说collection的数据会拆分成块chunk,然后分布在不同的shard
# 这个chunk很大,现在这种服务器配置,只有数据插入到一定量级才能看到分片的结果
# 默认的chunk大小是64M,可以存储很多文档
# 查看chunk大小:
use config
db.settings.find()
# 修改chunk大小
db.settings.save( { _id:"chunksize", value: NumberLong(128)} )

7 使用hash分片

use admin
db.runCommand({"enablesharding":"myHashDB"})
db.runCommand({"shardcollection":"myHashDB.coll_shard","key":
{"_id":"hashed"}})

问题记录

1 如果你第一次启动并配置过集群,这个时候改配置文件的时候需要格外小心,replSet=configsvr这个配置不要改,因为启动过集群的cfg操作被记录到了日志中,再启动的时候会根据日志恢复,如果你的配置和之前的不一样会无法启动。
参考资料: 极客时间高级体系课

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/108202.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】手撕STL系列——stack,queue篇

前言 前面实现了string和vector&#xff0c;理所应当就该轮到stack和queue啦&#xff0c;本篇还会涉及到一个比较重要且听起来很厉害的概念——适配器模式 适配器模式 在之前数据结构初阶的学习过程中&#xff0c;我们学习的栈是由数组加上一些限制组成的容器&#xff0c;底…

Jenkins 内存占用

查看内存占用 # ps aux | grep 9090 root 130854 0.0 0.0 8900 708 pts/1 S 16:23 0:00 grep --colorauto 9090 root 4010748 0.2 30.7 5826500 2502884 ? Ssl Oct13 8:55 /usr/bin/java -Djava.awt.headlesstrue -jar /usr/share/java/jenkins…

C++入门之引用与内联函数

一、引用 1、初步理解 引用在语法上的理解就是起别名&#xff0c;用法就是在类型后面加&&#xff0c;例子&#xff1a;int a 1; int& b a; 上例所示&#xff0c;执行后&#xff0c;b就是a的别名&#xff0c;它们代表同一块空间&#xff0c;a的改变会影响b&#xff0…

哇喔,用这个平台制作电子画册,太简单了!

经常在朋友圈里看到可以在线浏览、类似仿真书的电子画册&#xff0c;总觉得这种制作起来很难&#xff0c;后来无意间看到朋友在制作&#xff0c;今天终于知道怎么做了&#xff01; 原来只用一个平台 FLBOOK&#xff01;&#xff01;就能做出来这种效果&#xff0c;像我这种电脑…

在vscode中配置git bash终端、git 源码管理

打开vscode文件->首选项->设置&#xff0c;打开设置搜索shell windows将以下配置添加到vscode中的settings.json中 注意&#xff1a; terminal.integrated.profiles.windows这个配置项是就是添加终端的terminal.integrated.defaultProfile.windows这个是配置默认选项的…

【计算机网络笔记】分组交换中的报文交付时间计算例题

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 系列文章目录题目解答 题目 在下图所示的采用“存储-转发”方式的分组交换网络中所有链路的数据传输速率为100 Mbps&#xff0c;分…

关于setInteval定时器在不同浏览器下表现差异

背景: 项目下用到websocket, 中间使用了setInterval 定时向服务端发送心跳包, 5s/次, 观察正常, 就将浏览器最小化后, 经过了两天, 周一过来查看, 咋才 5000次; 问题分析: 遇到这种简单的问题当然是请教一下GPT 来的最快最实际, 不出所料, 马上得到证实; chrome 88 版本之…

05、SpringBoot 集成 RocketMQ

目录 SpringBoot集成RocketMQ消息发送三种方式1、同步消息producer-springboot创建项目添加依赖配置文件同步消息发送代码启动类Test类 comsumer-springboot创建项目添加依赖配置文件同步消息消费代码 2、异步消息生产者消费者 3、一次性消息生产者消费者 消息消费两种方式1、集…

windows应用程序告警:帐户名与安全标识间无任何映射完成

目录 一、问题现象 二、问题解决 &#xff08;一&#xff09;官方方法 &#xff08;二&#xff09;问题定位 &#xff08;三&#xff09;问题处理 一、问题现象 今天巡检域控服务器时&#xff0c;发现告警如下&#xff1a; 安全策略已传播&#xff0c;但有警告信息。 0x534…

21.Hadoop在Windows环境下的下载安装配置超详细版

Hadoop在Windows环境下的下载安装配置超详细版 本文章所需下载安装软件&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1jIQyy0VHuPvQZ8-n_Zq0pg?pwd1017 hadoop的Windows化安装步骤是非常麻烦的&#xff0c;如果有一步出错将导致得充头从来。 环境配置 前置依赖1&…

苏东坡在元丰五年

北宋神宗元丰二年&#xff08;1079年&#xff09;十二月二十八日&#xff0c;震惊朝野上下的“乌台诗案” 正式结案&#xff1a;“祠部员外郎、直史馆苏轼责授检校水部员外郎、黄州团练副使&#xff0c;本州安置、不得签书公事&#xff0c;令御史台差人转押前去。” 元丰三年&…

外卖大数据案例

一、环境要求 HadoopHiveSparkHBase 开发环境。 二、数据描述 meituan_waimai_meishi.csv 是某外卖平台的部分外卖 SPU&#xff08;Standard Product Unit &#xff0c; 标准产品单元&#xff09;数据&#xff0c;包含了外卖平台某地区一时间的外卖信息。具体字段说明如下&am…

医院陪诊小程序:改善患者体验的技术创新

在数字化时代&#xff0c;医疗领域也迎来了革命性的变革。医院陪诊小程序作为这场变革的一部分&#xff0c;为患者和家属提供了前所未有的便捷和支持。这篇文章将探讨医院陪诊小程序的技术实现&#xff0c;以及如何使用代码来创建一个基本的医院陪诊小程序。 什么是医院陪诊小…

Archive Team: The Twitter Stream Grab

该集合不再更新&#xff0c;应被视为静态数据集。 从一般 Twitter 流中抓取的 JSON 的简单集合&#xff0c;用于研究、历史、测试和记忆的目的。这是“Spritzer”版本&#xff0c;最轻、最浅的 Twitter 抓取。不幸的是&#xff0c;我们目前无法访问流的洒水器或花园软管版本。 …

讲解嵌入式软件中超时机制设计

软件超时机制 1、背景 在嵌入式软件程序设计过程中中&#xff0c;经常会遇到超时&#xff08;或定时&#xff09;的处理情况&#xff0c;基本处理思想是在时间到的时候进行相关程序处理&#xff0c;下面介绍两种超时&#xff08;或定时&#xff09;的程序设计方案。 2、方案…

计算机网络 | 应用层

计算机网络 | 应用层 计算机网络 | 应用层应用层概述网络应用模型客户/服务器模型&#xff08;Client/Server&#xff0c;C/S&#xff09;P2P模型&#xff08;Peer-to-Peer&#xff09; 域名系统&#xff08;DNS&#xff09; 参考视频&#xff1a;王道计算机考研 计算机网络 参…

用shell批量修改文件名

场景一 给这些文件都加上.png后缀 #!/bin/bash for i in *; do mv "$i" "$i.png"; done 场景二 给某些文件按某种规则重命名,如按照1,2,3,4…命名,保留原格式 注: Shell中实现整数自增的几种方法示例,此处用于声明是数字类型的declare -i必须添加,否则…

浅谈工业企业能源管理软件的应用

安科瑞 崔丽洁 摘要&#xff1a;在工业企业中&#xff0c;能源是企业正常工作的根本保障&#xff0c;同时也是工业企业成本的主要构成部分。工业企业在相应的工作和使用的能源包括水、电、气等。在过去&#xff0c;企业对能源消耗的关注度比较低&#xff0c;更多的强调安全与保…

跨境电商系统商城源码定制开发的优势与需求

随着互联网的快速发展&#xff0c;跨境电商成为了全球贸易的重要方式之一。为了满足不同企业的需求&#xff0c;跨境电商系统商城源码定制开发应运而生。这种定制开发的方式可以帮助企业打造适合自己的电商系统&#xff0c;提供个性化的功能和服务&#xff0c;迎合不断变化的市…

CUDA学习笔记4——自定义设备函数

自定义设备函数 核函数&#xff1a;__global__修饰&#xff1b;在设备中执行&#xff1b;设备函数&#xff1a;__device__修饰&#xff1b;在设备中执行&#xff1b;只能被核函数或其他设备函数调用&#xff1b;主机函数&#xff1a;__host__修饰&#xff08;可省略&#xff0…