L B T

记 录 过 去 的 经 验

环境信息

  • Kibana 8.8

Space 管理

创建 Space 参考

space 不能隔离 roleuser,这属于 Elasticsearch 的安全功能,roleuser 对整个 Kibana 实例都可见,不与特定的 space 关联。也不能隔离 index,因为这是 Elasticsearch 中的资源

space 隔离以下资源:

  • data view - 不同 space 中的 data view 互不可见。
  • Dashboard

Roles 管理

创建 role 参考

内置 role:

  • view - 此角色拥有对所有 Kibana space 的 只读权限。如果想要创建对 Kibana 所有 space 拥有只读权限的用户,只需要将用户绑定到此角色即可。

Users 管理

创建 role 参考

创建只读用户

Kibana 内置的 view 角色拥有对所有 Kibana space 的 只读权限。如果想要创建 对 Kibana 所有 space 拥有只读权限 的用户,只需要将用户绑定到此角色即可。

如果需要创建对特定 space 拥有只读权限的用户,可以参考以下步骤:

  1. 创建针对特定 space 具有只读权限的 role,如下图,创建 ops space 拥有只读权限的 role
  2. 创建用户并绑定到新建的 role

data view

创建 data view

Discover 管理

修改 Discover 中默认显示的最大文档数量

Discover 中默认最多显示 500 条文档,如果 Elasticsearch 中索引的文档数量超过500,默认不显示,也无法通过 Kibana 搜索到。要修改此值,参考以下步骤

  1. 找到 Discover 页面的右上角的 Options 按钮,点击弹出的 View Discover settings
  2. Space Settings 中,找到选项 Maximum rows per table,起默认值为 500,修改此值

KQL

KQL(Kibana Query Language)是 Kibana 中用于进行查询的查询语言。KQL 可以帮助用户在 Kibana 的 “Discover”(发现)页面、”Visualize”(可视化)页面以及 “Dashboard”(仪表盘)页面等地方快速构建查询,并过滤和分析数据。

参考链接

Kibana 官方文档

环境信息

  • elasticsearch 8.8.2

集群状态

查看集群健康状态

Elasticsearch 的集群监控信息中包含了许多的统计数据,其中最为重要的一项就是 集群健康 , 它在 status 字段中展示为 greenyellow 或者 red

  • green - 所有的主分片和副分片都正常运行
  • yellow - 所有主分片都正常运行,但不是所有的副本分片都正常运行
  • red - 有主分片没能正常运行

分片 概念说明

$ curl 'http://localhost:9200/_cluster/health'
{"cluster_name":"elasticsearch","status":"green","timed_out":false,"number_of_nodes":1,"number_of_data_nodes":1,"active_primary_shards":1,"active_shards":1,"relocating_shards":0,"initializing_shards":0,"unassigned_shards":0,"delayed_unassigned_shards":0,"number_of_pending_tasks":0,"number_of_in_flight_fetch":0,"task_max_waiting_in_queue_millis":0,"active_shards_percent_as_number":100.0}

$ curl 'http://localhost:9200/_cluster/health?pretty'
{
"cluster_name" : "elasticsearch",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 1,
"number_of_data_nodes" : 1,
"active_primary_shards" : 1,
"active_shards" : 1,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}

查看集群节点信息

使用 _cat/nodes API 可以获取集群中所有节点的信息,包括它们的 IP 地址、堆内存使用情况、CPU 使用情况等。

# curl -u elastic:XhScf5Jqw -XGET 'http://172.31.25.229:9200/_cat/nodes?pretty'
172.31.25.229 58 98 9 1.86 2.27 2.36 dilm - node-1
172.31.30.249 54 98 10 2.05 2.12 2.30 dilm - node-2
172.31.21.225 65 91 0 0.00 0.04 0.05 dfilmrt * node-3

# curl -u elastic:XhScf5Jqw -XGET 'http://172.31.25.229:9200/_cat/nodes?v'
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
172.31.25.229 51 99 10 2.11 2.33 2.37 dilm - node-1
172.31.30.249 49 99 9 1.96 2.06 2.25 dilm - node-2
172.31.21.225 40 91 0 0.03 0.04 0.05 dfilmrt * node-3

输出信息说明

  • heap.percent - JVM 堆内存使用的百分比。这是节点分配给 Java 虚拟机堆的内存使用量的百分比。
  • ram.percent - 节点的物理内存(RAM)使用率的百分比
  • cpu - 节点的CPU使用率百分比
  • node.role - 节点的角色。各个字母含义如下
    • d - 代表数据节点 Data Node。负责存储数据,执行与数据相关的操作,如 CRUD(创建、读取、更新、删除)、搜索和聚合。
    • i - 代表摄取节点 Ingest Node。用于预处理文档,然后再将其索引到 Elasticsearch 中,它们可以运行摄取管道,这些管道可以执行各种转换,如提取数据、转换数据格式、添加信息等。
    • l - 代表机器学习节点 Machine Learning Node。机器学习节点专门用于运行Elasticsearch的机器学习功能,它们可以分析数据,识别模式,执行异常检测等。
    • m - 代表主节点 Master Node。主节点负责管理集群的全局状态,例如哪些索引存在,哪个节点是哪个索引的一部分等,它们还负责集群重新分片、索引创建、删除等操作。
    • r - 代表远程集群客户端节点 Remote Cluster Client Node。这些节点用于连接到远程集群,它们使得可以从一个集群中执行跨集群搜索和其他操作
    • t - 代表转换节点 Transform Node。转换节点用于运行 Elasticsearch 中的转换任务,这些任务可以将现有的 Elasticsearch 索引数据重新整理和汇总成新的索引。
  • * - 表示这个节点是当前的主节点。

使用 _nodes/stats 查看集群中所有节点的详细状态和统计信息

# curl -u elastic:XhScf5JqwVsSQwHe -XGET 'http://172.31.25.229:9200/_nodes/stats?pretty'
{
"_nodes" : {
"total" : 3,
"successful" : 3,
"failed" : 0
},
"cluster_name" : "es-cluster",
"nodes" : {
"TrQqg_8HTDiKBt6t8Z1JVw" : {
"timestamp" : 1699941330544,
"name" : "node-1",
"transport_address" : "172.31.25.229:9300",
"host" : "172.31.25.229",
"ip" : "172.31.25.229:9300",
"roles" : [
"ingest",
"master",
"data",
"ml"
],
"attributes" : {
"ml.machine_memory" : "133483876352",
"xpack.installed" : "true",
"ml.max_open_jobs" : "20"
},
"indices" : {
"docs" : {
"count" : 1725702315,
"deleted" : 0
},
"store" : {
"size_in_bytes" : 1766657662877
},
"indexing" : {
"index_total" : 28053218,
"index_time_in_millis" : 6610781,
"index_current" : 1,
"index_failed" : 0,
"delete_total" : 0,
"delete_time_in_millis" : 0,
"delete_current" : 0,
"noop_update_total" : 0,
"is_throttled" : false,
"throttle_time_in_millis" : 0
},
...

参考以下命令查看指定节点的详细状态和统计信息,Endpoint 格式参考 _nodes/{nodeId}/stats?pretty

# curl -u elastic:XhScf5JqwVsSQwHe -XGET 'http://172.31.25.229:9200/_nodes/TrQqg_8HTDiKBt6t8Z1JVw/stats?pretty' 
{
"_nodes" : {
"total" : 1,
"successful" : 1,
"failed" : 0
},
"cluster_name" : "es-cluster",
"nodes" : {
"TrQqg_8HTDiKBt6t8Z1JVw" : {
"timestamp" : 1699941591263,
"name" : "node-1",
"transport_address" : "172.31.25.229:9300",
"host" : "172.31.25.229",
"ip" : "172.31.25.229:9300",
"roles" : [
"ingest",
"master",
"data",
"ml"
],
"attributes" : {
"ml.machine_memory" : "133483876352",
"xpack.installed" : "true",
"ml.max_open_jobs" : "20"
},
"indices" : {
"docs" : {
"count" : 1726608289,
"deleted" : 0
},
"store" : {
"size_in_bytes" : 1768415039992
},
"indexing" : {
"index_total" : 29016441,
"index_time_in_millis" : 6829570,
"index_current" : 0,
"index_failed" : 0,
"delete_total" : 0,
"delete_time_in_millis" : 0,
"delete_current" : 0,
"noop_update_total" : 0,
"is_throttled" : false,
"throttle_time_in_millis" : 0
},

获取集群级别的信息和统计数据

/?pretty 参数的主要作用为通过添加缩进和换行增强输出的可读性

$ curl 'http://localhost:9200/?pretty'
{
"name" : "b5f96e32c638",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "UAiC0qVVT-Ov4nJFvoE1HA",
"version" : {
"number" : "8.8.2",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "98e1271edf932a480e4262a471281f1ee295ce6b",
"build_date" : "2023-06-26T05:16:16.196344851Z",
"build_snapshot" : false,
"lucene_version" : "9.6.0",
"minimum_wire_compatibility_version" : "7.17.0",
"minimum_index_compatibility_version" : "7.0.0"
},
"tagline" : "You Know, for Search"
}

阅读全文 »

环境信息

  • Centos7 3.10.0-1062.9.1.el7
  • elasticsearch 8.8.2

elasticsearch 下载

elasticsearch 下载页面

安装 elasticsearch

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.8.2-linux-x86_64.tar.gz
tar -xzf elasticsearch-8.8.2-linux-x86_64.tar.gz
cd elasticsearch-8.8.2/

启动

./bin/elasticsearch

首次启动 Elasitcsearch 时,安全特性默认被启用,以下的安全选项会自动配置: [2]

  • 认证鉴权功能会被启用,并且会为默认的超级用户 elastic 产生一个密码
  • 生成 TLS 证书,并配置证书以启用 TLS 功能
  • 为 Kibana 产生一个 enrollment key,有效期 30 分钟

要以 daemon 的形式运行 Elasticsearch,使用 -d 选项,使用 -p 选项将 PID 记录到一个文件里面

./bin/elasticsearch -d -p pid

RPM 安装 Elasticsearch 官方参考文档不同版本具有不同的配置,根据版本选择对应配置

$ rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

$ cat /etc/yum.repos.d/elasticsearch.repo
[elasticsearch]
name=Elasticsearch repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=0
autorefresh=1
type=rpm-md

$ yum install --enablerepo=elasticsearch elasticsearch

配置文件示例

elasticsearch.yml
cluster.name: es-cluster1
node.name: es-cluster1-node1
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch

# 多网卡情况下,建议指定 IP 地址,以防止集群使用网络不通的 IP。如果需要监听多个 IP 地址,使用配置 network.host: ["127.0.0.1", "192.168.1.1"]
network.host: 0.0.0.0
http.port: 9200

discovery.seed_hosts: ["172.31.26.116", "172.31.19.164", "172.31.21.3"]
cluster.initial_master_nodes: ["es-cluster1-node1", "es-cluster1-node2", "es-cluster1-node3"]

xpack.security.enabled: false
xpack.security.enrollment.enabled: false
xpack.security.transport.ssl.enabled: false
xpack.security.http.ssl.enabled: false

加入节点到集群

默认情况下,只有同一个主机上的节点才能在 没有其他配置的情况下 加入到集群。如果要让另一个主机上的节点加入到新启动的节点的集群中,需要更改配置,首先要修改 Elasticsearch 的监听地址,确保另一台主机能连接它(不是默认监听的 localhost[2]

加入开启了安全功能的集群

要将新节点加入到开启了安全功能的集群,首先要创建一个 enrollment token。在集群中的任一节点上执行以下命令,创建 enrollment token

bin/elasticsearch-create-enrollment-token -s node

要加入集群的节点上,使用以下命令启动 Elasticsearch,使用 --enrollment-token 传递 enrollment token

bin/elasticsearch --enrollment-token <enrollment-token>

新节点上的 Elasticsearch 会自动在 config/certs 下面生成证书和 Key

阅读全文 »

环境信息

  • elasticsearch 8.8.2

安全相关配置管理

更新 transport ssl 证书

在启用安全配置(xpack.security.enabled: true)的情况下,Elasticsearch 集群节点间通信(transport 默认端口 9300)必须使用 TLS (xpack.security.transport.ssl.enabled: true)。默认使用的证书文件位于 /etc/elasticsearch/certs/。若需要更新或者重新生成此证书,可以参考以下步骤

  1. 生成 CA,如果已有 CA 可跳过此步骤。此命令会生成一个 CA 证书文件,默认名称为 /usr/share/elasticsearch/elastic-stack-ca.p12。根据提示使用 证书密码,如果不配置密码,使直接Enter
    elasticsearch-certutil ca
  2. 为 Elasticsearch 生成 TLS 证书,证书使用 CA 进行签名,根据提示输入 CA 证书密码等信息,如果无密码,使直接Enter 键。默认生成文件 /usr/share/elasticsearch/elastic-certificates.p12
    elasticsearch-certutil cert --ca elastic-stack-ca.p12
  3. 执行以下命令,将 CA 证书密码和服务器证书密码写入 /etc/elasticsearch/elasticsearch.keystore
    # elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
    Setting xpack.security.transport.ssl.keystore.secure_password already exists. Overwrite? [y/N]y
    Enter value for xpack.security.transport.ssl.keystore.secure_password:

    # elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password
    Setting xpack.security.transport.ssl.truststore.secure_password already exists. Overwrite? [y/N]y
    Enter value for xpack.security.transport.ssl.truststore.secure_password:
  4. 将上面生成的 CA 证书服务器证书 以及 证书密码文件 拷贝到 Elasticsearch 集群的所有节点的 /etc/elasticsearch/certs/ 下,并修改权限
    chmod 660 /etc/elasticsearch/certs/*
    chown root:elasticsearch /etc/elasticsearch/certs/*
  5. 重启 Elasticsearch 集群的所有节点
    systemctl restart elasticsearch
  6. 检查集群状态
    # curl --user newadmin:password localhost:9200/_cluster/health?pretty
    {
    "cluster_name" : "es-cluster1",
    "status" : "green",
    "timed_out" : false,
    "number_of_nodes" : 3,
    "number_of_data_nodes" : 3,
    "active_primary_shards" : 18,
    "active_shards" : 37,
    "relocating_shards" : 0,
    "initializing_shards" : 0,
    "unassigned_shards" : 0,
    "delayed_unassigned_shards" : 0,
    "number_of_pending_tasks" : 0,
    "number_of_in_flight_fetch" : 0,
    "task_max_waiting_in_queue_millis" : 0,
    "active_shards_percent_as_number" : 100.0
    }

重置用户密码

可以使用以下命令,创建新的超级管理员账号。首先要 确保集群状态正常

elasticsearch-users useradd newadmin -p password -r superuser

接下来使用刚刚创建的账号密码对原有的账号(如 elastic) 进行密码重置

# curl -s --user newadmin:password -XPUT "http://localhost:9200/_security/user/elastic/_password?pretty" -H 'Content-Type: application/json' -d '{
"password": "password1"
}'


密码重置成功后,尝试使用新账号密码访问集群

# curl --user elastic:password1 localhost:9200/_cluster/health?pretty
{
"cluster_name" : "es-cluster1",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 3,
"number_of_data_nodes" : 3,
"active_primary_shards" : 19,
"active_shards" : 39,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}
阅读全文 »

530 Login incorrect

报错信息: 登录时报错 530 Login incorrect
错误原因

/etc/pam.d/vsftpd
auth  required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed 

默认情况下,/etc/vsftpd/ftpusers里面的用户是被拒绝登录的,确保要登录的用户不在此文件中

/etc/pam.d/vsftpd
auth       required    pam_shells.so  

此配置指定,只允许登录shell为/etc/shells中的shell的用户登录
如果用户shell为/sbin/nologin,则不允许登录,可改为pam_nologin.so

阅读全文 »

环境信息

  • Centos 7
  • Vsftpd 3.0.2

vsftpd虚拟用户通过映射系统用户权限的方式,使虚拟用户具有和本地系统用户一样的权限,或者灵活的控制虚拟用户的权限(不和本地用户权限相同,不能高于本地权限),达到访问权限的灵活控制,同时防止大批vsftpd用户添加到系统账号库中,使系统用户管理变动臃肿。

阅读全文 »

场景

远程登录 windows 失败,报错:

由于没有远程桌面授权服务器可以提供许可证,远程会话连接已断开,请跟服务器管理员联系

解决方法

  1. 打开 cmd,执行以下命令远程登录无法登录的 Windows 主机
    mstsc /v:1.1.1.1 /admin
  2. 打开注册表


3. 找到路径: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\RCM\GracePeriod.如果超过120天后RCM下面会有一个GracePeriod,先备份这项注册表,再删除除了默认的的注册表项。

  1. 重启电脑后生效.

环境信息

  • Centos 7
  • predixy-1.0.5

安装

下载地址, clone或下载最新的版本或指定版本下载后解压

yum install libstdc++-static -y
cd predixy-1.0.5
make
cp src/predixy /usr/local/bin/

需要依赖 libstdc++-static, 否则make会报错:
/bin/ld: cannot find -lstdc++
collect2: error: ld returned 1 exit status
make[1]: *** [predixy] Error 1
make[1]: Leaving directory `/root/predixy-1.0.5/src’
make: *** [default] Error 2

配置文件说明

  • predixy.conf,整体配置文件,会引用下面的配置文件

  • cluster.conf,用于Redis Cluster时,配置后端redis信息

  • sentinel.conf,用于Redis Sentinel时,配置后端redis信息

  • auth.conf,访问权限控制配置,可以定义多个验证密码,可每个密码指定读、写、管理权限,以及定义可访问的健空间

  • dc.conf,多数据中心支持,可以定义读写分离规则,读流量权重分配

  • latency.conf, 延迟监控规则定义,可以指定需要监控的命令以及延时时间间隔

启动

predixy /predixy/conf/predixy.conf

使用默认的配置文件predixy.conf, predixy将监听地址0.0.0.0:7617,后端的redis是Redis Cluster 127.0.0.1:6379

环境信息

  • Mysql 5.7 之后版本支持多主一从

配置步骤

分别在Master_1和Master_2上导出需要同步的数据库

分别在Master_1和Master_2上执行以下命令,导出需要同步的数据库备份

Master_1
mysqldump -uroot -p123456 --master-data=2 --single-transaction --databases  --add-drop-database  db1  > db1.sql
Master_2
mysqldump -uroot -p123456 --master-data=2 --single-transaction --databases  --add-drop-database  db2  > db2.sql

备份完成后,将备份数据拷贝到从库服务器上面

阅读全文 »

Mysql 主从同步基本原理

复制的基本过程如下:

  1. Slave上面的IO进程连接上Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;

  2. Master接收到来自Slave的IO进程的请求后,通过负责复制的IO进程,根据请求信息,读取指定日志指定位置之后的日志信息,返回给Slave 的IO进程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息已经到Master端的bin-log文件的名称以及bin-log的位置;

  3. Slave的IO进程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到的Master端的 bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的告诉Master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”;

  4. Slave的Sql进程检测到relay-log中新增加了内容后,会马上解析relay-log的内容,获得在Master端真实执行的那些可执行的内容,并在自身执行。

双主情况下,禁止同时写入,建议还是按照主从的方式工作,防止数据冲突。双主场景下,主要是切换主备方便。

阅读全文 »

模板中需要循环中循环,{% for i in alist %},假如i是个元组或列表,需要继续循环:

{% for i in alist %}
{% with temp=I %}
{% for k in temp %}

{% endfor %}
{% endwith %}
{%endfor%}

或使用如下方式,data = [[1,2],[3,4]]:

{% for l in data%}

{% for temp in l % }
{% if forloop.first % }
'{{temp}}',
{% else %}
{{temp}}
{% endif %}
{% endfor %}

{%endfor%}

class Question(models.Model):
question_text=models.CharField(max_length=200)
pub_date=models.DateTimeField('datepublished')

def__str__(self):
returnself.question_text

class Choice(models.Model):
question=models.ForeignKey(Question,on_delete=models.CASCADE)
choice_text=models.CharField(max_length=200)
votes=models.IntegerField(default=0)

def__str__(self):
returnself.choice_text


上例中,Choice引用了Question作为外键,在模板中通过Question对象获取所有引用了Question对象的Choice对象,可以使用以下方法:

{% for choice in question.choice_set.all %}
<li>{{choice.choice_text}}</li>
{%endfor%}

使用question.choice_set.all的方式获取所有引用question对象的Choice对象实例

HCL AppScan(原名IBM Security AppScan)是原IBM的Rational软件部门的一组网络安全测试和监控工具,2019年被HCL技术公司收购。AppScan旨在在开发过程中对Web应用程序的安全漏洞进行测试。

阅读全文 »

环境信息

  • Centos 7
  • logstash 8.8

一个 Logstash 管道(pipeline) 至少要包含 2 个组件: inputoutput,可以包含可选组件 filter [2]

  • input - 负责从数据源获取数据
  • filter - 负责按照配置修改数据
  • output - 负责将数据写入目标存储,如 Elasticsearch

安装

Logstash 官方安装文档

yum 安装

$ sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

$ cat /etc/yum.repos.d/logstash.repo
[logstash-8.x]
name=Elastic repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

$ sudo yum install logstash

$ systemctl enable --now logstash

运行 Logstash 后,可以使用最基本的 Logstash Pipeline 测试 Logstash 运行是否正常

/usr/share/logstash/bin/logstash -e 'input { stdin { } } output { stdout {} }'
  • -e - 选项用来在 command line 中指定配置

运行之后在 shell 中输入内容,Logstash 会为数据添加元数据后输出到 stdout,表明 Logstash 运行正常

hello world
{
"@timestamp" => 2023-07-21T02:52:50.191084777Z,
"host" => {
"hostname" => "worker1"
},
"message" => "hello world",
"@version" => "1",
"event" => {
"original" => "hello world"
}
}

logstash 服务默认端口 5044

阅读全文 »

环境信息

  • elasticsearch 8.8.2

Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene [1] 基础之上。 Lucene 可以说是当下最先进、高性能、全功能的搜索引擎库 — 无论是开源还是私有。

但是 Lucene 仅仅只是一个库。为了充分发挥其功能,你需要使用 Java 并将 Lucene 直接集成到应用程序中。 更糟糕的是,您可能需要获得信息检索学位才能了解其工作原理。Lucene 非常 复杂。 [1]

Elasticsearch 也是使用 Java 编写的,它的内部使用 Lucene 做索引与搜索,但是它的目的是使全文检索变得简单, 通过隐藏 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTful API。

然而,Elasticsearch 不仅仅是 Lucene,并且也不仅仅只是一个全文搜索引擎。 它可以被下面这样准确的形容:

  • 一个分布式的实时文档存储,每个字段 可以被索引与搜索
  • 一个分布式实时分析搜索引擎
  • 能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据

Elasticsearch 将所有的功能打包成一个单独的服务,这样你可以通过程序与它提供的简单的 RESTful API 进行通信, 可以使用自己喜欢的编程语言充当 web 客户端,甚至可以使用命令行(去充当这个客户端)。

Elasticsearch 官方安装文档

Elasticsearch 官方安装包下载路径

Elasticsearch 是 面向文档 的,意味着它存储整个对象或 文档。Elasticsearch 不仅存储文档,而且 索引 每个文档的内容,使之可以被检索。在 Elasticsearch 中,我们对文档进行索引、检索、排序和过滤—而不是对行列数据。这是一种完全不同的思考数据的方式,也是 Elasticsearch 能支持复杂全文检索的原因。 [2]

Elasticsearch 使用 JSON 作为文档的序列化格式 [2]

Elasticsearch 集群内的原理

端口说明

elasticsearch 主要使用以下端口

  • 9200 - elasticsearch 服务的监听端口,客户端访问 9200 和 Elasticsearch 进行通信。
  • 9300 - 集群中的节点通过 9300 端口彼此通信,如果这个端口没有开,节点将无法形成一个集群

Elasticsearch 配置文件说明

Elasticsearch 的主要配置文件为,配置文件路径可以用环境变量 ES_PATH_CONF 指定。 [8]

  • elasticsearch.yml
  • jvm.options
  • log4j2.properties

Elasticsearch 已经有了 很好 的默认值,特别是涉及到性能相关的配置或者选项。 如果你有疑问,最好就不要动它。我们已经目睹了数十个因为错误的设置而导致毁灭的集群, 因为它的管理者总认为改动一个配置或者选项就可以带来 100 倍的提升。 [8]

配置文件格式支持 YAML扁平 格式 [8]

YAML 格式示例

YAML
path:
data: /var/lib/elasticsearch
logs: /var/log/elasticsearch

discovery.seed_hosts:
- 192.168.1.10:9300
- 192.168.1.11
- seeds.mydomain.com

扁平 格式示例

flattened
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch

discovery.seed_hosts: ["192.168.1.10:9300", "192.168.1.11", "seeds.mydomain.com"]

集群及节点名称

Elasticsearch 默认启动的集群名字叫 elasticsearch生产环境中建议修改集群名称,防止其他使用默认集群名称的节点意外加入集群 [8]

同样,最好也修改你的节点名字。就像你现在可能发现的那样, Elasticsearch 会在节点启动的时候随机给它指定一个名字。你可能会觉得这很有趣,但是当凌晨 3 点钟的时候, 你还在尝试回忆哪台物理机是 Tagak the Leopard Lord 的时候,你就不觉得有趣了。

更重要的是,这些名字是在启动的时候产生的,每次启动节点, 它都会得到一个新的名字。这会使日志变得很混乱,因为所有节点的名称都是不断变化的[8]

elasticsearch.yml
cluster.name: elasticsearch
node.name: elasticsearch_005_data

网络配置

监听接口相关配置

elasticsearch.yml
# 多网卡情况下,建议指定 IP 地址,以防止集群使用网络不通的 IP。#
# 如果需要监听多个 IP 地址,使用以下配置
# network.host: ["127.0.0.1", "192.168.1.1"]
network.host: 0.0.0.0
http.port: 9200

阅读全文 »

策略使用 HCL 或是 JSON 语法编写,描述了一个人类用户或是应用程序允许访问 Vault 中哪些路径。[1]

策略管理

创建策略

命令格式

$ vault policy write policy-name policy-file.hcl

以下示例创建一个只读策略

$ cat readonly_policy.hcl 
path "kv/*" {
capabilities = ["read"]
}

$ vault policy write readonly_policy readonly_policy.hcl


更新策略使用和创建策略一样的命令,使用的是已有的策略名

查看策略

$ vault policy list
default
readonly_policy
root

读取策略内容

$ vault policy read readonly_policy
path "kv/*" {
capabilities = ["read"]
}

关联策略

创建 token 时关联策略

使用以下命令在创建 token 时附加策略,否则创建的 token 默认关联当前身份(如 token)的策略

$ vault token create -policy=readonly_policy -policy=logs

Key Value
--- -----
token hvs.CAESICUghHrXAe3mFG9YEnEq8IXdtGPN-63VRRxqPOEzidpvGh4KHGh2cy5RMUhkbmU1M2FFdk52a3lFRTNiMmR6Um8
token_accessor iRixdShkSeHNTgS5JBLWW2Ta
token_duration 768h
token_renewable true
token_policies ["default" "logs" "readonly_policy"]
identity_policies []
policies ["default" "logs" "readonly_policy"]

关联策略时,如果关联的策略不存在,创建 token 只会给出相关策略不存在的 warnning,创建 token 不会失败

使用新建的 token 登陆并尝试更新相关键

$ vault login
Token (will be hidden):
Success! You are now authenticated. The token information displayed below
is already stored in the token helper. You do NOT need to run "vault login"
again. Future Vault requests will automatically use this token.

Key Value
--- -----
token hvs.CAESICUghHrXAe3mFG9YEnEq8IXdtGPN-63VRRxqPOEzidpvGh4KHGh2cy5RMUhkbmU1M2FFdk52a3lFRTNiMmR6Um8
token_accessor iRixdShkSeHNTgS5JBLWW2Ta
token_duration 767h55m32s
token_renewable true
token_policies ["default" "logs" "readonly_policy"]
identity_policies []
policies ["default" "logs" "readonly_policy"]

读取键,可以看到只能读取键值,无法写入

$ vault kv list
Not enough arguments (expected 1, got 0)
~/vault_policy $ vault kv list kv
Error listing kv: Error making API request.

URL: GET http://127.0.0.1:8200/v1/kv?list=true
Code: 403. Errors:

* 1 error occurred:
* permission denied


$ vault kv get kv/ms/fm/qzx/qzapp/api/config
===== Data =====
Key Value
--- -----
db_host 127.0.0.1
db_type mysql
db_user password
tk test key


$ vault kv put kv/ms/fm/qzx/qzapp/api/config key=value
Error writing data to kv/ms/fm/qzx/qzapp/api/config: Error making API request.

URL: PUT http://127.0.0.1:8200/v1/kv/ms/fm/qzx/qzapp/api/config
Code: 403. Errors:

* 1 error occurred:
* permission denied

参考链接

Vault 中文参考

脚注

环境信息

  • Centos 7
  • Redis 6

redis Cluster 部署

下载已经编译好的 redis6-cluster 安装文件

wget https://s.csms.tech/redis6-cluster.tar
tar -xf redis6-cluster.tar -C /usr/local/

本示例安装 3 master 3 slave 的 redis cluster,假设使用端口为 7380-7385。数据存放路径为 /data/redis/7380,日志路径为 /data/logs/redis-cluster/7380/,其他端口的 redis 服务配置以此类推,主要是修改对应端口。

创建服务启动需要的数据目录及日志目录

for i in 1 2 3 4 5 0 ; do mkdir -p /data/redis/738${i} ; done

for i in 1 2 3 4 5 0 ; do mkdir -p /data/logs/redis-cluster/738${i} ; done

7380 服务使用如下配置文件

7380.conf
bind 0.0.0.0
protected-mode no
port 7380
tcp-backlog 511
timeout 600
tcp-keepalive 60
daemonize yes
supervised no
pidfile /var/run/redis_7380.pid
loglevel notice
logfile /data/logs/redis-cluster/7380/redis.log
databases 16
always-show-logo yes
save ""
stop-writes-on-bgsave-error no
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /data/redis/7380
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
requirepass redisPassword
masterauth redisPassword
maxclients 30000
maxmemory-policy volatile-lru
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
cluster-enabled yes
cluster-node-timeout 5000
cluster-require-full-coverage no
slowlog-log-slower-than 3000
slowlog-max-len 200
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 0 0 0
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes

若要根据以上 7380 端口的服务配置文件复制出其他服务端口的配置文件,可以参考以下命令

cp 7380.conf 7381.conf
sed -i 's/7380/7381/g' 7381.conf

cp 7380.conf 7382.conf
sed -i 's/7380/7382/g' 7382.conf

分别启动服务(7380-7385)

/usr/local/redis6-cluster/src/redis-server /usr/local/redis6-cluster/7380.conf

阅读全文 »