数据存储扫盲:hbase,cassandra,clickhouse,pg,neo4j... - 知乎


本站和网页 https://zhuanlan.zhihu.com/p/434499454 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

数据存储扫盲:hbase,cassandra,clickhouse,pg,neo4j... - 知乎首发于开发技术夜谈无障碍写文章登录/注册数据存储扫盲:hbase,cassandra,clickhouse,pg,neo4j...新西兰种植园地主被开发支配的开发10 人赞同了该文章本文为个人学习笔记,部分信息、图片等,来源于于网络,若有错误或侵权请联系。本文长期更新hbase简介列族数据库、依赖 Hadoop HDFS、Apache项目、google、Bigtable、JAVA实现、分布式、KV数据库(列族存储)、支持稀疏表设计、可在线平衡和扩展、高并发写入、多副本容灾、使用SQL需结合Phonenix、CP、单行ACID官方文档: https://hbase.apache.org/book.html中文:http://abloz.com/hbase/book.html源码:https://github.com/apache/hbase其他文献:https://zhuanlan.zhihu.com/p/145551967https://developer.aliyun.com/article/724660使用场景大数据量写入、大数据的实时查询、报表、存储在线消息历史数据、日志、订单实时入库、稀疏矩阵存储应用如用户tag,数据一致性强。具体来说,比较适合标签化场景,如描述某一个物体的标签属性[1]、轨迹大数据写入、订单及聊天数据存储等。数据结构hbase可以理解为帮你做了表的水平切分+垂直切分,行按region切,列按列族(column family)切,切出来的小格子就叫store,底层就是一个HFile格式的hdfs文件,一个store会保存到一起。一个列族就是一颗LSM树、内存部分选用跳跃表维护有序KV集合、磁盘部分由多个内部KV有序的文件组成,并附带BloomFilter判断Key是否存在。写入不会修改数据,只是追加最新时间戳的数据信息,删除也是追加一条最新时间戳的delete记录。数据可能存在于内存的memstore或磁盘storefile,由WAL HLog保证持久化。内存数据会定期/定量flush到磁盘小的storeFile会清理过期数据+合并为大的hRegion过大会再split切分为小的行键(RowKey,所谓Key)可以理解为唯一主键,按字典序排序!其使用和定义非常重要,hbase的使用水平完全依赖于RowKey的定义。比如Region的划分就依赖于RowKey分区,使用不当会造成严重的热点问题,比如如果RowKey是时间戳,那较新的数据就会堆积到相同的Region,新的请求也都会发往相同的RegionServer,使系统吞吐量受到单点影响,通常的解决方法包括预hash、反转等方案。一个列族下可以任意添加列,不受任何限制。列存让稀疏结构的数据不浪费空间。HBase的使用上本质是KV的,相邻Key会聚集到一起被切分。服务架构client:客户端读写数据都要去zk拿路由,然后去对应HRegionServer操作。此处也存缓存。zookeeper:存储HBase的元数据(meta表)、master监控HMaster:DML,管理、维护schema结构、重新分配、负载均衡等。只要不改表结构,master挂了client也能crud。HRegionServer:处理客户端的读写请求,负责与HDFS底层交互,是真正干活的节点缺陷仅rowkey支持索引,不存在二级索引。不过这块也有开源的方案,二级索引一般是基于HBase协处理器实现,比较成熟的方案可以使用Phoenix,Phoenix还可以弥补hbase的SQL支持能力。另外还有华为方案[2]。没有事务不支持复杂查询,本质是KV查询,查询方案复杂、范围scan等场景性能很低。一般在HBase之上架设Phoenix或Spark等组件,增强HBase数据分析处理的能力[3]。因为列族不固定,所以也没法做数据约束。小数据量性能甚至不如mysql(千万以下)依赖复杂,使用繁琐cassandra简介Apache项目、Facebook、JAVA实现、分布式、Dynamo、Bigtable、NO-SQL KV、无停机在线扩展、无主架构(GOSSIP)、最终一致性、CQL(类SQL)、主副本、宽表数据库、AP、调优力度细、支持二级索引官方文档: https://cassandra.apache.org/_/index.html中文教程:https://www.cassandra.com.cn/tutorial/源码:https://github.com/apache/cassandracassandra比较hbase:https://developer.aliyun.com/article/25706https://zhuanlan.zhihu.com/p/344859872裸奔:Cassandra与HBase:双胞胎还是外表相似的陌生人?使用场景欺诈检测、位置服务、物联网、日志、邮件、时序数据(订单状态、包裹)相比hbase,可以部署到更前端、更接近在线需求、中小规模场景、OLTP向。写多读少场景性能更好,其实按Key读性能cassandra也比hbase强但是有一致性问题。相邻key可能会分散到多个host上。数据和部署结构LSM树、环、软删除等http://holajiawei.com/zh/tech/db/cassandra-core缺陷没有原子操作,AP在某些情况是一个比较大的问题clickhouse简介开源真*列式关系型数据库,OLAP、Yandex研发、C++实现、分布式、SQL支持、静态查询能力强、次级索引、无ACID、时序数据库、数据压缩、特定类型专用编解码、分布式shard、replica、支持近似计算、DDL、DML、可Join多表、TTL、需要定义表结构、JDBC支持、无ACID、接近ANSI SQL、读取性能炸裂(上亿行/s)官方文档: https://clickhouse.com/docs/zh/源码:https://github.com/ClickHouse/ClickHouse其他文献:对比:https://clickhouse.com/benchmark/dbms/#[%2210000000%22,[%22ClickHouse%22,%22MySQL%22],[%220%22]]对比:https://db-engines.com/en/system/Cassandra%3BClickHouse%3BHBase%3BPostgreSQLhttps://zhuanlan.zhihu.com/p/98439924ClickHouse特性及底层存储原理 - 四季写爱 - 博客园特性工作于磁盘、多核心优化(向量化执行SIMD消除循环优化)、多M架构(客户端可以连任何节点)、数据分片采用本地表+分布式表,分布式表不存储数据相当于DBProxy缺陷没有完整的事务支持。缺少高频率,低延迟的修改或删除已存在数据的能力。仅能用于批量删除或修改数据,但这符合 GDPR。稀疏索引使得ClickHouse不适合通过其键检索单行的点查询。不支持mapreduce使用场景OLAP、日志记录(可能很多情况ES的全文检索是没用的)、网络系统监控、分析统计、流量分析、地理分析、时间序列、MapReduce底层结构ClickHouse支持在表中定义主键。为了使查询能够快速在主键中进行范围查找,数据总是以增量的方式有序的存储在MergeTree中。因此,数据可以持续不断地高效的写入到表中,并且写入的过程中不会存在任何加锁的行为。采用稀疏索引,表引擎MergeTree采用类LSM Tree结构。https://developer.aliyun.com/article/762092MergeTree存储引擎对数据实时可见要求非常高的场景是不太友好的。http://www.hnbian.cn/posts/e6ed3197.html一级索引、二级索引(跳数索引)postgreSQL简介行式数据库、关系型数据库RDBMS、无源码修改风险、对SQL标准实现好、表继承、array和json索引支持、表达式索引、自带全文检索、PostgreSQL只支持堆表,不支持索引组织表、OLTP且有一定OLAP能力、FDW、利用Citus可以做分布式官方文档: https://www.postgresql.org/docs/源码:https://github.com/topics/postgresql相比mysql可以做到同步、半同步、异步复制。几乎任何查询性能都好于mysql想要支持较多连接需要插件,如pgbouncer和pgpool具体可见:https://www.zhihu.com/question/20010554https://www.cnblogs.com/geekmao/p/8541817.html索引结构索引结构 btree , hash , gin , gist , sp-gist , brin , bloom , rum , zombodb , bitmap 等,可定制Neo4j简介图数据库、java+scala、cypher(类sql)、弱schema、集群能力弱、ACID完整、单图事务、碎片无法进行图算法官网:https://neo4j.com/源码:https://github.com/neo4j/neo4j图数据库意义:https://www.cnblogs.com/loveis715/p/5277051.html使用场景长程关系如知识图谱的知识存储、社交、最短路径查询、主要是存储计算关系用,大量数据不适用,如日志等、结构化数据不适用底层数据结构只有两种类型:节点和关系、都为定长存储。矩阵为根本,相关算法基本都能实现https://zhuanlan.zhihu.com/p/98839484小结hbase结构和cassandra非常相似,hbase支持行级acid,这点是cassandra不具有的。但是如果没有使用谷歌全家桶的互联网公司,看起来还是cassandra门槛低一些(二级索引)、AP一点(无主架构)。而ch是真正的列式关系行数据库,身边有人用来存储用户tag,可以join,这点是bigtable实现不具备的,门槛更低(JDBC支持)、但是表结构不支持稀疏设计。未完待续参考^华为云HBASE CASE https://www.zhihu.com/question/39859266/answer/1898246412^华为hbase二级索引 https://github.com/Huawei-Hadoop/hindex^hbase use case https://zhuanlan.zhihu.com/p/107770811编辑于 2022-10-07 15:38数据库分布式数据库MySQL​赞同 10​​添加评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录开发技术夜谈一个把思路理顺、确保读者能看懂的后端技术专栏