BaikalDB 1.1.2 版本发布

Stella981
• 阅读 520

BaikalDB 正式开启 1.1.X 版本

版本发布

https://github.com/baidu/BaikalDB/releases/tag/v1.1.2

https://gitee.com/mirrors/BaikalDB/tree/v1.1.2

主要特性介绍

分布式事务实现优化

在第一版事务设计中,如果事务COMMIT过程中有部分Region失败,通过持续重试直到Region全部成功才结束,但在生产环境下可能永远不会结束重试,这会带来额外的运维工作。

因此在新版本事务实现中,我们结合Rocksdb悲观事务与Percolator事务模型,引入Primary Region作为事务同步点。只有Primary Region COMMIT成功或者ROLLBACK成功后,才会继续给其他Region发送COMMIT/ROLLBACK指令。

基于Primary Region,接入层模块(baikaldb)的相关逻辑得以简化,其他Region超时未收到COMMIT/ROLLBACK指令会通过反查Primary Region来判断事务状态。Primary Region也通过raft同步状态,稳定性大幅提升。

还有一个重要的改进点是与Raft结合的部分,在第一版设计中,DML语句是在Leader上全部执行成功,Leader收到PREPARE指令后,才一次性打包复制给Follower,导致大事务情况下,Follower比Leader落后过多,造成不一致和不稳定的情况。本次我们改造了单条DML语句在Leader执行成功无冲突后,就直接通过Raft复制给Follower,使得Follower不会落后Leader过多,有效降低了不一致风险。

二级索引

在1.0.x版本中,BaikalDB 只支持局部二级索引,新版本中开始支持全局二级索引,并实现了局部二级索引的 Online Index Change。

局部二级索引,类似分片MySQL的各个分表的索引,主表与索引数据存储在统一分片中。好处是在分片内的处理是可以走单机事务,查询的也时候不需要网络交互。但是最大的问题是,局部索引查询时,如果没有分片信息(BaikalDB中是主键前缀),查询语句需要广播到所有分片,然后合并处理结果,在分片数上千的表中性能非常差。

全局二级索引,主表和索引数据独立存储,索引有独立的分片规则。好处是索引独立路由,查询性能比较稳定,不会有大量分片广播的问题。缺点是每次查询需要额外网络开销,索引写入时需要分布式事务保证一致。

BaikalDB同时支持全局二级索引与局部二级索引。在查询语句都会带上分片信息时,优先建议使用局部二级索引,对于无分片信息的表建议选全局二级索引。参考索引选择

业务最常见的Schema Change需求是加列与加索引。BaikalDB底层数据存储采用了ProtoBuf,因此加列无需特殊处理。对于加索引场景,目前支持了局部二级索引的Online Index Change。

Online Index Change主要参考了Google F1 的Online Schema Change方案,过程不阻塞业务读写,通过多状态保证一致。实现过程中,引入了NONE、DELETE_ONLY、WRITE_ONLY、REORG、PUBLIC几个状态保证数据一致。DELETE_ONLY只能删除索引,WRITE_ONLY可以写入和删除索引,REORG阶段把全部历史数据读出后写入到二级索引中。 随着全局二级索引使用越来越多,全局索引的Online Index Change也将实现。

基于代价模型的索引选择

在1.0.x版本中,我们的索引选择是依靠规则的,这在业务规模比较小的时候工作得很好。随着业务不断扩大,固定规则难以覆盖业务场景,业务使用显式Hint也较为繁琐。

因此在新版本中,我们引入了直方图和CMSketch收集表的统计信息。索引选择过程中,使用统计信息预估代价来选择索引。这部分依赖的统计信息目前还比较基础,后面也会引入更多统计维度。

支持SST备份恢复

在新版本中,我们引入了一个新的SST备份接口,通过Brpc的Stream接口,可以把全表的Region都写成SST文件并流式发送出去。这个接口比之前的select *的方式有着数量级的提升,可以用于数据的定期备份。同时,考虑到一个大集群中大量的Region是更新频率很低的,因此这个接口也支持版本号的传入,数据不更新就不需要备份,沿用之前的即可。配套的备份调度管理工具也在整理中,后续将逐步开源出来。

性能优化

在1.0.x版本中,倒排拉链使用的是ProtoBuf的存储格式,解析和析构性能较差。在新版本中引入了Apache Arrow的新拉链格式,可以大幅降低长拉链的解析和析构开销。

通过减少中间转化和ProtoBuf反射优化,大量数据扫描性能也相比之前有较高的提升。PREPARE STMT通过复用查询计划,减少bthread开销等方式,降低CPU使用。

其他功能

  • 支持TTL功能,减轻业务GC负担
  • 支持HyperLogLog功能,支持业务统计,实现跟 Redis HyperLogLog 完全一致
  • 支持存储通过resource_tag隔离,支持表粒度的不同集群间迁移数据
  • 支持物理机房分布功能,可以选择不同机房副本分布方式
  • 增加几十个常用MySQL函数
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这