一、目录
- 需求
- 问题
- 解决方案
二、需求
现在有接近Z台分布式数据库服务器,M台汇总数据库。当前需要将Z台数据库中的每个数据库中的关键性数据同步到汇总数据库上。汇总数据库上的数据要求:实时,准确。
三、问题:
当前数据量比较大,数据插入更新频繁。当前根据类型分库,如果这一类数据出现问题,那影响的是这一类数据。
比如,当前有一亿条数据,这些数据分为A类,B类,C类等等。同时,A类数据在Z1数据库上,B类在Z2数据库上,C类在Z3数据库上。这些数据都会有一个唯一的Key。
这样每个类别的数据库分别建立同步机制。当前选择的同步机制是MSSQL发布订阅机制:
优点:方便
缺点:实时性差(数据量大时)
稳定性差(同步数据量大时,服务会停止,需要重新初始化,千万级别的数据就会同步半天甚至一天更多)
不够灵活(同步挂掉的时候,要从头开始同步,没有标志节点等等)
这样根据以上的数据库设计,如果这个库的数据同步服务挂掉,那么这一类数据的实时性、准确性都会受到影响。
四、解决方案
(一)数据存储
因为数据有唯一的key。不再根据A、B、C类去分类,我们将这些数据全部打散。根据算法存入设置的数据库。每个数据库400万的数据。
唯一标识 —> 算法—> 转化成1~255 —>分组—>存入数据库
1)、唯一标识算法码取到对应的值(1~255)
2)、我们将1~255,分位5组
Index Value
1 1~50
2 51~100
3 101~150
4 151~200
5 201~255
3)、数据库和表
库: 国家&区域 — Index — 组别
D1—Index—1 * D国家1区 —Index — Index=1的,即Value1~50
表: 国家&区域 — Index(组别) — Data—表编号
D1—1—Data—1 * D国家1区 — 组别为1 — Data — Table1
D1—1—Data—2 * D国家1区 — 组别为1 — Data — Table2
库: 国家&区域 — Index — 组别
D1—Index—5 * D国家1区 —Index — Index=5的,即Value201~255
表: 国家&区域 — Index(组别) — Data—表编号
D1—5—Data—1 *D国家1区 — 组别为1 — Data — Table1
D1—5—Data—2 *D国家1区 — 组别为1 — Data — Table2
库: 国家&区域 — Index — 组别
G11—Index—3 * G国家11区 —Index — Index=3的,即Value101~150
表: 国家&区域 — Index(组别) — Data—表编号
G11—3—Data—1 *G国家11区 — 组别为3 — Data — Table1
G11—3—Data—2 *G国家11区 — 组别为3 — Data — Table2
说明:
数据根据算法得到的值(1~255),分别存入到对应组别下的数据库中,并且存入第一个表。当对应的的组别下的第一个表存满400万数据,立即在当前组别的数据库下创建第二个表,以此类推。
好处:
所有数据Key值算法得到的值(1~255),分散比较平均,而且值是不会变的。这样存储得平均而且分散,如果有新的大量数据进入,也会有很好的扩展性,每个表存满后就会创建新表。
问题:我们怎样去查数据?
数据Key—通过算法得到Value—找到对应的Index组别—到对应组别数据库下的表中查询相关数据(多个表可以多个并发)
(二)数据同步
因为业务库不能直连,我们采用webservice同步。将同步数据打到同步表中,有同步程序同步,同时服务端有接收程序进行处理。