Thinking PostgreSQL PL/Proxy Used in weibo(微博) Case

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介:
最近和网络的同事聊组播的技术,对于IP电视来说,这个技术可以大大降低网络的开销。
突然想到微博其实也是很耗带宽的一种东西,之前也没去了解过,我的理解是微博就类似留言,留言上带上了撰写人,标签,是否公开,接收人,发送时间等属性。
如 , 
普通的一条微博,有了撰写人,那么关注撰写人的用户在登录微博时就需要看到这部分微博信息。
另外,也可以定点给某人或者某些人发送信息,那么就有了接收人的属性。

如果用户量很大,活跃用户比较多的情况下,信息量也是巨大的。特别是明星用户。关注或被关注的人比较多的情况下。信息推送都会带来比较大的流量。

组播就值得借鉴了,如在10毫秒内发起的请求,如果有相同的,只请求一次。

另外,为了获得好的扩展性,数据库设计的时候要充分考虑数据暴增带来的问题。
如下:
Thinking PostgreSQL PL/Proxy Used in weibo Case - 德哥@Digoal - The Heart,The World.
 
发微博为了提高响应速度可以考虑异步消息,记录撰写人的USERID,私信接收人的USERID,如果是回复的话记录子msgid等属性。
MQ异步写入到索引库和消息数据库。

热索引主要用来存储收微博时需要用到的索引,如根据关注者的USERID(s)来检索msgid,根据自己的USERID来检索MSGID(私信),根据标签来检索MSGID。

索引库和消息数据库都可以使用PostgreSQL数据库,使用PL/Proxy可以不用担心数据库的扩展能力(读用流复制扩展(毫秒延时),写用bit&分库扩展)。
PostgreSQL的pgfincore插件能实现数据文件块级别的内存映射,并能记录下数据块的位置,重启之后通过位置信息进行预加载数据或索引数据至内存,非常灵活。(灵活性超越ORACLE的buffer pool keep)
写能力的提高除了分库之外,单库写能力的提高也可以使用异步事务提交, 分组提交等。

持久数据(历史数据), 每日/小时从热数据库同步。热库定期删除时间比较OLD的数据。

收微博的时候,到关系库取出关注者的userid(s),根据关注者的USERID检索索引库,按时间倒序取出MSGID。然后根据msgid(s)去数据库取出数据。

收取私信的时候,根据自己的USERID到索引库检索MSGID,按时间倒序取出MSGID。然后根据msgid(s)去数据库取出数据。

如图 : 
Thinking PostgreSQL PL/Proxy Used in weibo Case - 德哥@Digoal - The Heart,The World.

热数据和热索引在这里只的是时间比较接近当前时间的数据,怎么理解呢?
因为微博里面的信息量非常大,推送给用户的时候是按照时间倒序显示的。所以时间约新鲜,数据越热。被回复和转发的概率越大。
而时间比较久远的数据,相对来说不太会被查询或修改。

Thinking PostgreSQL PL/Proxy Used in weibo Case - 德哥@Digoal - The Heart,The World.
分库规则:
1. 索引库分库因子: userid(int8) bit& 操作, attr(int4) bit&操作.库的个数为2^n次方。当然plproxy允许重复条目。所以最粗的时候服务器不需要完全按照实际分库的个数来配置,可以后期几乎平滑的扩展。
2. 数据库分库因子: msgid(int8) bit& 操作, 库的个数为2^n次方。当然plproxy允许重复条目。所以最粗的时候服务器不需要完全按照实际分库的个数来配置,可以后期几乎平滑的扩展。
3. 关系库分库因子: userid(int8) bit& 操作。当然plproxy允许重复条目。所以最粗的时候服务器不需要完全按照实际分库的个数来配置,可以后期几乎平滑的扩展。

CACHE:
pgmemcached, 通过这个PostgreSQL插件,CACHE操作可以更加灵活的和数据库紧密结合起来(通过PG函数增删改查memcache的内容)。
Thinking PostgreSQL PL/Proxy Used in weibo(微博) Case - 德哥@Digoal - The Heart,The World.
 

关系库:
正向数据结构 : userid(int8),attention_userid(int8) 。(是否需要限制关注上限,关注的人越多,每次获取关注人信息的数据量越庞大)
反向数据结构 : userid(int8),attentioned_userid(int8) 。(明星用户可能被百万甚至千万人关注)

其他:
按USERID来分库 ,在数据库的扩展性方面比较灵活。
当然还要考虑msgid取出的时候需要merge后排序,这个比较麻烦。

按时间来分库比较麻烦的是,热点将集中在最近的库。
按时间,然后在下面再按用户ID来分,或许也是一种选择。

【能力预估】
假设 1台8核72G内存,500G硬盘服务器, 1.5W rw tps. 
        缓存服务器, 15W rw tps.
用户1亿,平均关注100用户。正向关系100亿,反向关系100亿。
10%活跃用户。平均每人每天发微博10条。一天1亿条新增微博信息。
关系库预计投入:100/8=12.5 台, 对外提供18W rw tps
反向关系库预计投入:100/8=12.5 台, 对外提供18W rw tps
(每一维度)热索引库预计投入:2/8=1 台, 对外提供1.5W r/w tps (可能不能满足rTPS要求,通过复制或者pgmemcache解决)
热数据库预计投入:2/1=2 台, 对外提供3W r/w tps (可能不能满足rwTPS要求,r通过复制或者pgmemcache解决,w增加分区服务器或者MQ异步消息解决)
(每一维度)历史索引库预计投入:视存储量
数据库预计投入:视存储量
缓存服务器预计投入:视实际请求量
hot standby服务器预计投入:视实际请求量

【压力测试】

有待完善.

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
5月前
|
存储 安全 关系型数据库
PolarDB行列存节点的路由不是通过proxy路由的 是节点内部的路由吗?
PolarDB行列存节点的路由不是通过proxy路由的 是节点内部的路由吗?
19 0
Oracle PL/SQL应用迁移 AnalyticDB for PostgreSQL指导
AnalyticDB for PostgreSQL(简称:ADB for PG)对Oracle语法有着较好的兼容,本文介绍如何将Oracle应用迁移到AnalyticDB for PostgreSQL。
2780 0
|
存储 关系型数据库 PostgreSQL
PostgreSQL 优化CASE - 有序UUID插件
标签 PostgreSQL , uuid , 无序uuid , 索引分裂 , io , 性能诊断 背景 无序UUID会带来很多问题,例如索引分裂膨胀,离散IO,WAL膨胀等,详见以前的分析。 Regular random UUIDs are distributed uniformly over the whole range of possible values.
2280 0
|
SQL 关系型数据库 数据库
PostgreSQL 设计优化case - 大宽表任意字段组合查询索引如何选择(btree, gin, rum) - (含单个索引列数超过32列的方法)
标签 PostgreSQL , adhoc查询 , 大宽表 , 任意字段组合查询 , 索引 , btree , gin , rum 背景 大宽表,任意字段组合查询,透视。是实时分析系统中的常见需求: 1、实时写入。
2506 0
|
SQL 存储 关系型数据库
PostgreSQL 设计优化case - 多对多 转 一对多(数组)
标签 PostgreSQL , 数组 , 多对多 , 一对多 , udf , JOIN 背景 某个系统存储了会员的标签,以及标签的描述信息。业务上需要通过会员ID得到会员的标签,再得到描述信息。 每个会员有若干标签,原来是这么存储的 1、会员标签表,人数5亿左右,每个人平均有几百个标签,1500亿行左右。
2132 0
|
SQL 算法 关系型数据库
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 10 章 类型转换_10.5. UNION、CASE和相关结构
10.5. UNION、CASE和相关结构 SQL UNION结构必须使可能不相似的类型匹配成为一个单一的结果集。该决定算法被独立地应用到一个联合查询的每个输出列。 INTERSECT和EXCEPT采用和UNION相同的方法来决定不相似的类型。
1275 0
|
前端开发 关系型数据库 测试技术