背景
我们一般应用对数据库而言都是‘读多写少’,也就说对数据库读取数据的压力比较大,有一个思路就是说采用数据库集群的方案,
其中一个是主库,负责写入数据,我们称之为:写库 其他都是从库,负责读取数据,我们称之为:读库 那么,对我们的要求是:
1.读库和写库的数据一致 2.写数据必须写到写库 3.读数据必须到读库
方案:
解决读写分离的方案有两种:应用层解决和中间件解决
应用层解决: 方案一:
优点:
1.多数据源切换方便,由程序自动完成 2.不需要引入中间件 3.理论上支持任何数据库 缺点:
1.由程序员完成,运维参与不到 2.不能做到动态增加数据源
中间件解决:
优点:
1.源程序不需要做任何改动就可以实现读写分离 2.动态添加数据源不需要重启程序 缺点:
没有特别成熟的中间件产品,
应用层解决,用spring实现,可以不动代码,选择方案1
大概的过程:
主数据库需要创建一个同步账户,确定一个同步的数据库,从数据库中设置主数据库的信息。
原理和问题
主库数据变更时,记录二进制文件(查询不要记录),从数据库读取这些二进制文件,变更数据。
问题:主数据库记录变更,从数据库读取,肯定会有时间差存在。
解决:我们设计架构的时候就需要知道到这个问题的所在,要避免这个问题,这个时间差我们能不能接受,对我们以后的数据有什么影响。
主从复制需要注意的问题:
从数据库不需要开启日志记录的二进制文件 主数据库和从数据库版本要一致
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》 发现问题后要准确定位问题,才能有效的解决问题 我在搭建主从复制的时候遇到的问题?
主从复制搭建不成功,通过读取mysql的日志文件,发现是主数据库和从数据库uuid一样造成的,然后我就百度解决问题。Mysql的文件里data>文件夹>里面有个auto.conf,修改UUID之后,重启服务器,同步成功。
方案一结合spring完成读写分离,通过方法名称,
实现方式:
Spring提供了一个配置动态数据源的类。
配置一个动态数据源,里面设置多个数据源,设置默认的数据源,默认走写库。 定义aop切面,通过方法名确定访问那个数据库。
因篇幅问题不能全部显示,请点此查看更多更全内容