1. 启动服务器
1.1 启动配置服务器

配置服务器是集群的大脑,保存着关于每个服务器包含哪些数据的所有元数据,因此,必须首先创建配置服务器。

由于资源限制,在同一机器上启动三个进程

# mkdir /home/mongo/cs1
# mkdir /home/mongo/cs2
# mkdir /home/mongo/cs3
# mongod --configsvr --replSet configRS --bind_ip localhost --port 27038 --dbpath /home/mongo/cs1
# mongod --configsvr --replSet configRS --bind_ip localhost --port 27039 --dbpath /home/mongo/cs2
# mongod --configsvr --replSet configRS --bind_ip localhost --port 27040 --dbpath /home/mongo/cs3
# mongo --host localhost --port 27038
> rs.initiate(
{
_id: "configRS",
configsvr: true,
members: [
{_id: 0, host: "localhost:27038"},
{_id: 1, host: "localhost:27039"},
{_id: 2, host: "localhost:27040"}
]
})

可以看到,配置服务器副本集至此启动成功

configRS:PRIMARY> rs.isMaster()
{
"hosts" : [
"localhost:27038",
"localhost:27039",
"localhost:27040"
],
"setName" : "configRS",
"setVersion" : 1,
"ismaster" : true,
"secondary" : false
......
}
1.2 启动mongos路由进程

在3个配置服务器都运行后,启动一个mongos进程以供应用程序进行连接。为了确保高可用性,至少应该创建两个mongos进程。

# mongos --configdb configRS/localhost:27038,localhost:27039,localhost:27040 --bind_ip_all --port 27029 --fork --logpath /home/mongo/log.log
1.3 将副本集转换为分片

假设你已经创建了副本集,或参考之前文章8.MongoDB系列之创建副本集(一)进行创建副本集

连接副本集成员,并查看主节点

# mongo localhost:27018
study:PRIMARY> rs.isMaster()
{
"hosts" : [
"localhost:27018",
"localhost:27019",
"localhost:27020"
],
"setName" : "study",
"setVersion" : 2,
"ismaster" : true
.....
}

依次关闭从节点,并如下方式重新启动

mongod --replSet study --shardsvr --port 27019 --bind_ip localhost --dbpath /home/data/rs2
mongod --replSet study --shardsvr --port 27020 --bind_ip localhost --dbpath /home/data/rs3

现在将mongo shell连接到主节点,然后让其退位:

# mongo localhost:27018
study:PRIMARY> rs.stepDown()
# mongod --replSet study --shardsvr --port 27018 --bind_ip localhost --dbpath /home/data/rs1

现在可以将副本集作为分片添加到集群中了。通过mongos连接到admin数据库

# mongo localhost:27029/admin
> sh.addShard("study/localhost:27018,localhost:27019,localhost:27020")
mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("62db816632b8e5b7cc0a5018")
}
shards:
{ "_id" : "study", "host" : "study/localhost:27018,localhost:27019,localhost:27020", "state" : 1 }
active mongoses:
"4.2.6" : 1
autosplit:
Currently enabled: yes
balancer:
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 0
Migration Results for the last 24 hours:
No recent migrations
databases:
{ "_id" : "config", "primary" : "config", "partitioned" : true }
{ "_id" : "study", "primary" : "study", "partitioned" : false, "version" : { "uuid" : UUID("edc96711-21fd-4199-b47a-45a3b89c2f1c"), "lastMod" : 1 } }

至此分片配置完成!

2. MongoDB如何追踪集群数据

每个mongos都必须能够根据一个片键来查找一个文档。MongoDB会将文档已数据块的形式进行分组,这些数据块是片键指定范围内的文档。块总是存在于分片上,因此MongoDB可以用较小的表来维护数据块跟分片的映射。一个块总是属于且仅属于一个块,因此,不能使用数组字段来作为片键。

2.1 块范围

块在shell中显示范围为$minKey和$maxKey, 块存储在config.chunks集合中

2.2 拆分块

各个分片的主节点mongod进程会跟踪他们当前的块,一旦达到某个阈值,就会检查该块是否需要拆分。

mongodb尝试分裂某个块却无法成功的过程被称为拆分风暴。防止拆分风暴的唯一方法是确保配置服务器尽可能正常运行。

3. 均衡器

均衡器负责是数据的迁移。它会定期检查分片之间是否存在不平衡,如果存在,就会对块进行迁移。

4. 变更流

变更流允许应用程序耿总数据库中数据的实时变更。通过跟踪oplog实现。跨分片集群的变更使用全局逻辑时钟来保持有序性。

欢迎关注公众号算法小生沈健的技术博客

14.MongoDB系列之配置分片的更多相关文章

  1. mongodb集群配置分片集群

    测试环境 操作系统:CentOS 7.2 最小化安装 主服务器IP地址:192.168.197.21 mongo01 从服务器IP地址:192.168.197.22 mongo02 从服务器IP地址: ...

  2. Mongodb 笔记07 分片、配置分片、选择片键、分片管理

    分片 1. 分片(sharding)是指将数据拆分,将其分散存放在不同的机器上的过程.有时也用分区(partitioning)来表示这个概念.将数据分散到不同的机器上,不需要功能强大的大型计算机就可以 ...

  3. mongodb系列之---副本集配置与说明

    在配置副本集之前,我们先来了解一些关于副本集的知识. 1,副本集的原理 副本集的原理与主从很相似,唯一不同的是,在主节点出现故障的时候,主从配置的从服务器不会自动的变为主服务器,而是要通过手动修改配置 ...

  4. mongoDB系列之(三):mongoDB 分片

    1. monogDB的分片(Sharding) 分片是mongoDB针对TB级别以上的数据量,采用的一种数据存储方式. mongoDB采用将集合进行拆分,然后将拆分的数据均摊到几个mongoDB实例上 ...

  5. 13.MongoDB系列之分片简介

    1. 分片概念 分片是指跨机器拆分数据的过程,有时也会用术语分区.MongoDB既可以手工分片,也支持自动分片 2. 理解集群组件 分片的目标之一是由多个分片组成的集群对应用程序来说就像是一台服务器. ...

  6. mongodb系列之--mongodb 主从配置与说明

    一.为什么要配置mongodb的主从: 1.做主从,可以说是做数据的备份,有利于故障的恢复 2.做主从,可以做到读写分离,主节点负责写操作,从节点负责读操作,这样就把读写压力分开,保证系统的稳定性. ...

  7. MongoDB系列之二(主动复制)

    目前我正在进行MongoDB的双机热备方面相关的工作.根据我目前看到的MongoDB方面的材料,MongoDB的实际部署有三种方式,分别是“主动复制”,“副本集”以及“分片副本集”. 首先我们从最简单 ...

  8. mongoDB系列之(二):mongoDB 副本集

    1. 什么是副本集 副本集就是mongoDB副本所组成的一个集群. 同期原理是,写操作发生在主库,从库同步主库的OpLog日志. 集群中没有特定的主库,主库是选举产生,如果主库down了,会再选举出一 ...

  9. Mongodb副本集+分片集群环境部署

    前面详细介绍了mongodb的副本集和分片的原理,这里就不赘述了.下面记录Mongodb副本集+分片集群环境部署过程: MongoDB Sharding Cluster,需要三种角色: Shard S ...

随机推荐

  1. ROS机械臂 Movelt 学习笔记4 | Move Group 接口 Python

    Python 的使用总是比 C++ 简单许多,Move Group 的 Python 接口更为便捷,也为使用者提供了很多用于操纵机器人和机械臂的函数,能够和 C++ 接口实现相同的功能: 设置机械臂的 ...

  2. Dolphin Scheduler 1.1.0升级1.2.0避坑指南

    本文章经授权转载 组件介绍 Apache Dolphin Scheduler是一个分布式易扩展的可视化DAG工作流任务调度系统.致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开 ...

  3. Redis 01 概述

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

  4. Excel 数学函数(一):INT、TRUNC、ROUND、ROUNDUP 和 ROUNDDOWN

    前言 INT.TRUNC.ROUND.ROUNDUP 和 ROUNDDOWN 都是对一个数进行取舍,但是,各自的取舍的方式不一样. INT 函数只有一个参数:TRUNC.ROUND.ROUNDUP 和 ...

  5. Python入门系列(四)别再傻傻分不清:列表、元组、字典、集合的区别

    总结分析列表.元组.字典.集合的相同与区别之处,只有彻底分清之后,就会在应用的时候,得心应手. 四句话总结 列表是一个有序且可更改的集合,允许重复成员. 元组是一个有序且不可更改的集合,允许重复成员. ...

  6. 简单创建一个SpringCloud2021.0.3项目(二)

    目录 1. 项目说明 1. 版本 2. 用到组件 3. 功能 2. 上一篇教程 3. 创建公共模块Common 4. 网关Gateway 1. 创建Security 2. Security登陆配置 3 ...

  7. django_day02

    django_day02 外键 表示一对多 多对一 class Book(models.Model): name = models.CharField(max_length=32) publisher ...

  8. 解决报错:axios is not defined

    好家伙,来解决报错:axios is not defined 写前端嘛,修bug,不寒颤 进入页面一片空白 来看看报错: 1.axios在安装时:npm install axios --save-de ...

  9. Nginx_Mac安装时使用

    Mac 上安装和使用Nginx 1. 安装Nginx brew install nginx 2. 启动Nginx nginx 其他命令 重启Nginx nginx -s reload 关闭(停止)Ng ...

  10. CMake | 将路径添加到 CMAKE_PREFIX_PATH

    1. CMAKE_PREFIX_PATH CMAKE_PREFIX_PATH是一个分号分隔的路径列表,用来指明软件/库安装路径前缀,以供find_package(),find_program(),fi ...