Elasticsearch集群

  • Elasticsearch可以横向扩展至数百(甚至数千)的服务器节点,同时可以处理PB级数据Elasticsearch天生就是分布式的,并且在设计时屏蔽了分布式的复杂性
  • 一个运行中的Elasticsearch实例称为一个节点,而集群是由一个或者多个拥有相同cluster.name配置的节点组成,它们共同承担数据和负载的压力.当有节点加入集群中或者从集群中移除节点时,集群将会重新平均分布所有的数据
  • 当一个节点被选举成为主节点时,它将负责管理集群范围内的所有变更,例如增加,删除索引,或者增加,删除节点等.而主节点并不需要涉及到文档级别的变更和搜索等操作,所以当集群只拥有一个主节点的情况下,即使流量的增加它也不会成为瓶颈.任何节点都可以成为主节点
  • 我们可以将请求发送到集群中的任何节点,包括主节点.每个节点都知道任意文档所处的位置,并且能够将我们的请求直接转发到存储我们所需文档的节点.无论我们将请求发送到哪个节点,它都能负责从各个包含我们所需文档的节点收集回数据,并将最终结果返回給客户端.Elasticsearch对这一切的管理都是透明的

列举后台自动执行的操作

  • 分配文档到不同的容器或分片中,文档可以储存在一个或多个节点中
  • 按集群节点来均衡分配这些分片,从而对索引和搜索过程进行负载均衡
  • 复制每个分片以支持数据冗余,从而防止硬件故障导致的数据丢失
  • 将集群中任一节点的请求路由到存有相关数据的节点
  • 集群扩容时无缝整合新节点,重新分配分片以便从离群节点恢复

默认设置

  • 一个索引默认1副本5分片
  • 默认自己就是一个集群,默认的集群名称为elasticsearch

集群状态颜色

  • 绿色:所有条件都满足,数据完整,副本满足
  • 黄色:数据完整,副本不满足
  • 红色:有索引里的数据出现不完整了
  • 紫色:有分片正在同步中

安装注意的内容

  1. 锁定内存要修改配置
  2. JVM虚拟机最大最小内存设置为一样
  3. 最大内存不要超过30G
  4. 更改数据目录需要授权用户给elasticsearch
  5. es启动比较慢

数据增删改查操作

  • 插入数据不需要提前创建好数据库
  • index : 索引,库
  • type : 类型,表
  • filter : 字段
  • _ID : 唯一键ID默认随机生成

交互方式

  • curl命令
  • es-head插件
  • kibana

安装部署

修改配置文件如下

#db01
vi /etc/elasticsearch/elasticsearch.yml

#集群名称,同一个集群内所有节点集群名称要一模一样
cluster.name: Linux
#节点名称,同一个集群内所有节点的节点名称不能重复
node.name: node-1
#数据目录
path.data: /data/elasticsearch
#日志目录
path.logs: /var/log/elasticsearch
#内存锁定
bootstrap.memory_lock: true
#绑定监听地址
network.host: 10.0.0.51,127.0.0.1
#默认端口号
http.port: 9200
#集群发现节点配置
discovery.zen.ping.unicast.hosts: ["10.0.0.51", "10.0.0.52"]
#选项相关参数,有公式 master/2+1 
discovery.zen.minimum_master_nodes: 2

新增节点db02

#db02

#安装
cd /data/es_soft
rpm -ivh elasticsearch-6.6.0.rpm

#修改配置文件如下
vi /etc/elasticsearch/elasticsearch.yml

cluster.name: Linux
node.name: node-2
path.data: /data/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 10.0.0.52,127.0.0.1
http.port: 9200
discovery.zen.ping.unicast.hosts: ["10.0.0.51", "10.0.0.52"]
discovery.zen.minimum_master_nodes: 2

#修改内存锁定
systemctl edit elasticsearch

[Service]
LimitMEMLOCK=infinity

#创建数据目录并授权
mkdir /data/elasticsearch -p
chown -R elasticsearch:elasticsearch /data/elasticsearch

#重启服务
systemctl daemon-reload
systemctl restart elasticsearch

#查看日志和端口
tail -f /var/log/elasticsearch/Linux.log
netstat -lntup|grep 9200

查看效果

QQ图片20200530154757.png

以上配置一共2个节点,当discovery.zen.minimum_master_nodes设置为2的时候,一台出现故障导致集群不可用解决方法

  • 因为2个节点失去其中一个,所以无法满足最小主节点的选举条件
  • 把还存活的节点的配置文件集群选举相关的选项注释掉或者改成1,重启服务
vi /etc/elasticsearch/elasticsearch.yml

discovery.zen.minimum_master_nodes: 1

新增节点db03

#db03

#安装
cd /data/es_soft
rpm -ivh elasticsearch-6.6.0.rpm

#修改配置文件如下
vi /etc/elasticsearch/elasticsearch.yml

cluster.name: Linux
node.name: node-3
path.data: /data/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 10.0.0.53,127.0.0.1
http.port: 9200
discovery.zen.ping.unicast.hosts: ["10.0.0.51", "10.0.0.53"]
discovery.zen.minimum_master_nodes: 2

#修改内存锁定
systemctl edit elasticsearch

[Service]
LimitMEMLOCK=infinity

#创建数据目录并授权
mkdir /data/elasticsearch -p
chown -R elasticsearch:elasticsearch /data/elasticsearch

#重启服务
systemctl daemon-reload
systemctl restart elasticsearch

#查看日志和端口
tail -f /var/log/elasticsearch/Linux.log
netstat -lntup|grep 9200

集群相关查询

查看集群信息

curl -XGET 'http://localhost:9200/_cluster/health?pretty'
  • 主节点负责调度数据返回数据,工作节点负责处理数据
  • 默认情况下,所有节点都是工作节点,主节点即负责调度又负责处理数据

查询节点的状态

curl -XGET 'http://localhost:9200/_nodes/procese?human&pretty'
curl -XGET 'http://localhost:9200/_nodes/_all/info/jvm,process?human&pretty'
curl -XGET 'http://localhost:9200/_cat/nodes?human&pretty'

查看集群的设置

curl -XGET 'http://localhost:9200/_cluster/settings?include_defaults=true&human&pretty'

查看系统检索信息

Cluster Stats API允许从集群范围的角度检索统计信息

curl -XGET 'http://localhost:9200/_cluster/stats?human&pretty'

集群分片与副本

默认ES会创建5分片1副本的配置,粗框为本体,细框为副本

  • 以下情况在任意1个节点失效的情况下,依然能保证数据完整性
  • 在不同时损坏的极限情况下,最多可以失去2个节点
  • 如果使用zabbix,需要监控服集群节点数量和集群健康状态

QQ截图20200530162600.png

指定分片和副本

指定3分片1副本,分片数一旦创建就不能更改,但是副本数可以调整

curl -XPUT 'localhost:9200/index2?pretty' -H 'Content-Type: application/json' -d'
{
   "settings" : { 
   "number_of_shards" : 3, 
   "number_of_replicas" : 1
 } 
}'

查看结果

QQ截图20200530163511.png

修改副本数

修改为2副本

curl -XPUT 'localhost:9200/index2/_settings?pretty' -H 'Content-Type: application/json' -d'
{
  "settings" : { 
  "number_of_replicas" : 2
 } 
}'

查看结果

QQ截图20200530163653.png

移入节点分片变化

移入节点.gif

移除节点分片变化

移除节点.gif

Elasticsearch工具

x-pack监控功能

  • x-pack为elasticsearch, logstash, kibana提供了监控,报警,用户认证等功能,属于一个集成的插件
  • 6.x以前是以插件形式存在,6.x以后默认安装的时候就集成在软件包里了
  • 不过这些功能并不全是免费的,具体分为四个版本:开源,基础,黄金,铂金,企业五个版本
  • https://www.elastic.co/cn/subscriptions

不同版本功能对比网址

Elasticsearch 权限认证Search Guard

Elasticsearch优化

  1. JVM最大最小内存调整
  2. 关闭SWAP分区
  3. vm.max_map_count调整
  4. ulimit调整
  5. 磁盘性能

Elasticsearch备份与恢复

Elasticsearch-dump

python操作

Elasticsearch防脑裂配置

#防脑裂配置
discovery.zen.minimum_master_nodes: 2
discovery.zen.fd.ping_interval: 10s
discovery.zen.fd.ping_timeout: 60s
discovery.zen.fd.ping_retries: 6

中文分词器

#分词器安装(需要对应elasticsearch版本)
cd /usr/share/elasticsearch
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.6.0/elasticsearch-analysis-ik-6.6.0.zip

#安装完成后重启
systemctl restart elasticsearch.service 

查看效果

#创建索引
curl -XPUT http://localhost:9200/index

#创建映射
curl -XPOST http://localhost:9200/index/resource/_mapping -H 'Content-Type:application/json' -d'
{
        "properties": {
            "content": {
                "type": "text",
                "analyzer": "ik_max_word",
                "search_analyzer": "ik_smart"
            }
        }
}'

#索引一些文档
curl -XPOST http://localhost:9200/index/resource/1 -H 'Content-Type:application/json' -d'
{"content":"美国留给伊拉克的是个烂摊子吗"}'
curl -XPOST http://localhost:9200/index/resource/2 -H 'Content-Type:application/json' -d'
{"content":"公安部:各地校车将享最高路权"}'
curl -XPOST http://localhost:9200/index/resource/3 -H 'Content-Type:application/json' -d'
{"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}'
curl -XPOST http://localhost:9200/index/resource/4 -H 'Content-Type:application/json' -d'
{"content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"}'

#使用突出显示的查询
curl -XPOST http://localhost:9200/index/_search?pretty -H 'Content-Type:application/json' -d'
{
    "query" : { "match" : { "content" : "中国" }},
    "highlight" : {
        "pre_tags" : ["<tag1>", "<tag2>"],
        "post_tags" : ["</tag1>", "</tag2>"],
        "fields" : {
            "content" : {}
        }
    }
}'

#结果
{
  "took" : 43,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 2,
    "max_score" : 0.6489038,
    "hits" : [
      {
        "_index" : "index",
        "_type" : "resource",
        "_id" : "4",
        "_score" : 0.6489038,
        "_source" : {
          "content" : "中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"
        },
        "highlight" : {
          "content" : [
            "<tag1>中国</tag1>驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"
          ]
        }
      },
      {
        "_index" : "index",
        "_type" : "resource",
        "_id" : "3",
        "_score" : 0.2876821,
        "_source" : {
          "content" : "中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"
        },
        "highlight" : {
          "content" : [
            "中韩渔警冲突调查:韩警平均每天扣1艘<tag1>中国</tag1>渔船"
          ]
        }
      }
    ]
  }
}