Elasticsearch:1.集群搭建

简介

基本概念

  • cluster

代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的。

  • shards

代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。

  • replicas

代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。

  • recovery

代表数据恢复或叫数据重新分布,es在有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。

  • river

代表es的一个数据源,也是其它存储方式(如:数据库)同步数据到es的一个方法。它是以插件方式存在的一个es服务,通过读取river中的数据并把它索引到es中,官方的river有couchDB的,RabbitMQ的,Twitter的,Wikipedia的。

  • gateway

代表es索引快照的存储方式,es默认是先把索引存放到内存中,当内存满了时再持久化到本地硬盘。gateway对索引快照进行存储,当这个es集群关闭再重新启动时就会从gateway中读取索引备份数据。es支持多种类型的gateway,有本地文件系统(默认),分布式文件系统,Hadoop的HDFS和amazon的s3云存储服务。

  • discovery.zen

代表es的自动发现节点机制,es是一个基于p2p的系统,它先通过广播寻找存在的节点,再通过多播协议来进行节点之间的通信,同时也支持点对点的交互。

  • Transport

代表es内部节点或集群与客户端的交互方式,默认内部是使用tcp协议进行交互,同时它支持http协议(json格式)、thrift、servlet、memcached、zeroMQ等的传输协议(通过插件方式集成)。

健康状态

针对一个索引,Elasticsearch 中其实有专门的衡量索引健康状况的标志,分为三个等级:

  • green,绿色。这代表所有的主分片和副本分片都已分配。你的集群是 100% 可用的。
  • yellow,黄色。所有的主分片已经分片了,但至少还有一个副本是缺失的。不会有数据丢失,所以搜索结果依然是完整的。不过,你的高可用性在某种程度上被弱化。如果更多的分片消失,你就会丢数据了。所以可把 yellow 想象成一个需要及时调查的警告。
  • red,红色。至少一个主分片以及它的全部副本都在缺失中。这意味着你在缺少数据:搜索只能返回部分数据,而分配到这个分片上的写入请求会返回一个异常。

如果你只有一台主机的话,其实索引的健康状况就是 yellow,因为一台主机,集群没有其他的主机可以防止副本,所以说,这就是一个不健康的状态,因此集群也是十分有必要的。

节点的4种类型

  • 主节点:即 Master 节点。主节点的主要职责是和集群操作相关的内容,如创建或删除索引,跟踪哪些节点是群集的一部分,并决定哪些分片分配给相关的节点。稳定的主节点对集群的健康是非常重要的。默认情况下任何一个集群中的节点都有可能被选为主节点。索引数据和搜索查询等操作会占用大量的cpu,内存,io资源,为了确保一个集群的稳定,分离主节点和数据节点是一个比较好的选择。虽然主节点也可以协调节点,路由搜索和从客户端新增数据到数据节点,但最好不要使用这些专用的主节点。一个重要的原则是,尽可能做尽量少的工作。
  • 数据节点:即 Data 节点。数据节点主要是存储索引数据的节点,主要对文档进行增删改查操作,聚合操作等。数据节点对 CPU、内存、IO 要求较高,在优化的时候需要监控数据节点的状态,当资源不够的时候,需要在集群中添加新的节点。
  • 负载均衡节点:也称作 Client 节点,也称作客户端节点。当一个节点既不配置为主节点,也不配置为数据节点时,该节点只能处理路由请求,处理搜索,分发索引操作等,从本质上来说该客户节点表现为智能负载平衡器。独立的客户端节点在一个比较大的集群中是非常有用的,他协调主节点和数据节点,客户端节点加入集群可以得到集群的状态,根据集群的状态可以直接路由请求。
  • 预处理节点:也称作 Ingest 节点,在索引数据之前可以先对数据做预处理操作,所有节点其实默认都是支持 Ingest 操作的,也可以专门将某个节点配置为 Ingest 节点。
    以上就是节点几种类型,一个节点其实可以对应不同的类型,如一个节点可以同时成为主节点和数据节点和预处理节点,但如果一个节点既不是主节点也不是数据节点,那么它就是负载均衡节点。具体的类型可以通过具体的配置文件来设置。

环境

[root@centos181002 ~]# cat /etc/centos-release
CentOS Linux release 7.6.1810 (Core) 

elasticsearch-6.6.0.rpm

节点1:centos181001 10.0.1.61
节点2:centos181002 10.0.1.62
节点3:centos181003 10.0.1.63

第一步:系统优化设置

1.告诉操作系统可以无限制分配内存给一个进程

echo '* soft memlock unlimited' >>/etc/security/limits.conf
echo '* hard memlock unlimited' >>/etc/security/limits.conf
cat /etc/security/limits.conf

2.禁用SWAP

## 完全禁用SWAP
## swapoff -a
## 尽量避免使用SWAP
echo 'vm.swappiness = 1' >> /etc/sysctl.conf

3. 修改最大打开文件描述符

echo '* soft nofile 65535' >> /etc/security/limits.conf
echo '* hard nofile 65535' >> /etc/security/limits.conf
cat /etc/security/limits.conf
ulimit -n 65535

4.重启生效

init 6

第二步:安装和配置Elasticsearch

1.下载并安装

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.6.0.rpm
rpm -ivh elasticsearch-6.6.0.rpm

2.修改配置文件以支持集群

1.注意修改network.host为各节点IP地址
2.注意修改discovery.zen.ping.unicast.hosts列表
cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak
cat <>/etc/elasticsearch/elasticsearch.yml
## 集群名称
cluster.name: my-cs-cluster

## 节点名称(每个节点名称不能相同)
node.name: `hostname`

## 允许 JVM 锁住内存,禁止操作系统交换出去
# bootstrap.memory_lock: true

## 是否有资格成为主节点
## 通过 node.master 可以配置该节点是否有资格成为主节点,如果配置为 true,则主机有资格成为主节点
## 注意这里是有资格成为主节点,不是一定会成为主节点
node.master: true

## 是否是数据节点
## 当 node.master 和 node.data 均为 false,则该主机会作为负载均衡节点
node.data: true

## 设置访问的地址和端口
network.host: 192.168.30.41
http.port: 9200

## 集群地址设置
## 配置之后集群的主机之间可以自动发现
discovery.zen.ping.unicast.hosts: ["192.168.30.41", "192.168.30.42", "192.168.30.43"]

## 配置大多数节点(通常为主节点的节点总数/ 2 + 1)来防止“裂脑”:
discovery.zen.minimum_master_nodes: 2

## 在完全集群重启后阻止初始恢复,直到启动N个节点
gateway.recover_after_nodes: 2
EOF
vim /etc/elasticsearch/elasticsearch.yml

3.为elasticsearch设置jdk路径,否则启动时候会报错

请根据自己实际路径进行修改
cp /etc/sysconfig/elasticsearch /etc/sysconfig/elasticsearch.bak
cat <>/etc/sysconfig/elasticsearch
JAVA_HOME=/home/jdk1.8.0_202
EOF

4.设置堆内存(根据物理内存情况设置)

http://openskill.cn/article/304
https://www.elastic.co/guide/en/elasticsearch/guide/current/heap-sizing.html
https://www.elastic.co/guide/cn/elasticsearch/guide/current/_limiting_memory_usage.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html

## 编辑以下值
## 内存设置为物理内存的50%,并且不要超过32G
## 确保这两个值相等,防止程序在运行时改变堆内存大小, 这是一个很耗系统资源的过程
cp /etc/elasticsearch/jvm.options /etc/elasticsearch/jvm.options.bak
vim /etc/elasticsearch/jvm.options

-Xms2g
-Xmx2g

5.启动服务

systemctl daemon-reload
systemctl enable elasticsearch.service
systemctl stop elasticsearch.service
systemctl start elasticsearch.service
systemctl status elasticsearch.service

6.验证

curl -X GET "192.168.30.41:9200/"
curl -X GET "192.168.30.42:9200/"
curl -X GET "192.168.30.43:9200/"

curl -XGET 'http://192.168.30.41:9200/_cat/nodes?pretty'
curl -XGET 'http://192.168.30.42:9200/_cat/nodes?pretty'
curl -XGET 'http://192.168.30.43:9200/_cat/nodes?pretty'

curl -XGET 'http://192.168.30.41:9200/_cat?pretty'
curl -XGET 'http://192.168.30.42:9200/_cat?pretty'
curl -XGET 'http://192.168.30.43:9200/_cat?pretty'

    _cat代表查看信息
    nodes为查看节点信息,默认会显示为一行,所以就用刀了?preety让信息更有好的显示
    ?preety让输出信息更友好的显示

第三步:安装中文分词器 elasticsearch-analysis-ik

https://github.com/medcl/elasticsearch-analysis-ik

1.创建目录

mkdir /usr/share/elasticsearch/plugins/ik

2.下载并解压

cd /usr/share/elasticsearch/plugins/ik
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.6.0/elasticsearch-analysis-ik-6.6.0.zip
unzip elasticsearch-analysis-ik-6.6.0.zip

3.重启 Elasticsearch

systemctl stop elasticsearch.service
systemctl start elasticsearch.service
systemctl status elasticsearch.service

4.验证

## 1.登录 Kibana 
## 2.Dev Tools - Console

    GET _analyze?pretty
    {
      "analyzer": "ik_smart",
      "text":"安徽省长江流域"
    }

    GET _analyze?pretty
    {
      "analyzer": "ik_max_word",
      "text":"安徽省长江流域"
    }

附录:

JAVA_HOME=`/usr/libexec/java_home -v 1.8` java -Xmx32766m -XX:+PrintFlagsFinal 2> /dev/null | grep UseCompressedOops
bool UseCompressedOops   := true
JAVA_HOME=`/usr/libexec/java_home -v 1.8` java -Xmx32767m -XX:+PrintFlagsFinal 2> /dev/null | grep UseCompressedOops
bool UseCompressedOops   = false

你可能感兴趣的:(Elasticsearch:1.集群搭建)