首页 > 数据库 >MongoDB集群之复制集,分片

MongoDB集群之复制集,分片

时间:2022-11-10 20:47:25浏览次数:40  
标签:mongod 1.3 -- MongoDB chunk 集群 分片 节点

目录

1 集群

1.1 简介

MongoDB 有三种集群部署模式,分别为主从复制(Master-Slaver)、副本集(Replica Set)和分⽚(Sharding)模式。

  • 副本集:Replica Set
    ⾼可⽤(主要⽬标):当⼀个结点故障时⾃动切换到其他结点
    数据冗余(主要⽬标):数据复制到n个结点上,增加数据安全性,同时为⾼可⽤提供基础
    功能隔离(次要⽬标):使⽤不同的结点隔离某些有特殊需求的功能,⽐如使⽤⼀个结点进⾏OLAP运算(⼤规模资源占⽤),使⽤⼀个结
    点在远程做灾备(性能要求不如本地⾼),读写分离等等;
  • 分片:Sharded Cluster
    ⽔平扩展:当⼀台服务器满⾜不了需求的时候,我们可以选择垂直扩展(增加服务器硬件),它虽然简单,但很容易达到极限,并且⾯临成本⾼等明显缺点。成本更低的⽅式是使⽤n台服务器组成集群来满⾜系统需求。这就是分⽚集的主要设计⽬标
    缩短响应时间:因为可以把数据分散到多台服务器上,⾃然每台服务器的处理压⼒减⼩,处理时间就会缩短
    这⾥会出现⼀个问题:假设每台服务器出故障的机率是p,那么n台服务器有⼀台出现故障的机率就是p * n,如果不做⾼可⽤设计,集群出现故障的概率就与机器数量成正⽐,这在⼯程上是不能接受的。
    幸运的是我们已经有了解决⾼可⽤的⽅案,也就是复制集。所以MongoDB的分⽚集群要求每⼀个⽚都是复制集(当然测试环境也可以使⽤单结点,⽣产环境不推荐
  • 主从:Master-Slaver
    ⽬前已经不推荐使⽤
    主从复制模式的集群中只能有⼀个主节点,主节点提供所有的增、删、查、改服务,从节点不提供任何服务,但是可以通过设置使从节点提供查询服务,这样可以减少主节点的压⼒。
    另外,每个从节点要知道主节点的地址,主节点记录在其上的所有操作,从节点定期轮询主节点获取这些操作,然后对⾃⼰的数据副本执⾏这些操作,从⽽保证从节点的数据与主节点⼀致。
    在主从复制的集群中,当主节点出现故障时,只能⼈⼯介⼊,指定新的主节点,从节点不会⾃动升级为主节点。同时,在这段时间内,该集群架构只能处于只读状态。

1.2 复制集

1.2.1 简介

副本集是一组保持着相同数据集合的mongod实例,其中1个mongod为primary,接收全部写操作其余secodary只负责读操作
primary instance打开oplogsecendary读取oplog,并产生相同的数据集
replicattion set多台服务器维护相同的数据副本,提高服务器的可用性
在这里插入图片描述

副本集中仲裁关系
在这里插入图片描述

1.2.2 复制集设置

1.2.2.1 创建目录并启动

mkdir -p /data/r0 /data/r1 /data/r2

注意:在启动3个实例时,必须要声明 实例属于某复制集

./bin/mongod --port 27017 --dbpath /data/r0  --replSet rsa --fork --logpath /var/log/mongo17.log
./bin/mongod --port 27018 --dbpath /data/r1  --replSet rsa --fork --logpath /var/log/mongo18.log
./bin/mongod --port 27019 --dbpath /data/r2  --replSet rsa --fork --logpath /var/log/mongo19.log

注意:

  • 当在启动服务时报错,报错:To see additional information in this output, start without the "--fork" option
    先看下三个服务的 dbpath是不是指向同一个了,三个服务的dbpath应该三个不同的目录,当把dbpath指向正确的地方时还不能启动,那就把dbpath目录下的文件都删除掉
    因为kill -9 杀掉进程会产生mongod.lock文件,先把mongod.lock文件删了试试看,如果不行就把dbpath下全删除了

1.2.2.2 配置及初始化

先随便连上一台服务器,然后切换到admin数据库

var rsconf = {
    _id:'rsa', //复制集名字
    members: //成员集合
    [
        {_id:0,
        host:'192.168.1.201:27017'
        },
        {_id:1,
        host:'192.168.1.201:27018'
        },
        {_id:2,
        host:'192.168.1.201:27019'
        }
      
    ]
}

根据配置做初始化

rs.initiate(rsconf);

查看复制集信息:

查看配置
rs.conf();
查看状态
rs.status();
查看帮助信息
rs.help();

1.2.2.3 操作节点

添加节点

rs.add('192.168.1.201:27018');
rs.add('192.168.1.201:27019');

删除节点

rs.remove('192.168.1.201:27019');

主节点插入数据

>use test
>db.user.insert({uid:1,name:'lily'});

连接secondary查询同步情况

./bin/mongo --port 27019
>use test
>show tables

rsa:SECONDARY> show tables;
Sat Aug 17 16:03:55.786 JavaScript execution failed: error: { "$err" : "not master and slaveOk=false", "code" : 13435 } 

出现上述错误,是因为slave默认不许读写

>rs.slaveOk();
>show tables

1.2.2.4 不正常关闭服务

mongodb不正常关闭形成的mongodb被锁定,这算是一个Mongod启动的一个常见错误,非法关闭的时候,lock 文件没有remove,第二次启动的时候检查到有lock 文件的时候,就报这个错误了

  • 首先删除数据库目录下的mongod.lock文件
  • repair方式启动mongodb
    ./mongod -f /etc/mongod.conf --repair

1.3 分片

1.3.1 简介

分片是指把数据分布存储在多台机器上,从而达到存储超大数据,及提高数据吞吐量的目的,分片就要使用命令mongos命令来请求路由

注意:在replication中,每台机器存储的内容是一致的,而sharding中,每台机器存储数据的一部分

在这里插入图片描述

1.3.2 结构

分片要有如下要素:

  • 要有N(N>=2)mongod服务做片节点
  • 要有config server 维护meta信息
  • 要启动mongos做路由
  • 要设定号数据的分片规则(config server才能维护)

在这里插入图片描述

mongos查询某条数据时,要先找config server,询问得到该数据在哪个shard分片上

  1. mongs,请求路由
  2. config server,存储元数据--即某台数据存储于某个sharding
    它不存储真的数据,存储meta信息,即某条数据在哪个片上的信息
  3. shard--mongod实例或repla set

1.3.3 配置分片

1.3.3.1 创建分片服务

./bin/mongod --port 27017 --dbpath share/data01 --logpath logs/mongod01.log --fork --replSet share --shardsvr

./bin/mongod --port 27018 --dbpath share/data02 --logpath logs/mongod02.log --fork --replSet share --shardsvr

./bin/mongod --port 27019 --dbpath share/data03 --logpath logs/mongod03.log --fork --replSet share --shardsvr

1.3.3.2 创建配置服务

创建配置服务,这里我们完全可以像启动普通mongodb服务一样启动

./bin/mongod --port 28017 --dbpath replSet/data01 --logpath logs/mongod01.log --fork --replSet config --configsvr

./bin/mongod --port 28018 --dbpath replSet/data02 --logpath logs/mongod02.log --fork --replSet config --configsvr

./bin/mongod --port 28019 --dbpath replSet/data03 --logpath logs/mongod03.log --fork --replSet config --configsvr

1.3.3.3 配置连接路由

配置mongos,通过 configdb 来说明是为哪个服务服务的

./bin/mongos --port 30000 --logpath /var/log/mongo30.log\
 --configdb 127.0.0.1:27020 --fork

报错:

BadValue: configdb supports only replica set connection string

如上, 出现这个问题, 是因为使用的MongoDB 5.0.6版,这个版本在之前的版本上有做调整,要求configs服务器是副本集模式。3.2和3.2以下都不做强制要求的。
解决办法:

  1. configs服务器配置成副本集模式
    比如:./bin/mongos --port 30000 --configdb rsa/127.0.0.1:28017 --logpath logs/router.log --fork
  2. 把MongoDB换成3.4以下版本

连接路由器,通过mongos的端口连接

./bin/mongo --port 30000

1.3.3.4 添加分片

sh.addShard('share/127.0.0.1:27017,127.0.0.1:27018,127.0.0.1:27019');

分片相关的状态

sh.status();

查看帮助信息

sh.help();

1.3.3.5 对库表进行分片

添加待分片的库

sh.enableSharding(databaseName);

添加待分片的文档

>sh.shardCollection('dbName.collection',{field:1});

fieldcollection的一个字段,系统将会利用filed的值,来计算应该分到哪一个片上.这个filed片键(shard key)

1.3.3.6 分片相关问题

mongodb不是从单篇文档的级别,绝对平均的散落在各个片上,而是N篇文档,形成一个块chunk,优先放在某个片上,当这片上的chunk,比另一个片的chunk,区别比较大时, (>=3) ,会把本片上的chunk,移到另一个片上,以chunk为单位,维护片之间的数据均衡

问: 为什么插入了10万条数据,才2个chunk?
答: 说明chunk比较大(默认是64M),在config数据库中,修改chunksize的值
查看chunk大小:db.settings.find()
修改命令:db.settings.save({_id:'chunksize,value:1});

问: 既然优先往某个片上插入,当chunk失衡时(一个片34chunk,另一个36chunk),会自动移动chunk,自然随着数据的增多,shard的实例之间有chunk来回移动的现象,这将带来什么问题?
答: 服务器之间IO的增加,

问: 能否自定义一个规则,某N条数据形成1个块,预告分配M个chunk,M个chunk预告分配在不同片上,以后的数据直接入各自预分配好的chunk,不再来回移动?
答: 能,手动预先分片

1.3.4 手动预先分片

以shop.user表为例

  1. 配置分片的表
    user表用userid做shard key
    sh.shardCollection('shop.user',{userid:1});
  2. 使用sh.splitAt分片
    预先在1K 2K...40K这样的界限切好chunk(虽然chunk是空的), 这些chunk将会均匀移动到各片上.
    for(var i=1;i<=40;i++) { sh.splitAt('shop.user',{userid:i*1000}) }
  3. 通过mongos添加user数据
    数据会添加到预先分配好的chunk上,chunk就不会来回移动了.

1.3.5 复制集和分片相结合

配置复制集参考上面步骤
配置分片参考上面步骤,向分片中添加复制集分片时不同
sh.addShard('复制集名字'/ip:port);

sh.addShard('rsa/127.0.0.1:27017');
sh.addShard('rsa/127.0.0.1:27018');

标签:mongod,1.3,--,MongoDB,chunk,集群,分片,节点
From: https://www.cnblogs.com/jingzh/p/16878685.html

相关文章

  • K8S部署zooker集群
    直接贴yaml apiVersion:v1kind:Servicemetadata: name:zk-hs labels:  app:zkspec: ports: -port:2888  name:server -port:3888......
  • 不只是负载均衡,活字格智能集群的架构与搭建方案
    还在单机服务器,时刻面临宕机风险吗?优化程度不够,响应速度缓慢,系统工作响应像老汉拉车吗?为了帮助大家具备企业级应用的部署能力,轻松应对核心业务系统的部署要求,我们准备了......
  • 在 Kubernetes 集群上部署 Dapr
    在Kubernetes集群上部署Dapr在本地机器上运行以下命令以在集群上初始化Dapr:daprinit--kubernetes验证安装结果:daprstatus-k ......
  • Karmada大规模测试报告发布:突破100倍集群规模
    摘要:在本文中,我们将介绍用于测试的相关指标,如何进行大规模测试,以及我们如何实现大规模的集群接入。本文分享自华为云社区《​​突破100倍集群规模!Karmada大规模测试报告发布......
  • Mongodb数据库和MySQL的比较
    谈谈Mongodb和MySQL的区别什么是Mongodb数据库Mongodb是一个介于关系数据库和非关系数据库之间的产品(Nosql),非关系型数据库(nosql),属于文档型数据库。文档是mongoDB......
  • CDH集群内存不够?先别急着加机器
    我们在使用CDH集群的时候,经常会跑一些spark、flink等任务,通常会占用集群较高的内存;随着业务进展,数据量增加,可能会并行跑一些任务,或者是给历史任务分配的内存不足以运行现......
  • 使用kubekey搭建k8s集群,一键安装!
    前言KubeKey是KubeSphere公司用go语言开发的一款云原生容器工具,使用KubeKe可以轻松、高效、灵活地单独或整体安装Kubernetes。安装准备主机名IP作用master1......
  • Installing MongoDB-6.0.2 on openEuler-22.09
    一、InstallingMongoDB-6.0.2onopenEuler-22.091查看版本openEuler-22.09和CentOS8.3里安装无差别,直接一步到位好吧! X、OneStepSuccesssystemctlstopfi......
  • Websocket集群解决方案
    最近在项目中在做一个消息推送的功能,比如客户下单之后通知给给对应的客户发送系统通知,这种消息推送需要使用到全双工的websocket推送消息。所谓的全双工表示客户端和服务......
  • GBase 8a数据库集群JDBC入库非常慢原因及解决方案(Datax同步Gbase数据库也可用)
    一、GBase8a数据库集群JDBC入库方式如下:1、insert方式,每次插入一行;2、insert方式,每次n行,批量提交;3、输出成文件,load加载方式; 二、以上三种方式性能对比:1、第一种,......