Elasticsearch

Elasticsearch

Lucene

Lucene是Apache软件基金会Jakarta项目组的一个子项目,提供了一个简单却强大的应用程式接口,能够做全文索引和搜索。在Java开发环境里Lucene是一个成熟的免费开源工具。就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库。但Lucene只是一个提供全文搜索功能类库的核心工具包,而真正使用它还需要一个完善的服务框架搭建起来进行应用。比如Elasticsearch And Solr。

下载与启动

下载地址:https://www.elastic.co/cn/downloads/elasticsearch

启动

bin文件夹下,elasticsearch.bat

9300端口为Elasticsearch集群间组件的通信端口,9200端口为浏览器访问的http协议RESTful端口。

Elasticsearch的配置

配置文件:config/elasticsearch.yml

所有配置项参考官方Settings,均可通过配置文件或命令行配置。对于相同的配置项,命令行配置会覆盖配置文件中的配置。命令行参数均以-E开头,如:-Ecluster.name=my_cluster -Enode.name=node_1

大部分配置项都可以在集群运行过程中在线更改,参考官方Cluster Update Settings API。配置文件中只需要配置结点为了加入集群而必须要提前配置的项即可,类似node.name、cluster.name和network.host等。

Elasticsearch的目录结构

目录 描述 默认值 配置参数
home ES的安装目录 $ES_HOME -
bin elasticsearch (用于启动node),elasticsearch-plugin (用于安装插件) $ES_HOME/bin -
conf 配置文件路径,包含elasticsearch.yml等配置文件 $ES_HOME/conf path.conf
data 数据文件路径(存储每个索引分配到该结点上的分片数据),可配置多个值 $ES_HOME/data path.data
logs 日志文件路径 $ES_HOME/logs path.logs
plugins 插件路径,每个插件分别存放在单独的子目录中 $ES_HOME/plugins -
repo Shared file system repository locations. Can hold multiple locations. A file system repository can be placed in to any subdirectory of any directory specified here - path.repo
script Location of script files. $ES_HOME/scripts path.scripts

应用场景

Elasticsearch是一个高度可扩展(highly scalable)的全文检索和分析引擎。它可用于大数据的存储,并以接近实时(NRT, Near Realtime)的速度进行检索和分析。

常见的使用场景示例:

  1. 在线商品search或autocomplete,ES存储所有商品目录和库存信息
  2. 挖掘日志或交易数据,获得一些统计、趋势等信息。这种场景可以使用logstash组件将数据feed到ES
  3. 做价格提醒,如用户可以指定“当某个指定的商品价格低于$X时提醒他”,此时可以收集价格信息到ES中,然后用ES的反向检索(reverse-search)特性Percolator来匹配查询推送提醒
  4. 需要在大量数据上做快速调查、分析、可视化、解决特定问题,可以用ES存储数据,用Kibana建立自定义的dashbord进行可视化展现。也可以使用聚合功能做一些复杂的BI查询

基本概念

Cluster

Cluster必须有一个唯一的name,默认是elasticsearch,每个node只能属于一个cluster。

Cluster Name示例:logging-dev, logging-stage, logging-prod

Node

存储数据、提供索引和查询能力,name默认是启动时分配的一个UUID标识,也可自定义,通过指定cluster name将node加入某个集群。单独机器启动时默认新建一个单结点集群(cluster name默认为elasticsearch)。

Index

必须指定name,全小写,这个name用于search、update、delete该索引上的文档。

Type

每个Index上可以定义Type,可根据需要命名,如:user/blog/comments

(Elasticsearch 7.X中,Type的概念已经被删除了)

Document

JSON格式,虽然物理上存储在index中,但需关联index中的一个type。

Shards & Replicas

一个index可能很大,一个结点存不了或者会响应太慢,ES可以将index分片,每个分片可以存储在不同的Node上,提供完整的index功能:

  1. 创建索引时可以指定shards数量
  2. 可以水平分割,分Partition存储
  3. 可以垂直分割,允许跨shards的并行操作,能够提高性能和吞吐
  4. shard的分布机制以及如何聚合搜索结果由ES完成,对用户是透明的
  5. 为了保证高可用,ES会存储shards的复本,称为Replicas
  6. index创建后,可以指定replicas的数量,但不能修改shards的数量
  7. ES默认每个index分为5个shard,每个shard存储1份replicas,即两结点的集群每个index默认会有10个shard
  8. 每个shard是一个Lucene Index,限制大小:Integer.MAX_VALUE - 128 = 2,147,483,519
  9. 查看shards使用API:http://ip.addres:port/_cat/shards

Elasticsearch的REST API

Elasticsearch提供的REST API可以进行如下操作:

  1. 检查集群、结点、索引的状态信息
  2. 管理集群、结点、索引的数据和元数据
  3. 对索引执行CRUD和search操作
  4. 执行高级检查功能:分页、排序、过滤、聚合等

示例:

Cluster Health: GET http://ip.address:port/_cat/health?v

Node Info: GET http://ip.address:port/_cat/nodes?v

List All Indices: GET http://ip.address:port/_cat/indices?v

Index Operation:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 基本操作:<REST Verb> /<Index>/<Type>/<ID>
PUT /customer
PUT /customer/external/1
{"name": "John Doe"}
GET /customer/external/1
DELETE /customer

# 向同一个URL PUT不同的数据,可以更新替换doc数据
# 如:更新ID=1的doc的name字段,同时增加一个age字段
POST /customer/external/1/_update?pretty
{ "doc": { "name": "Jane Doe", "age": 20 } }
# 使用script更新age,如下的ctx._source表示当前将要被修改的文档对象
POST /customer/external/1/_update?pretty
{ "script" : "ctx._source.age += 5" }
# 每次Update只能更新一个doc,后续会提供类似SQL的where语句一样的批量更新的功能

# 也可不指定doc的ID,由ES随机生成doc id
POST /customer/external?pretty
{"name": "Jane Doe"}

# 删除某个文档
DELETE /customer/external/2?pretty
# 如果要删除全部文档,更有效的方式是直接删除整个index

Bulk API:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 批处理-添加两个文档
POST /customer/external/_bulk?pretty
{"index":{"_id":"1"}}
{"name": "John Doe" }
{"index":{"_id":"2"}}
{"name": "Jane Doe" }

# 批处理-更新文档1删除文档2
POST /customer/external/_bulk?pretty
{"update":{"_id":"1"}}
{"doc": { "name": "John Doe becomes Jane Doe" } }
{"delete":{"_id":"2"}}
# 批处理遇到某个文档出错会继续执行,最后给出执行结果

Search API:

1
2
3
4
5
6
7
8
9
10
11
12
13
GET /bank/_search?q=*&sort=account_number:asc&pretty

GET /bank/_search
{
"query": { "match_all": {} },
"from": 10,
"size": 10
"sort": [
{ "account_number": "asc" }
],
"_source": ["account_number", "balance"] // 返回指定字段
// "sort": { "balance": { "order": "desc" } }
}

Match Query:

1
2
3
4
5
6
7
GET /bank/_search
{
"query": { "match": { "account_number": 20 } }
// "query": { "match": { "address": "mill" } } // address中包含mill的doc
// "query": { "match": { "address": "mill lane" } } // address包含mill或lane的doc
// "query": { "match_phrase": { "address": "mill lane" } } // address中包含mill lane的doc
}

Bool Query:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
GET /bank/_search
{
"query": {
"bool": {
"must": [ // address中同时包含mill和lane的doc
{ "match": { "address": "mill" } },
{ "match": { "address": "lane" } }
]
}
}
}

GET /bank/_search
{
"query": {
"bool": {
"should": [ // address中包含mill或lane的doc
{ "match": { "address": "mill" } },
{ "match": { "address": "lane" } }
]
}
}
}

GET /bank/_search
{
"query": {
"bool": {
"must_not": [ // address中既不含mill也不含lane的doc
{ "match": { "address": "mill" } },
{ "match": { "address": "lane" } }
]
}
}
}

# 以上must/should/must_not可以在bool查询中混用
GET /bank/_search
{
"query": {
"bool": {
"must": [
{ "match": { "age": "40" } }
],
"must_not": [
{ "match": { "state": "ID" } }
]
}
}
}

MultiHash和Base58

MultiHash和Base58

MultiHash

目前IPFS使用SHA2-256的加密方式,目前来说比较安全,但随着科技发展,说不定哪天就会被破解。因此IPFS在制定协议时,采用了MultiHash这种方式,可扩展支持多种HASH算法。如果未来改用了别的算法,用的仍然是MultiHash,也就保持了加密方式的持续性。

格式

  • HASH算法编码
  • HASH值长度(字节数)
  • HASH值

SHA2-256的编码为0x12,其Hash摘要长度为32字节(十六进制为0x20)。

所以将 1220 添加到所有的Hash值前。

Base58

Base64有一些缺点,就是某些字符容易混淆,比如O0等。很容易将字符串认错,造成阅读上的障碍。Base58将Hash值压缩,并且剔除了干扰字符。

因此1220开头的Hash值都被编码成了Qm开头。

这就是ipfs add时,返回的CID都是Qm开头的原因。

ServiceWorker尝试

ServiceWorker尝试

node12.14.0下安装sqlite3@3.1.13失败

download (403): https://mapbox-node-binary.s3.amazonaws.com/sqlite3/v3.1.13/node-v72-win3 2-x64.tar.gz

binaries not found for sqlite3@3.1.13 and node@12.14.0 (node-v72 ABI) (falling back to source compile with node-gyp)

解决方法

安装nvm 下载地址

1
2
nvm install 8.9.3
nvm use 8.9.3

配置nvm,如果需要proxy的话就配置proxy

1
2
3
nvm proxy http://$proxy-url/
nvm node_mirror https://npm.taobao.org/mirrors/node/
nvm npm_mirror https://npm.taobao.org/mirrors/npm/

再次安装即能成功

1
npm install

nvm降级node安装sqlite3

nvm降级node安装sqlite3

node12.14.0下安装sqlite3@3.1.13失败

download (403): https://mapbox-node-binary.s3.amazonaws.com/sqlite3/v3.1.13/node-v72-win3 2-x64.tar.gz

binaries not found for sqlite3@3.1.13 and node@12.14.0 (node-v72 ABI) (falling back to source compile with node-gyp)

解决方法

安装nvm 下载地址

1
2
nvm install 8.9.3
nvm use 8.9.3

配置nvm,如果需要proxy的话就配置proxy

1
2
3
nvm proxy http://$proxy-url/
nvm node_mirror https://npm.taobao.org/mirrors/node/
nvm npm_mirror https://npm.taobao.org/mirrors/npm/

再次安装即能成功

1
npm install

Service Worker

Service Worker

概述

Service Worker本质上也是浏览器缓存资源用的,只不过他不仅仅是cache,也是通过worker的方式来进一步优化。

他基于h5的web worker,所以绝对不会阻碍当前js线程的执行,sw最重要的工作原理就是

  1. 后台线程:独立于当前网页线程;

  2. 网络代理:在网页发起请求时代理,来缓存文件;

使用条件

sw 是基于 HTTPS 的,因为service worker中涉及到请求拦截,所以必须使用HTTPS协议来保障安全。如果是本地调试的话,localhost是可以的。

PWA

PWA是Progressive Web App的英文缩写, 翻译过来就是渐进式增强WEB应用。

PWA中所包含的核心功能及特性

  1. Web App Manifest
  2. Service Worker
  3. Cache API缓存
  4. Push & Notification 推送与通知
  5. Background Sync 后台同步
  6. 响应式设计

在service worker忠,可以监听install、activate,message,fetch,sync,push等事件。

WorkBox

在service worker中通过监听事件,然后编写对应逻辑,缓存文件都不是很容易。并且webpack build之后,js名称随时会变。因此chrome推出了workbox框架。

workbox 是用于向web应用程序添加离线支持的JavaScript库。

在wokbox对象中,包含很多模块,比如 workbox.routing模块,workbox.precaching模块,workbox.strategies模块,workbox.expiration模块等等,它们分别负责处理不同的逻辑。

  1. workbox缓存/预缓存
  2. workbox路由
  3. workbox插件

workbox的使用介绍

另外npm中也已经有这个包了https://www.npmjs.com/package/web-pwa ,可以玩玩。

如何搭建一个简单的区块链

如何搭建一个简单的区块链

bitcoin

Cypherpunk宣言

Gossip协议

八卦协议,流行病协议。

比特币使用的gossip protocol,Cassandra和redis Cluster都采用了gossip protocol以达到自动发现。以太坊使用的Kademlia。

加密算法

RSA非对称加密

ECC椭圆曲线加密

签名过程:私钥用于签名,公钥用于验证签名

交易过程:公钥用于加密,私钥用于解密

共识机制

PoW

PoS

DPos

blockchain

挖矿的本质是记账。

IPFS-Cluster客户端构建

IPFS-Cluster客户端构建

安装windows构建插件

需要使用管理员权限安装

1
npm install –global –production windows-build-tools

保证有python2.7的编译环境

下载源码

1
2
3
4
5
6
7
git clone --depth 1 --single-branch https://github.com/caorushizi/oss-client.git
# 进入目录
cd oss-client
# 安装依赖
npx cross-env npm_config_electron_mirror="https://npm.taobao.org/mirrors/electron/" npm_config_electron_custom_dir="7.1.9" npm install
# 运行
npm start

IPFS-Cluster搭建(ubuntu)

IPFS-Cluster搭建(ubuntu)

Update Linux packages and dependencies:

1
2
sudo apt-get update
sudo apt-get -y upgrade

Install IPFS

准备好的go-ipfs资源

1
2
3
4
5
tar -zxf go-ipfs_v0.4.23_linux-amd64.tar.gz
cd go-ipfs
sudo ./install.sh //安装文件自动mv /usr/local/bin
ipfs init //ipfs初始化
ipfs version

Creating a Private network

拷贝准备好的swarm.key到集群各个节点

1
cp swarm.key ~/.ipfs/swarm.key

Bootstrapping IPFS nodes

1
2
ipfs bootstrap rm --all
ipfs bootstrap add /ip4/启动节点的ip地址/tcp/4001/ipfs/启动节点的id的hash

也可以配置环境变量强制为private mode:

1
export LIBP2P_FORCE_PNET=1

Run IPFS daemon as a service in the background

1
sudo touch /etc/systemd/system/ipfs.service

添加配置

1
2
3
4
5
6
7
8
9
[Unit]
Description=IPFS Daemon
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=simple
ExecStart=/usr/local/bin/ipfs daemon --enable-namesys-pubsub
User=$rootuser
[Install]
WantedBy=multi-user.target

Apply新service。

1
2
3
4
sudo systemctl daemon-reload
sudo systemctl enable ipfs
sudo systemctl start ipfs
sudo systemctl status ipfs

Deploying IPFS-Cluster

1
2
tar -zxf ipfs-cluster-service_v0.12.1_linux-amd64.tar.gz
tar -zxf ipfs-cluster-ctl_v0.12.1_linux-amd64.tar.gz

Generate and set up CLUSTER_SECRET variable

在主节点,生成cluster-secret

1
2
export CLUSTER_SECRET=$(od -vN 32 -An -tx1 /dev/urandom | tr -d ' \n') 
echo $CLUSTER_SECRET

把生成的cluster_secret设置入所有节点的.bashrc中再source

Run IPFS-Cluster daemon as a service

1
sudo touch /etc/systemd/system/ipfs-cluster.service

主节点添加配置

1
2
3
4
5
6
7
8
9
10
[Unit]
Description=IPFS-Cluster Daemon
Requires=ipfs
After=syslog.target network.target remote-fs.target nss-lookup.target ipfs
[Service]
Type=simple
ExecStart=/home/$rootuser/ipfs-tools/ipfs-cluster-service/ipfs-cluster-service daemon
User=$rootuser
[Install]
WantedBy=multi-user.target

子节点添加配置

1
2
3
4
5
6
7
8
9
10
[Unit]
Description=IPFS-Cluster Daemon
Requires=ipfs
After=syslog.target network.target remote-fs.target nss-lookup.target ipfs
[Service]
Type=simple
ExecStart=/home/$rootuser/ipfs-tools/ipfs-cluster-service/ipfs-cluster-service daemon --bootstrap /ip4/38.91.120.173/tcp/9096/ipfs/12D3KooWSL6aP7UqkV8YruT99htjjdHQq4rHFvsRTrmdpSnt9cSL
User=$rootuser
[Install]
WantedBy=multi-user.target

Apply新service。

1
2
3
4
sudo systemctl daemon-reload
sudo systemctl enable ipfs-cluster
sudo systemctl start ipfs-cluster
sudo systemctl status ipfs-cluster

IPFS-Cluster搭建

IPFS-Cluster搭建

私有网络集群允许IPFS节点只连接到拥有共享密钥的其他对等节点,网络中的节点不响应来自网络外节点的通信请求。IPFS-Cluster是一个独立的应用程序和一个CLI客户端 ,它跨一组IPFS守护进程分配、复制和跟踪pin。它使用基于Raft一致性算法来协调存储,将数据集合分布到参与的节点上。

目前在搭建分布式存储系统时,需要将一个peer上存储的文件同步备份到所有集群上的其他的peer上,或者对集群的节点管理,就需要IPFS-Cluster来实现。

下载

ipfs官网

进入官网选择合适的版本。

1
2
wget https://dist.ipfs.io/ipfs-cluster-ctl/v0.12.1/ipfs-cluster-ctl_v0.12.1_linux-amd64.tar.gz
wget https://dist.ipfs.io/ipfs-cluster-service/v0.12.1/ipfs-cluster-service_v0.12.1_linux-amd64.tar.gz

安装ipfs-cluster-service

1
2
3
tar -zxf ipfs-cluster-service_v0.12.1_linux-amd64.tar.gz
cd ipfs-cluster-service
./ipfs-cluster-service init //初始化

初始化之后会生成两个文件

.ipfs-cluster/service.json

含有secret和监听端口,需要把secret配置到其他节点的service.json里,保证一样。

.ipfs-cluster/identity.json

含有cluster的节点id

启动

主节点

1
./ipfs-cluster-service daemon &

其他节点启动–bootstrap添加主节点

1
./ipfs-cluster-service daemon --bootstrap /ip4/$主节点ip/tcp/9096/ipfs/$cluster id

安装ipfs-cluster-ctl

1
2
3
tar -zxf ipfs-cluster-ctl_v0.12.1_linux-amd64.tar.gz
cd ipfs-cluster-ctl
./ipfs-cluster-ctl peers ls

默认端口

一定需要保证所有服务器的9094端口、9095端口、9096端口开放input的安全组。

  • 9094-HTTP API endpoint
  • 9095-IPFS proxy endpoint
  • 9096-Cluster swarm

IPFS搭建(windows节点)

IPFS搭建(windows节点)

下载

ipfs官网

进入官网选择合适的版本。Windows Binary

初始化

在下载好的binary文件夹里执行以下命令后,会在根目录生成一个.ipfs的文件夹存储节点数据。

1
2
ipfs.exe init //初始化ipfs
ipfs bootstrap rm -all //删除默认的bootstrap设置

将集群中之前生成好的swarm.key文件拷贝进**~.ipfs**文件夹下

启动

添加启动节点地址到当前节点的bootstrap列表中

1
ipfs bootstrap add /ip4/启动节点的ip地址/tcp/4001/ipfs/启动节点的id的hash

一定需要保证所有服务器的4001端口和5001端口开放input的安全组。

1
2
ipfs daemon & //启动,后台运行
ipfs bootstrap list //查看ipfs bootstrap列表

在各个节点查看别的节点信息

1
ipfs swarm peers
  • Copyrights © 2015-2021 小白兔
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信