1.基本概念
分布式存储:数据冗余和数据分片
数据冗余:一组多从,应对高并发的数据查询(分摊读压力)
数据分片:降低单个节点的存储压力
分库分表带来的问题:
查询必须带分区键
聚合查询效率低
主键全局唯一(物理上是分离的,需要在逻辑上保持一致)
2.数据的主键怎么选择
2.1使用业务字段作为主键
使用手机号,身份证号..
一般不使用,需要耦合业务,同时会出现不好选择的情况
2.2使用生成唯一ID作为主键
推荐使用,唯一性,一旦生成不会变更,随意引用
单裤单表:自增ID即可
分库分表:全局递增ID,同时保证全局唯一
基于 Snowflake 算法搭建发号器(生成全局唯一ID)
如果使用UUID有什么问题?
IDC 数据中心(Internet Data Center)
| Snowflake | UUID | |
|---|---|---|
| 算法思想 | 将**64位二进制(正好是一个int的大小)**数字分为若干部分,每一部分包含特殊含义(时间戳、机器ID、序列号、业务信息...) 包含业务信息后可以进行id反解 | |
| 具体实现 | 1.嵌入业务代码中,分布在业务服务器中 需要考虑机器ID 但是需要引入Zookeeper保证机器ID的全局唯一 2.独立服务部署,发号器服务 需要增加一次网络调用,但是不再需要考虑机器ID | |
| 优点 | 设计巧妙,性能高效 | 不依赖第三方,性能可用性好 |
| 缺点 | 强依赖时间戳,时间戳不准会导致重复ID 发现时间不准后,拒绝发号 QPS低的话,没毫秒只发一个ID,ID末尾永远是1 1.时间戳不记录毫秒,只记录秒 2.生成序列起始号做一下随机 | 是无序的,很难满足时间排序 无序ID会影响数据库写性能(会造成数的分裂,节点移动) 不具备业务含义 UUID是字符串,作为主键时比较耗费空间 |
| 适用场景 | 可以用来表示traceid |
3.课程小结
方案不在多,而在精,方案没有最好,只有最适合,真正弄懂方法背后的原理,并将它落地,才是你最佳的选择