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

news2024/11/26 20:27:01

复制集群搭建

基本介绍

什么是复制集?
在这里插入图片描述
复制集是由一组拥有相同数据集的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":"configcluster", # _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();
#分片集群
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

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("shard1/27.0.0.1:37017,27.0.0.1:37018,27.0.0.1:370
19");
sh.addShard("shard2/27.0.0.1:47017,27.0.0.1:47018,27.0.0.1:470
19");
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"}})

参考资料: 极客时间高级体系课

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

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

相关文章

花2个月时间学习,面华为测开岗要30k,面试官竟说:你不是在搞笑。。。

背景介绍 计算机专业&#xff0c;代码能力一般&#xff0c;之前有过两段实习以及一个学校项目经历。第一份实习是大二暑期在深圳的一家互联网公司做前端开发&#xff0c;第二份实习由于大三暑假回国的时间比较短&#xff08;小于两个月&#xff09;&#xff0c;于是找的实习是…

通用考勤后台管理系统

考勤后台系统&#xff0c;包括待办事项、人员管理、任务中心、任务详情、我的任务、客户管理、考勤功能几大功能&#xff0c;本后台系统以考勤打卡为主要功能&#xff0c;采用分屏布局的方式&#xff0c;简洁大方&#xff0c;使用方便

mysqlbinlog 日用记录

我是同步覆盖了两张表&#xff0c;现在想用日志恢复。 先说结论&#xff0c;没有恢复&#xff0c;因为我的日志不完整&#xff0c;设置了定时清理。 如果你truncate了表或者数据库&#xff0c;如果没有完整的日志是恢复不了数据的。 第一、mysqlbinlog 可能没开启 第二、开…

C++入门 第一篇(C++关键字, 命名空间,C++输入输出)

目录 1. C关键字 2. 命名空间 2.1 命名空间定义 2.2命名空间的使用 命名空间的使用有三种方式&#xff1a; 1.加命名空间名称及作用域限定符 2.使用using将命名空间中某个成员引入 3.使用using namespace 命名空间名称 引入 3. C输入&输出 4.缺省函数 4.1 缺省参…

微信开发者工具下载

一、微信开发者工具下载官网 微信开发者工具下载地址与更新日志 | 微信开放文档 (qq.com) 二、微信开发者工具界面 下载安装好后&#xff0c;软件图标如下图所示。 运行软件如下图所示&#xff0c;这时候就需要使用你的管理员账号扫码登录。 登陆后的界面&#xff0c;如下图…

为知笔记一个日记模板

<!DOCTYPE HTML><html><head> <meta http-equiv"Content-Type" content"text/html; charsetunicode"> <title>日记&#xff1a;</title><style id"wiz_custom_css">html, .wiz-editor-body {font-siz…

Lua调用C#类

先创建一个Main脚本作为主入口&#xff0c;挂载到摄像机上 public class Main : MonoBehaviour {// Start is called before the first frame updatevoid Start(){LuaMgr.GetInstance().Init();LuaMgr.GetInstance().DoLuaFile("Main");}// Update is called once p…

Stm32_标准库_11_ADC_光敏热敏传感器_测数值

在测量光敏传感器数值得基础上手动将通道改成热敏传感器通道即可 由于温度传感器的测量范围是-20 ~ 105摄氏度&#xff0c;所以输出温度得考虑带上符号这就需要在原有输出光照强度代码的基础上新添加几个函数 函数1&#xff1a; uint16_t AD_Getvailue(uint8_t ADC_Channel){…

C# PortraitModeFilter (人物图片)背景模糊

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Linq; using System.Windows.Forms; us…

python文本转语音

概述 目前有文本转语音的技术&#xff0c;可以用在配音领域&#xff0c;我个人因为一些需求&#xff0c;所以开始寻找这方面的资源&#xff0c;目前各大平台&#xff0c;比如腾讯&#xff0c;讯飞&#xff0c;阿里&#xff0c;百度等都有这样的API服务&#xff0c;我个人是是使…

Multi Scale Supervised 3D U-Net for Kidney and Tumor Segmentation

目录 摘要1 引言2 方法2.1 预处理和数据增强2.2 网络的体系结构2.3 训练过程2.4 推理与后处理 3 实验与结果4 结论与讨论 摘要 U-Net在各种医学图像分割挑战中取得了巨大成功。一些新的、带有花里胡哨功能的架构可能在某些数据集中在使用最佳超参数时取得成功&#xff0c;但它们…

力扣-463.岛屿的周长

Idea 注意观察&#xff0c;每一个完整的方块&#xff0c;边长都是加4&#xff0c;一旦这个方块有其他的方块相邻的话&#xff0c;那么这两个方块总边长就要减少2. 因此我们遍历二维数组的时候&#xff0c;判断岛屿方块的上面还有左方是否有相邻即可 class Solution { public:in…

Linux 64位 C++协程池原理分析及代码实现

导语 本文介绍了协程的作用、结构、原理&#xff0c;并使用C和汇编实现了64位系统下的协程池。文章内容避免了协程晦涩难懂的部分&#xff0c;用大量图文来分析原理&#xff0c;适合新手阅读学习。 GitHub源码 1. Web服务器问题 现代分布式Web后台服务逻辑通常由一系列RPC请…

算法村开篇

大家好我是苏麟从今天开始我将带来算法的一些习题和心得体会等等...... 算法村介绍 我们一步步地学习算法本专栏会以闯关的方式来学习算法 循序渐进地系统的学习算法并掌握大部分面试知识 , 期待和大家一起进步 . 索大祝大家学有所成 , 前程似锦.

PyCharm运行Nosetests并导出测试报告

1. Pycharm运行Nosetests PyCharm可以使用两种方法&#xff0c;运行Nosetests测试文件&#xff1a; 1) 图形用户界面GUI a) 在PyCharm中&#xff0c;选中测试文件&#xff0c;如Tests/test_demo.py b) 鼠标右键选择Run Nosetests in test_demo.py即可执行测试 注1&#xff…

【大数据Hive】hive select 语法使用详解

目录 一、前言 二、Hive select 完整语法树 三、Hive select 操作演示 3.1 数据准备 3.1.1 创建一张表 3.1.2 将数据load加载到t_usa_covid19表 3.1.3 再创建一张分区表 3.1.4 使用动态分区插入数据 3.2 select 常用语法 3.2.1 查询所有字段或者指定字段 3.2.2 查询…

【数据库系统概论】第七章数据库设计

7.1数据库设计概述 数据库设计定义是什么&#xff1f; 数据库设计(database design)&#xff1a;数据库设计是指对于一个给定的应用环境&#xff0c;构造(设计)优化的数据库逻辑模式和物理结构&#xff0c;并据此建立数据库及其应用系统&#xff0c;使之能够有效地存储和管理…

【排序算法】详解冒泡排序及其多种优化稳定性分析

文章目录 算法原理细节分析优化1优化2算法复杂度分析稳定性分析总结 算法原理 冒泡排序(Bubble Sort) 就是从序列中的第一个元素开始&#xff0c;依次对相邻的两个元素进行比较&#xff0c;如果前一个元素大于后一个元素则交换它们的位置。如果前一个元素小于或等于后一个元素…

RootSIFT---SIFT图像特征的扩展

RootSIFT是论文 Three things everyone should know to improve object retrieval - 2012所提出的 A Comparative Analysis of RootSIFT and SIFT Methods for Drowsy Features Extraction - 2020 当比较直方图时&#xff0c;使用欧氏距离通常比卡方距离或Hellinger核时的性能…

分析智能平台VMware Greenplum 7 正式发布!

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…