zanePerfor前端性能监控平台高可用之Mongodb集群分片架构

栏目: 数据库 · 发布时间: 5年前

内容简介:在MongoDB中,分片集群(sharded cluster)是一种水平扩展数据库系统性能的方法,能够将数据集分布式存储在不同的分片(shard)上,每个分片只保存数据集的一部分,MongoDB保证各个分片之间不会有重复的数据,所有分片保存的数据之和就是完整的数据集。分片集群将数据集分布式存储,能够将负载分摊到多个分片上,每个分片只负责读写一部分数据,充分利用了各个shard的系统资源,提高数据库系统的吞吐量。上图中主要有如下所述三个主要组件:

HI!,你好,我是zane,zanePerfor是一款最近我开发的一个前端性能监控平台,现在支持web浏览器端和微信小程序段。

我定义为一款完整,高性能,高可用的前端性能监控系统,这是未来会达到的目的,现今的架构也基本支持了高可用,高性能的部署。实际上还不够,在很多地方还有优化的空间,我会持续的优化和升级。

开源不易,如果你也热爱技术,拥抱开源,希望能小小的支持给个star。

项目的github地址:

github.com/wangweiange…

项目开发文档说明:

blog.seosiwei.com/performance…

分片的概念:

MongoDB 中,分片集群(sharded cluster)是一种水平扩展数据库系统性能的方法,能够将数据集分布式存储在不同的分片(shard)上,每个分片只保存数据集的一部分,MongoDB保证各个分片之间不会有重复的数据,所有分片保存的数据之和就是完整的数据集。分片集群将数据集分布式存储,能够将负载分摊到多个分片上,每个分片只负责读写一部分数据,充分利用了各个shard的系统资源,提高数据库系统的吞吐量。

为什么要分片:

  • 解决高并发时系统吞吐量
  • 解决垂直扩展的价格昂贵成本,降低成本
  • 提高系统的稳定,高可用性
  • 提供大数据量时的分布式计算能力
  • 解决单机或副本集的磁盘不足
  • 解决请求量巨大时的内存不足等

MongoDB分片集群结构分布:

zanePerfor前端性能监控平台高可用之Mongodb集群分片架构

上图中主要有如下所述三个主要组件:

Shard:

用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个replica set承担,防止主机单点故障

Config Server:

mongod配置服务器,存储了整个 ClusterMetadata,其中包括 chunk信息(配置服务器3.4起需要是副本集)。

Query Routers:

mongos路由器,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。

分片实例

(备注:鉴于成本,以下内容在单机下部署为例,多机部署只需要替换下IP即可)

分片计划

  • 三个Shard分片 端口:27020,27021,27022
  • 三个Config服务 端口:27100,27101,27102
  • 一个Mongos路由服务 端口:30000

创建Shard分片目录

// 创建分片数据和日志存储目录
mkdir -p /data/mongod/s0
mkdir -p /data/mongod/s1
mkdir -p /data/mongod/s2
mkdir -p /data/mongod/log复制代码

启动Shard Server

mongod --dbpath /data/mongod/s0 --logpath /data/mongod/log/s0.log --fork --smallfiles --port 27020 --shardsvr
mongod --dbpath /data/mongod/s1 --logpath /data/mongod/log/s1.log --fork --smallfiles --port 27021 --shardsvr
mongod --dbpath /data/mongod/s2 --logpath /data/mongod/log/s2.log --fork --smallfiles --port 27022 --shardsvr复制代码
  • --dbpath:存储数据目录

  • --logpath:存储日志目录

  • --smallfiles:是否使用较小的默认文件。默认为false

  • --shardsvr:是表示以sharding模式启动Mongodb服务器

提示:每个Shard分片也可以是Mongodb副本集

创建Config Server目录

mkdir -p /data/mongod/c0
mkdir -p /data/mongod/c1
mkdir -p /data/mongod/c2复制代码

启动Config Server

mongod --dbpath /data/mongod/c0 --logpath  /data/mongod/log/c0.log --fork --smallfiles --port 27100 --replSet rs1 --configsvr
mongod --dbpath /data/mongod/c1 --logpath  /data/mongod/log/c1.log --fork --smallfiles --port 27101 --replSet rs1 --configsvr
mongod --dbpath /data/mongod/c2 --logpath  /data/mongod/log/c2.log --fork --smallfiles --port 27102 --replSet rs1 --configsvr复制代码
  • --replSet:副本集名称,副本集名称必须一致

  • --configsvr:是表示以config配置服务启动Mongodb服务器

提示:配置服务器需要是Mongodb副本集

配置副本集:

// shell 命令进入mongodb
mongo --port 27100
// 使用admin账户
use admin;
// 初始化副本集
rs.initiate({_id:"rs1",members:[{_id:0,host:"127.0.0.1:27100"},{_id:1,host:"127.0.0.1:27101"},{_id:2,host:"127.0.0.1:27102"}]})
// 查看副本集状态
rs.status();复制代码

提示:Mongodb副本集节点的增删非常简单,增加使用 rs.add("127.0.0.1:27103") 删除使用: rs.remove("127.0.0.1:27103")

启动Route Process

mongos  --logpath /data/mongod/log/mongo.log --port 30000 --fork --configdb rs1/127.0.0.1:27100,127.0.0.1:27101,127.0.0.1:27102复制代码
  • mongos服务不存储数据,因此不需要dbpath
  • --configdb是核心配置,表示设定config server的地址列表,格式: 副本集名称/host:prot,host:prot,host:prot 格式。

提示:mongos路由服务也可以是副本集

配置Sharding分片

// 进入路由服务器
mongo --port 30000

// 添加分片
sh.addShard("127.0.0.1:27020")
sh.addShard("127.0.0.1:27021")
sh.addShard("127.0.0.1:27022")

// 查看分片信息
sh.status();复制代码

设置分片数据库与片键

指定需要分片的数据库

sh.enableSharding("performance")复制代码

设置分片的片键

Mongodb如何分片是一门学问,分的好对数据均衡存储,查询效率有很高的提升,分的不好导致分片不均匀,有的chunk太大,有的太小,查询效率低下,需要好好的实践和琢磨。

Sharding架构下,如果不手动分片,Mongodb不会自动分片,所有数据会存储到一个片中,所以我们希望分片的表必须手动分片。

分片选择的片键首先需要建立索引。

例如:下面对performance数据库的 pagelist 集合进行分片,选择url为片键。

1、创建索引

db.pagelist.ensureIndex({"url":1})复制代码

2、设置分片

sh.shardCollection("performance.pagelist",{url:1})复制代码

至此分片完毕。

Mongodb一个chunk默认大小为64M,当数据量大于64M时会重新创建新的chunk储存数据。

在zanePerfor (前端性能监控平台)生产环境中使用Mongodb集群分片。

在zanePerfor使用集群分片非常简单,跟单机配置模式是一样的,只需要更改下端口号即可。

一:找到项目的 config/config.prod.js文件

更改如下Mongodb配置即可:

// mongodb 服务
// 此处替换 url 参数为链接副本集方式即可
const dbclients = {
        db3: {
           // 单路由方式
            url: 'mongodb://127.0.0.1:30000/performance',
           // 路由副本集方式
            url: 'mongodb://127.0.0.1:30000,127.0.0.1:30001,127.0.0.1:30002/performance?replicaSet=mongos',
            options: {
                poolSize: 100,
                keepAlive: 10000,
                connectTimeoutMS: 10000,
                autoReconnect: true,
                reconnectTries: 100,
                reconnectInterval: 1000,
            },
        },
 };复制代码

二:分片规则

分片规则初期使用hashed分片,例如webpages集合分片方式:

sh.shardCollection("performance.webpages", { "url": "hashed"})复制代码

详细的分配规则和性能还在总结和实践中,调优之后我会放到github中。

zanePerfor github地址:

github.com/wangweiange…

zanePerfor 开发文档:

blog.seosiwei.com/performance…


以上所述就是小编给大家介绍的《zanePerfor前端性能监控平台高可用之Mongodb集群分片架构》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

计算智能导论

计算智能导论

英吉布雷切特 / 谭营 / 清华大学出版社 / 2010-6 / 59.00元

《计算智能导论(第2版)》导论性地介绍了计算智能的5 个典型范例:人工神经网络、进化计算、计算群体智能、人工免疫系统和模糊系统。它们分别是对生物神经系统、生物进化过程、社会组织的群体行为、自然免疫系统和人类思维过程的成功建模。这些范例已经得到了广泛深入的研究,人们在取得了很大的成功之后,已将研究成果广泛地应用到了众多的实际应用领域。极大提高了人们发现问题,求解问题,尤其是求解复杂科学与工程问题的能......一起来看看 《计算智能导论》 这本书的介绍吧!

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具