有状态分布式,涉及的知识就比较多了,不过我们可以拿几个现实的例子由浅入深的来理解。
数据库的分库分表
- 假设你是一个开发负责人,开始使用单机的数据库,突然一天数据库硬盘挂掉了。你没有做备份,然后就没有然后了。
- 进入第2个公司,你意识到备份的重要性,每天定时备份到另一台机器,突然有一天,数据库硬盘挂掉了。你心想幸好我有备份,然后巴拉巴拉的恢复起来,用了2个小时。老板说不错,但是—-我们因为宕机造成大量用户流失,信誉下降,然后就又没有然后了。上面说的就是单点的问题。
- 进入第3个公司,你觉得单点很可怕,所以主备做起来,数据自动同步到备库,做到随时准备切换。突然有一天,主数据库硬盘挂掉了,你从容的修改数据库连接指向备库,重启系统恢复了,只用了5分钟。此时掌声一片,你沉浸在无比的欢乐中,老板说不错,但是—就在这5分钟我们丢了一个上亿的单子。我擦,你不是故意的吧!(其实这有可能是真实的片段,我们创业时,就30分钟断网,结果正好在举行一个大型的营销策划,不说了,我擦一会眼泪),然后就又没有然后了。其实当你用上主备时,说明数据库已经有状态了,必须要区分谁是主,谁是备。
- 进入第4个公司,你不但做了主备,还做了高可用,通过HA实现了瞬时切换。突然有一天,主数据库硬盘挂掉了,你从容的端起了你的屌丝杯,世界清静了。老板说不错,小子我看好你。从此你走向人生巅峰,出任CTO,迎娶白富美。但是没过多久问题来了,随着用户不断的增加,你的数据库摇摇欲坠,不时就抽疯。老板说搞定他,不然我就搞定你。
- 咋办,分库分表啊!如何分,这就涉及到更多的规则了,比如按照用户id是最常见的做法。此时你不但需要管主备而且还需要在程序中确定如何路由,结果集合并,如果再有机器增加,还要涉及数据迁移,另外还要防止出现重复id的脏数据,需要全局唯一主键,等等。亚美蝶!知道有状态的痛苦了吧。这也是为什么有些同学转投nosql的存储的很大原因,nosql替你屏蔽了这些规则,他在内部实现了路由、分库、合并等等。
- 提到这里不得不提一下淘宝的牛逼产品–drds(沈公子是不是应该给些广告费啊)。
- 分布式SQL引擎
- 将数据按照条件分散到多个数据节点(分库分表),对于数据操作sql进行分布式优化,获得最佳执行效率
- 自主运维
- DRDS的用户运维平台提供DRDS接入、分布式DDL、拆分信息维护、平滑扩缩容、分布式DML、监控等常用功能,让运维工作变得更简单
- 小表复制
- 对于配置表,常量表等不经常变化的表进行多节点对等同步,加速该类表与其他拆分表做关联查询的速度
- 分布式全局唯一id
- 提供全局唯一数字id服务,帮助您在分布式环境下,继续保持类似唯一键、主键等数据的全局(所有节点)唯一性
- 分布式SQL引擎
- 看到了吧,这就是有状态带来的痛苦。为了把有状态变为无状态有时候你需要做大量的工作。
有关分库分表的关键点和难点,我新一章统一讲解。
时间: 2024-10-23 11:25:48