前阵子有个朋友在技术群里问了一句话:“我们团队准备做物联网设备数据的存储和实时查询,老大让我比较一下HBase和Azure Cosmos DB,说一个是开源标杆,一个是微软云数据库,到底该怎么选?”这问题一下就戳中了我这几年反复踩过的坑。HBase和Cosmos DB放在一起对比,表面上是“自建开源列族数据库”和“云托管全球分布式数据库”的对决,实际上背后是“你要为省心付出多少成本”以及“你的业务到底能不能驾驭分布式系统”两个更深层的抉择。
我从2015年开始用HBase做用户画像和订单索引,后来又在Azure上给客户搭过两套Cosmos DB。这俩我都不是“看过文档”的水平,是实打实维护过、踩过坑、半夜爬起来看过监控的那种。这篇文章我不打算写成一板一眼的产品对比手册,而是想把我理解的HBase和Cosmos DB的底层逻辑、实操细节、选型思路,以及那些文档里不写但实际一定会遇到的坑,都摊开来聊一聊。无论你是刚接到任务的技术选型负责人,还是想搞懂这两个数据库区别的开发者,这篇都值得你花十几分钟读完。
1. HBase与Cosmos DB的核心差异:先搞清楚它们各自的“出身”
1.1 架构思路:一个“自建派”和一个“托管派”的典型代表
HBase是Apache Hadoop生态里的老兵,2008年左右开始孵化,底层直接跑在HDFS之上。它解决的核心问题是:在廉价商用服务器集群上,对超大规模结构化数据做随机的、实时的读写。HBase的设计蓝本是Google的BigTable论文,这也决定了它天然具备“列族存储”、“稀疏表”、“自动分片(Region分裂)”、“强一致性”这些基因。
Cosmos DB则是微软云Azure上的原生多模型数据库,2017年正式推向全球。它更年轻,但野心更大。它不在你机房里跑,而是一出生就长在微软遍布全球的几十个Azure骨干节点上。它提供“点击按钮即可全球分发”、“多主多写”、“五个一致性级别可调”这些能力。在我看来,Cosmos DB本质上不是一个“数据库引擎”,更像是一套“全球分布式数据基础设施”。
这两者之间最本质的差别,不是性能数字的差别,而是运维责任的差别。你用HBase,意味着你要自己部署、自己监控、自己处理RegionServer宕机、自己调JVM参数;你用Cosmos DB,意味着你把这些问题都外包给微软,但你付出的代价是——你失去了对底层物理存储的一切控制权,而且账单会随着请求量稳步上涨。
1.2 数据模型:宽表家族的远房亲戚
从数据模型看,HBase和Cosmos DB都能存“宽表”,但玩法很不一样。
HBase的核心模型是:Table(表)→ RowKey(行键)→ Column Family(列族)→ Column Qualifier(列限定符)→ Timestamp(时间戳版本)。一张表可以有几个列族,每个列族下可以动态添加任意列。这种设计特别适合“同一行数据的不同属性在不同时间逐渐补齐”的场景,而且列的稀疏性做得极好,空列不占存储。
举个例子,你在HBase里建一张用户表,列族info下可以今天加一个age列,明天加一个vip_level列,完全不用改表结构。这种自由度在关系型数据库里是不可想象的。
Cosmos DB则支持多种API,最常用的是Core (SQL) API,它本质上是文档数据库,存的是JSON格式的数据。你也可以把它当宽表用,因为它允许每个文档有完全不同的结构,但每个文档最大2MB,这就意味着它不适合存特别大的单条记录。Cosmos DB还有一个Table API,这个API是专门为了兼容Azure Table Storage设计的,行为上接近键值存储,它不是HBase那种列族模型。
从实用角度说,如果你要存的是“行数上亿、列模式经常变化、单行可能很大”的数据,HBase更顺手;如果你要存的是“JSON文档、嵌套结构、需要富查询能力”的数据,Cosmos DB的SQL API明显更强。后面我会展开说查询能力的差距。
2. HBase核心细节深挖:WAL、Region分裂与Shell操作
HBase这块我必须讲透,因为这是很多人在面试和实际开发中最容易翻车的点。你如果只是用云厂商的托管HBase,可能觉得它很乖,一旦自己搭过裸的HBase,你就能深刻理解什么叫“分布式系统的细节是魔鬼”。
2.1 WAL预写日志:HBase数据安全的生命线
HBase的写入路径是这样的:客户端把写请求发给RegionServer,RegionServer先把写入操作追加到WAL(Write-Ahead Log,预写日志),然后才写入内存里的MemStore。等到MemStore积攒到一定阈值(默认128MB),再刷写(Flush)成磁盘上的HFile文件。
为什么要先写WAL?因为MemStore是纯内存结构,一旦RegionServer宕机或者进程崩溃,内存数据就全丢了。有了WAL,重启后可以通过回放日志来恢复MemStore中尚未落盘的数据。所以WAL是HBase数据一致性和持久性的基石。
WAL在HDFS上的路径通常是/hbase/WALs/{RegionServerHost}/{RegionServer的端口号},注意不同版本的HBase路径有差异。旧版本(0.98之前)路径是/hbase/.logs/,新版本是/hbase/WALs/。这个细节经常出现在面试题里,也是排查问题时首先要确认的。
实操中我遇到过好几次WAL异常,最典型的是HDFS空间满导致WAL写入阻塞。当时的情况是:HDFS容量监控被忽略了,NameNode进入SafeMode,所有RegionServer的WAL写入全部超时,线上写入接口的RT从5ms飙到30秒。排查过程很直接,先看RegionServer日志里有没有Blocked关键字,再看HDFS是否有写入失败,最终定位到是磁盘不足。从那之后,我把HDFS空间监控和WAL目录大小监控都加到了值班告警系统里,而且给WAL所在的目录单独做了容量趋势看板。
还有一个常见误区:很多人以为WAL只是“写日志所以很快”,实际上WAL的同步策略直接影响写入延迟。HBase里有个参数hbase.regionserver.hlog.sync,默认是hflush,也就是每次写WAL都要HDFS刷盘。你要是追求高吞吐,可以改成hdfs异步,但那是拿数据安全换性能,生产环境别这么干。
2.2 HBase安装与配置:从零搭一套能跑的集群(连Windows都有坑)
HBase安装本身不难,难在“你认为你装好了,但其实没有”。这里我以Linux环境为主,顺带说说Windows环境下的坑。
装HBase之前你得先有一个HDFS,或者至少有一个ZooKeeper。最简模式是Standalone,直接解压就能跑,但生产至少是伪分布式或完全分布式。推荐下载稳定版本,比如2.4.x或2.5.x(注意版本差异)。
最简单的Linux安装流程:
- 下载二进制包并解压,配置环境变量
HBASE_HOME。 - 编辑
conf/hbase-env.sh,设置JAVA_HOME。 - 编辑
conf/hbase-site.xml,核心配置项如下:
<property> <name>hbase.rootdir</name> <value>hdfs://namenode:9000/hbase</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>node1,node2,node3</value> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property>- 编辑
conf/regionservers,把RegionServer的节点名逐行写上。 - 启动:先保证HDFS正常,然后执行
bin/start-hbase.sh。检查进程和日志,看Master和RegionServer是否起来了。
Windows下装HBase是另一种心酸。因为HBase依赖HDFS,Windows上跑HDFS本身就是折腾。常见做法是在Windows上用WSL装Hadoop,或者直接下载HBase的Windows包(有个hbase-x.x.x-bin.tar.gz在Windows下解压也能跑伪分布式模式,但要额外装一个cygwin或winutils)。我个人的建议是:如果你只是在学习,直接在Docker里起一个harisekhon/hbase镜像,五分钟就能有一个带Shell的环境,别跟Windows本机安装较劲。
另外一定要弄清楚HBase的端口清单。HBase不只有一个端口,默认意义上它的组件依赖是很清晰的:
| 组件 | 端口 | 说明 |
|---|---|---|
| HMaster Web UI | 16010 | HBase Master的Web界面 |
| HMaster RPC | 16000 | Master与客户端通信 |
| RegionServer Web UI | 16030 | RegionServer的Web界面 |
| RegionServer RPC | 16020 | RegionServer与客户端通信 |
| ZooKeeper | 2181 | HBase依赖的ZooKeeper端口 |
| HDFS NameNode | 9000/8020 | HDFS的RPC端口 |
| HDFS DataNode | 9866 | HDFS数据端口 |
这些端口你要是没记清楚,排查网络问题时很容易把“HBase的问题”误判成“网络的问题”。我曾经有一次线上连接超时,折腾了半天才发现是安全组没放行16020端口。
2.3 HBase Shell操作:自动拆分和预分区,别等Region热了你才后悔
HBase性能调优里最经典的就是预分区和自动拆分,这也是面试题的高频考点,几乎必问。
先理解Region和你数据的关系。一张表的数据一开始只有一个Region,这个Region有个起始RowKey和结束RowKey。随着数据量增大,Region会分裂(Split),分裂之后数据就分布在多个Region上。如果只有一个Region,所有读写都压在一个RegionServer上,无论你的集群有多大,都是白搭——这就是“热点问题”。
默认情况下HBase会自动拆分,策略是IncreasingToUpperBoundRegionSplitPolicy:Region大小超过一定阈值就自动分裂。这个“自动拆分”是HBase的兜底机制,但不是最优解法。因为自动拆分是按“单个Region过大”来触发的,这意味着在拆分前这个Region可能已经达到了1GB甚至10GB,而拆分时会有短暂的RIT(Region In Transition),产生毛刺。
更可控的做法是预分区:在建表时就手动指定多个Region的分割点(Split Points),让数据从第一天起就均匀分布在多个RegionServer上。
HBase Shell里预分区的命令很简单:
# 创建表,预分为4个Region,分割点在'10','20','30' create 'user_behavior', 'cf', SPLITS => ['10','20','30']也可以用工具类RegionSplitter做十六进制或十进制拆分:
hbase org.apache.hadoop.hbase.util.RegionSplitter user_behavior HexStringSplit -c 10 -f cf这里面最大的坑就是你选择的RowKey分割策略。如果RowKey是自然ID且分布不均(比如前面几位是地区编码),那么即使预分区了,也依然会出现热点Region。常见解法有加盐(Salt)、加哈希前缀(Hash Prefix)。比如你在RowKey前面拼一个MD5散列或CRC32取模的前缀,让数据天然均匀分布,同时保证同一类数据可以通过前缀范围扫描。这是我给所有HBase新手的第一个建议:RowKey设计比预分区本身重要一百倍。
2.4 用Sqoop操作HBase:大数据链路里的“连接器”玩法
要说HBase在传统大数据生态里的地位,就不能不提Sqoop。Sqoop是个工具,负责在关系型数据库(MySQL、Oracle)和Hadoop组件(HDFS、Hive、HBase)之间搬运数据,虽然现在Flink、Spark大行其道,但在传统数仓环境里Sqoop依然大量存在。
Sqoop导入HBase的典型命令大致是:
sqoop import \ --connect jdbc:mysql://localhost:3306/orders \ --username root \ --password xxxx \ --table orders \ --hbase-table ods_orders \ --column-family cf \ --hbase-row-key order_id \ --split-by id \ -m 4它的逻辑很简单:把MySQL的orders表数据按行读出来,每行的order_id作为RowKey,其余列放到cf列族下。这有个隐含限制:Sqoop的HBase集成只支持单列族,不支持多列族映射,这在处理复杂表结构时很蛋疼。你只能在业务上将多列拆到同一列族的不同限定符下。
实操里我踩过的坑是Sqoop导入性能。默认-m参数是4,如果表有2亿条数据,4个Map作业跑起来很慢,而且容易对MySQL造成压力。建议根据主键取值范围设置合理的并行度,同时设置--fetch-size控制每次拉取行数。另外一个很隐蔽的坑是:如果目标HBase表没有提前建好,Sqoop不会自动建表,它会直接报错表不存在。所以实际操作时,必须先用HBase Shell把表结构预创建好。
3. Cosmos DB的实操要点:一致性、RU和分区键
聊完HBase,我们把镜头转向微软的Cosmos DB。作为一个云数据库,它的使用体验跟HBase完全不同:你不需要装任何软件,只要在Azure门户点几下就能创建一个数据库账户;但正是因为太方便了,很多人反而忽略它背后的几个关键概念。
3.1 五个一致性级别:低延迟和强一致,你怎么平衡
Cosmos DB最让我觉得“高级”的设计,就是它的五个一致性级别。这五个级别从强到弱分别是:
- Strong(强一致):写入成功后,任何区域的读都能立即读到最新值,但写入延迟会显著增加,因为数据要等所有副本确认。
- Bounded Staleness(有界过期):读到的数据允许有一定延迟(比如最多滞后1000次操作或5秒),可以理解为强一致和最终一致之间的“中间档”。
- Session(会话一致):同一个客户端会话内读己之所写,也就是同一用户写入后自己能立刻读到,其他用户不一定。
- Consistent Prefix(一致前缀):读到的数据不会出现乱序,比如先写了A再写了B,读的时候不会读到B而没读到A。
- Eventual(最终一致):最弱的级别,延迟最低,适合日志类、非关键数据。
这个选择对实际业务影响极大。我的建议是:默认选Session,这是最中庸也能满足大多数业务需求的级别;但如果你有金融交易类的需求,优先考虑Strong,哪怕慢一点也值;如果你做的是产品推荐、浏览记录这类允许轻微滞后的数据,选Eventual能省下不少成本。
有意思的是,你可以在代码层面动态修改一致性级别,不需要改数据库配置。这给你在性能调优上留了很大的操作空间。我记得有一个做全球游戏排行榜的项目,读多写少,逻辑上用Session一致性就够,但因为游戏客户端访问量暴增,我直接降到Consistent Prefix,瞬间延迟下降了一截。
3.2 RU(请求单元):你花的每一分钱都跟它有关
Cosmos DB的计费核心是RU(Request Unit,请求单元)。RU是一个抽象单位,可以理解为“处理一次请求消耗的资源和时间的综合度量”。1RU约等于读一个1KB大小的文档。写入的消耗则更大,大概一个1KB的文档写入需要10RU左右,因为涉及索引更新和复制。
计算RU这件事,听起来简单,做起来很容易翻车。我见过很多团队上线后账单爆炸,就是因为上线前完全没预估RU消耗。合理的做法是先做一个基准测试:用真实数据和真实请求量,跑上半小时,看实际RU消耗,再根据峰值请求量乘上冗余系数(我一般给1.5到2倍),然后配置吞吐量。
Cosmos DB的吞吐量有两种配置方式:手动RU/s和自动缩放RU/s。手动适合流量稳定场景;自动缩放适合波峰波谷明显的场景(比如白天8点-10点业务高峰,晚上流量骤降)。自动缩放我刚用的时候有个误区,以为它会在流量高峰瞬间就提升额度,实际上它有一定的反应时间,如果你遇到的是“秒级流量突刺”,自动缩放可能会跟不上。所以对核心业务,我建议用预留高RU配上限流保护,避免费用不可控。
3.3 分区键:选错分区键,性能灾难的开始
Cosmos DB的逻辑分区上限是20GB,物理分区会根据数据量和吞吐量自动分裂。分区键的选择决定了你的数据如何分布在物理分区上。如果你选了一个低基数的分区键,比如“地区”只有华东、华南两个值,那么数据只会散到两个物理分区上,其他物理分区完全空闲——这会直接导致性能瓶颈和成本浪费。
还记得那个把/deviceType当分区键的案例吗?假设你就三种设备类型,数据最多分布到三个物理分区,20GB的上限迟早爆掉。更严重的是,在同一分区内的所有操作,Cosmos DB是按事务处理的,锁竞争非常激烈。
正确选分区键的原则是:高基数(比如DeviceID、UserID)+ 分区内读写相对均匀 + 能支撑你90%以上的查询按分区键过滤。如果实在找不出合适的自然键,可以把ID的某种哈希拼进去做合成分区键。
4. 一张表看清HBase和Cosmos DB的全面差异
前面分散讲了很多,为了让你更直观对比,我做了一张浓缩的差异表,按几个关键维度梳理:
| 对比维度 | HBase | Cosmos DB |
|---|---|---|
| 部署方式 | 自建集群,依赖HDFS和ZooKeeper | 云托管全托管,Azure门户开通即用 |
| 数据模型 | 列族宽表,稀疏动态列,可按RowKey范围扫描 | 多模型(SQL文档、MongoDB API、Cassandra API等),JSON文档为主 |
| 一致性 | 强一致(单Region内),跨Region需要额外机制 | 5个一致性级别,可在请求级动态调整 |
| 查询能力 | 只支持基于RowKey的Get和Scan,查询能力弱 | 支持SQL语法、多条件过滤、聚合函数、JSON查询,能力更强 |
| 全球分布 | 原生能力弱,需要自己搭跨机房复制(如Replication) | 天生全球多区域写入和读取,多主写支持 |
| 运维复杂度 | 极高,需要自己监控HDFS、ZooKeeper、RegionServer | 极低,微软负责底层基础设施 |
| SLA | 自建无官方SLA | 提供99.99%以上SLA,多区域可达99.999% |
| 成本模式 | 硬件+运维人员成本,前期投入大 | 按RU计费,账单与请求量强相关,闲置也花钱 |
| 生态集成 | 与Hadoop/Spark/Hive/Sqoop天然融合 | 与Azure生态(Function App、Data Factory等)集成方便 |
| 典型场景 | 海量订单流水、用户画像、日志索引、时序数据 | 移动App后端、IoT设备状态、全球用户配置服务、电商订单 |
这张表一出来,其实选型的答案就已经揭开一半了。但我要强调的是,选型不是只看功能列表,还要看你的团队配置和运维能力。如果你们公司没有专职的Hadoop运维工程师,硬上HBase等于给自己埋雷。
5. 选型决策:什么情况下选HBase,什么情况下选Cosmos DB
看起来有对比表就够了对吧?不够。因为数据库选型永远是个权衡题,不是计算题。我见过太多团队,为了“技术先进性”选了一个看似完美的方案,最后被运维拖垮了。所以我再补充一些非常实际的判断标准。
5.1 什么场景闭眼选HBase
第一类场景:你已经上了Hadoop生态,离线数仓、Spark计算链路都跑在YARN上。HBase能跟Hive、Spark完美对接,尤其做用户画像和推荐系统里的“特征表”时,HBase是标配。这时候引入Cosmos DB反而是另起炉灶,数据链路割裂。
第二类场景:你对数据主权和可控性有强制要求。云计算虽然方便,但“数据在别人机房里”这件事,对某些合规要求严格的行业来说是个政治不正确。自建HBase,你至少能拍着胸脯说“数据在我们自己的机房里”。
第三类场景:你的数据有很强的“稀疏宽表”特征。比如一张表有几十个属性,但每个用户只填了其中几个字段,而且字段一直在动态增加。HBase的稀疏列族模型几乎是为这种场景量身定做的。你只要设计好RowKey,剩下的就是往里灌数据。
第四类场景:你的业务以“按RowKey点查”为主,极少需要条件过滤和聚合。比如订单详情查询、消息ID查询。这种请求HBase的吞吐能力非常强,单机QPS上万是很轻松的(前提是RowKey设计得好)。
5.2 什么场景直接上Cosmos DB
第一类场景:你的业务有明确的多区域全球部署需求。比如你的用户分布的全球各地,你希望用户就近访问自己的数据,同时允许不同区域同时写入。Cosmos DB的多主写能力是HBase这些老石库很难望其项背的。HBase的多机房复制通常只能做到单写多读或异步复制,复杂度还特别高。
第二类场景:你的数据是JSON文档型,且查询条件五花八门。Cosmos DB的SQL API能很方便地支持嵌套对象查询、数组过滤、聚合分组等操作。这种需求你用HBase写代码,那真是太痛苦了,因为你要么用Filter链表硬凑,要么把数据冗余到多行。
第三类场景:你团队里没有合格的HBase运维。自己搭HBase,说白了你不是在搭数据库,你是在搭一个分布式系统全家桶:HDFS的Namenode高可用、Zookeeper的稳定性、RegionServer的垃圾回收调优、HFile的合并问题……每个都要命。Cosmos DB把这些都吞掉了,你只需要关心逻辑上的吞吐和分区键。
5.3 迁移与共存的可能性:别把它们当敌人
我很反感那种“选A就必须放弃B”的二元论思维。真实生产环境中,HBase和Cosmos DB完全可以共存。比如一个电商平台,可以把订单核心链路放在Cosmos DB上,因为它要的是低延迟和全球一致能力;而将离线分析用的历史订单明细放在HBase里,供ETL和Spark批处理分析使用。两者通过数据管道定期同步,各司其职。
如果你正在做从HBase到Cosmos DB的迁移,我的建议是:不要试图做在线双写方案,复杂度太高。先通过离线ETL做全量数据导出导入,再模拟一段时间把增量数据同步过去,最后通过开关切换读流量。期间要把验证数据一致性作为最高优先级。这个思路实际上跟大多数异构数据库迁移的通用套路一致,Cosmos DB和HBase数据模型差异大,映射关系需要你自己定义清楚。
6. 常见问题与排查技巧实录
这部分是我从实际运维中攒下来的“保命经验”。很多人喜欢收藏各种数据库面试题,但我更愿意分享真实的故障场景。下面几个问题,每一个我都亲手处理过,至少能帮你在遇到问题时不慌。
6.1 HBase WAL预写日志异常的典型现场
问题描述:RegionServer日志出现大量WAL file is corrupted或者Failed to append to WAL,随后部分Region变成不可写状态,甚至RegionServer启动失败。
排查思路:
- 先看HDFS的健康状态。很多WAL异常根因都是HDFS的节点出问题,比如磁盘坏道、DataNode心跳丢失。
- 进入HDFS的WAL目录:
hdfs dfs -ls /hbase/WALs/xxx,看看是否有异常大小的文件。 - 检查HDFS的副本数。如果副本数太小(小于2),一旦某台机器宕机,WAL文件就可能不可读简化。
- 如果WAL确实损坏,在确认丢失数据可容忍的前提下,可以把损坏的WAL文件挪到备份目录,强制HBase跳过它继续启动。但要很明确——这是严重后果的兜底操作,绝不能随便用。
我当时的处理是:先确认HDFS其他节点健康,然后把损坏WAL文件移走,重启RegionServer,数据最终只丢了很小一段时间的增量(因为有部分WAL是异步刷盘的),之后我把WAL同步策略改回了强同步模式,并增加了HDFS空间监控。
6.2 HBase常见的配置和端口问题速查
- 无法连接ZooKeeper:确认2181端口安全组是否放行;检查
hbase-site.xml里的hbase.zookeeper.quorum是否写对了主机名(我栽过坑,写成IP导致部分客户端连不上)。 - RegionServer启动失败但Master正常:看
logs/hbase-xxx-regionserver.log。最常见的是Java堆内存配置不足,导致频繁Full GC然后进程自动退出。如果JVM参数没调好,很常见。 - HBase Shell执行
status卡住:一般是Master Web UI和RPC不一致,先确认Master进程是否存活,再确认RegionServer是否都注册成功。
6.3 Cosmos DB的经典报错与处理
Request rate is large:这是RU消耗超过配置导致的限流,Cosmos DB会返回429错误码。处理办法不是无脑提RU,而是先看你的分区键是否让请求集中到了单个物理分区。如果是热点问题,你就算提了RU也浪费钱。PartitionKey doesn't match:你插入数据时的分区键值与你容器定义不匹配。这个问题在改分区键时经常发生,因为Cosmos DB一旦建立容器就不能直接改分区键,只能新建容器再迁移数据。- 跨区域写延迟突然升高:检查你的写入是否跨越了多个区域,Cosmos DB多主模式不是说任何区域写都无门槛,跨Region写仍然有复制成本和延迟。写流量尽量在本地区域完成,只在故障切换时启用其他区域。
6.4 Sqoop导入HBase数据时的几个隐藏坑
如果你用Sqoop往HBase导数据,请一定注意这三件事:
- 提前建好HBase表并开启预分区。如果没建表,Sqoop会直接报错。
--null-string和--null-non-string要设置好。MySQL的NULL导入到HBase后,默认可能变成空字符串而不是被过滤掉,这会让你后续查询时出现脏数据。- Sqoop的Map数不能少于目标表Region数,否则数据导入会不均匀。理想情况是Map数等于Region数的整数倍。
7. 写在最后的几句实在话
我把HBase和Cosmos DB的对比写到这里,技术细节基本都覆盖了,最后想分享一点个人体会。这俩数据库我都重度用过,如果非要用一句话概括我的感觉,那就是:HBase是你亲手养大的马,你得喂它、刷它、治病;Cosmos DB是你租来的宝马,省心省力但价格不便宜,行驶一圈朋友圈都得按里程算钱。
在实际选型时,不少团队卡在“技术选型政治学”上——有人推崇开源HBase,有人推崇云原生Cosmos DB,两边吵得不可开交。我的建议是,别从“技术信仰”出发,而是从“你希望把团队的宝贵时间花在哪里”出发。如果你的目标业务是全球化互联网产品,而且团队已经准备深度绑Azure云生态,那么Cosmos DB的多主写、全球分发、五级一致性,会让你少写很多分布式代码。
如果你更看重成本透明和数据完全掌控,而且你已经有一只熟悉Hadoop生态的运维团队,那么HBase依旧是很能打的方案。最后提醒一句:不管你怎么选,生产上线前一定压测到极限,观察热点分布和延迟趋势;数据的价值和风险,永远都掌握在敢于直面它的人手里。