小记一次海量数据实时查询域名库设计(上)
一.PDNS库设计
根据前期调研及技术选型,基于第三方外部PDNS数据,开发导入程序,完成构建基于Hadoop HBASE的PDNS实时数据查询系统,系统平台采用8台4U服务器组成Hadoop集群。
- 服务器配置为:Xeon Silver 4110 @2.1Ghz,128G内存,24*2T硬盘。
- HDFS块大小:256MB
- Hbase Region大小:10GB
- 其他为默认配置。
库设计主要考虑点说明:
- 高并发。
无高并发需求,不存在该场景,HBASE的RowKey设计时不需要考虑Key值散列程度。 - 实时响应。
Hbase中正确使用Key值进行查询,可提供准实时级别响应。因此在使用Key进行查询时,为保证实时响应,只考虑使用以下两种走列索引的高效查询命令:
(1)基于key,查value。
(2)基于Key的STARTROW和ENDROW进行查询。 - 数据更新与备份
备份:可对第三方数据外部数据单独进行备份。
更新:可使用HBASE多版本特性,保留更新后的多版本数据。 - 其他
扩展性、健壮性可参考Hbase动态扩展、Hbase Master高可用方案。
1.1 PDNS数据业务字典及样例数据
1.1.1 业务字典
数据文件pdns.sample
每行一个record的json字符串,在序列化中先将meta字段的值进行了json序列化,然后进行整体record记录json序列化。
1.1.2 数据样例
第三方原始数据样例如下:
{
‘meta’: [[1572765040000, 1572765040000, 1, [‘virustotal’]]],
‘name’: ‘xzyx.mail.com-secure-auth-success-redirect-user.mailcommute.com’,
‘type’: ‘A’,
‘data’: ‘204.11.56.48’
}
1.1.3 数据规模
经统计,PDNS数据记录总规模在55亿条左右。
第三方原始数据文件大小为1.8T【非压缩文本】。
1.2 PDNS查询需求说明
根据调研,PDNS库查询需求主要有以下2种。
1.2.1 根据域名查询
查询输入:域名、起始时间、终止时间
查询输出:整条PDNS数据。
举例:
输入下面查询条件:
域名:xzyx.mail.com-secure-auth-success-redirect-user.mailcommute.com
起始时间:1572765040000
终止时间:1572765040000
查询输出数据为:
{
‘meta’: [[1572765040000, 1572765040000, 1, [‘virustotal’]]],
‘name’: ‘xzyx.mail.com-secure-auth-success-redirect-user.mailcommute.com’,
‘type’: ‘A’,
‘data’: ‘204.11.56.48’
}
1.2.2 根据IP地址查询
查询输入:IP地址、起始时间、终止时间
查询输出:整条PDNS数据。
举例:
IP地址:204.11.56.48
起始时间:1572765040000
终止时间:1572765040000
查询输出数据为:
{
‘meta’: [[1572765040000, 1572765040000, 1, [‘virustotal’]]],
‘name’: ‘xzyx.mail.com-secure-auth-success-redirect-user.mailcommute.com’,
‘type’: ‘A’,
‘data’: ‘204.11.56.48’
}
1.3 PDNS表设计
PDNS数据采用HBASE进行存储,Hbase是以Key作为查询条件,以Value输出的,半结构化的,面向列存储格式进行存储的海量实时查询数据库。
1.3.1 表设计思路
为满足1.2需求,根据Hbase只能使用单一Key作为查询条件的特点。对于“根据域名查询”及“根据IP地址查询”2种需求,采用2张表的设计方案,如下:
1.对于1.2.1需求,设计表PDNS,可满足直接使用域名、时间查询整条记录的需求。
2.对于1.2.2需求,设计索引表pdns_ip2domain_index,在查询时分两步实现:
(1)使用IP、时间在pdns_ip2domain_index索引表中查询域名。
(2)使用步骤(1)中返回的域名,以及时间,再去PDNS表中查询出完整记录。
1.3.2 PDNS表
PDNS表的ROWKEY为:域名_终止13位时间戳。
说明:
ROWKEY设计为:“域名_终止13位时间戳”即可满足查询1.2.1查询需求,查询逻辑如下。
当查询条件为域名、起始时间、终止时间时,可基于HBASE索引的特性,查询出匹配指定时间范围内的记录。
举例:
查询域名“–9n9xwk.grizlybigtit.com”在 时间 “1368662400000”的解析记录。
可通过命令:get ‘pdns’,’–9n9xwk.grizlybigtit.com_1368662’ 实现,因为基于HBASE索引默认按字典排序特性,上述命令查询了–9n9xwk.grizlybigtit.com域名在136866200000~ 136866299999时间范围内的所有解析记录。
PDNS表中记录查询:
1.3.3 pdns_ip2domain_index表
pdns_ip2domain_index表的ROWKEY为:IP_终止13位时间戳。
pdns_ip2domain_index表中记录样例如下:
说明:
基于pdns_ip2domain_index表的查询使用方法。
(1)根据用户输入的IP地址、时间范围,在pdns_ip2domain_index中查询索引记录。
scan ‘pdns_ip2domain_index’,{STARTROW => ‘174.128.255.229_146’,ENDROW => ‘174.128.255.229_147’}
(2)根据查询到的时间1467308336000,在PDNS表中做精确查询。
get ‘pdns’, '–1-.vicp.net_1467308336000 ',结果如下。
1.4 建表脚本
1.4.1 PDNS建表脚本
create ‘pdns’,{NAME =>‘meta’,COMPRESSION => ‘SNAPPY’}
其中,列簇为 meta;列为 syst,domain,ip,type,stt,edt,count,source。
经数据导入后,列名对应的列会自动填充到列簇中。
1.4.2 pdns_ip2domain_index建表脚本
create ‘pdns_ip2domain_index’,{NAME =>‘meta’,COMPRESSION => ‘SNAPPY’}
其中,列簇为 meta;列为 domain。
经数据导入后,列名对应的列会自动填充到列簇中。
1.4.3 关于数据导入
从原始文本数据导入到Hbase表中的导入脚本需要自行开发,在导入数据时,需要将对应列的数据填充到列族中。
1.5 REST API使用
1.5.1 开启HBASE REST API服务
Hbase自带 Rest服务,需要在Cloudera Manager页面中启动Hbase的 Rest服务。具体方案请安装Cloudera Hadoop后自行百度。默认端口20550
1.5.2 REST API使用例子
(1)单条记录查询
- REST命令:http://192.168.10.24:20550/pdns/—link.wmkg.info_1435499558000
返回结果:
<CellSet>
<Row key="LS0tbGluay53bWtnLmluZm9fMTQzNTQ5OTU1ODAwMA==">
<Cell column="bWV0YTpjb3VudA==" timestamp="1591560104172">MQ==</Cell>
<Cell column="bWV0YTpkb21haW4=" timestamp="1591560104172">LS0tbGluay53bWtnLmluZm8=</Cell>
<Cell column="bWV0YTplZHQ=" timestamp="1591560104172">MTQzNTQ5OTU1ODAwMA==</Cell>
<Cell column="bWV0YTppcA==" timestamp="1591560104172">NTAuODcuMTQ0LjE0</Cell>
<Cell column="bWV0YTpzb3VyY2U=" timestamp="1591560104172">XCJkbnNkYlwi</Cell>
<Cell column="bWV0YTpzdHQ=" timestamp="1591560104172">MTQzNTQ5OTU1ODAwMA==</Cell>
<Cell column="bWV0YTp0eXBl" timestamp="1591560104172">QQ==</Cell>
</Row>
</CellSet>
说明:XML标签中的column和value的值均为Base64编码,需要自行解码。
(2)跨时间范围查询
- REST命令:http://192.168.10.24:20550/pdns/*?startrow=—link.wmkg.info_1435499551000&endrow=—link.wmkg.info_1435499559000
返回结果:
<CellSet>
<Row key="LS0tbGluay53bWtnLmluZm9fMTQzNTQ5OTU1ODAwMA==">
<Cell column="bWV0YTpjb3VudA==" timestamp="1591560104172">MQ==</Cell>
<Cell column="bWV0YTpkb21haW4=" timestamp="1591560104172">LS0tbGluay53bWtnLmluZm8=</Cell>
<Cell column="bWV0YTplZHQ=" timestamp="1591560104172">MTQzNTQ5OTU1ODAwMA==</Cell>
<Cell column="bWV0YTppcA==" timestamp="1591560104172">NTAuODcuMTQ0LjE0</Cell>
<Cell column="bWV0YTpzb3VyY2U=" timestamp="1591560104172">XCJkbnNkYlwi</Cell>
<Cell column="bWV0YTpzdHQ=" timestamp="1591560104172">MTQzNTQ5OTU1ODAwMA==</Cell>
<Cell column="bWV0YTp0eXBl" timestamp="1591560104172">QQ==</Cell>
</Row>
</CellSet>
1.6 Hbase相关配置参考
1.6.1 Hbase查询超时配置
根据查询业务确定查询超时时间,如果发生慢查询,可直接超时返回,后续可对慢查询再做优化,建议参考配置参数如下:
hbase.rpc.timeout
hbase.client.operation.timeout
hbase.client.scanner.timeout.period
waitTime=60000
1.6.2 Hbase历史版本设定
Hbase自身支持多版本数据,可根据更新数据情况,设定保存版本的个数,命令为:
alter ‘test’,NAME=>‘meta’,VERSIONS=>‘10’ //保存表test最近10个版本的记录
每当新数据覆盖已有数据时,已有数据会自动保存到历史版本中。
查询历史版本数据命令:
get ‘test’,‘4’,{COLUMN=>[‘meta:domain’,‘meta:ipAdd’],VERSIONS=>2} //查询最近2个版本数据。
小记一次海量数据实时查询域名库设计(上)相关推荐
- 小记一次海量数据实时查询域名库设计(下)
二. WHOIS库设计 根据WHOIS数据查询业务场景.响应性能等需求,该库采用Hbase + ES 技术组合设计,其中HBASE存储全量WHOIS数据,ES库作为查询索引库,只存储查询WHOIS数据 ...
- PHP检查微信域名屏蔽接口,微信域名检测API接口,实时查询域名是否被微信拦截...
微信域名检测API接口的应用场景: 由于微信对外部链接内容规范比较严格,所以可能一不小心就会被判定为是违反内容规范的,或被同行恶意举报投诉之类的. 那么此时就要用到微信域名检测接口,实时检测域名的状态 ...
- 微信域名检测 实时查询域名是否被微信拦截
微信是我们生活中必不可少的社交工具,用户群体也相当大,所以就不乏大量的个人或团队利用微信进行推广,推广方式就是转发分享链接到个人或群,发朋友圈,或利用微信公众号,一心专注与营销和推广的商家,却忽略了微 ...
- 【巨杉访谈】分布式数据库如何实现海量数据实时查询
巨杉数据库高访问量.海量数据业务背后的基础系统架构是如何设计和优化的?分布式数据库是如何做到数据的透明水平.垂直拆分,实现海量数据实时查询的? 访谈实录 1.巨杉数据库作为国内第一款自主研发的 New ...
- 微信域名拦截检测php,微信域名检测API接口,实时查询域名是否被微信拦截
微信域名检测API接口的应用场景: 由于微信对外部链接内容规范比较严格,所以可能一不小心就会被判定为是违反内容规范的,或被同行恶意举报投诉之类的. 那么此时就要用到微信域名检测接口,实时检测域名的状态 ...
- 价格查询系统 数据库 PHP Mysql,信息实时查询系统的设计与实现(PHP+MySQL)
摘 要 信息查询系统是基于校园网络环境下设计,满足师生员工对校内综合信息实时查询,及对校园网上各类信息资源的检索服务需求. 本系统采用了浏览器/服务器(B/S)模式.以MySQL数据库为存储方式,运 ...
- 基于HBase的海量数据实时查询系统设计与实现
点击打开链接 http://www.doc88.com/p-7445439907872.html
- 网址域名查询-域名注册查询工具
域名查找软件 域名查找软件是一种能够帮助用户快速查询域名相关信息的工具.它通常提供了批量域名查询和实时域名查询服务,能够帮助用户查询域名的注册信息.到期时间.所有者信息.域名服务器等多种相关信息.以下 ...
- 【演讲实录】分布式数据库海量数据存储和实时查询实现与应用
节选自OSC深圳源创会 演讲速记 分享嘉宾:巨杉数据库技术总监 乔国治 巨杉数据库,核心产品是SequoiaDB巨杉数据库.是我们的团队完全从零开始研发的.巨杉数据库是商业数据库,同时我们本身也将 ...
最新文章
- iOS之CAEmitterLayer粒子引擎
- rap 接口管理 java_有没有类似阿里rap的api管理方案(rap太卡了)
- 大数据笔记2019.5.7
- springboot在工具类中添加service的方法,显示为空的解决方案
- WINCE6.0+S3C2443自动重启的实现
- jquery-confirm
- 写给在Java和.net中徘徊的新手
- 这些潮汕美食你吃过没有?
- Linux并发服务器编程之多线程并发服务器
- AI算法连载17:统计之半监督学习
- 线性表之顺序表与单链表的区别及优缺点
- Java ObjectInputStream readShort()方法(带示例)
- 【CSS布局】已知布局元素的高度,写出三栏布局,要求左栏、右栏宽度各为300px,中间自适应。
- 剑指offer(C++)-JZ24:反转链表(数据结构-链表)
- 史上最全电子科技大学858信号与系统考研要了解的常识
- 两个音轨合并_技能!如何合并两个音频文件?
- HTML5之HTML+CSS3技术介绍
- html设置ie9兼容性视图,ie9兼容性视图设置方法
- java那块最难_Java哪块最难学?
- Android Studio获取数字签名(SHA1)