Arganzheng's Blog

stay hungry, stay foolish

Redis集群学习

Redis3.0版本加入了cluster功能,解决了Redis单点无法横向扩展的问题。 分布式系统要解决的不外乎以下两个问题: sharding/partition 以提高系统的吞吐率 replication 以提高系统的高可用性 然后因为sharding了,所以就有一个 哈希或者路由 的事情要处理。引入的问题包括: 数据分布方式:取模, 范围映射,一致性哈希, etc. 客户端哈希还是服务端转发路由,如果需要客户端或者任意一个节点都能接受请求进行转发,那么就需要引入集群的概念,让集群中的节点能够互相知道数据的分布情况(相关技术参见下面讨论) 对于没有sharding key的请求(如果系统设计支持),需要有个scatter和gat...

ElasticSearch的节点类型

集群中的每一个ElasticSearch实例都可作为一个节点存在,相同集群名字的节点构成同一个ElasticSearch集群。 默认情况下,集群中的每个节点都可以处理 HTTP 或者 Transport 请求。 其中 transport 层专门用于节点和Java TransportClient之间的通讯;而HTTP层则只供REST客户端使用。 集群中所有的节点都知道集群中其他所有的节点,可以将客户端请求转发到适当的节点。 逻辑上,从职责上划分,ElasticSearch节点有以下类型: Master node: 主节点。当一个节点配置node.master: true(默认)的时候,它有资格被选作为主节点,控制整个集群。 Data node: 数据...

ElasticSearch如何支持深度分页

分布式环境下的分页 ES本身是支持分页查询的,使用方式跟MySQL非常类似: from: Indicates the number of initial results that should be skipped, defaults to 0 size: Indicates the number of results that should be returned, defaults to 10 如: GET /_search?size=5&from=10 但是跟MySQL不同,ES是分布式存储的,查询结果一般都是跨多个分片的(spans multiple shards),每个shard产生自己的排序结果,最后协调节点(coordi...

使用puppeteer和chrome-headless做暗网抓取

最近 国家企业信用信息公示系统 的验证码又升级了。之前是 点按后滑动拼图方式: 解决方案虽然麻烦,但是偏向于工程架构方面,没有什么算法的东东: 但是最近升级之后新增了一种验证码模式——点按后顺序选字方式: 这个就没办法用纯工程的方式来解决了。必须使用到机器学习的方式了。机器学习的最基本的就是要模型训练,而模型训练就需要样本和标注(有监督学习)。所以首先我们要想办法拿到大量的验证码图片,进行标注和训练。 但是这个验证码要 进入到首页在搜索框输入文字点击搜索按钮 才会出现: 所以我们要能够模拟用户请求进入到首页在搜索框输入文字然后点击搜索按钮,将弹出的验证码图片保存下来。 欣哥一开始负责这个事情,他用CasperJS写了一个脚本模拟这个事情,...

ElasticSearch如何支持嵌套属性检索

地球是圆的,对象往往也不是扁平的。所以嵌套属性就很常见了,比如name.first, address.city, etc. 我们知道ElasticSearch是Document Oriented的NoSQL,文档本身就是JSON表示,JSON本身就是一个自由嵌套的数据结构(JSON documents are hierarchical in nature: the document may contain inner objects which, in turn, may contain inner objects themselves.)。那么ElasticSearch支持嵌套属性的索引和检索吗?让我们深入了解一下。 Array dataType 事实上ES...

ElasticSearch的Query Context和Filter Context

Sorting and Relevance 像MySQL这样的数据库,查询结果如果没有order by,那么默认就是按照主键排序的。对于大部分业务场景来说,排序往往取决于某个/些字段的值,但是对于搜索引擎来说,排序却往往跟相关性有关系。那么ES中相关性是什么,又是怎么计算的呢? Scoring by Relevance ES默认对结果按照相关性降序排序(By default, results are returned in descending order of relevance.)。 相关性在ES中以_score变量表示,是一个浮点数,默认值是1。那么_score是怎么计算的呢?不同的查询语句有不同的计算规则。不过基本上相关性指的是query和文档之间的...

如何查看和设置文件句柄数

1. 系统级别限制(System-Wide Limit) Set this higher than user-limit set above. 配置文件:/etc/sysctl.conf: fs.file-max = 2097152 然后运行: sysctl -p让其生效。 这个命令会增加系统级别(所有用户)可以打开的文件句柄数。 可以通过/proc/sys/fs/file-max或者sysctl fs.file-max 验证: $ cat /proc/sys/fs/file-max 2097152 还可以通过/proc/sys/fs/file-nr文件查看整个系统目前使用的文件句柄数量: # cat /proc/sys/fs/file-nr ...

neo4j如何支持多个label索引查询

4kw+的Company数据,8kw+的Person数据,和20kw左右的关系数据。 $ head company.csv id:ID,name,:LABEL 00002cefc5e2d05b9311a791fd009160,"岳阳市岳阳楼区亿诺厨房电器总经销",Company 00002ebe645c0f777887ff17d525ba6b,"禄丰县碧城镇零点俱乐部",Company 000037a77f24a10153dcb4c2e7ae082d,"淄川将军路星显日用品经营部",Company 0000a82f6261107197cb386c5e5e01bc,"上海高易电子有限公司",Company 0000b340976a6425d4a4be58c119b4...

一个诡异的Antlr4语法问题

背景 图数据库对外要提供灵活的查询接口,可以有三种层次的实现形式: 自然语言: unicorn(facebook) 结构化查询语言: Gremlin(Titan), AQL(ArangoDB), Cypher(Neo4j), etc. 根据需要预定义的接口: 如一度关系接口,实体查询接口等。 自然语言实现起来过于复杂,准确度不高,不好现实;预定义接口之前在做通用知识图谱支持图搜广告的时候采用过,好处就是高性能,使用简单,但是缺点就是不够灵活;综合来说第二种方式是最合适的。面向图谱的结构化查询语言也有很多,比如AQL(ArangoDB),OrientDB SQL dialect(OrientDB),Cypher(Neo4j),还有Gremlin(...

基于Aerospike实现一个分布式图数据库

背景 去年开始做知识图谱,从网站抓取到的数据经过清洗、抽取、消歧、挖掘等最后得到的图谱,需要以在线的形式提供给用户使用,这就需要一个图数据库了。为了避免重复造轮子,我们调研了很多开源的图数据库,像neo4j, Titan, OrientDB,Graph Engine(@Microsoft), Cayley, ArangoDB, 等等。具体可以参考笔者之前写的一篇文章:图存储引擎学习笔记。 遗憾的是这块不像RMDB,并没有一个winer,各有优缺点。本来想用Titan的,但是发现Titan的性能实在太差,而且更重要的是,代码非常复杂,不利于维护和扩展。最后我们觉得自己开发一个。但是我们并不打算从零开始构建一个图存储,而是借鉴了Titan的思想,做一个粘合层,底层的...

×