文章目录
一、高性能数据库集群的两种方式
高性能数据集群通常采用以下两种方式:
- 1)读写分离
- 2)分库分表
二、读写分离原理
1)定义
将访问压力分散到集群中的多台机器上,但是,存储压力并没有改变
2)基本实现
数据库服务器搭建主从集群,一主一从,或者一主多从
数据库主机负责读写操作,从机只负责读操作
数据库主机通过复制将数据同步到从机,每台数据库服务器都存储了所有相同的业务数据
业务服务器将写操作发给数据库主机,将读操作发给数据库从机
基本实现需要注意两个细节点:
- 主从复制延迟
- 分配机制
3)主从集群与主备集群的区别
从机,需要提供数据访问功能
备机,仅仅提供数据备份功能,不提供访问功能
4)什么情况下该采取读写分离
当系统性能出现问题,首先应该进行优化,如优化慢查询、调整不合理的业务逻辑、引入缓存等,只有确定系统没有优化空间之后,才考虑读写分离或者集群
三、复制延时
1)定义
主机将数据复制到从机时,发生了延时问题,导致业务服务器从从机上读取的数据与主机不一致
2)解决方法
- 写操作后的读操作指定发给数据库主服务器
该方式与业务强绑定,对业务的侵入和影响较大
- 读从机失败后再读一次主机
二次读取和业务无绑定,只需要对底层数据库访问的 API 进行封装即可,实现代价较小,不足之处在于如果有很多二次读取,将大大增加主机的读操作压力
- 关键业务读写操作全部指向主机,非关键业务采用读写分离
从字面就可以理解,无须过多赘述
3)复制延时无法避免
从解决方法可知,在面对主从复制延时问题上,这是没有办法避免的事情,因为网络等各种因素
四、分配机制
1)程序代码封装
在代码中抽象一个数据访问层,实现读写操作分离和数据库服务器连接的管理
开源实现方案,淘宝TDDL(Taobao Distributed Data Layer,外号: 头都大了),一个通用数据访问层,所有功能封装在 jar 包中提供给业务代码调用。其基本原理是一个基于集中式配置的 jdbc datasource 实现,具有主备、读写分离、动态数据库配置等功能
2)中间件封装
中间件封装指的是独立一套系统出来,实现读写操作分离和数据库服务器连接的管理
开源数据库中间件,MySql Proxy、MySql Router、奇虎 360 数据库中间件 Atlas