OceanBase分布式存储引擎公共模块——基础数据结构

简介: OceanBase源代码中有一个公共模块,包含其他模块需要的公共类,例如公共数据结构、内存管理、锁、任务队列、RPC框架、压缩/解压缩等。下面介绍其中部分类的设计思路

OceanBase分布式存储引擎公共模块——基础数据结构

1.哈希表

为了提高随机读取性能,UpdateServer支持创建哈希索引,这个哈希索引结构就是LightlyHashMap,代码如下:

template <typename Key, typename Value>
class LightlyHashMap
{
public:
    //插入一个<key,value>对到哈希表
    inline int insert(const Key& key, const Value& value);
    //根据key查找value
    inline int get(const Key& key, const Value& value);
    //根据key删除一个<key,value>对,如果value不为空,那么,保存删除的值到value中
    inline int erase(const Key& key, Value& value = NULL);
private;
    struct  Node
    {
        Key key;
        Value value;
        union
        {
            Node* next;
            int64_t flag;
        };
    };
    Node* buckets_; //哈希桶指针
    BitLock bit_lock_;//位锁,用于保护哈希桶
};

LightlyHashMap采用链式冲突处理方法,即将所有哈希值相同的对链到同一哈希桶中,它包含如下三个方法:

  • insert:往哈希表中插入一个对。这个函数首先根据key 的哈希值得到桶号,接着,往哈希桶中插入一个包含key和value值的Node节点。
  • get:根据key查找value。这个函数首先根据key的哈希值得到桶号,接着,遍历对应的链表,找到与传入key相同的Node节点,返回其中的value值。
  • erase:根据key删除一个对。这个函数首先根据key的哈希值得到桶号,接着,遍历对应的链表,找到并删除与传入key相同的Node节点。

LightlyHashMap设计用来存储几千万甚至几亿个元素,它与普通哈希表的不同点在于以下两点:

  1. 位锁(BitLock):LightlyHashMap通过BitLock实现哈希值的锁结构,每个哈希桶的锁结构只需要占用一个位(Bit)。如果哈希桶对应的位锁值为0.表示没有锁冲突;否则,表现出锁冲突。需要注意的是,LightlyHashMap没有区分读锁和写锁,多个get请求也是冲突。可以对LightlyHashMap的BitLock做一些改进,例如用两个位(Bit)表示哈希桶对应的锁,其中一个位表示是否有读冲突,另外一个位表示是否有写冲突。
  2. 延迟初始化(Lazy Initialization):LightlyHashMap的哈希桶个数往往特别多(默认为1000万个),即使仅仅对所有哈希桶执行一次memset操作,消耗的时间也是相当可观的。因此,LightlyHashMap采用延迟初始化的策略,即将哈希桶划分为多个单元,默认情况下每个单元包含65536个哈希桶。每次执行insert、get或者erase操作时都会判断哈希桶所属的单元是否已经初始化,如果未初始化,则对该单元内的所有哈希桶执行初始化操作。

2.B树

UpdateServer的MemTable结构底层采用B树结构索引其中的数据,代码如下:

template<class K, class V, class Alloc>
class BTreeBase
{
public:
    //把,<key, value>对加到B树中,overwrite参数表示是否覆盖原有值
    int put(const K& key, const V& value, const bool overwrite = false);
    //获取key对应的value
    int get(const K& key, V& value);
    //获取扫描操作描述符
    int get_scan_handle(TScanHandle& handle);
    //设置扫描的数据范围
    int set_key_range(TScanHandle& handle, const K& start_key, int32_t start_exclude, const K& end_key, int32_t end_exclude);
    //读取下一行数据
    int get_next(TScanHandle& handle, K& key, V& value);
};

支持的功能如下:

  • Put:插入一个对。
  • Get:根据key获取对应的value。
  • Scan:扫描一段范围内的数据行。首先,调用get_scan_handle获取扫描操作描述符,其次,调用set_key_range设置扫描的数据范围,最后,不断地diao'yon调用get_next读取下一行数据直到全部读完。

为了提高读写并发能力,B树实现时采用写时复制(Copy-on-write)技术,修改每个索引节点时首先将该节点拷贝出来,接着在拷贝出来的节点上执行修改操作,最后在原子地修改其父节点的指针使其指向拷贝出来的节点。这种实现方式的好处在于修改操作不影响读取,读取操作永远不会被阻塞。

目录
相关文章
|
4月前
|
存储 SQL 分布式数据库
OceanBase 入门:分布式数据库的基础概念
【8月更文第31天】在当今的大数据时代,随着业务规模的不断扩大,传统的单机数据库已经难以满足高并发、大数据量的应用需求。分布式数据库应运而生,成为解决这一问题的有效方案之一。本文将介绍一款由阿里巴巴集团自主研发的分布式数据库——OceanBase,并通过一些基础概念和实际代码示例来帮助读者理解其工作原理。
419 0
|
1月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
43 5
|
2月前
|
存储 数据采集 分布式计算
Hadoop-17 Flume 介绍与环境配置 实机云服务器测试 分布式日志信息收集 海量数据 实时采集引擎 Source Channel Sink 串行复制负载均衡
Hadoop-17 Flume 介绍与环境配置 实机云服务器测试 分布式日志信息收集 海量数据 实时采集引擎 Source Channel Sink 串行复制负载均衡
57 1
|
2月前
|
存储 缓存 数据处理
深度解析:Hologres分布式存储引擎设计原理及其优化策略
【10月更文挑战第9天】在大数据时代,数据的规模和复杂性不断增加,这对数据库系统提出了更高的要求。传统的单机数据库难以应对海量数据处理的需求,而分布式数据库通过水平扩展提供了更好的解决方案。阿里云推出的Hologres是一个实时交互式分析服务,它结合了OLAP(在线分析处理)与OLTP(在线事务处理)的优势,能够在大规模数据集上提供低延迟的数据查询能力。本文将深入探讨Hologres分布式存储引擎的设计原理,并介绍一些关键的优化策略。
149 0
|
2月前
|
程序员 Python 容器
python 中的 collections 模块:常用数据结构和工具详解
python 中的 collections 模块:常用数据结构和工具详解
23 0
|
4月前
|
SQL 监控 分布式数据库
【解锁数据库监控的神秘力量!】OceanBase社区版与Zabbix的完美邂逅 —— 揭秘分布式数据库监控的终极奥秘!
【8月更文挑战第7天】随着OceanBase社区版的普及,企业广泛采用这一高性能、高可用的分布式数据库。为保障系统稳定,使用成熟的Zabbix监控工具对其进行全方位监控至关重要。本文通过实例介绍如何在Zabbix中配置监控OceanBase的方法,包括创建监控模板、添加监控项(如TPS)、设置触发器及图形展示,并提供示例脚本帮助快速上手。通过这些步骤,可以有效监控OceanBase状态,确保业务连续性。
110 0
|
7月前
|
存储 自然语言处理 搜索推荐
分布式搜索引擎ElasticSearch
Elasticsearch是一款强大的开源搜索引擎,用于快速搜索和数据分析。它在GitHub、电商搜索、百度搜索等场景中广泛应用。Elasticsearch是ELK(Elasticsearch、Logstash、Kibana)技术栈的核心,用于存储、搜索和分析数据。它基于Apache Lucene构建,提供分布式搜索能力。相比其他搜索引擎,如Solr,Elasticsearch更受欢迎。倒排索引是其高效搜索的关键,通过将词条与文档ID关联,实现快速模糊搜索,避免全表扫描。
287 13
|
6月前
|
存储 搜索推荐 Java
微服务SpringCloud ES分布式全文搜索引擎简介 下载安装及简单操作入门
微服务SpringCloud ES分布式全文搜索引擎简介 下载安装及简单操作入门
87 2
|
6月前
|
关系型数据库 MySQL 数据库
深入OceanBase分布式数据库:MySQL 模式下的 SQL 基本操作
深入OceanBase分布式数据库:MySQL 模式下的 SQL 基本操作
|
6月前
|
存储 分布式数据库 数据库
深入OceanBase内部机制:分区构建高可用、高性能的分布式数据库基石
深入OceanBase内部机制:分区构建高可用、高性能的分布式数据库基石