一、案例
微博:
微博内容:
关注用户和粉丝用户: 添加或移除关注用户
查看关注用户的微博内容
微博数据存储:
响应时间 秒级 无延迟
(1)mysql分布式
(2)hbase数据库
使用HBase数据库实现微博系统数据的存储
表的设计:
命名空间:weibo
1. 微博内容表
TableName: weibo:weibo-content
RowKey:用户ID_timestamp
列簇:cf
列标签: cf:content,cf:title,cf:photo
版本设计:只需要保留一个版本
2. 用户关系表
TableName: weibo:relations
rowkey: 用户iID
列簇:
attend 关注用户
fan 粉丝用户
列标签:使用用户ID作为列标签,值为用户ID
rowkey attend fan
0001 attend:0002=0002 fan:0004=0004
attend:0003=0003 fan:0004=0004
版本设计:只需要保留一个版本
3. 用户微博内容接收邮件箱表
TableName: weibo:receive-content-email
Rowkey:用户ID
列簇:cf
列标签:
直接使用用户ID,vlaue值取微博内容的rowkey
版本设计:设置最大版本为1000
rowkey cf
00001 cf:0002=0002_2132455
cf:0002=0002_2132456
1)rowkey设计:
(1)唯一性
(2)长度: 最大64kb。rowkey是hbase中表数据冗余产生的因素
10~100 字节
最好 8字节 16字节 64位操作系统
(3)散列原则:
假如 时间戳_用户ID 作为rowkey
10亿用户同时发微博,
1456777_000001
1456778_000002
1456778_100000
问题: 集中到某个region,造成这单独几个region负载量偏大,而其他region完全没有负载
散列: 尽量将某一时刻内的数据均衡分散到所有Region中(大部分Region)中
热点现象:数据在某一个时刻集中存储到某一两个Region上
rowkey设计规范;
方便查询,尽可能讲查询字段放到rowkey,HBase根据rowkey查询速度是最快。
2)列簇设计:
HBase面向列簇存储
region起始rowkey --- 终止rowkey范围内一个列簇下的数据
hdfs上的一个文件
StoreFile === HFile
跨列簇查询,速度相对较慢
一般设计一到两个列簇
HBase中的缓存
memstore: 写缓存
blockcache:块缓存,读缓存
HBase表单元格版本号:插入数据的时候如果没有单独制定,系统默认使用时间戳作为版本号。也可以自己制定时间戳。
Get查询单行记录,Scan查询多行记录