Linux-ElasticSearch-7-3-0集群部署

x33g5p2x  于2021-09-24 转载在 Linux  
字(7.9k)|赞(0)|评价(0)|浏览(420)

前置条件

1、es不能使用root用户启动,因此需要创建一个用户。

sudo adduser es   创建账号es 
 
sudo passwd es    创建密码   密码是 huanmin123@qq.com

2、本地的多个es节点之间不能使用相同的datalog目录。

3、集群之间的脑裂问题,集群自己维护。

注意: 集群最少有2节点

暂时关闭防火墙

systemctl stop firewalld

永久关闭防火墙

systemctl disable firewalld

用户切换

su es

es的配置文件

config/elasticsearch.yml 文件

cluster.name: search-7.3.2  # 集群名称 (多个es之间这个名称必须一致,才能实现集群)
path.data: /home/es/es/data/node-1   # 单机集群数据存储位置多节点不能一样
path.logs: /home/es/es/log/node-1    # 单机集群日志存储位置多节点不能一样
node.name: node-1     # 节点名称 ->集群需要不同
node.master: true      # true:表示可以被选举成为master节点.(不用修改)
node.data: true       # true: 表示可以存储数据。 (不用修改)
node.ingest: false   # 文档存入索引之前对文档进行预处理 (不用修改)
network.host: 0.0.0.0   # 监听地址,可以写本地ip,通过此地址可以访问到es (不用修改)
http.port: 9200   # 监听端口 单机集群需要不同
transport.port: 9300   # 集群监听端口 单机集群需要不同
discovery.seed_hosts: ["127.0.0.1:9300","127.0.0.1:9301","127.0.0.1:9302"]  # 有资格成为主节点的地址列表
cluster.initial_master_nodes: ["node-1","node-2","node-3"]  # 初始的候选master节点列表。必须和node.name的值一致。
http.cors.enabled: true  # true: 表示允许跨域。 (不用修改)
http.cors.allow-origin: "*"  #表示支持所有域名 (不用修改)

config/jvm.options JVM的配置

默认是1G

-Xms300m
-Xmx300m

官方建议不要超过物理内存的百分之50 最大不要超过30g

启动ES

进入到es目录里然后执行下面命令

前台启动

./bin/elasticsearch

后台启动

./bin/elasticsearch -d -p pid

关闭后台启动的es

pkill -F pid

查看ES节点状态

curl -X GET "localhost:9200/?pretty"       #查看单节点状态
curl -X GET "http://127.0.0.1:9200/_cat/nodes"  # 查看集群状态

搭建ES中遇到的问题

max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

解决办法

vi /etc/sysctl.conf

然后在文件最后添加

vm.max_map_count=655360

然后执行 sysctl -p

max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]

解决办法

vi /etc/security/limits.conf

然后在文件最后添加

* soft nofile 300000
* hard nofile 300000
* soft nproc 102400
* soft memlock unlimited
* hard memlock unlimited

master_not_discovered_exception/#

主节点指定的名字要保证存在,别指定了不存在的节点名。

单机版ES集群

最近在看es相关的知识,此处简单记录一下es集群的搭建步骤。因为本地机器有限,此处模拟一下在同一台机器上搭建三个节点的集群

不用你去网上下载了,也不用你去配置了我直接给你配置好了,拿去就能用

7.3.0单机版ES集群

链接:https://pan.baidu.com/s/10KI3BuqedbhlPRicaQOGCg
提取码:1234

上传到linux 上然后

yum -y install  unzip
unzip 7.3.0单机版ES集群.zip

使用root用户进入7.3.0单机版ES集群目录里 ,给这些目录加上权限

chown -R  es  elasticsearch-7.3.0-1
chown -R  es  elasticsearch-7.3.0-2
chown -R  es  elasticsearch-7.3.0-3

然后切换到 es 用户,启动这三个节点

注意: 我给ES的JVM默认配置的是300M 需要你自己根据业务调整

如果你觉得3个节点不够那么你可以把node-1节点复制一份改一改就行

多机版ES集群

比单机集群更简单,就是把节点名称改改就行了,其他的配置所有节点保持一致

不用你去网上下载了,也不用你去配置了我直接给你配置好了,拿去就能用

7.3.0多机版ES集群

链接:https://pan.baidu.com/s/1yaFADoEQnrQKZ95xjvkYrg
提取码:1234

上传到linux 上然后

yum -y install  unzip
unzip 7.3.0多机版ES集群.zip

使用root用户进入7.3.0单机版ES集群目录里 ,给这些目录加上权限

chown -R  es  elasticsearch-7.3.0-1
chown -R  es  elasticsearch-7.3.0-2
chown -R  es  elasticsearch-7.3.0-3

然后切换到 es 用户,启动这三个节点

注意: 我给ES的JVM默认配置的是300M 需要你自己根据业务调整

如果你觉得3个节点不够那么你可以把node-1节点复制一份改一改就行

可视化工具

elasticsearch-head

yum -y install git

git clone git://github.com/mobz/elasticsearch-head.git //git下载相关资源

cd elasticsearch-head //进入相关的目录

npm install

npm run start

然后耐心等待,就可以了。

http://192.168.81.141:9100

kibana (版本必须和ES版本保持一致) (推荐)

官方地址:https://www.elastic.co/cn/products/kibana

cd /usr/src

wget https://artifacts.elastic.co/downloads/kibana/kibana-7.3.0-linux-x86_64.tar.gz

tar zxvf kibana-7.3.0-linux-x86_64.tar.gz

cd kibana-7.3.0-linux-x86_64

cd kibana-7.3.0-linux-x86_64/config

修改kibana.yml配置文件

server.port: 5601  # 开启默认端口号
server.host: "192.168.81.142"  #写当前kibana的ip 不然打不开kbana
i18n.locale: "zh-CN"   #使用kibana中文
./bin/kibana --allow-root   # 使用root用户启动

http://192.168.81.143:5601

IK 分词器

介绍

为什么要在elasticsearch中要使用ik这样的中文分词呢,那是因为es提供的分词是英文分词,对于中文的分词就做的非常不好了,因此我们需要一个中文分词器来用于搜索和使用。

支持中文分词的分词器有很多,word分词器、庖丁解牛、盘古

分词、Ansj分词等,但我们常用的还是下面要介绍的IK分词器。

IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始,

IKAnalyzer已经推出 了3个大版本。最初,它是以开源项目Lucene为应用主体的,结合词典分词和文法分析算法的

中文分词组件。新版本的IKAnalyzer3.0则发展为 面向Java的公用分词组件,独立于Lucene项目,同时提供了对

Lucene的默认优化实现。

IK分词器特性如下:

1)采用了特有的“正向迭代最细粒度切分算法“,具有60万字/秒的高速处理能力。

2)采用了多子处理器分析模 式,支持:英文字母(IP地址、Email、URL)、数字(日期,常用中文数量词,罗马数字,科学计数法),中文 词汇(姓名、地名处理)等分词处理。

3)对中英联合支持不是很好,在这方面的处理比较麻烦.需再做一次查询,同时是支持个人词条的优化的词典存储,更小的内存占用。 4)支持用户词典扩展定义。 5)针对Lucene全文检索优 化的查询分析器IKQueryParser;采用歧义分析算法优化查询关键字的搜索排列组合,能极大的提高Lucene检索的 命中率。

倒排索引

倒排表以字或词为关键字进行索引,表中关键字所对应的记录表项记录了出现这个字或词的所有文档,一个表项就是一个字表段,它记录该文档的ID和字符在该文档中出现的位置情况。
   由于每个字或词对应的文档数量在动态变化,所以倒排表的建立和维护都较为复杂,但是在查询的时候由于可以一次得到查询关键字所对应的所有文档,所以效率高于正排表。在全文检索中,检索的快速响应是一个最为关键的性能,而索引建立由于在后台进行,尽管效率相对低一些,但不会影响整个搜索引擎的效率。

安装IK分词器

cd  /usr/src/elasticsearch-7.3.0-1/plugins

mkdir analysis-ik

cd  analysis-ik

wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.3.0/elasticsearch-analysis-ik-7.3.0.zip

yum -y install unzip

unzip -o  elasticsearch-analysis-ik-7.3.0.zip

然后重启 elasticsearch-7.3.0 即可自动加载IK分词器

[2021-08-03T18:54:42,354][INFO ][o.e.p.PluginsService     ] [node-2] loaded plugin [analysis-ik]

当我们看到有这些的信息 那么 就表示 成功了

IK分词器测试

IK提供了两个分词算法ik_smart 和 ik_max_word

其中 ik_smart 为最少切分,ik_max_word为最细粒度划分

我们分别来试一下 :

先创建一个索引

PUT http://192.168.81.140:9200/test/

然后测试索引

POST http://192.168.81.140:9200/test/_analyze 最少切分

{
  "analyzer": "ik_smart",
  "text": "我是中国人"
}

结果:

{
    "tokens": [
        {
            "token": "我",
            "start_offset": 0,
            "end_offset": 1,
            "type": "CN_CHAR",
            "position": 0
        },
        {
            "token": "是",
            "start_offset": 1,
            "end_offset": 2,
            "type": "CN_CHAR",
            "position": 1
        },
        {
            "token": "中国人",
            "start_offset": 2,
            "end_offset": 5,
            "type": "CN_WORD",
            "position": 2
        }
    ]
}

POST http://192.168.81.140:9200/test/_analyze 最细粒度划分

{
  "analyzer": "ik_max_word",
  "text": "我是中国人"
}

结果

{
    "tokens": [
        {
            "token": "我",
            "start_offset": 0,
            "end_offset": 1,
            "type": "CN_CHAR",
            "position": 0
        },
        {
            "token": "是",
            "start_offset": 1,
            "end_offset": 2,
            "type": "CN_CHAR",
            "position": 1
        },
        {
            "token": "中国人",
            "start_offset": 2,
            "end_offset": 5,
            "type": "CN_WORD",
            "position": 2
        },
        {
            "token": "中国",
            "start_offset": 2,
            "end_offset": 4,
            "type": "CN_WORD",
            "position": 3
        },
        {
            "token": "国人",
            "start_offset": 3,
            "end_offset": 5,
            "type": "CN_WORD",
            "position": 4
        }
    ]
}

从上面我们就可以看出来 区别了吧 如果内容较为庞大的情况下不建议使用最细切分那样会导致速度非常慢

既然了解了 IK 那么我们就将IK 映射到Mapping中吧

修改索引映射mapping

重建索引

删除原有blog2索引

使用DELETE请求 http://localhost:9200/blog2

创建blog2索引,此时分词器使用ik_max_word

使用PUT请求 http://localhost:9200/blog2

Body

{
    "mappings":{
        "article":{
            "properties":{
                "id":{
                    "type":"long",
                    "store":true,
                    "index":false
                },
                "title":{
                    "type":"text",
                    "store":true,
                    "index":true,
                    "analyzer":"ik_max_word"
                },
                "content":{
                    "type":"text",
                    "store":true,
                    "index":true,
                    "analyzer":"ik_max_word"
                }
            }
        }
    }
}

创建索引blog2 和表article 以及表结构

elasticsearch-head里 查看索引信息

使用POST请求 http://localhost:9200/blog2/article/1

向blog2索引内article表中添加 文档id为1 的 一行数据

Body

{
    "id":1,
    "title":"ElasticSearch是一个基于Lucene的搜索服务器",
    "content":"它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java 开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时 搜索,稳定,可靠,快速,安装使用方便。"
}

我们使用 最细切分 来看看 切分后的结果 然后在进行 query_string查询 和 term查询

http://127.0.0.1:9200/_analyze?analyzer=ik_max_word&pretty=true&text=ElasticSearch是一个基于Lucene的搜索服务器

token	"elasticsearch"

token	"是"

token	"一个"

token	"一"

token	"个"

token	"基于"
	
token	"lucene"
	
token	"的"

token	"搜索"

token	"服务器"

token	"服务"

token	"器"

上面就是ik 分词集

我们使用query_String查询 看看有什么变化

发送POST请求 http://localhost:9200/blog2/article/_search

Body

{
    "query":{
        "query_string":{
            "default_field":"title",
            "query":"搜索服务器"
        }
    }
}

结果 是能查询到的 默认采用的是 or 匹配 在ik分词集里 是能匹配到的

然后我们在试试 将请求体搜索服务器字符串修改为 钢索,再次查询 发现并没有查询到

因为 在ik分词集里没有 钢 或者 索 的词

我们使用 term 查询 看看有什么变化

发送POST请求 http://localhost:9200/blog2/article/_search

Body

{
    "query":{
        "term":{
            "title":"搜索"
        }
    }
}

结果发现 是能查询到的 因为在ik分词集里是能找到搜索 这个词

相关文章