Week6 学习总结
一、如何解决数据库写压力大问题
1、 读压力大 VS 写压力大
1)读压力大问题的解决方式
a. 使用缓存
b. 数据库主从复制
2)写压力大问题的解决方式
a. 消息队列:可以解决写压力分布不均匀的问题,无法解决写压力始终较大的问题
b. 数据分片&分布式数据库
2、数据分片
1)解决的问题:数据量大、用户的写请求量大,超出服务器的压力
2)如何分片
a. 水平拆分:对数据表进行切分,避免单表数据量过大,对拆分的表分开部署
b. 垂直拆分:按业务对数据分库+拆分的数据库分开部署
3)如何实现分片&查询
a. 硬编码实现分片:数据分片和路由算法,写在代码中
b. 映射表外部存储:数据分片和路由算法写在配置文件中,应用程序加载配置文件
c. 分布式数据库中间件:应用程序调用中间件实现数据分片和路由处理,应用程序对分片过程无感 知,eg. MyCat
4)分片算法&集群如何伸缩
a. 余数hash法:需要一条一条的遍历数据,重新计算hash值,迁移的数据量较大
b. 一致性hash算法:需要一条一条的遍历数据,重新计算hash值,迁移的数据量较少,但是处理过程仍然比较复杂
c. 实践场景:
->使用算法:余数hash算法
->具体操作:
一个数据库中部署了多个schema示例;
伸缩时,将schema迁移到新的服务器上(数据库主从复制)
数据迁移完成后,再修改路由配置,并将原有的schema删除
->注意事项:一开始应该部署多少个schema呢,怎样设置合适的个数?需要在一开始做好容量规划
二、数据库演进
1、演进过程
1)单一数据库
2)数据库读写分离:主从复制
3)业务分库:不同的业务使用不同的数据库
4)综合部署
2、分布式数据库
1)为了解决什么问题
2)引入了什么新的问题:高可用问题&数据最终一致性问题
a. CAP原理:
->一致性C:每次读取数据时,要么返回正确的数据,要么返回错误,不能返回一个过期的数据
->可用性A:每次请求一定要有返回,不能返回错误或失去响应,但是允许返回不正确的数据
->分区耐受性P:因为网络原因导致部分节点之间的消息丢失或延迟时,要保证系统依然可用
->总结:
C和A之间是矛盾的,而对分布式系统而言,P是必须要满足的,所以分布式系统只能同时满足CP或AP,不能同时满足CAP;
C和A之间并非是绝对的对立关系,不是说降低C就一定能提高A,或降低A就一定能提高C。设计时,需要考虑保证可用性的同时,尽可能提高一致性,从而引出BASE理论
b. BASE理论:
->基本可用:Basically Avaliable,即系统出现故障时,允许损失部分可用性,如响应时间上的损失或功能上的损失
->弱状态:Soft state,即允许系统中的数据存在中间状态,允许多个服务节点之间的数据同步过程存在延时
->最终一致性:Eventually consistent,多个节点上的数据副本,经过一段时间的同步后,最终能够达到一致
c. 最终一致性问题解决方法
->时间戳+集群间时间同步
->客户端解决冲突
->投票解决冲突
3、NoSQL数据库
1)HBase & LSM树
2)Doris案例分析
三、分布式一致性问题--Zookeeper
1、分布式系统的高可用问题
1)类似于MySQL的主主复制,需要设置备份的主节点
2)主节点&备份主节点之间,需要设置一个仲裁节点,进行判主处理
3)仲裁节点又需要保证高可用.......
2、Zookeeper如何解决高可用问题中的仲裁节点问题
1)Paxos算法
2)Zab协议
3、Zookeeper分析
1)架构的分析
2)树状记录结构分析
3)API
4、使用场景
1)配置管理
2)选master:
a. 节点尝试向zookeeper将自己注册为leader
b. 临时节点
3)集群管理:
a. 负载均衡&失效转移
b. 服务节点的注册&发现
c. 负载均衡节点的观察&监听
评论