花钱的年华

江南白衣,公众号:春天的旁边

Cassandra杂记

| Filed under 技术

最近又开始新一轮的Cassandra选型测试,稳定性上还是会遇到Query Timeout,把旧资料翻出来记一下。但,未完待续。

几乎是完美的特性列表

Cassandra是Peer 2 Peer完全去中心化的的分布式数据库

也就是它没有控制节点,只通过Gossip协议同步集群状态,
它的数据节点也没有Master/Slave之分,使用RWN(R+W>N)保证一致性。
完全可线性扩展的,基于Virtual Node的分区方式。

Cassandra 还是天生的跨数据中心

数据的读写都支持跨数据中心的设计,不是后来外挂的跨数据中心复制与切换方案,这也是它完胜其他SQL/NOSQL的地方最吸引我的地方。
Cassandra是列式文件数据库

它不是内存数据库,数据不放在内存里,因此可以存T级的数据。

写入时,先写到内存MemTable(1/4 JVM size)和顺序写的Commit Log文件(用于在Crash后恢复MemTable),满了会被刷成磁盘上的SSTable文件, SSTable再时不时合并一下,详见LSM模式

读取则需要从磁盘读取,使用Bloom Filter加速在各个SSTable文件中寻找所有插入修改记录再拼装出查询所需字段。所以它是少有的写比读还快的数据库

不过Cassandra内置了使用native memory(off-heap不占JVM)的缓存机制,不需要再加一个Memcached/Redis在前面。

它的删除也不是直接的删除,只做标记,等SSTable合并时再处理,还要更新Bloom Filter。 删除的性能很差,所以绝对不合适做Session之类短生命周期数据的存储

它是列式的,记录有属性也支持按属性查询,不是简单Key-Value数据库。 不过数据其实还是以行存储。
有数据expired 设置,Counter类型这些新一代DB的功能。

CQL
CQL,类似于SQL(DDL与DML都有),甚至有3PP项目提供ORM/JPA的支持。
CQL不支持Join表查询,但支持 column类型是map、list、 set ,也就是可以把子表也放进主表的column里。
CQL不支持GroupBy的聚合。

 

RWN

官方比较推荐的复制数份数是3(N=3),写的时候一定要成功写入两台才返回(W=2),和读取时也获取两台的结果返回结果最新的那条。满足R+W>N的约束,因为W在三份复制里成功写了两份,则R在三份复制里读取任意两份,其中一定有一份是最新的。

满足此条件又保证HA,最少的机器也是4台,否则crash了一台就无法实现N=3了。

如果只有三台机器,N=2,W=2,R=1 ,貌似也满足一致性约束。

 

稳定性

Cassandra 2.0在这几周各种测试的折腾下,死活跑不出一个平静的下午,不愧是把Digg的副总裁弄下课了的主。和清汤一样简单的Redis比,还是越复杂的东西越容易坏,它的功能实在太完备了。不过,好像也挺多项目用Cassandra用着挺顺手的呀,他们的神经得有多粗壮。 20140-4-23

后来,又找到一位同病相连者:我是如何一夜变身 Cassandra DBA的,每次看别人深夜大战NOSQL,都是心肝儿颤的感觉.....Cassandra好像做这种大战的主角的机会最多。

(Caption: 心中默默祈禱,上帝保佑)

 

参考资料

《Mastering Apache Cassandra 2nd Edition.2015》 百度网盘 密码:nl2t

by calvin | tags : | 0

我的2014技术流水帐

| Filed under 工作 技术

2014,平缓的一年,记一篇平淡的流水帐,没有形而上的思考。有些是自己弄的,有些是同事在弄自己只在旁边看的。

1. Redis and other DB

Redis在上年已用作Session、Scheduler与Throttling,今年还用于Cache与应用服务器去集群化后的Cluster Service替代品。Redis的各种数据结构太好用,可惜Redis作者今年的时间都在非功能的需求上,在数据结构上面下的功夫少了。

动态扩容不能像豌豆荚那么高大上的做一个Codis出来,只像小米一样做了个成倍扩容的方案,然后苦等Redis Cluster出来。而Redis的跨机房复制与容灾切换最牵扯精力,最后打算做一个后台双写的Replicator和一堆FailOver/Recover的脚本,但只支持幂等的操作如SET。

Cassandra也试了一下,好像没有一个压力测试的下午是无错的渡过的,也不适合会频繁删除的数据如Session。但它的动态扩容,跨机房容灾,以及按属性查询,不占用内存又的确比Redis这熊孩子省心。

传统数据库方面,原本只有MySQL Cluster与Oracle两种选择,现在PostgreSQL强势插入,唯一完全摆脱了O记的选型,各方面测试结果都漂亮。不过跨机房复制的功能需要买商业版,而虚拟环境/云平台下的License,公司的集采还没谈下来。

 

2. Craftmanship

今年最痛快的编程体验,是做一个引擎类家伙的原型,三两天写了千多行代码,对美国那张大单有大帮助。好久没这么密集的coding了,一段宝贵的记忆。

有趣的是,几个月过去后引擎又完善了很多,但代码还是两千行上下,平均下来的每天编码行数又变成正常值。所以,1. 某某大牛一天写多少行代码的江湖传说其实意义不大,2. 代码大部分时间都在被阅读被维护,可理解可维护性多么重要。

左拨一下,右弄一下,项目性能随随便便就比上一个版本提升了400%,就是过程有点不够轰轰烈烈。

有的项目在用Scala Test做折中经济版的BDD,比黄瓜、JBehave容易实施,也有用Scala制作专用于Restful测试的DSL。

有个段子,程序员最讨厌写文档,和别人不写文档。但自从Leo用Jekyll + Git + Jenkins搭了个新的文档系统 ,一下子冒出好多设计文档看花了眼,证明程序员也不是天生讨厌写文档。

Leo还引入了PlantUML,这种用text写的UML太方便,原本习惯了直接用PPT画图的又慢慢改回UML。但还是可惜UML被UML三剑客带进沟里,然后就没了发展。

 

3. Graphite与运维

新引入的Graphite,同样是被一鱼多吃:存储Time Series Metrics数据,能用于诸如服务监控与报表、按TPS/接入设备数/月使用量的License模式、系统限流保护等等。有了它,很多故事都能讲下去了。

Graphite最成熟,功能非功能做得最好,生态圈也最完备,不过最近的更新有点慢了,用Go写的后起之秀InfluxDB可以关注。

Graphite原本只运行于Linux,我改写了一个可跑在Windows下的版本,方便日常调测。

Graphite今年还终于有了好看的DashBoard:Grafana,基于Angular.js,每月蹭蹭的涨功能。

但Metrics的类库,堂堂Java界就只有一个CodeHale Metrics,Spring Boot用它,Cassandra也用它。但它实在不够好啊,所以自己结合Statsd,写了个Metrics Lib,也开源在SpringSide-Metrics里。谁说我只会用轮子,不会做轮子的!!!

Logstash + ElasticSearch也终于引入做日志的集中收集和统计。

 

4. Spring Boot

Spring Boot出来,Javaer有福了,小白也能愉快的快速开始一个SSH的典型项目。再加上Spring Loaded,不用在Rails,PHP前自卑了。

恰逢MicroService架构又火了起来,和Spring Boot很搭。

其实它不是一个新的框架,而是大幅简化并集中了SSH中的各种配置,嵌入式的Tomcat或Jetty,还自带DevOps们喜欢的Http API(e.g. /health, /metrics, /jmx)。成熟项目里一些老手经过一番努力也可以实现。但人家这个是官方的,开箱即用的,面向小白的。

生产环境还是Weblogic,但只在本地开发与Jenkins环境里换用Spring Boot,团队的生产效率便提升很多,轻轻松松压着进度不用加班加成狗了——但不加班加成狗,是不是就拿不到明星团队奖了?

[注: SSH= Spring / SpringMVC / Hibernate + Spring Data JPA]

 

5. SpringSide

今年不算勤快,只发布了1个中版本,3个小版本,明年要更勤快些。

域名换到springside.io,又站到了Spring的新域名spring.io的旁边。io是地球上哪个角落的小国,没人有闲心管域名注册的事,所以成了开源软件们的菜。

下个版本,SpringSide的Modules会洋气地放到Maven中央库,谢谢D瓜哥帮忙在Sonatype填的申请

 

6. 其他

项目都云化了,接地气当了一把装机小王子,小碰了一下KVM 和 OpenStack ,并记下一份装机宝典,据说有不少同事看。

项目所需,对Diameter协议可以冒充专家了,但对各种电信协议还是没什么感情。

敏捷一个新玩法是将Team Leader 与 Scrum Master分开,固定的Team Leader是团队的技术骨干和精神领袖,而可轮换的Scrum Master负责团队管理与杂务,将团队里技术最强的那个人从管理中释放出来。

另一个新鲜事物是对Jenkins上几百个Job无数的Test Case进行大数据分析,显示经常不稳定的,变快的,变慢的测试用例等等,对现在大量时间都花在Jenkins维护上的团队有帮助。

全年各种大会,只去了一次InfoQ在深圳的架构师峰会,还要感谢泰稳的赠票。

by calvin | tags : | 13

SpringSide二三事

| Filed under 技术

springside.io

启用开源味很浓的springside.io,再次站到了SpringFramework新域名spring.io的旁边。

[知乎问答:为什么github,redis,spring都用上了.io后缀?因为io是一个在地球不知哪个角落的小国家,人烟稀少,根本没人有闲心来管域名注册的事,所以成了开源软件们的菜。]

建宁公主 vs SpringSide

建宁公主前几天学会了向SpringSide提交Pull Request,SpringSide有了第一段女程序员写的代码。

工具、类库散播者

| Filed under 技术

JSONassert

"借你的戟一看,巡夜人,我是弗郎西斯·维庸。"

单元测试用JSONassert 来检验JSON内容,再也不怕那些总是随机出现在不同位置的元素了。  2014-10-18

Spring Retry

开新项目时,大家兴高采烈的讨论:“远程服务调用异常时,不单写日志,还应该重试“, “嗯,嗯,最多重试三次 ”,”嗯,嗯,嗯,每回重试要隔一段时间,而且每试一次时间要大博“......然后,就没有然后了。

Spring旗下的Spring Retry子项目,为光说不练的懒人们提供了一个RetryTemplate。 2014-9-22

PlantUML

最近大家用上了PlantUML,只要写text就能生成uml。

或许是厌烦了以前写wiki时画图、截图、上传、再修改、再截图的循环(P与多数wiki都有集成)。

又或是厌烦了修改PPT时发现仅有截图而只好重画一遍(备注里把text带上就好)

所以我们必须继续讨论厌烦。 2014-09-07

Spring Loaded

"狭巷短兵相接处,杀人如草不闻声"

有了Spring Loaded,在IDE里基于嵌入式Jetty运行Web应用时,可以像我们暗地里羡慕的PHP, Ruby on Rails那样,修改代码而不用重启应用。

这种连续、激烈的编码感受,像开头的两句诗。 2014-09-06

Kickstart

上周又变身太平洋电脑城装机小王子,用Kickstart 装了N台RedHat的KVM Host。

在没有虚拟机,没有Puppet、Ansible之前,Kickstart将快速批量安装与配置做到了极致.   2014-06-19

by calvin | tags : | 2

DB Strategy

| Filed under 技术

多年以后,Redis、MongoDB、Cassandra们还是种种不如意不完美,我司又把目光重新投向了NuoDB,Aerospike这些散发着商业光芒的家伙。 2014-06-05

再然后,Aerospike除了多数据中心同步的方案外,其余功能都免费了。

但还是担心它用户数太少,但在亚马逊云的2014年DB使用统计下,AeroSpikie也是有一席之地的,没有被直接扔到 The others里。

(Caption: 不完美的Redis、Cassandra们)

 

NoSQL之后的新趋势是不变数据的存储,就像Erlang那些函数式语言的不变量一样。有些数据插进去就不会改的,比如日志,比如微博,那就干脆把修改的功能拿掉,并发什么的立马提升一截,据说Twitter在研究它。其实与NOSQL的思路是连贯的,将系统剪裁到极致。 via @InfoQ『Peter Bell谈NoSQL的发展趋势』

by calvin | tags : | 1

ArchSummit 2014 深圳

| Filed under 技术

1. ArchSummit,全球架构师峰会,大梅沙,群贤毕至,少长咸集,放眼望去都是背黑色双肩包的技术狗。

2. 堂堂阿里技术副总裁,以一个朴素的幻灯片,分享不同IO策略下IOPS的变化。台下的陌生人或许各种呵欠,但对沉浸在调优中的技术员,这就是全部的美丽与哀愁。

3. 深圳路边的房地产广告牌上写着:"别人恐惧的时候,你应该贪婪。" -- 看来真的卖不动了。

4. 一个人,宵夜。点了一只乳鸽,一盘青菜。店外天风海雨逼人。

5. 打了两天的台风,终究没有去到海滩。

《人生元编程》

| Filed under 技术

@池建强 的《人生元编程》大卖,又再版。嗯,咱不写书,咱向封底小王子努力——基本上忠于文人酒宴酬唱无耻吹捧的悠长传统,出120%的力气写了段封底书评,狠狠夸。

 

技术书容易过时,时候一到,想捐都找不到看的人,只能变回五帘卷西风毛钱一斤的纸浆。而这本《人生元编程》,则可预见能经受住若干年光阴的洗刷,因为它谈的是技术人员精彩、困顿又多元,充满选择又没有标准答案的编程人生,作者以温润的文字慢慢展开,让人有"既见君子,云胡不喜"的愉悦。是的,另一个舍不得卖掉的原因是书里的好文字,作者对文字的体认基本上忠于悠长的文人传统,在最讨厌写文档和别人不写文档的IT圈里,殊为可贵。
by calvin | tags : | 0

GNU License

| Filed under 技术

一直误以为商业软件用GNU License的开源产品就如强抢民女一般过分,是触发铁律的。

前几天才搞明白,原来只要不嵌进应用里,通过Socket之类去连接是允许的,比如HAProxy和MySQL。

至于那些无可避免地嵌入的jar包,还有着GNU with Classpath Exception的豁免,Sun家的东西多数是这一套。

(Caption: 强抢民女)

另外,大部分License文件都是严肃得不想让人读懂的,立刻拿出Google Translate机翻一下,反而容易读懂些。
 

by calvin | tags : | 0

工具、类库散播者 II

| Filed under 技术

1. 又一个名字文艺的开源项目,Kundera ,米兰昆德拉,《生命中不能承受之轻》— 让各式NOSQL支持JPA。包装Redis时,是用Hash存对象,再用Sorted Set建索引支持JPQL查询,虽然一般不会这么费劲搞,但也是种思路。

 

2. Apache Kafka,以卡夫卡为名,实现也如卡夫卡般荒诞、离奇,在各式消息系统中那样的孤独。  InfoQ: 《Apache Kafka —一个不同的消息系统》

 

3. 大老板点将的Ansible,比起Puppet、Chef、SaltStack,确实清秀可人一些,适合白板似的普通公司们快速开始,但已经是胖子的也没必要再走回去了.....

 

4. Apache HttpClient 4.3变动之大,该叫5.0更好。线程安全且自带连接池的Fluent API,让Java终于有了一个好用的Http Client,出门都不用被其他语言嘲笑了。 2014-01-22

 

5. 《进击的Java开发》里,Fest Assertion小三上位,打败了JUnit的原配Hamcrest。现在,fork出来的小四AssertJ凭着更加的努力,又把不更新的小三打败了。看过例子的人都忍不住回家把自己的assert语句重写一遍。

雁过留声,我记的AssertJ wiki 。

 

by calvin | tags : | 0