隐去其闻


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

Ardb集群设计(草案)

发表于 2014-09-08   |   分类于 Ardb   |  

Update 2016-06

目前想法有改变,现在考虑基于raft + gossip实现类似redis cluster的功能,兼容后续的redis cluster client或者工具。

随着Ardb的Replication实现部分稳定下来,需要开始考虑如何实现集群的方案了。中秋的几天抽空思考了下相关设计,以下是初步设想,可以作为初步设计草案。

目标与约定

  • 兼容Redis的client的cluster部分 —— 意味着client端可以直接用redis的各种支持cluster的client实现,而无需单独开发
  • 集群节点间复制机制沿用现有异步实现,意味着在主从切换时存在丢数据的可能,这个无法避免;此约束需要特别指明,以防误解
  • 此分布式系统应该满足AP限制, 较弱的一致性约束
  • 需要支持大于1的备份;
  • 每个节点最多只有一个Slave,多备份情况下见后续的slave作为上一slave的slave串行相连
  • 数据分库存放 —— 数据按现有的库实现分区存放(和redis的slot实现不同), 支持0到0xFFFFFF, cluster中应该可以限制更小一些,比如16384(redis的取值); 分库存放对后续迁移数据时会比较容易,无需迭代所有底层数据
  • 分两部分实现:Cluster Manager以及Node Agent
  • 整体基于zookeepr,Cluster Manager用python实现,基于kazoo; Node Agent直接基于zookeeper的c client库,集成到Ardb实例中。
  • 集群拓扑关系存于zookeeper中,各个节点同步获取
  • 集群环境原则上只支持单key的命令,支持的命令参考redis集群支持情况
阅读全文 »

杂感之二

发表于 2014-09-05   |   分类于 杂感   |  
  • “几处吹笳明月夜,何人倚剑白云天”。 当初以为这句唐诗就是倚天剑的由来,今天才发现更早的出处在战国的宋玉的一句“长剑耿耿倚天外”
  • 在实现一个比较大的软件工程时, 往往本人事前高估了难度,事后他人低估了难度。
  • 只看文章标题就迫不及待的发表高论/疑问, 所谓”喷子”是也
  • 《乞力马扎罗的雪》的开头是看过的文学类作品中相当令人印象深刻的。摘抄如下:

    乞力马扎罗是一座海拔一万九千七百一十英尺的长年积雪的高山,据说它是非洲最高的一座山。西高峰叫马塞人的“鄂阿奇—鄂阿伊”,即上帝的庙殿。在西高峰的近旁,有一具已经风干冻僵的豹子的尸体。豹子到这样高寒的地方来寻找什么,没有人作过解释。

  • 其它的印象比较深的开头暂时想起来还有《双城记》, 《百年孤独》, 这两者的开头已经被模仿引用之滥俗了。又联想到中国的文学甚少有这样的”凤头“, 《白鹿原》勉强算一个。

  • 《史记》里记有季札许剑的事迹, 这是春秋年间的事情, 这样看来所谓魏晋风骨也不独是只有魏晋年间的人才有。
  • ”败军之将不可与言勇, 亡国之大夫不可与言图存”
  • 国内的监管部门中,对广电总局的印象算是属于最差一类的。
  • 唐诗里写景若是带上“物是人非”的含义,马上高大上了, 若是用于咏史,则境界又高一层。 前者如“人面不知何处去,桃花依旧笑春风”; 后者如“旧时王谢堂前燕,飞入寻常百姓家”。 这一类写景应属于王国维所说的“有我之境”。
  • 南梁萧衍属下还有两个非常出名的儒将:韦睿和陈庆之, 我朝太祖对这二位评价甚高, 看来萧衍也算是识人之君。 其晚年发生了“侯景之乱”时,这二位均已离世。
  • “主人劝我养心骨,莫受俗物相填豗”

Ardb与Redis中的复制机制简介与比较

发表于 2014-09-04   |   分类于 Ardb   |  

近段时间花了几天重新review了下Ardb中的主从复制的设计与实现,经过多次高压力环境下的测试,已经相当稳定了。这里简单介绍下Redis与Ardb中的主从复制实现, 以及两者简单比较。

##Redis

###2.6之前
在Redis2.6及以前,主从复制机制比较简单, 基本可以描述为全量镜像复制 + 异步持续复制。大致的过程如下:

  • Slave发送Sync命令给Master
  • Master收到Sync命令后,开始全量dump内存到rdb文件中。于此同时, master接收到的后续写入命令都缓存到Slave的连接待发送缓冲区里;
  • Master在dump期间,定时给Slave发送一个换行字符以保持TCP连接
  • dump过程结束后,Master将此文件发送给Slave。 文件发送完毕后,继续发送待发送缓冲区replication数据; 后续收到的写操作直接发送给Slave。
  • Slave将接收到的dump内容保存到rdb文件中,接受完毕后开始load到内存中;此过程是阻塞操作,期间不能处理任何其他命令。
  • Slave加载完rdb文件后,即可认为Master/Slave已经是完成同步状态, Slave可以开始提供对外服务
  • Master每间隔repl-ping-slave-period秒(默认10s)给所有完成同步的Slave发送ping; 若slave在repl-timeout秒(默认60s)内未收到复制命令(包括ping),则自动断开和master之间连接。
  • 若Slave重新连接上Master, 则之上的步骤重新执行一次

Redis2.6及以前的主从复制机制相对比较简单, 很好的保证了数据一致性,复制效率的要求。不过在一些比较极端的场景下,这种复制机制有些缺陷。 考虑下面的场景:

  • Master存储了10G的数据,Slave与Master之间网络不稳定, 频繁断开;
  • Master存储了100G的数据,Slave完成同步后,Master宕机。 Slave切换为Master, 而原先Master恢复后,将原Master改为新Master的Slave。(用redis sentinel可以自动模拟这种切换场景)

这两种场景都要求Master, Slave之间在每次连接时重新开始全量镜像复制。

阅读全文 »

杂感之一

发表于 2014-08-30   |   分类于 杂感   |  
  1. 抬扛: “羚羊挂角,无迹可求”。 据说含义是羚羊晚上欲睡前,上跃而将角挂在树上,四足离地,则整夜即是“无迹可求”。如果是整群羚羊挂角,这个场景可是相当壮观;又可以想象中途树枝不堪重负而断如何解决,次日下树之法等等,太多矛盾之处了,不知怎么在古人那里居然流行起来了,以至于传到现在。
  2. 柏拉图的囚徒困境中,面壁的囚徒其实并不知道其囚于穴居之中 —— 很多情况下是穴居之外之人刻意告诉他们其实在穴居之外。
  3. 虞卿以魏齐之故,不重万户侯卿相之印,太史公以为庸夫尚知其不可。余以为实乃为友知其不可而为之。
  4. Define 官僚资本主义。
  5. “暴君治下的臣民,大抵比暴君更暴” —— 鲁迅
  6. 蹇驴得志鸣春风

Ardb添加Travis CI持续编译集成

发表于 2014-08-30   |   分类于 技术   |  

今日大约花了10分钟, 参考官方说明给Ardb增加了travis-ci持续编译集成,整个过程简单地超乎想象,在github上有自己开源项目的朋友可以尝试下。
与此相比,前段时间在厂内第一次配置一个持续集成(只有编译)的项目,在两个PMO协助下花了两天的时间。很多IT流程原本非常简单,但一经过企业内部因为各种奇怪的理由二次开发,包装改造,就变得复杂沉重无比。

GeoHash介绍与改进的GeoHash-Int

发表于 2014-08-24   |   分类于 技术   |  

##关于GeoHash
GeoHash是一种将二维坐标数据编码为一维数据的算法,具体可以参考GeoHash Wiki.
简单的描述下算法, 首先将整个平面按x, y轴对半, 如下则得到四个区域, 分别二进制编码为(00, 01, 10, 11).

*  -----------------
*  |       |       |
*  |       |       |
*  | 0,1   | 1,1   |
*  -----------------
*  |       |       |
*  |       |       |
*  | 0,0   | 1,0   |
*  -----------------

每个编码代表一个矩形区域范围, 若某坐标落在区域01中, 则置首两位编码为01, 其中0为x轴的编码, 1为y轴的编码; 以此迭代类推下去,累积的编码长度越长, 则编码代表的区域与坐标本身的误差越小,无限逼近下去,是可以认为是完全等同的。 实际上,针对地球坐标,GeoHash编码在大约52bit,即类似上述步骤重复26次, 精度已经小于1m了,足够精确。

阅读全文 »

未命名

发表于 2014-08-23   |  

layout: post
title: “Ardb简介”
description: “”
category: Ardb

tags: [Ardb, Redis]

简介

Ardb是一个C/C++开发的完全兼容Redis协议的NoSQL存储服务,支持绝大部分Redis命令以及数据结构如list/hash/set/sorted set,你可以很容易将依赖redis的业务在Redis和Ardb之间来回迁移。

Ardb的存储基于现有成熟的KV存储引擎实现,理论上任何类似B-Tree/LSM Tree实现的KV存储实现均可作为Ardb的底层存储实现,目前Ardb支持LevelDB/RocksDB/LMDB.

Ardb项目的目的不是为了替换Redis(这点很重要), 而是作为Redis的补充存在。Ardb重点解决的是在性能可接受的情况下单机支持远超过内存限制的数据量, 以及与Redis之间的互通的问题。

特性

最新的Ardb版本支持如下特性:

  • 完全支持Redis协议, 包括早期的协议(可用telnet连接Ardb实例)
  • 支持绝大部分redis命令,所有数据结构Set/Hash/List/Sorted Set, Lua脚本支持, PubSub,Transaction等等
  • 支持所有数据结构的Key的Expire过期自动删除机制
  • 兼容Redis主从复制机制。你可以把Ardb作为Redis实例的Slave或者将Redis作为Ardb的Slave,支持Redis2.6以及2.8+。
  • 兼容Redis Sentinel的主从切换机制,你可以用Redis Sentinel监控主从节点并在节点异常情况下切换。
  • 支持Redis的dump备份数据文件通过import命令在线导入;Save/BGSave命令将Ardb数据用Redis Dump格式导出
  • 支持类似Redis的分库机制, 库ID范围为0到0xFFFFFF,无需预先指定
  • 内置二维空间索引实现,基于扩展的GeoAdd/GeoSearch命令实现二维空间查找特性。
  • 支持LevelDB/RocksDB/LMDB作为底层的存储引擎
  • 兼容所有的Redis的Client实现,你可以用任意Redis的client实现连接Ardb实例
  • 多端口服务支持,读写端口分离, QPS限制, IP白名单等高级特性
  • 支持作为一个库内置到其他服务中
阅读全文 »
12
yinqiwen

yinqiwen

Tech & Think

17 日志
3 分类
11 标签
© 2013 - 2016 yinqiwen
由 Hexo 强力驱动
主题 - NexT.Pisces