一种高效、可自动扩容、缓存、永久存储通用方案设计

来源:互联网 发布:虚拟内存 知乎 编辑:程序博客网 时间:2024/06/06 03:02

离线消息存储方案

1 系统框架设计

1.1 名词解释:

名词

解释

备注

OffServer集群

离线消息服务器集群


Redis

一个redis实例

用于存储一些关键信息

MysqlKeyHashServer(MKHS)

代理整个MySql存储服务器集群

OfflineServer向MKHS发送“增加一条离线消息请求”,MKHS根据“会话ID”,将其固定hash到一台mysql服务器上。

NotifyServer(NS)

通知服务器,通知各种事件

当由于存储容量/存储速度不够时,我们增加mysql实例后,需要修改我们的hash策略,并通过NS服务器通知到所有的MKHS和MDS;以及数据迁移完成后,再次通知所有MKHS。

MoveDataServer(MDS)

数据迁移服务器

当由于存储容量/速度不够时,我们添加了mysql实例,一旦接收到MKHS的hash策略变更消息,则开始自动迁移数据,完成迁移后通知NS。

Mysql集群

某一个Mysql实例


1.2 组件图

 


1.3 mysql数据库设计

1.3.1 表定义

1.3.2 表管理

每一个mysql,根据将会话ID离散成500(可进行自定义)张表进行存储。

2 序列设计

2.1 存储离线消息

 


2.2 读取离线消息

 


2.3 添加mysql实例

2.3.1 第一步骤同步新Hash算法



2.3.2 第二步骤数据迁移


1 重要算法

1.1 MysqlKeyHash算法描述

Topic总量在每遇到一个分支后,将离散出50%,并继续离散,直到叶节点为止。

1.2 情形1

 

此时mysql1上保存着百分之百的Topic消息。

数学描述:

[1]


1.3 情形2

 

“Mysql实例1”此时上保存着50%的Topic消息;

“Mysql实例2”此时上保存着50%的Topic消息;

数学描述:

[1][1,2]

[2]


1.4 情形3

 

“Mysql实例1”此时上保存着50%的Topic消息;

“Mysql实例2”此时上保存着25%的Topic消息;

“Mysql实例3”此时上保存着25%的Topic消息;

数学描述:

[1][1,2]

[2][2,3]

[3]







1 0
原创粉丝点击