Ray's blog

Coding...


  • 归档

  • 分类

  • 标签

  • 关于

基于LSM树的存储引擎

发表于 2024-03-10 | 分类于 数据库

使用 LSM 树提升写入性能

在了解 LSM 树存储引擎之前,我们先来说说磁盘的随机IO、顺序IO。通常数据库的数据最终都是持久化到磁盘上,而对磁盘的访问方式有两种,即:

  • 随机IO
    随机 IO 就需要花费时间做昂贵的磁盘寻道,一般来说,它的读写效率要比顺序 IO 小好几个数量级,所以我们想要提升写入的性能就要尽量减少随机 IO
  • 顺序IO
    以 MySQL 的 InnoDB 存储引擎来说,更新 binlog、redolog、undolog 都是在做顺序 IO,而更新 datafile 和索引文件则是在做随机 IO,而为了减少随机 IO 的发生,关系数据库已经做了很多的优化,比如说写入时先写入内存,然后批量刷新到磁盘上,但是随机 IO 还是会发生。
    索引在 InnoDB 引擎
    中是以 B+ 树(上一节课提到了 B+ 树,你可以回顾一下)方式来组织的,而 MySQL 主键是聚簇索引(一种索引类型,数据与索引数据放在一起),既然数据和索引数据放在一起,那么在数据插入或者更新的时候,我们需要找到要插入的位置,再把数据写到特定的位置上,这就产生了随机的 IO。而且一旦发生了页分裂,就不可避免会做数据的移动,也会极大地损耗写入性能。

目前很多 NoSQL 数据库都在使用基于 LSM 树的存储引擎,例如 RocksDB、LevelDB、HBase 以及 Prometheus 等,这也是为什么这些数据库的写入性能很高的原因。

阅读全文 »

clickhouse时序数据应用

发表于 2024-03-09 | 分类于 数据库

应用场景

使用场景

  • 绝大多数请求都是用于读访问的,数据一次写入,多次查询
  • 数据需要以大批次(大于1000行)进行更新,而不是单行更新;或者根本没有更新操作
  • 数据只是添加到数据库,没有必要修改
  • 读取数据时,会从数据库中提取出大量的行,但只用到一小部分列
  • 表很“宽”,即表中包含大量的列
  • 查询频率相对较低(通常每台服务器每秒查询数百次或更少)
  • 对于简单查询,允许大约50毫秒的延迟
  • 列的值是比较小的数值和短字符串(例如,每个URL只有60个字节)
  • 在处理单个查询时需要高吞吐量(每台服务器每秒高达数十亿行)
阅读全文 »

设备影子与物模型

发表于 2023-12-16 | 分类于 IoT

设备影子与物模型

物模型

物模型(Thing Specification Language)是为产品定义的数据模型,用于描述产品的功能。物模型将设备在云端从属性、服务和事件三个维度,分别描述了该实体是什么、能做什么、可以对外提供哪些信息。定义了物模型的这三个维度,即完成了产品功能的定义。

阅读全文 »

物联网体系梳理

发表于 2023-11-25

从数据的角度审视物联网

物联网系统的价值在于数据的价值,而数据的价值则来源于我们对数据的分析和应用。数据从“生产”到“消费”的过程需要经过一系列处理,如:

  1. 数据源数据采集(设备)
  2. 数据传输(消息队列、负载均衡)
  3. 数据存储(结构化数据、半结构化数据、非结构化数据)
  4. 数据处理(批处理、流处理)
  5. 数据应用(数据可视化、数据挖掘、商业智能、数据预测、控制决策)
阅读全文 »

influxdb小试牛刀

发表于 2023-10-09 | 分类于 数据库

1.8 版本不支持副本机制,目前开源的高可用方案 influxdb-proxy 是使用多个一致性 hash 环,并将数据分别写入每个 hash 环中的一个实例(双写)。如果数据写入失败则会写入缓存文件以便后续进行重写。

2.2 版本及以上(2022年03月发布)默认采用 Flux 语言,并支持副本机制,副本机制为异步复制,所以一定程度上无法保证数据不丢失。

阅读全文 »

json序列号性能对比

发表于 2022-04-15 | 分类于 后端

json序列号性能对比

笔者在日常工作中对高并发的要求越来越高,在针对 QPS 50k/s 的情况下需要对 json 数据进行序列化和反序列化,如果使用官方提供的 encoding/json 包的话性能会低很多。

下面基于常用的 json 序列化/反序列化进行性能对比:

阅读全文 »

字符串拼接性能对比

发表于 2022-03-09 | 分类于 后端

字符串拼接性能对比

笔者在日常工作中经常会遇到将数据进行批处理,即接收多个数据源发送的数据后合并批量操作。在一次针对字符串拼接时出现处理耗时达到 1s(偶发情况),在排查问题时发现在高并发的情况下由于使用了 + 直接对字符串进行拼接导致系统处理时间很慢,因此进行优化。

下面基于常用的字符串拼接进行性能对比:

阅读全文 »

Kafka如何做到高并发读写

发表于 2021-12-10 | 分类于 消息队列

Kafka是一个分布式流处理平台a distributed streaming platform。以发布订阅的模式来记录流数据,类似于消息队列或企业级消息系统。下面引用官方文档的描述:

A streaming platform has three key capabilities:

  1. Publish and subscribe to streams of records, similar to a message queue or enterprise messaging system.
  2. Store streams of records in a fault-tolerant durable way.
  3. Process streams of records as they occur.

如何实现快速读写

  1. 顺序写(page cache)
  2. 零拷贝
kafka
阅读全文 »

Python版本管理

发表于 2021-06-06 | 分类于 后端

笔者在使用 Python 使通常会遇到当前正在使用的版本与想要用的版本不一致,但是又不能改动它,不然原先使用的应用可能就会无缘无故因为版本问题出现一系列的问题。所以这时候就需要用到了版本控制,笔者使用的是 pyenv 来管理不同的版本,virtualenv 来创建不同的虚拟环境。

阅读全文 »

使用 etcd 作为服务配置中心

发表于 2020-12-12 | 分类于 微服务

etcd 简单介绍

etcd 是一个高可用的分布式 key-value 数据存储系统,内部采用 Raft 协议作为一致性算法,基于 Go 语言实现。

主要特点:

  • 简单:提供明确的定义、面向用户的 API(gRPC)
  • 安全:支持 TLS客户端证书认证
  • 快速:基准测试每秒 10000 写入
  • 可靠:使用 Raft 算法保证一致性
阅读全文 »
123
Ray Wong

Ray Wong

Peace & Love

30 日志
8 分类
38 标签
RSS
GitHub cnblog QQ E-Mail
© 2024 Ray
由 Hexo 强力驱动
|
主题 — NexT.Pisces v5.1.4