• 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. 加机器:官方参考文档
  • 相关阅读:
    java中Object转String
    JSON以及Java转换JSON的方法(前后端常用处理方法)
    JS基础如何理解对象
    图解数据结构(7)——二叉查找树及平衡二叉查找树(一共14篇)
    C++虚函数表解析(图文并茂,非常清楚)( 任何妄图使用父类指针想调用子类中的未覆盖父类的成员函数的行为都会被编译器视为非法)good
    C++中代理类和句柄类
    C++的 RTTI 观念和用途(非常详细)
    川普就是领着一群工业革命时代的棺材瓤子,发动了一次资本主义复辟,面对互联网不过是一次新的砸机器运动
    基于.NET MVC的高性能IOC插件化架构
    雅虎35条
  • 原文地址:https://www.cnblogs.com/backups/p/EBLK_1.html
Copyright © 2020-2023  润新知