二. WHOIS库设计
根据WHOIS数据查询业务场景、响应性能等需求,该库采用Hbase + ES 技术组合设计,其中HBASE存储全量WHOIS数据,ES库作为查询索引库,只存储查询WHOIS数据时的索引项数据。当提交一条查询请求时,首先从ES库中利用索引检索出记录的唯一键【_id】,再使用该唯一键从Hbase中查询出全量数据。
HBASE库配置:同PDNS库设计中HBASE配置。
ES库配置:7服务器集群【与HBASE共用硬件服务器】,JDK版本1.8,单节点JVM堆内存固定为12G。
2.1 WHOIS数据业务字典及样例数据
2.1.1 业务字典
WHOIS业务字典见《whois数据说明.pdf》文档。
WHOIS原始数据为.CSV格式,第三方数据样例文件见whoisdemo.csv文件
2.1.2 数据规模
WHOIS第三方数据以CSV文本文件格式存储,经粗略统计,全量数据大小约180G,索引数据大小约80G,包含WHOIS记录约3亿4千万。
2.2 WHOIS查询需求说明
WHOIS数据查询需求简单描述为,根据约定的可查询业务字段项进行查询,查询时可根据多条件项进行逻辑匹配,需要支持等值匹配、模糊查询。无聚合查询、分组查询等复杂查询需求。
2.2.1 根据约定业务字段查询
查询输入:
查询输出:全量WHOIS记录,具体字段见《whois数据说明.pdf》
若查询项不能满足需求,后续可从全量数据中增加。
2.3 WHOIS表设计
2.3.1 whois_data_index索引表设计
ES中的索引数据表名为: whois_data_index。
id的格式为 : {domain}{reg_data}_{expir_data}
{domain}表示域名;
{reg_data}表示注册时间,格式为13位时间戳;
{expir_data}表示过期时间,格式为13位时间戳,且该字段不存在与ES查询字段中,该字段为WHOIS全量数据中的记录,需要在导入ES库时,写入_id。
number_of_shards:21
Replicas:0
建表脚本为:
PUT whois_data_index
{
"settings":{
"number_of_shards":21,
"number_of_replicas":0
},
"mappings": {
"doc": {
"dynamic": "strict",
"properties": {
"domain": {
"type": "text"
},
"domain_status": {
"type": "text"
},
"registrar": {
"type": "text"
},
"reg_email": {
"index": true,
"type": "keyword"
},
"registrar_whois_server": {
"type": "text"
},
"name_server": {
"type": "text"
},
"reg_data": {
"index": true,
"type": "keyword"
},
"registrar_abuse_contact_email": {
"index": true,
"type": "keyword"
},
"reg_name": {
"index": true,
"type": "keyword"
},
"registrant_organization": {
"index": true,
"type": "keyword"
},
"registrant_city": {
"index": true,
"type": "keyword"
},
"registrant_state_province": {
"index": true,
"type": "keyword"
},
"reg_country": {
"index": true,
"type": "keyword"
},
"registrar_IANA_id": {
"index": true,
"type": "keyword"
} }}}}
2.3.2 whois表设计
WHOIS原始数据表保存在HBASE中,建表脚本如下:
create ‘whois’,{NAME =>‘meta’,COMPRESSION => ‘SNAPPY’}
其中,列簇为 meta;具体列见《whois数据说明.pdf》
经数据导入后,列名对应的列会自动填充到列簇中。
2.3.3关于数据导入
对于ES索引库,需要开发导入程序将第三方原始WHOIS中索引数据导入。
对于HBASE库,需要开发导入程序将第三方原始WHOIS导入,在导入数据时,需要将对应列的数据填充到列族中。
2.4 REST API使用
2.4.1 ES REST API
利用POSTMAN工具,简单列举几种典型查询场景。
- 分词器查询【对分词列使用match关键字查询】
输出:
- 多条件查询【must、term、match混用】
输出:
2.4.2 HBASE REST API
HBASE表名为WHOIS, REST API同1.5.2
2.5 ES配置流程
-
修改配置文件
修改ES中配置文件,elasticsearch.yml和jvm.options -
Linux下创建es用户
useradd es -
LINUX服务器修改内核参数
vi /etc/security/limits.conf
*soft nofile 65535
*hard nofile 65535 -
查看当前用户资源限制
ulimit -a -
修改LINUX内核MMAP使用限制
vi /etc/sysctl.conf
vm.max_map_count=262144
sysctl -p -
ES节点启动
su es
cd /grid/elasticsearch-6.6.2/bin
cd /opt/elasticsearch/elasticsearch-6.6.2/bin
./elasticsearch -d
http://192.168.10.23:9200/_cat/health?v //验证集群状态 -
启动KIBANA
查看端口被进程占用
netstat -lnp| grep 5601
启动(192.168.10.21)
cd /grid/kibana-6.6.3-166SNAPSHOT-linux-x86_64/bin
./kibana -q &
exit