# 活动精彩实录 | Cassandra与职业发展
大家好,我叫邓为,我目前在DataStax担任领航架构师。我在DataStax工作了7年多的时间,也有7年多的Cassandra经验,我在大数据和数据库领域的经验则有大约十多年的时间。很高兴今天能够邀请大家到我们的活动中,来听听我们的嘉宾们与职场相关的经验和感悟。
我们今天的嘉宾来自三个不同的公司,他们都是在Cassandra数据库方面有很多年经验的专家。
首先是阿里云高级技术专家栾小凡。14年第一次接触Cassandra,追随Cassandra的作者Avinash创业,构建了软件定义存储产品hedvig。16年加入阿里,从事Ali HBase和阿里自研云原生数据库lindorm的开发工作。20年开始回归Cassandra,负责阿里云Cassandra的开发工作。
接着是蔚来汽车资深软件开发工程师张旭东。目前在蔚来汽车从事数据平台、数据仓库相关研发工作。17年开始接触Cassandra,对于Cassandra的使用有较深的理解,将Cassandra成功运用于多个公司项目中。
最后一位是网龙公司软件开发工程师阙乃祯。近6年来在网龙参与im即时通讯,推送服务,iot的设计开发。这些项目对cassandra有重度依赖,期间同时负责基础服务平台cassandra的运维、监控、开发指导工作。
非常感谢嘉宾们能抽出宝贵的周末时间与大家分享经验。
---
## Q:能否简单介绍自己的背景以及你是如何开启Cassandra之路的?
### 栾小凡
大家好,目前我在阿里云做数据库研发。我接触Cassandra比较早,属于机缘巧合。在接触Cassandra之前,我在Oracle工作,主要负责数据库硬件加速方面的内容,那时候我对分布式系统并不是特别了解。
后来在学习像Cassandra这样的分布式系统之后,我就对分布式系统产生了兴趣。正好那时想要创业,而且认识了Cassandra的作者Avinash。与他聊过之后,发现他对数据库和存储产品的见解比较深入,所以我决定加入他的团队。在这个团队中,我主要是基于Cassandra做了一个分布式的存储系统Hedvig,这个存储系统后来成为了很多银行的数据备份方案。
基本上就是借这么一个机会,我开始了解Cassandra。从做Cassandra开始,我最开始的定位主要还是做数据库的研发,当时也给社区贡献了一些bug fix。后来2016年回国后,我逐渐开始兼顾研发和运维两个方面的职责。尤其是最近一年做了更多运维工作,比如帮用户设计他们自己的系统。
在这个过程中,我对Cassandra也有了更深的理解以及它周边的生态,比如用户现在比较关注的可能是Spark、ES,以及它们与Cassandra的结合方式。早期的我虽然对Cassandra有所理解,但是对它的周边理解不多。后来在学习的过程中,我也看了很多DataStax的文章,这些文章为用户提供了很多方便,有很多东西是我之前在社区都没有关注到的。
在我现在工作中,Cassandra占到了50%-60%,主要是在研发和运维方面。
### 张旭东
大家好,我叫张旭东,目前在蔚来汽车北京的软件部门从事数据仓库相关的工作。我大概15-16年还在猎豹移动做广告和新闻推荐的时候,团队里就已经在用Cassandra存一些新闻推荐相关的文章、customer profile相关的数据。这也给了我一个了解Cassandra的契机。
三年前来到蔚来汽车,发现软件部门已经在多个业务线使用Cassandra了。也是从那时开始,我不仅从理论上更是从实战上了解Cassandra的原理和使用。
为什么当初公司没有选择像是MySQL那样知名的数据库,而是选择了Cassandra呢?据我了解,主要是有这么几个原因:
- 公司需要一个NoSQL数据库来存储大量数据。在NoSQL数据库中,通过一些技术文档和benchmark了解到,相较于HBase来说Cassandra的性能要更好一些。
- Cassandra从2.0版本开始提供CQL这种查询语言,它的表达能力相对HBase来说更强一些。
- 公司那时也有意愿探索新的技术。那时团队中的一些人在雅虎工作时一直在用HBase,后来他们看到了Cassandra,也想要去了解一下它的原理和使用。
现在我们是跟随Cassandra线上的开源版本对其进行使用和维护,集群也都用的是最新版本的Cassandra 3.11.8。我们存储最多的是与车联网相关的数据,目前我们的数据总量达到了千亿级别,将近百T。目前公司用的是在AWS EC2上自行搭建的Cassandra集群,未来可能也会考虑使用AWS上的Cassandra云服务,把集群托管出去。
### 阙乃祯
大家好,我是阙乃祯,我来自网龙公司,我从2014年开始接触Cassandra。
当时我们成立了一个新的子公司,主要专注于教育相关的业务,比如网校通、信息推送、教育IoT一类的业务。因为我之前有HBase的经验,团队里有NoSQL相关经验的人又比较少,所以我当时就开始负责这一块的工作。
当时我们可能也是比较激进,大概两三个月就把Cassandra搬上了生产环境。因为我之前也没有Cassandra的经验,那时候就用了两三个月阅读了社区文档,还跑了demo做练习。这些做完后,我们就开始小规模地上线,把Cassandra放入生产环境。由于我们比较激进,其实刚开始的阶段踩了不少坑。这个踩坑的过程持续了一两年,等集群开始稳定下来,业务规模也慢慢上来了。
在这之后,我就比较侧重于业务方面的开发,比如IM即时通讯、Push IoT,一直持续到现在。目前主要用Cassandra的业务数据量都比较大,用户也比较多,但是没有人专职负责。所以如果生产或者集群出现问题,我都是兼职帮忙解决一下,包括运维和技术指导。
---
## Q:你们现在工作中的技术栈里会用到的和Cassandra相结合的技术都有哪些呢?
### 栾小凡
因为我们本身提供托管服务,跟其他两位嘉宾相比,我们的业务可能会更杂一些。
整体来讲,我觉得Cassandra更适用于两种场景。一是大数据相关的场景,比如和Spark做一些结合进行离/在线的分析+实时。二是仰赖于Cassandra zero downtime(零宕机时间)的特性,因为它的QUORUM的读写模型导致它的稳定性和可用性相比传统的HBase或MySQL来讲更高,所以我们也发现有很多用户用Cassandra做线*问。比如最早Facebook将Cassandra应用于Inbox(邮箱的收件箱)这样的场景,或者可以用于IM(即时通讯)或消息推送的场景。
在这种场景下,我们发现除了Cassandra的二级索引可以提供非常好的读的检索能力以外,用户还有一些额外的需求。比如用户希望把数据和ES结合在一起,也就是同样的数据会在宽表里放一份,在ES或者Solr里面再放一份。这样就可以实现一些功能,比如对IM的关键词做分词检索。这些方面我们能够看到用户是有比较大的需求的。
Cassandra还有一个很强大的能力,就是它可以作为MySQL的历史库。当MySQL的数据放不下时,用户可能会寻求一些NoSQL的解决方案,但NoSQL的查询能力相比MySQL可能略弱一些。总的来说,Cassandra+Solr/ES其实是一个非常好的解决方案。
除此之外,我们也在探索Cassandra能不能跟一些底层的文件系统做一些结合。比如我们把Cassandra的实时数据通过一些服务的方式生成像是Parquet或ORC格式的文件,然后交给Spark或Hive做一些分析,由此形成一个离/在线的场景。这也是我们看到用户确实是在这样做的。
### 张旭东
我们这边的技术栈比较相似,我分成两个方面介绍吧。
我们主要有两拨人在使用Cassandra,一是后端在线服务,主要用Cassandra来存APP的数据。对于车联网来说,我们会以车辆ID或车辆电池ID为主键,然后做一些查询方式比较固定的点查询。对于一些非固定的查询,我们会和MySQL结合使用。另外如果要全文检索的话,我们需要和ES结合使用。
*由于通信质量不佳而中断
### 阙乃祯
其实技术栈都是很通用的,我想说的其实前面都已经提到了。像是IM、IoT、收件箱、消息记录这样的数据,我们都用Cassandra来存储。像是IM这样比较敏感的数据或是信息流的过滤,我们需要做一些风控审计,所以我们需要做检索或事后分析。
我们会用Spark、Storm或者Flink做一些实时的流控、敏感词过滤以及恶劣行为的监测,总之就是会清洗一遍信息流。关于事后的检索,我们会用Kafka将数据同步到一个ES集群,实现像是聊天记录检索这样的功能。
另外我们会把Ceph上面的文件的二级索引一类的信息同步到我们的Cassandra集群中,也就是将Cassandra和Ceph这样的块存储一起结合使用。
### 邓为
栾小凡老师刚刚说的内容很有意思,包括怎么把Cassandra的数据以Parquet或者ORC的形式放到分布式的文件系统上面。这其实也是DataStax在研究和发展的东西,我们将来也会有一些相关的开源的贡献。Cassandra是用来处理实时的热数据的,怎么把这些热数据尽快地导成冷数据,以一种高效的方式长期存储,让其他人有一个分析的平台——相信社区很多同学会对这方面感兴趣,我们以后可以多多交流。
根据我为很多财富100强公司咨询的经验来看,现在很多大数据处理的框架和引擎都非常相像,比如Kafka、用于流处理的Spark Streaming、Flink、用于搜索的Elastic Search或是Solr。包括我们DataStax Enterprise(企业版Cassandra)也是以Cassandra为核心,又集成了Spark和Solr。也就是说如果你用DataStax Enterprise的话,你就可以直接在Cassandra数据库里进行搜索。如果你要做分析处理的话,也可以直接使用我们的DSE Spark release。
总的来说,确实有很多东西是相通的。不过最近我看到“云原生”这个概念非常火,所以现在整个Cassandra社区(不光是中国社区,包括美国、欧洲、澳洲等)中有很多公司都在考虑怎么把Cassandra搬到Kubernetes环境里。因为Cassandra本身很容易做到灵活伸缩、在线扩展以及多云支持,所以Cassandra和Kubernetes这种环境其实非常相匹配。
在这方面,DataStax为开源社区做了很多贡献。昨天在大型全球会议KubeCon上,DataStax发行了一个新的Cassandra版本,叫做K8ssandra。也就是说我们现在正式有了一个在Kubernetes环境下使用的Cassandra发行版本,这个版本可以被用于生产环境。不仅如此,K8ssandra还自动管理了包括repair在内的很多运维工作。
---
## Q:如果作为初学者,面对众多数据库的选择,为什么要花费时间精力学习Cassandra?
### 栾小凡
我主要从两个角度来谈这个问题。
第一,Cassandra本身是一个非常实用的数据库。而且它已经被非常多的大型跨国公司在使用,包括像是Apple和Netflix,所以说Cassandra是经过了长时间生产考验的数据库。
在公司选型的时候,通常大家都会选择一个关系型数据库(relational database),比如像是MySQL。但一旦你的数据增多,你必然要考虑如何将更多的数据存在一个实时的数据库中并获得比较好的查询性能。在这种场景下,Cassandra其实是你非常好的选择。
如果你能学习这样一个栈,未来能匹配到的公司数量也会相对较多。目前国内使用Cassandra可能还不如国际上普遍,但总体还是处于快速增长的状态,我相信未来会有更多的国内公司开始使用Cassandra。
第二,如果你是一个学生或是刚刚开始工作,可能你对分布式系统并不是特别了解。Cassandra其实是在去中心化设计下一个非常好的范例。
最早的去中心化系统(比如Dynamo)大都不是开源的,一般人很难获取丰富的学习资料。对于分布式系统来说,要么就是主从结构(master/slave)要么就是去中心化的架构,两者分别的代表其实就是HBase和Cassandra。如果你能把这两个系统搞清楚,这对你未来设计分布式系统是非常有好处的。
学习Cassandra,你可以从DataStax的文档中学习了解这个系统的设计和使用,并且可以自己搭一个Demo。我最开始学习Cassandra就是通过这种方式,会自己构造一些小的业务场景,然后在AWS或阿里云上买一个服务,之后再用这个服务去跑自己的Demo以便了解Cassandra的设计和使用。我觉得这对大家了解分布式系统和Java这门语言都会很有帮助。
### 张旭东
栾老师刚才提到的也正是我想说的。对于初学者来说,Cassandra能够加深你对数据库和分布式系统的理解,以及并帮助你理解Bigtable和Dynamodb这两篇论文的细节是如何实现的。
如果你想要钻研,你可以看Cassandra在单机上是怎么实现LSM的,这是很多分布式数据库都采用的一个结构。简单说,就是把热数据写到memtable,然后数据会定期被flush到sstable。这个结构在很多OLAP和OLTP引擎中都有用到,非常常见。
了解Cassandra之后,你可以以Cassandra为跳板,进一步了解更多其他流行的分布式数据库的底层实现,也就是可以举一反三。这对你之后学习其它的数据库都会很有益处。
### 阙乃祯
前面两位老师讲得很好,我再补充一点。Cassandra上手很快,像是DataStax Getting Started的demo,随便调一调可能只要1-2个小时。而Cassandra从集群搭建起来到库表的增删改查语句都能跑通,这个过程非常快,这会让你很快就有成就感。
另外Cassandra的运维相较HBase一类的数据库来说比较简单,对于初创公司来说,如果没有充足的运维人员,开发人员就得又当爹又当妈,可能用Cassandra就比较合适,公司也能节约一些成本。
第三点就是国内的招聘网站上可以看到越来越多岗位的招聘需求会提到有Cassandra一类的数据库的使用经验。我相信如果你有这方面的经验,这会对你找工作有一定的帮助。
### 邓为
我有一些粗浅的想法,想要做一些补充。一方面,Cassandra作为一个流行的数据库,如果你的工作中本来就要用到,那么你当然有理由去学习和精通。但是最重要的,就像栾老师说的,Cassandra其实是把分布式系统中比较重要的理论和比较精华的算法都做了工程上的实现。
另外Cassandra这种无主(masterless)架构在传统的数据库中其实是很难实现的,Cassandra不仅能够实现这种架构,还能在实际生产环境中被很多大公司采用并应用于很多核心业务,摸爬滚打十多年的时间,这充分证明了这些分布式系统理论和算法的实用性。
如果你把Cassandra吃透,你再去看很多其他的分布式系统,包括最新的数据库和分布式系统,你会觉得很多常用概念其实是一通百通。所以即使你是个学生,只是抱着学习的目的来了解Cassandra,以后你再学习其他的高并发、低延迟、大数据量的分布式数据存储平台,你就会有一个很好的基础。
另外Cassandra这个技术本身也在与时俱进。比如针对Kubernetes,现在社区就有很多新的动作,想把Cassandra打造成云原生、混合云和跨云环境下的大规模数据的分布式数据库的默认选项。因为社区非常活跃,紧跟各种新技术的发展,这个技术就能一直保持活力,不容易过时。所以你现在投入的时间在五年后、十年后还是会有助于你的工作和事业。
---
## Q:你们在系统学习Cassandra时会用到什么样的资源?如果工作中碰到问题,你们去哪里寻找答案呢?
### 栾小凡
一般我的学习渠道主要是两个。
因为我是做研发的,所以我会看社区和DataStax的文档和jira issues,以便了解最近社区在做的功能、修补的bug以及准备release的东西。我也会去看大家的讨论,可以从社区大牛的讨论中汲取经验、获取灵感。
第二个部分我会从源码入手,比如当我在日常运维中发现问题或有不理解的地方,我可能会直接切入源码。Cassandra的源码是开源且相对规范的,所以在看源码的过程中,我不仅对Cassandra有更深的理解,也学习到大家使用Java这门语言的小技巧。
至于我们刚才提到的certification,我觉得还是很有必要的。尤其是在你刚刚进入这个行业的时候,针对证书考试的学习能够帮助你快速成长,并且可以增加大家对你的认可度。
比如我们招聘的时候,有时候还是比较难判断候选者对于Cassandra的了解程度,或者我们招聘DBA时会想要知道他有哪些技能。像是Oracle也会比较看重相关的证书,因为它是一个比较复杂的系统,有很多可以调优的地方。Cassandra其实也是一样的,如果你能有一个证书,我们会认为你会Cassandra的运维有一定程度的了解,那我们也会对你优先考虑。
### 张旭东
我这边主要是两个学习渠道。一是因为公司已经在大规模使用Cassandra,而我作为一个使用者,我会看公司同事写的Cassandra周边工具和API。二是Cassandra官方文档。有些东西不能想当然,我们得看文档里对于每个特性的最佳实践是什么,包括像是线程数、key怎么存储、key的大小等。这些还是需要细扣文档。
如果想要系统性学习,我当初看了《Cassandra权威指南》的第二版。这个版本跟Cassandra 3.0有些差距,但是大部分原理还是通用的,所以还是有些帮助的。(《Cassandra权威指南》第三版针对Cassandra 3.x和4.0,关注DataStax微信公众号并在后台回复【CDC3】即可下载电子版。)
另外关于Cassandra Certification,Dev和Admin两种我都考了。因为我是先使用了Cassandra几年,最近才考的这个证书。我感觉Certification里的这些考题和我日常使用Cassandra时需要注意的关键点是非常契合的。另外我还和我们team的Cassandra DBA也沟通了一下,问了他们做的事情和遇到的问题。他们的回答和我在Cassandra Certification for Amin这个考试中遇到的题目很相关的。
所以建议大家有时间还是要看一下这个证书考试,至少可以看看DataStax的相关课程,这些都是很有用的。
### 阙乃祯
我跟大家差不多,主要是看官方的文档以及大牛的技术博客。学习过程中,还是要多看多实践,光看不练肯定是没用的。一般来说,我们都会针对学习的东西或者工作中遇到的问题搭建集群,做一些建模或是压力测试。通过比较多地进行实践,我们希望尽量把问题统统暴露出来,然后再通过社区或是博客寻找答案。
如果遇到一些比较难的问题,我可能就直接找邓为老师了(笑)。还有像是阿里云的郭超,你们都是比较热情的,在群里面提问题基本上都会很快得到你们的解答,效率特别高。
---
## Q:SAI是否会对Cassandra将来的使用带来比较大的变化?
(SAI功能现已在DataStax Enterprise和DataStax Astra中上线,点击此处详细了解SAI。)
### 栾小凡
因为SAI还没有完全进入社区,所以目前我们还没将这个功能投入生产使用。但是我们已经看了文档,对这个功能还是非常期待的。SAI的功能还是很强大的,而且像是我们LSM树这种模型的写性能虽然比较好,但是我们所说的local index或是其他index方案都涉及到“写前读”的问题。SAI应该能够比较好的解决这个问题,所以我对它的期待是至少它会较大地提高写性能。
在读的方面,SAI的功能也是比较强大的。之前我们需要依赖ES或是外部检索所做的事情,可能我们就可以比较容易地在Cassandra里面直接完成了。所以我对SAI的期待是能够解决一部分不涉及分词的搜索场景。我们一直在密切关注社区的相关动态,等这个功能正式release,我们也期待我们的用户能尽快地用上。
### 张旭东
我们这边也很期待SAI。正好前两天我们的Cassandra DBA报了一个问题,有人在使用二级索引(老版本的SASI索引)时遇到了问题,最后也没用成二级索引。包括这几年有一些场景我们想用二级索引,但是因为看了官方文档中提到的限制,所以比较遗憾一直都没有用起来。总的来说我也是非常期待SAI这个功能,希望它可以早日在社区正式release。
---
## Q:Cassandra和ES的结合是否常见?
### 栾小凡
目前我确实看到这方面的需求,比较常见的是在圈人或营销的场景下,可能会选择用ES筛选出一部分人群,然后再用Cassandra回查,拿到他们的具体信息。
第二种常见场景就是消费记录和聊天一类的场景,这些场景的查询维度相对较多,尤其在消费记录那种特别宽的表里面会有非常多的字段,用户可能会选择某几个字段进行查询。这种不太确定Schema的查询对Cassandra本身local index的方案并不是特别友好,当然我们前面聊到的SAI不知道是否能解决这个问题。但目前的话就是把数据在ES里放一份,方便用户进行查询。
### 张旭东
我们这边主要利用ES的前端检索功能,比如我们蔚来的APP有一些搜索的场景会需要中文词的分词。ES的查询出结果后,为了性能,我们还会到Cassandra里回查。总的来说就是应用在中文检索的场景下。
### 阙乃祯
我们也会用到ES的情况还是挺多的,比如IoT场景对设备信息的检索,还有一些指令信息和历史记录检索的场景,我们会把原数据放在Cassandra中,但是索引会放到ES上面。
---
## Q:在多DC横跨多地的情况下,你们如何实现备份恢复?
### 栾小凡
我们确实有关注到用户这方面的需求。Cassandra本身存储的可能是比较关键的数据,虽然snapshot是一个不错的功能,但是有时候用户需要的其实是物理备份。
这种情况下,我们推出了一个我们自己的解决方案,叫BDS。它可以把Cassandra的sstable托管到我们的一些对象存储上面去,比如AWS的S3或阿里云的OSS这样的系统,从而实现硬备份。在这个基础上,我们也在跟社区贡献一个叫sidecar的解决方案,本质上可以将其理解为Cassandra的CDC(change data capture,数据改变捕捉)。
我们传统的拖文件的方案可能会存在一定的时效性(的问题),比如在内存或commitlog里面的数据其实是没办法快速回放的。如果这时候做恢复的话,可能会存在几分钟的gap。如果集群本身挂了的话,有些数据可能就丢掉了。所以如果我们有了CDC的sidecar,我们就有了一个毫秒级的方案。如果大家没有我们的服务,也可以拉一个CDC的sidecar的组件,然后通过Spark和Kafka实现这种备份方案,实现Cassandra的秒级恢复。
### 张旭东
我们的备份方案一般通过一些大数据组件,比如研发集群上我们会用全量备份。DBA方面我们还在探索中,比如多DC同步,我们想把AWS的数据同步到腾讯云时也遇到一些问题,尤其是那种迁移数据。
### 阙乃祯
我们会把重要的数据通过Kafka同步到ES集群或其他集群中去,其他的数据就用快照(snapshot)的形式备份。像是一些海外对数据本土化要求比较高的,我们会把所有的数据同步到我们的Ceph集群。