系统优化方案:
系统基于oracle
1000万数据条件下:
(1)优化索引和sql
(2)纵向拆表,将不相关属性与主要属性分离
(3)迁出不活跃数据,包括删除数据以及不活跃数据
(4)数据进行分库保存。
以上四项可应对1000完数据左右的系统,对系统并没有太大改动。
同时DBA会对数据情况进行抓取,以便及时通知程序对数据库结构和数据进行修改。
2000万数据条件下:
(1)数据库主从分离,结构如下:
主从分离需要注意如何建立连接,如何判断读写请求以及从服务器的路由策略(如果使用mongo将会十分方便)
(1)使用多数据源切换连接,连接配置在配置文件中。
AbstractRoutingDataSource
protected abstract Object determineCurrentLookupKey()
<bean id="cpcDataSource“ class="com.sogou.bizdev.msdb.mydatasource.MyDataSource">
<property name="targetDataSources">
<map key-type="java.lang.String">
<entry key="rds01"value-ref="cpcSlaveDataSource" />
<entry key="wds01"value-ref="cpcMasterDataSource" />
</map>
</property>
(2)读写请求的判断在事务开始的时候进行,因此主要在service层进行判断。
主要有以下几种方式:
1、根据方法名称进行判断:比如约定find为读方法,save为写方法。
2、Annotation 方法:自定义注解
3、特殊配置,进行强制读或写。
出现问题:主从延迟。
解决方案:读后写不切换数据源。可通过ThreadLocal保存信号位
(3)对于服务器路由方面,可以有以下几种方式:
随机、加权、特殊策略。
出现问题:路由错误,导致写入错误数据库问题
解决方案:对读服务器配置只读权限,并进行告警。
出现问题:服务挂掉时,如何让保证不会路由到此处
解决方案:重写getConnection方法或者加入心跳。
对于mongo搭建的主从服务本身包含心跳检测,实现十分方便。
进行拆库操作,基于负载均衡和易于实现的原则。
多表关联使用oracle的DatabaseLink。
多库查询分页等问题,暂未解决。