- 两个写库使用不同的初始值 , 相同的步长来增加id:1写库的id为0,2,4,6...;2写库的id为1,3,5,7...;
- 不使用数据的id , 业务层自己生成唯一的id , 保证数据不冲突 。
文章插图
仍是双主 , 但只有一个主提供服务(读+写) , 另一个主是“shadow-master” , 只用来保证高可用 , 平时不提供服务 。master挂了 , shadow-master顶上(vip漂移 , 对业务层透明 , 不需要人工介入) 。这种方式的好处:
- 读写没有延时;
- 读写高可用 。
- 不能通过加从库的方式扩展读性能;
- 资源利用率为50% , 一台冗余主没有提供服务 。
文章插图
写库不建立索引;线上读库建立线上访问索引 , 例如uid;线下读库建立线下访问索引 , 例如time;第二种扩充读性能的方式是 , 增加从库 , 这种方法大家用的比较多 , 但是 , 存在两个缺点:
- 从库越多 , 同步越慢;
- 同步越慢 , 数据不一致窗口越大(不一致后面说 , 还是先说读性能的提高) 。
文章插图
上游是业务应用 , 下游是主库 , 从库(读写分离) , 缓存 。实际的玩法:服务+数据库+缓存一套 。
文章插图
业务层不直接面向db和cache , 服务层屏蔽了底层db、cache的复杂性 。为什么要引入服务层 , 今天不展开 , 采用了“服务+数据库+缓存一套”的方式提供数据访问 , 用cache提高读性能 。不管采用主从的方式扩展读性能 , 还是缓存的方式扩展读性能 , 数据都要复制多份(主+从 , db+cache) , 一定会引发一致性问题 。
5、如何保证一致性?主从数据库的一致性 , 通常有两种解决方案:中间件:
文章插图
高并发下的数据安全 如果某一个key有写操作 , 在不一致时间窗口内 , 中间件会将这个key的读操作也路由到主库上 。这个方案的缺点是 , 数据库中间件的门槛较高(百度 , 腾讯 , 阿里 , 360等一些公司有) 。
强制读主:
文章插图
上面实际用的“双主当主从用”的架构 , 不存在主从不一致的问题 。第二类不一致 , 是db与缓存间的不一致:
文章插图
常见的缓存架构如上 , 此时写操作的顺序是:
- 淘汰cache;
- 写数据库 。
- 读cache , 如果cache hit则返回;
- 如果cache miss , 则读从库;
- 读从库后 , 将数据放回cache 。
- 淘汰cache;
- 写数据库;
- 在经过“主从同步延时窗口时间”后 , 再次发起一个异步淘汰cache的请求;
推荐阅读
- 熬夜太伤身,“夜猫子”一族遇到4种水果别吝啬,清热润肺又养心
- 安徽太平猴魁介绍
- 太阳能里面的水可以饮用吗 太阳能的水能喝吗
- 太平猴魁的特点是什么
- 玻璃杯冲泡太平猴魁方法
- 玻璃杯冲泡太平猴魁介绍
- 为什么太平猴魁茶条很长却仍旧鲜嫩
- 开淘宝店运费太高怎么办 淘宝运费自己出吗
- 电视机选购,认准这几个参数就够了,其它方面不用考虑太多
- 安徽绿茶太平猴魁名茶介绍