• EBLK之1---Elasticsearch集群


    ELK之1---Elasticsearch集群

    EB/LK

    • EB/LK架构

    image-20201228085615816

    • 阿里云云盾面板

    image-20201228085705247

    • ELK面板

    image-20201228085730103

    第1章 Elasticsearch介绍

    Lucene

    Lucene是一个高性能的java搜索引擎库,操作非常繁琐,需要具备Java开发经验。

    Elasticsearch是基于Lucene之上包装一层外壳,屏蔽了Lucene的复杂操作,即使不会java语 ⾔也可以快速上⼿。

    image-20201228090451583

    索引

    索引就好⽐书的目录,如果我们想快速查看某个章节,只需要找到目录里相应章节对应的页数即
    可。

    通过目录找到章节,通过章节找到页码这个过程就是索引的过程。

    索引的目的就是加快数据搜索的效率。


    全文检索

    先建⽴索引,再对索引进⾏搜索的过程就叫全文检索(Full-text Search)。

    image-20201228090622800


    倒排索引

    索引是根据章节找到页数,但是如果我并不知道我要找的内容属于哪个章节,⽐如我只知道⼀个
    关键词,但是不知道这个关键词属于哪个章节。⼤家可以想⼀下,我们平时利用搜索引擎搜索的
    时候是不是也是这种场景呢?
    ⽐如我们想知道⼀个电影的名字,但是记不起来具体的名字,只知道部分关键词或者剧情的内
    容,那这种情景背后如何用技术解决呢?
    这时候就不得不提到倒排索引了。
    那么什么是倒排索引呢?还是拿书的目录举例⼦:
    
    正常索引:
    第1章 Elasticsearch介绍 第10页
    第2章 Elasticsearch安装配置 第15页
    第3章 Elasticsearch自定义配置 第20页
    
    倒排索引:
    关键词 章节
    Elasticsearch 第1章 第2章 第3章
    安装 第2章
    配置 第2章 第3章
    自定义 第3章
    

    image-20201228091221446

    假设数据里里有以下新闻标题:
    1.老男孩教育				 1
    2.老男孩教育linux学院		1	1
    3.老男孩教育python学院		1	1
    4.老男孩教育DBA学院		1	1
    5.老男孩教育oldzhang		 1	2
    6.老男孩教育安全			1
    
    Elasticsearch 内部分词,倒排索引,评分:
    老男孩			  1 2 3 4 5 6
    教育			  1 2 3 4 5 6 
    linux			2
    python			3
    DBA				4
    oldzhang		5
    学院			   2 3 4
    安全			   6
    
    用户输入:
    老男孩 学院 oldzhang
    
    分词:
    老男孩
    DBA
    
    打分:
    老男孩	
    DBA
    
    返回给用户:
    4.老男孩教育DBA学院	   1	1
    

    Elasticsearch应用场景

    1. 搜索: 电商,百科,app搜索,搜索结果⾼亮显示

    2. 日志分析和数据挖掘,数据展示

    Elasticsearch特点

    1. 高性能,天然分布式集群
    2. 对运维友好,不需要会java语言,开箱即用,配置文件精简
    3. 功能丰富,社区活跃,版本更新特别的快2.6 -- 8.0

    Elasticsearch在电商搜索的实现

    cat
    skuid    name
    1        狗粮100kg
    2        猫粮50kg
    3        猫罐头200g
    
    select * from cat where name 1ike '%狗粮%'
    
    Elasticsearch:
    聚合运算之后得到SKUID:
    1
    2
    
    拿到ID之后,mysq1就只需要简单地where查询即可
    mysq1:
    select xx from xxx where skuid = 1
    

    第2章 Elasticsearch部署

    环境准备

    主机名 IP 配置
    node-1 10.0.0.51 1C4G
    node-2 10.0.0.52 1C2G
    node-3 10.0.0.53 1C2G
    • 关闭:selinuxfirewalldNetworkManagerpostfix(非必须)

    • 修改IP地址、主机名

    hostnamectl set-hostname node-1
    sed -i 's/200/51/g' /etc/sysconfig/network-scripts/ifcfg-eth[01]
    
    • 关闭SWAP分区
    swapoff -a
    sed -i '11d' /etc/fstab
    

    Elasticsearch部署

    Elasticsearch官网下载

    elastic中文社区下载中心

    1. 下载
    mkdir -p /data/soft && cd /data/soft
    wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.9.1-x86_64.rpm
    
    1. 安装jdk
    对于Elasticsearch7.0之后的版本不需要再独⽴的安装JDK了,软件包里已经自带了最新的JDK,所以直接启动即可。
    
    1. 安装
    rpm -ivh elasticsearch-7.9.1-x86_64.rpm
    
    1. 启动并加入开机自启
    systemctl daemon-reload
    systemctl enable elasticsearch.service
    systemctl start elasticsearch.service
    
    1. 验证:查看端口,页面,日志
    netstat -tupln | grep 9200
    curl 127.0.0.1:9200
    tail -f /var/log/elasticsearch/elasticsearch.log
    

    第3章 Elasticsearch自定义配置

    1. 查看ES配置文件
    [root@node-1 ~]# rpm -qc elasticsearch
    /etc/elasticsearch/elasticsearch.yml          # 主配置文件
    /etc/elasticsearch/jvm.options                # JVM配置文件
    /etc/init.d/elasticsearch                     # init启动脚本
    /etc/sysconfig/elasticsearch                  # 环境变量文件
    /usr/lib/sysctl.d/elasticsearch.conf          # 内核参数文件
    /usr/lib/systemd/system/elasticsearch.service # systemd启动文件
    
    1. 自定义配置文件
    cp /etc/elasticsearch/elasticsearch.yml /opt/
    cat > /etc/elasticsearch/elasticsearch.yml << 'EOF'
    node.name: node-1
    path.data: /var/lib/elasticsearch
    path.logs: /var/log/elasticsearch
    bootstrap.memory_lock: true
    network.host: 127.0.0.1,10.0.0.51
    http.port: 9200
    discovery.seed_hosts: ["10.0.0.51"]
    cluster.initial_master_nodes: ["10.0.0.51"]
    EOF
    
    bootstrap.memory_lock: true # 内存锁,最大堆内存=最小堆内存,启动时锁定内存
    # /etc/elasticsearch/jvm.options
    -Xms1g
    -Xmx1g
    
    1. 重启服务
    systemctl restart elasticsearch.service
    
    1. 解决内存锁定失败

    重启后,查看日志,发现提示内存锁定失败

    [root@node-1 ~]# tail -f /var/log/elasticsearch/elasticsearch.log
    [2020-12-17T19:34:38,132][ERROR][o.e.b.Bootstrap ] [node-1]
    node validation exception
    [1] bootstrap checks failed
    [1]: memory locking requested for elasticsearch process but memory is
    not locked
    

    官⽹解决方案,解决:

    systemctl edit elasticsearch
    
    [Service]
    LimitMEMLOCK=infinity
    
    systemctl daemon-reload
    systemctl restart elasticsearch.service
    

    第4章 Elasticsearch插件安装

    image-20201228110858703

    1. elasticsearch-head 介绍

    elasticsearch-head是⼀款用来管理Elasticsearch集群的第三方插件⼯具。

    elasticsearch-Head插件在5.0版本之前可以直接以插件的形式直接安装,但是5.0以后安装方式发⽣了改变,需要nodejs环境⽀持,或者直接使用别⼈封装好的docker镜像,更推荐的是谷歌浏览器的插件。

    1. elasticsearch-head的三种安装方式

      1. npm安装方式
      2. docker安装
      3. google浏览器插件(推荐)
    2. elasticsearch-head编译安装

    插件官方

    使用docker部署elasticsearch-head

    docker pull alivv/elasticsearch-head
    docker run --name es-head -p 9100:9100 -dit elivv/elasticsearch-head
    

    使用nodejs编译安装elasticsearch-head

    cd /opt/
    wget https://nodejs.org/dist/v12.13.0/node-v12.13.0-linux-x64.tar.xz
    tar xf node-v12.13.0-linux-x64.tar.xz
    mv node-v12.13.0-linux-x64 node
    echo 'export PATH=$PATH:/opt/node/bin' >> /etc/profile
    source /etc/profile
    npm -v
    node -v
    git clone git://github.com/mobz/elasticsearch-head.git
    unzip elasticsearch-head-master.zip
    cd elasticsearch-head-master
    npm install -g cnpm --registry=https://registry.npm.taobao.org
    cnpm install
    cnpm run start &
    
    1. es-head谷歌浏览器插件安装

    更多工具 --> 扩展程序 --> 开发者模式 --> 选择解压缩后的插件目录

    image-20201228111343990

    第5章 kibana部署

    1. 安装kibana
    wget https://artifacts.elastic.co/downloads/kibana/kibana-7.9.1-x86_64.rpm
    rpm -ivh kibana-7.9.1-x86_64.rpm
    
    1. 配置kibana
    cat <<EOF >> /etc/kibana/kibana.yml
    server.port: 5601
    server.host: "10.0.0.51"
    elasticsearch.hosts: ["http://10.0.0.51:9200"]
    kibana.index: ".kibana"
    EOF
    
    1. 启动kibana
    systemctl enable kibana
    systemctl start kibana
    
    1. 验证访问http://10.0.0.51:5601/

    image-20201228113338912

    image-20201228113807635

    1. 清除其他数据库

    image-20201228114359070

    image-20201228114441167

    image-20201228114502702

    image-20201228114528015

    image-20201228114542974

    1. API操作
    curl -XPUT 'http://10.0.0.51:9200/linux/_doc/1' -H 'Content-Type: application/json' -d '
    {
      "name": "zhang",
      "age": "29"
    }'
    

    image-20201228114646542

    粘贴API操作格式转变:

    image-20201228114718462

    第6章 Elasticsearch插⼊数据

    官网参考

    Relational DB Elasticsearch
    database Indices
    Tables Types
    rows Documents
    columns Fields
    POST Indices/Types/
    {
     "Fields": "Documents",
    }
    
    1. 使用自定义ID
    PUT linux/_doc/1
    {
     "name": "zhang",
     "age": "29"
    }
    
    1. 使用随机ID
    POST linux/_doc/
    {
     "name": "zhang",
     "age": "29",
     "address": "BJ"
    }
    
    1. 保证和mysql数据对应:使用POST随机ID,指定单独一列ID字段
    mysql
    id name  age address job
    1  zhang 27   BJ     it
    2  ya    22   SZ     it
    
    POST linux/_doc/
    {
     "id": "1",
     "name": "zhang",
     "age": "29",
     "address": "BJ",
     "job": "it"
    }
    POST linux/_doc/
    {
     "id": "2",
     "name": "ya",
     "age": "22",
     "address": "SZ",
     "job": "it"
    }
    

    第7章 Elasticsearch查询命令

    1. 创建测试语句
    POST linux/_doc/
    {
     "name": "zhang3",
     "age": "22",
     "address": "SZ",
     "job": "ops"
    }
    POST linux/_doc/
    {
     "name": "li4",
     "age": "30",
     "address": "BJ",
     "job": "dev"
    }
    POST linux/_doc/
    {
     "name": "wang5",
     "age": "24",
     "address": "BJ",
     "job": "dev"
    }
    POST linux/_doc/
    {
     "name": "zhao6",
     "age": "35",
     "address": "SZ",
     "job": "devops"
    }
    POST linux/_doc/
    {
     "name": "sun7",
     "age": "21",
     "address": "BJ",
     "job": "ops"
    }
    POST linux/_doc/
    {
     "name": "jack",
     "age": "27",
     "address": "BJ",
     "job": "devops"
    }
    POST linux/_doc/
    {
     "name": "scott",
     "age": "25",
     "address": "SZ",
     "job": "dev"
    }
    
    1. 简单查询
    GET linux/_search/
    
    1. 条件查询
    GET linux/_search
    {
      "query": {
        "term": {
          "name": {
            "value": "zhang3"
          }
        }
      }
    }
    GET linux/_search
    {
      "query": {
        "term": {
          "job": {
            "value": "ops"
          }
        }
      }
    }
    
    1. 多条件查询
    GET /linux/_search
    {
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "address": "BJ"
              }
            },
            {
              "match": {
                "job": "dev"
              }
            }
          ],
          "filter": {
            "range": {
              "age": {
                "gte": 27,
                "lte": 30
              }
            }
          }
        }
      }
    }
    

    image-20201228145018369

    第8章 Elasticsearch更新命令

    1. 自定义的ID更新
    PUT linux/info/1
    {
     "name": "zhang",
     "age": 30,
     "job": "it",
     "id": 1
    }
    
    1. 随机ID更新

    创建测试数据

    PUT linux/_doc/1
    {
     "name": "zhang",
     "age": "30",
     "job": "it",
     "id": 2
    }
    

    先根据自定义的Id字段查出数据的随机ID

    GET linux/_search/
    {
      "query": {
        "term": {
          "id": {
            "value": "2"
          }
        }
      }
    }
    

    取到随机ID后更改数据

    PUT linux/_doc/CVDdknIBq3aq7mPQaoWw
    {
     "name": "tony",
     "age": 30,
     "job": "it",
     "id": 2
    }
    

    删除:DELETE linux/_doc/Iz0UqHYBKb3_fEmINvjQ

    建议先关闭,等一段时间后,备份,最后删除

    image-20201228145621132

    第9章 Elasticsearch集群概念介绍

    1. Elasticsearch集群特点

    对运维友好:不需要太多java的知识也可以很方便的维护整个集群。
    搭建方便:搭建副本⾮常简单,只需要将新节点加⼊已有集群即可,会自动同步数据。
    自动故障转移:当节点出现故障时,会自动故障转移,将有数据复制到其他正常的节点。

    image-20201228153748911

    1. 数据分片

    主分片: 实际存储的数据,负责读写,粗框的是主分片
    副本分片: 主分片的副本,提供读,同步主分片,细框的是副本分片

    1. 副本

    主分⽚的备份,副本数量可以自定义

    1. 默认分⽚和副本规则

    7.x版本之前默认规则:1副本,5分⽚
    7.x版本之后默认规则:1副本,1分⽚

    1. 节点类型

    主节点:负责调度数据分配到哪个节点
    数据节点:实际负责处理数据的节点
    默认:主节点也是⼯作节点

    1. 集群健康状态

    绿色:所有数据都完整,且副本数满⾜
    黄色:所有数据都完整,但是副本数不满⾜
    红色:⼀个或多个索引数据不完整

    第10章 Elasticsearch集群部署

    1. 部署集群前注意

    如果以前有单节点的数据,最好备份出来,然后再清空集群数据。

    1. 新节点安装java

    7.x版本之后不需要单独的安装JDK,软件包自带了JDK

    1. 新节点安装Elasticsearch
    rpm -ivh elasticsearch-7.9.1-x86_64.rpm
    
    1. 配置内存锁定
    systemctl edit elasticsearch
    
    [Service]
    LimitMEMLOCK=infinity
    
    systemctl daemon-reload
    systemctl restart elasticsearch.service
    
    1. node1配置文件
    cat > /etc/elasticsearch/elasticsearch.yml <<EOF
    cluster.name: oldboy_linux
    node.name: node-1
    path.data: /var/lib/elasticsearch
    path.logs: /var/log/elasticsearch
    bootstrap.memory_lock: true
    network.host: 127.0.0.1,10.0.0.51
    http.port: 9200
    discovery.seed_hosts: ["10.0.0.51","10.0.0.52"]
    cluster.initial_master_nodes: ["10.0.0.51"]
    EOF
    
    1. node2配置文件
    cat> /etc/elasticsearch/elasticsearch.yml <<EOF
    cluster.name: oldboy_linux
    node.name: node-2
    path.data: /var/lib/elasticsearch
    path.logs: /var/log/elasticsearch
    bootstrap.memory_lock: true
    network.host: 127.0.0.1,10.0.0.52
    http.port: 9200
    discovery.seed_hosts: ["10.0.0.51","10.0.0.52"]
    cluster.initial_master_nodes: ["10.0.0.51"]
    EOF
    
    cluster.name: oldboy_linux                       # 集群名称
    node.name: node-1                                # 节点名称
    path.data: /var/lib/elasticsearch                # 数据目录
    path.logs: /var/log/elasticsearch                # 日志目录
    bootstrap.memory_lock: true                      # 设置内存锁定
    network.host: 127.0.0.1,10.0.0.51                # 本地监听地址
    http.port: 9200                                  # 本地端⼝
    discovery.seed_hosts: ["10.0.0.51","10.0.0.52"]  # 集群节点互相发现的地址,不需要把所有节点IP都写上。
    cluster.initial_master_nodes: ["10.0.0.51"]      # 集群初始化节点,只有创建集群的第⼀次有用,集群创建后参数失效。
    
    1. 以前单节点有数据,先停⽌运⾏,然后清空数据,再启动
    systemctl stop elasticsearch.service
    rm -rf /var/lib/elasticsearch/*
    systemctl start elasticsearch
    
    1. 查看日志
    tail -f /var/log/elasticsearch/oldboy_linux.log
    
    1. 检查集群:ES-head查看是否有2个节点

    image-20201228152756755

    1. 集群注意事项
      1. 插⼊和读取数据在任意节点都可以执⾏,效果⼀样
      2. es-head可以连接集群内任⼀台服务
      3. 主节点负责读写
        如果主分⽚所在的节点坏掉了,副本分⽚会升为主分⽚
      4. 主节点负责调度
        如果主节点坏掉了,数据节点会自动升为主节点
      5. 默认会有2个通讯端⼝:9200和9300
        但9300并没有在配置文件里配置过
        如果开启了防⽕墙并且没有放开9300端⼝,那么集群通讯就会失败

    第11章 Elasticsearch集群扩容

    1. 安装java

    2. 安装ES

    3. 配置内存锁定

    4. node3集群配置文件

    cat> /etc/elasticsearch/elasticsearch.yml <<EOF
    cluster.name: oldboy_linux
    node.name: node-3
    path.data: /var/lib/elasticsearch
    path.logs: /var/log/elasticsearch
    bootstrap.memory_lock: true
    network.host: 127.0.0.1,10.0.0.53
    http.port: 9200
    discovery.seed_hosts: ["10.0.0.51","10.0.0.53"]
    EOF
    
    1. 添加节点注意

      • 对于新添加的节点来说:
        只需要直到集群内任意⼀个节点的IP和他自己本身的IP即可
        discovery.seed_hosts: ["10.0.0.51","10.0.0.53"]
      • 对于以前的节点来说:
        什么都不需要更改
    2. 数据分⽚颜⾊解释

      • 紫⾊: 正在迁移
      • ⻩⾊: 正在复制
      • 绿⾊: 正常
    3. 集群故障转移实验

    1.停掉主节点,观察集群是否正常
    2.停掉主节点,是否还会选举出新的主节点
    3.停掉主节点,数据分片的分布会不会发生变化,分片状态会不会发生变化
    4.停掉主节点,然后在持续的写入数据,等节点恢复之后,会如何处理落后的数据
    5.3个节点的Elasticsearch集群,极限情况下最多允许坏几台? 
    6.主节点故障,集群健康状态发生什么变化?
    

    结论:

    1.如果主节点坏掉了,会从活着的数据节点中选出一台新的主节点
    2.如果主分片坏掉了,副本分片会升级为主分片
    3.如果副本数不满足,会尝试在其他的节点上重新复制一份数据
    4.修复上线只需要正常启动故障的节点即会自动加入到集群里,并且自动同步数据
    5.7.x版本之前允许单个节点的集群运⾏。
      7.x版本之后则必须至少2个节点存活集群才能正常工作
    

    image-20201222145109387

    image-20201222161714345

    image-20201222161848055

    第12章 Elasticsearch集群维护

    1. 自定义副本数和索引数参数注意事项

    索引⼀旦建⽴完成,分⽚数就不可以修改了,但是副本数可以随时修改

    1. 创建索引的时候就自定义副本和分⽚
    PUT /linux2/
    {
      "settings": {
        "number_of_shards": 3,
        "number_of_replicas": 0
      }
    }
    
    1. 修改单个索引的副本数
    PUT /linux2/_settings/
    {
      "settings": {
        "number_of_replicas": 2
      }
    }
    
    1. 修改所有的索引的副本数
    PUT /_all/_settings/
    {
      "settings": {
        "number_of_replicas": 0
      }
    }
    
    1. ⼯作如何设置

    2个节点: 默认就可以

    3个节点: 重要的数据,2副本 不重要的默认

    日志收集: 1副本3分⽚

    image-20201222165008364

    image-20201222165036682

    第13章 ES监控

    1. 监控注意

    1.不能只监控集群状态
    2.监控节点数
    3.监控集群状态
    4.两者任意⼀个发⽣改变了都报警

    1. 监控命令
    GET _cat/nodes
    GET _cat/health
    GET _cat/master
    GET _cat/fielddata
    GET _cat/indices
    GET _cat/shards
    GET _cat/shards/linux
    
    # zabbix监控:集群健康状态 OR 节点个数
    # 查看集群健康状态
    curl -s 127.0.0.1:9200/_cat/health|grep "green"|wc -l
    # 查看节点个数
    curl -s 127.0.0.1:9200/_cat/nodes|wc -l
    
    1. kibana开启监控

    点击kibana⾯板的监控按钮

    image-20201228170339085

    image-20201228170105555

    image-20201228170439853

    image-20201228170447300

    image-20201228170510535

    1. kibana关闭监控
    GET /_cluster/settings
    PUT /_cluster/settings
    {
      "persistent": {
        "xpack": {
          "monitoring": {
            "collection": {
              "enabled": "false"
            }
          }
        }
      }
    }
    

    第14章 中文分词器

    未配置中文分词

    1. 插⼊测试数据
    POST /news/_doc/1
    {"content":"美国留给伊拉克的是个烂摊⼦吗"}
    
    POST /news/_doc/2
    {"content":"公安部:各地校⻋将享最⾼路权"}
    
    POST /news/_doc/3
    {"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}
    
    POST /news/_doc/4
    {"content":"中国驻洛杉矶领事馆遭亚裔男⼦枪击 嫌犯已自⾸"}
    
    1. 查询测试
    POST /news/_search
    {
      "query": { "match": { "content": "中国" }},
      "highlight": {
        "pre_tags": ["<tag1>", "<tag2>"],
        "post_tags": ["</tag1>", "</tag2>"],
        "fields": {
          "content": {}
        }
      }
    }
    
    1. 结论

    未配置中文分词器时,查询中文会将词拆分成⼀个⼀个的汉字。

    配置中文分词

    1. 前提条件
    所有的ES节点都需要安装
    所有的ES都需要重启才能⽣效
    中文分词器的版本号要和ES版本号对应
    https://github.com/medcl/elasticsearch-analysis-ik
    
    1. 配置中文分词器
    • 在线安装
    /usr/share/elasticsearch/bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.9.1/elasticsearch-analysis-ik-7.9.1.zip
    
    • 离线本地文件安装
    /usr/share/elasticsearch/bin/elasticsearch-plugin install file:///opt/elasticsearch-analysis-ik-7.9.1.zip
    
    1. 重启所有ES节点生效
    systemctl restart elasticsearch.service
    
    1. 创建索引
    PUT /news2
    
    1. 创建模板,指定:search_analyzer
    POST /news2/_doc/_mapping?include_type_name=true
    {
      "properties": {
        "content": {
          "type": "text",
          "analyzer": "ik_max_word",
          "search_analyzer": "ik_smart"
        }
      }
    }
    
    1. 插⼊测试数据
    POST /news2/_doc/1
    {"content":"美国留给伊拉克的是个烂摊⼦吗"}
    
    POST /news2/_doc/2
    {"content":"公安部:各地校⻋将享最⾼路权"}
    
    POST /news2/_doc/3
    {"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}
    
    POST /news2/_doc/4
    {"content":"中国驻洛杉矶领事馆遭亚裔男⼦枪击 嫌犯已自⾸"}
    
    1. 再次查询数据发现已经能识别中文了
    POST /news2/_search
    {
      "query" : { "match" : { "content" : "中国" }},
      "highlight" : {
        "pre_tags" : ["<tag1>", "<tag2>"],
        "post_tags" : ["</tag1>", "</tag2>"],
        "fields" : {
          "content" : {}
        }
      }
    }
    

    根据字典拆,没有就拆到最小,因此需要更新中文分词库。

    ll /etc/elasticsearch/analysis-ik/main.dic
    

    热更新中文分词库

    1. 安装nginx
    yum install nginx -y
    
    1. 编写字典文件
    cat >>/usr/share/nginx/html/my_dic.txt<<EOF
    北京
    张亚
    武汉
    中国
    深圳
    EOF
    
    1. 启动并测试
    nginx -t
    systemctl start nginx
    curl 127.0.0.1/my_dic.txt
    
    1. 配置es启用中文分词器插件
    cat <<EOF >/etc/elasticsearch/analysis-ik/IKAnalyzer.cfg.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
    <properties>
            <comment>IK Analyzer 扩展配置</comment>
            <!--用户可以在这里配置自己的扩展字典 -->
            <entry key="ext_dict"></entry>
            <!--用户可以在这里配置自己的扩展停止词字典-->
            <entry key="ext_stopwords"></entry>
            <!--用户可以在这里配置远程扩展字典 -->
            <entry key="remote_ext_dict">http://10.0.0.51/my_dic.txt</entry>
            <!--用户可以在这里配置远程扩展停止词字典-->
            <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
    </properties>
    EOF
    
    1. 将修改好的IK配置文件,复制到其他所有ES节点
    scp -rp /etc/elasticsearch/analysis-ik/IKAnalyzer.cfg.xml 10.0.0.52:/etc/elasticsearch/analysis-ik/
    scp -rp /etc/elasticsearch/analysis-ik/IKAnalyzer.cfg.xml 10.0.0.53:/etc/elasticsearch/analysis-ik/
    
    1. 重启所有的ES节点
    systemctl restart elasticsearch.service
    
    1. 查看日志里字典的词有没有加载出来
    tail -f /var/log/elasticsearch/oldboy_linux.log
    
    [2020-12-18T10:27:08,126][INFO ][o.w.a.d.Dictionary ] [node-1]
    start to reload ik dict.
    [2020-12-18T10:27:08,127][INFO ][o.w.a.d.Dictionary ] [node-1] try
    load config from /etc/elasticsearch/analysis-ik/IKAnalyzer.cfg.xml
    [2020-12-18T10:27:08,538][INFO ][o.w.a.d.Dictionary ] [node-1]
    [Dict Loading] http://10.0.0.51/my_dic.txt
    [2020-12-18T10:27:08,540][INFO ][o.w.a.d.Dictionary ] [node-1] 北京
    [2020-12-18T10:27:08,541][INFO ][o.w.a.d.Dictionary ] [node-1] 张亚
    [2020-12-18T10:27:08,541][INFO ][o.w.a.d.Dictionary ] [node-1] 武汉
    [2020-12-18T10:27:08,541][INFO ][o.w.a.d.Dictionary ] [node-1] 中国
    [2020-12-18T10:27:08,541][INFO ][o.w.a.d.Dictionary ] [node-1] 深圳
    [2020-12-18T10:27:08,541][INFO ][o.w.a.d.Dictionary ] [node-1]
    reload ik dict finished.
    
    1. 更新字典内容,看日志里会不会自动加载
    echo "老男孩教育" >> /usr/share/nginx/html/my_dic.txt
    
    1. 搜索测试验证结果
    POST /news2/_doc/7
    {
     "content":"学Linux来老男孩教育"
    
    POST /news2/_search
    {
      "query" : { "match" : { "content" : "老男孩教育" }},
      "highlight" : {
        "pre_tags" : ["<tag1>", "<tag2>"],
        "post_tags" : ["</tag1>", "</tag2>"],
        "fields" : {
          "content" : {}
        }
      }
    }
    
    1. 电商上架新产品流程
      1. 先把新上架的商品的关键词更新到词典里
      2. 查看ES日志,确认新词被动态更新了
      3. 自己编写⼀个测试索引,插⼊测试数据,然后查看搜索结果
      4. 确认没有问题之后,在让开发插⼊新商品的数据
      5. 测试

    第15章 备份恢复

    使用官方的快照snap功能备份恢复

    image-20201229092542123

    1. 前提条件

    官方文档

    如果是Elasticsearch集群想使用快照功能,则存储快照的目录必须是共享存储,并且所有节点都需要挂载这个目录。

    1. 配置NFS服务端
    yum install nfs-utils -y
    cat > /etc/exports << 'EOF'
    /data/backup 10.0.0.0/24(rw,sync,all_squash,anonuid=998,anongid=996)
    EOF
    mkdir /data/backup -p
    systemctl start nfs
    showmount -e 10.0.0.51
    
    1. 所有节点创建目录,并授权
    yum install nfs-utils -y
    mkdir /data/backup -p
    chown -R elasticsearch:elasticsearch /data/backup/
    mount -t nfs 10.0.0.51:/data/backup /data/backup
    df -h
    
    1. 所有节点修改Elasticsearch配置文件,添加参数
    cat <<EOF >>/etc/elasticsearch/elasticsearch.yml
    path.repo: ["/data/backup"]
    EOF
    
    1. 重启ES生效
    systemctl restart elasticsearch
    
    1. 注册快照存储库
    PUT /_snapshot/my_fs_backup
    {
      "type": "fs",
      "settings": {
        "location": "/data/backup/my_fs_backup_location",
        "compress": true
      }
    }
    
    1. 查看所有快照
    GET /_snapshot/my_fs_backup
    
    1. 创建快照:全备
    PUT /_snapshot/my_fs_backup/snapshot_1?wait_for_completion=true
    
    1. 创建指定索引的快照
    PUT /_snapshot/my_fs_backup/snapshot_2?wait_for_completion=true
    {
      "indices": "news1,news2",
      "ignore_unavailable": true,
      "include_global_state": false
    }
    
    1. 查询快照信息
    GET /_snapshot/my_fs_backup/snapshot_1
    GET /_snapshot/my_fs_backup/snapshot_2
    
    1. 查看正在运行的快照
    GET /_snapshot/my_fs_backup/_current
    
    1. 删除快照
    DELETE /_snapshot/my_fs_backup/snapshot_2
    
    1. 删除存储库
    DELETE /_snapshot/my_fs_backup
    
    1. 全部还原
    POST /_snapshot/my_fs_backup/snapshot_1/_restore
    
    1. 还原部分:包括全局声明和同名重命名
    POST /_snapshot/my_fs_backup/snapshot_1/_restore
    {
      "indices": "news1,news2",
      "ignore_unavailable": true,
      "include_global_state": true,
      "rename_pattern": "news(.+)",
      "rename_replacement": "restored_news_$1"
    }
    
    1. 恢复的同时更改索引配置
    POST /_snapshot/my_fs_backup/snapshot_1/_restore
    {
      "indices": "index_1",
      "index_settings": {
        "index.number_of_replicas": 0
      },
      "ignore_index_settings": [
        "index.refresh_interval"
      ]
    }
    
    1. 以日期命名快照
    PUT /_snapshot/my_fs_backup/%3Csnapshot-%7Bnow%2Fd%7D%3E
    GET /_snapshot/my_fs_backup/_all
    

    使用第三方工具elasticdump备份恢复

    elasticdump Github

    1. 依赖node环境,安装nodejs
    wget https://nodejs.org/dist/v10.16.3/node-v10.16.3-linux-x64.tar.xz
    tar xf  node-v10.16.3-linux-x64.tar.xz -C /opt/
    ln -s /opt/node-v10.16.3-linux-x64 /opt/node
    echo 'export PATH=/opt/node/bin:$PATH' >> /etc/profile
    . /etc/profile
    npm -v
    node -v
    
    1. 指定使用国内淘宝npm源
    npm install -g cnpm --registry=https://registry.npm.taobao.org
    
    1. 安装es-dump
    cnpm install elasticdump -g
    
    1. 备份成可读的json格式
    elasticdump 
      --input=http://10.0.0.51:9200/news2 
      --output=/data/news2.json 
      --type=data
    
    1. 备份成压缩格式
    elasticdump 
      --input=http://10.0.0.51:9200/news2 
      --output=$|gzip > /data/news2.json.gz 
    
    1. 备份分词器/mapping/数据一条龙服务
    elasticdump 
      --input=http://10.0.0.51:9200/news2 
      --output=/data/news2_mapping.json 
      --type=mapping
    elasticdump 
      --input=http://10.0.0.51:9200/news2 
      --output=/data/news2.json 
      --type=data
    
    1. 只恢复数据
    elasticdump 
      --input=/data/news2.json 
      --output=http://10.0.0.51:9200/news2
    
    1. 恢复所有数据包含分词器/mapping一条龙服务
    elasticdump 
      --input=/data/news2_mapping.json 
      --output=http://10.0.0.51:9200/news2 
      --type=mapping
    elasticdump 
      --input=/data/news2.json 
      --output=http://10.0.0.51:9200/news2 
      --type=data
    
    1. 批量备份
    curl -s 10.0.0.52:9200/_cat/indices|awk '{print $3}'|grep -v "^."
    
    1. 注意

      • 如果恢复的时候数据冲突了,会被覆盖掉
      • 如果已经存在备份文件里没有的数据,会保留下来
    2. 带密码认证的导出

    --input=http://name:password@production.es.com:9200/my_index
    

    第16章 安全认证

    官方文档

    1. node-1生成证书和密钥
    /usr/share/elasticsearch/bin/elasticsearch-certutil ca
    /usr/share/elasticsearch/bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
    

    密码可以不填,全部回车即可。

    1. 所有节点创建证书目录
    mkdir /etc/elasticsearch/certs
    
    1. node-1复制证书到合适的位置,并推送到集群所有节点
    cp /usr/share/elasticsearch/*.p12 /etc/elasticsearch/certs/
    scp -r /etc/elasticsearch/certs 10.0.0.52:/etc/elasticsearch/
    scp -r /etc/elasticsearch/certs 10.0.0.53:/etc/elasticsearch/
    
    1. 所有节点证书修改权限
    chown -R elasticsearch:elasticsearch /etc/elasticsearch/certs/
    
    1. node-1修改ES配置文件:开启安全功能
    cat <<EOF >>/etc/elasticsearch/elasticsearch.yml
    xpack.security.enabled: true
    xpack.security.transport.ssl.enabled: true
    xpack.security.transport.ssl.verification_mode: certificate 
    xpack.security.transport.ssl.keystore.path: certs/elastic-stack-ca.p12
    xpack.security.transport.ssl.truststore.path: certs/elastic-stack-ca.p12
    EOF
    
    1. 所有节点重启ES生效
    systemctl restart elasticsearch
    
    1. node-1配置内置用户(7个用户)的密码
    /usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive
    
    Initiating the setup of passwords for reserved users elastic,apm_system,kibana,kibana_system,logstash_system,beats_system,remote_monitoring_user.
    You will be prompted to enter passwords as the process progresses.
    Please confirm that you would like to continue [y/N]y
    
    
    Enter password for [elastic]: 
    Reenter password for [elastic]: 
    Enter password for [apm_system]: 
    Reenter password for [apm_system]: 
    Enter password for [kibana_system]: 
    Reenter password for [kibana_system]: 
    Enter password for [logstash_system]: 
    Reenter password for [logstash_system]: 
    Enter password for [beats_system]: 
    Reenter password for [beats_system]: 
    Enter password for [remote_monitoring_user]: 
    Reenter password for [remote_monitoring_user]: 
    Changed password for user [apm_system]
    Changed password for user [kibana_system]
    Changed password for user [kibana]
    Changed password for user [logstash_system]
    Changed password for user [beats_system]
    Changed password for user [remote_monitoring_user]
    Changed password for user [elastic]
    
    1. kibana配置密码认证
    cat <<EOF >>/etc/kibana/kibana.yml
    elasticsearch.username: "kibana_system"
    elasticsearch.password: "elastic"
    EOF
    
    1. 重启kibana生效
    systemctl restart kibana
    
    1. 访问elasticsearch-head测试:管理员 elastic

    image-20201229103559431

    1. 访问kibana测试:管理员 elastic

    image-20201228183252422

    1. 注意事项
      1. 一定要先配置证书认证,再配置密码,不然就会报错。
      2. 默认创建的证书是root只读权限,需要设置为elasticsearch只读权限。
      3. 配置账号密码命令只需要在master节点配置即可。
      4. 配置账号密码命令只能运行一次,再次运行就会报错。
      5. 初始化的账号密码仅仅是作为组件之间传输信息使用,并不是给用户使用的。
      6. 给用户分配权限:需要在kibana里以elastic用户登录,创建新用户和新角色。

    image-20201229103752860

    image-20201229103817152

    第17章 ES优化

    1. 内存:
      1. 系统建议预留一半
      2. 每个ES节点不要超过32G
      3. 关闭swap分区
      4. 配置文件打开内存锁定参数
    2. 升级SSD硬盘
    3. 升级大版本
    4. 加机器:官方参考文档
  • 相关阅读:
    Javascript绝句欣赏
    【转载】浏览器的工作原理:新式网络浏览器幕后揭秘
    从零开始编写自己的JavaScript框架(二)
    从零开始编写自己的JavaScript框架(一)
    CSS 编码中超级有用的工具集合
    创建简单的响应式HTML5模版
    Javascript中的垃圾回收机制
    JavaScript继承详解(五)
    线上应用接入sentinel的第一个流控规则
    sentinel控制台监控数据持久化【MySQL】
  • 原文地址:https://www.cnblogs.com/backups/p/EBLK_1.html
Copyright © 2020-2023  润新知