一.PDNS库设计

根据前期调研及技术选型,基于第三方外部PDNS数据,开发导入程序,完成构建基于Hadoop HBASE的PDNS实时数据查询系统,系统平台采用8台4U服务器组成Hadoop集群。

  • 服务器配置为:Xeon Silver 4110 @2.1Ghz,128G内存,24*2T硬盘。
  • HDFS块大小:256MB
  • Hbase Region大小:10GB
  • 其他为默认配置。
    库设计主要考虑点说明:
  1. 高并发。
    无高并发需求,不存在该场景,HBASE的RowKey设计时不需要考虑Key值散列程度。
  2. 实时响应。
    Hbase中正确使用Key值进行查询,可提供准实时级别响应。因此在使用Key进行查询时,为保证实时响应,只考虑使用以下两种走列索引的高效查询命令:
    (1)基于key,查value。
    (2)基于Key的STARTROW和ENDROW进行查询。
  3. 数据更新与备份
    备份:可对第三方数据外部数据单独进行备份。
    更新:可使用HBASE多版本特性,保留更新后的多版本数据。
  4. 其他
    扩展性、健壮性可参考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个版本数据。

小记一次海量数据实时查询域名库设计(上)相关推荐

  1. 小记一次海量数据实时查询域名库设计(下)

    二. WHOIS库设计 根据WHOIS数据查询业务场景.响应性能等需求,该库采用Hbase + ES 技术组合设计,其中HBASE存储全量WHOIS数据,ES库作为查询索引库,只存储查询WHOIS数据 ...

  2. PHP检查微信域名屏蔽接口,微信域名检测API接口,实时查询域名是否被微信拦截...

    微信域名检测API接口的应用场景: 由于微信对外部链接内容规范比较严格,所以可能一不小心就会被判定为是违反内容规范的,或被同行恶意举报投诉之类的. 那么此时就要用到微信域名检测接口,实时检测域名的状态 ...

  3. 微信域名检测 实时查询域名是否被微信拦截

    微信是我们生活中必不可少的社交工具,用户群体也相当大,所以就不乏大量的个人或团队利用微信进行推广,推广方式就是转发分享链接到个人或群,发朋友圈,或利用微信公众号,一心专注与营销和推广的商家,却忽略了微 ...

  4. 【巨杉访谈】分布式数据库如何实现海量数据实时查询

    巨杉数据库高访问量.海量数据业务背后的基础系统架构是如何设计和优化的?分布式数据库是如何做到数据的透明水平.垂直拆分,实现海量数据实时查询的? 访谈实录 1.巨杉数据库作为国内第一款自主研发的 New ...

  5. 微信域名拦截检测php,微信域名检测API接口,实时查询域名是否被微信拦截

    微信域名检测API接口的应用场景: 由于微信对外部链接内容规范比较严格,所以可能一不小心就会被判定为是违反内容规范的,或被同行恶意举报投诉之类的. 那么此时就要用到微信域名检测接口,实时检测域名的状态 ...

  6. 价格查询系统 数据库 PHP Mysql,信息实时查询系统的设计与实现(PHP+MySQL)

    摘  要 信息查询系统是基于校园网络环境下设计,满足师生员工对校内综合信息实时查询,及对校园网上各类信息资源的检索服务需求. 本系统采用了浏览器/服务器(B/S)模式.以MySQL数据库为存储方式,运 ...

  7. 基于HBase的海量数据实时查询系统设计与实现

    点击打开链接 http://www.doc88.com/p-7445439907872.html

  8. 网址域名查询-域名注册查询工具

    域名查找软件 域名查找软件是一种能够帮助用户快速查询域名相关信息的工具.它通常提供了批量域名查询和实时域名查询服务,能够帮助用户查询域名的注册信息.到期时间.所有者信息.域名服务器等多种相关信息.以下 ...

  9. 【演讲实录】分布式数据库海量数据存储和实时查询实现与应用

    节选自OSC深圳源创会 演讲速记 分享嘉宾:巨杉数据库技术总监   乔国治 巨杉数据库,核心产品是SequoiaDB巨杉数据库.是我们的团队完全从零开始研发的.巨杉数据库是商业数据库,同时我们本身也将 ...

最新文章

  1. iOS之CAEmitterLayer粒子引擎
  2. rap 接口管理 java_有没有类似阿里rap的api管理方案(rap太卡了)
  3. 大数据笔记2019.5.7
  4. springboot在工具类中添加service的方法,显示为空的解决方案
  5. WINCE6.0+S3C2443自动重启的实现
  6. jquery-confirm
  7. 写给在Java和.net中徘徊的新手
  8. 这些潮汕美食你吃过没有?
  9. Linux并发服务器编程之多线程并发服务器
  10. AI算法连载17:统计之半监督学习
  11. 线性表之顺序表与单链表的区别及优缺点
  12. Java ObjectInputStream readShort()方法(带示例)
  13. 【CSS布局】已知布局元素的高度,写出三栏布局,要求左栏、右栏宽度各为300px,中间自适应。
  14. 剑指offer(C++)-JZ24:反转链表(数据结构-链表)
  15. 史上最全电子科技大学858信号与系统考研要了解的常识
  16. 两个音轨合并_技能!如何合并两个音频文件?
  17. HTML5之HTML+CSS3技术介绍
  18. html设置ie9兼容性视图,ie9兼容性视图设置方法
  19. java那块最难_Java哪块最难学?
  20. Android Studio获取数字签名(SHA1)

热门文章

  1. 全球数字高程数据:ASTER GDEM
  2. vue 二维码解码器
  3. SSM整合,非常详细的SSM整合
  4. Java培训出身,今获阿里Android岗offer,大专学渣的“登天”之路!
  5. wireshark数据包过滤
  6. oracle默认导出dmp路径_Oracle导入导出dmp文件
  7. python闭包,自由变量
  8. 《CCNA学习指南:数据中心(640-911)》——导读
  9. word课程表设置符号与编号_Word2003文档怎么添加编号
  10. CSAPP第五章家庭作业参考答案