Elasticsearch高可用集群搭建部署调优生产可用

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

Elasticsearch 的基础核心概念:
接近实时(NRT)
elasticsearch 是一个接近实时的搜索平台,这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是 1 秒)

集群(cluster)
一个集群就是由一个或多个节点组织在一起,它们共同持有你整个的数据,并一起提供索引和搜索功能。其中一个节点为主节点,这个主节点是可以通过选举产生的,并提供跨节点的联合索引和搜索的功能。集群有一个唯一性标示的名字,默认是 elasticsearch,集群名字很重要,每个节点是基于集群名字加入到其集群中的。因此,确保在不同环境中使用不同的集群名字。一个集群可以只有一个节点。强烈建议在配置 elasticsearch 时,配置成集群模式。

节点(node)
节点就是一台单一的服务器,是集群的一部分,存储数据并参与集群的索引和搜索功能。像集群一样,节点也是通过名字来标识,默认是在节点启动时随机分配的字符名。当然,你可以自己定义。该名字也很重要,在集群中用于识别服务器对应的节点。
节点可以通过指定集群名字来加入到集群中。默认情况,每个节点被设置成加入到 elasticsearch集群。如果启动了多个节点,假设能自动发现对方,他们将会自动组建一个名为 elasticsearch 的集群。

索引(index)
一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。在一个集群中,如果你想,可以定义任意多的索引。
索引相对于关系型数据库的库。
类型(type)
在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。
类型相对于关系型数据库的表。

文档(document)
一个文档是一个可被索引的基础信息单元。比如,你可以拥有某一个客户的文档,某一个产品的一个文档,当然,也可以拥有某个订单的一个文档。文档以 JSON(Javascript Object Notation)格式来表示,而 JSON 是一个到处存在的互联网数据交互格式。 在一个 index/type 里面,只要你想,你可以存储任意多的文档。注意,虽然一个文档在物理上位于一个索引中,实际上一个文档必须在一个索引内被索引和分配一个类型。
文档相对于关系型数据库的列。

分片和副本(shards & replicas)
在实际情况下,索引存储的数据可能超过单个节点的硬件限制。如一个 10 亿文档需 1TB 空间可能不适合存储在单个节点的磁盘上,或者从单个节点搜索请求太慢了。为了解决这个问题,elasticsearch 提供将索引分成多个分片的功能。当在创建索引时,可以定义想要分片的数量。每一个分片就是一个全功能的独立的索引,可以位于集群中任何节点上。
分片的两个最主要原因:
a. 水平分割扩展,增大存储量
b. 分布式并行跨分片操作,提高性能和吞吐量
分布式分片的机制和搜索请求的文档如何汇总完全是有 elasticsearch 控制的,这些对用户而言是透明的。

网络问题等等其它问题可以在任何时候不期而至,为了健壮性,强烈建议要有一个故障切换机制,无论何种故障以防止分片或者节点不可用。 为此,elasticsearch 让我们将索引分片复制一份或多份,称之为分片副本或副本。
副本也有两个最主要原因:
a. 高可用性,以应对分片或者节点故障。出于这个原因,分片副本要在不同的节点上。
b. 提供性能,增大吞吐量,搜索可以并行在所有副本上执行。
总之,每个索引可以被分成多个分片。一个索引也可以被复制 0 次(意思是没有复制)或多次。

总之一旦复制了,每个索引就有了主分片(作为复制源的原来的分片)和复制分片(主分片的拷贝)之别。分片和副本的数量可以在索引创建的时候指定。在索引创建之后,你可以在任何时候动态地改变副本的数量,但是你事后不能改变分片的数量。

默认情况下,Elasticsearch 中的每个索引被分片 5 个主分片和 1 个副本,这意味着,如果你的集群中至少有两个节点,你的索引将会有 5 个主分片和另外 5 个副本分片(1 个完全拷贝),这样的话每个索引总共就有 10 个分片

2)Elasticsearch集群部署
搭建Elasticsearch集群要注意集群中的Master数量因是"候选master/2+1".
架构图:
Elasticsearch高可用集群搭建部署调优生产可用_第1张图片
2.1 生产环境系统配置,其余节点配置相同。
安装基本软件包
yum install net-tools wget lrzsz lsof epel-release vim bash-completion make cmake gcc gcc-c++ screen -y
安装JAVA环境
JDK安装包:https://pan.baidu.com/s/1T6QpR7tpwiAGKLGpAKSPDw
Elasticsearch高可用集群搭建部署调优生产可用_第2张图片
运行”java -version“命令检查java环境是否安装成功。

设置JVM堆大小
Elasticsearch将 通过Xms(最小堆大小)和Xmx(最大堆大小)设置分配jvm.options中指定的整个堆。

cat >>/etc/profile <<HERE
export ES_MIN_MEM=1g
export ES_MAX_MEM=1g
HERE
source /etc/profile

禁止交换
swapoff -a
永久禁止修改/etc/fstab文件。
注释掉有"swap"的所有行
增加文件描述符

		vi /etc/security/limits.conf 
		* soft nofile 65536
		* hard nofile 65536
		* soft nproc 2048
		* hard nproc 4096

确保有足够的虚拟内存

		vi /etc/sysctl.conf 
		vm.max_map_count=655360
		执行命令:
		sysctl -p
		永久修改
		编辑/etc/sysctl.conf
		添加vm.max_map_count=655360,然后重启
		运行sysctl vm.max_map_count

确保足够的线程
保证Elasticsearch用户可以创建的线程数至少为4096。
可以通过ulimit -u 4096在启动Elasticsearch之前设置为root或设置nproc为4096 in来完成/etc/security/limits.conf。

2.2 名称解析
编辑/etc/hosts文件.

	vim /etc/hosts
		127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
		::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
		192.168.2.17    ES1
		192.168.3.25    ES2
		192.168.2.21    ES3
		192.168.2.15    Management
		192.168.2.16    es5
		192.168.2.22    es6

scp拷贝到其余ES上去。

2.3 创建elasticsearch账户

    groupadd elasticsearch
	useradd -g elasticsearch elasticsearch -s /bin/bash

2.4 下载源码包

curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch`-6.0.1.tar.gz

2.5 解压并赋权

	tar zxf elasticsearch-6.0.1.tar.gz -C /usr/local
	chown -R elasticsearch:elasticsearch /usr/local/elasticsearch-6.0.1

编辑 /usr/local/elasticsearch-6.0.1/config/elasticsearch.yml

# ======================== Elasticsearch Configuration =========================
#
# NOTE: Elasticsearch comes with reasonable defaults for most settings.
#       Before you set out to tweak and tune the configuration, make sure you
#       understand what are you trying to accomplish and the consequences.
#
# The primary way of configuring a node is via this file. This template lists
# the most important settings you may want to configure for a production cluster.
#
# Please consult the documentation for further information on configuration options:
# https://www.elastic.co/guide/en/elasticsearch/reference/index.html
#
# ---------------------------------- Cluster -----------------------------------
#
# Use a descriptive name for your cluster:
#
#cluster.name: my-application
#集群名称,若在相同一个集群内,集群名称需一致
cluster.name: my-es-cluster
#
# ------------------------------------ Node ------------------------------------
#
# Use a descriptive name for the node:
#
#node.name: node-1
#节点名称,不同的节点修改为自己的hostname主机名
node.name: Management
#
# Add custom attributes to the node:
#
#node.attr.rack: r1
#
# ----------------------------------- Paths ------------------------------------
#
# Path to directory where to store the data (separate multiple locations by comma):
#
#path.data: /path/to/data
#数据目录存放位置
path.data: /data/es_data
#
# Path to log files:
#
#path.logs: /path/to/logs
#日志存放路径
path.logs: /data/es_logs
#
# ----------------------------------- Memory -----------------------------------
#
# Lock the memory on startup:
#
#bootstrap.memory_lock: true
#不在启动的时候锁定内存
bootstrap.memory_lock: false
#
# Make sure that the heap size is set to about half the memory available
# on the system and that the owner of the process is allowed to use this
# limit.
#
# Elasticsearch performs poorly when the system is swapping the memory.
#
# ---------------------------------- Network -----------------------------------
#
# Set the bind address to a specific IP (IPv4 or IPv6):
#
#network.host: 192.168.0.1
#提供服务绑定的IP地址,0.0.0.0代表所有地址
network.host: 0.0.0.0
#
# Set a custom port for HTTP:
#
侦听端口地址
http.port: 9200
#
# For more information, consult the network module documentation.
#
# --------------------------------- Discovery ----------------------------------
#
# Pass an initial list of hosts to perform discovery when new node is started:
# The default list of hosts is ["127.0.0.1", "[::1]"]
#
#discovery.zen.ping.unicast.hosts: ["host1", "host2"]
#集群发现通过单播实现
discovery.zen.ping.unicast.hosts: ["ES1", "ES2", 'ES3', "Management", "es5", "es6"]
#
# Prevent the "split brain" by configuring the majority of nodes (total number of master-eligible nodes / 2 + 1):
#
#设置了最少有多少个备选主节点参加选举,同时也设置了一个主节点需要控制最少多少个备选主节点才能继续保持主节点身份。
#如果控制的备选主节点少于discovery.zen.minimum_master_nodes个,那么当前主节点下台,重新开始选举。
discovery.zen.minimum_master_nodes: 3
#
# For more information, consult the zen discovery module documentation.
#
# ---------------------------------- Gateway -----------------------------------
#
# Block initial recovery after a full cluster restart until N nodes are started:
#
#gateway.recover_after_nodes: 3
#
# For more information, consult the gateway module documentation.
#
# ---------------------------------- Various -----------------------------------
#
# Require explicit names when deleting indices:
#
#action.destructive_requires_name: true
#开启跨域访问支持,默认为 false
http.cors.enabled: true
#跨域访问允许的域名地址
http.cors.allow-origin: "*"
#该节点没有资格成为候选master
node.master: false
#该节点允许存储数据
node.data: true

注释:
http.port
//设置客户端的http监听端口,若是存在多台集群机器,可以不去做设置,默认值为9200,若是在一台机器上启动了多个es,则需要修改此端口号,防止端口冲突和被占用。
transport.tcp.port
//设置节点与节点之间相互通信的客户端端口,默认值为9300,同上,同一台机器需要修改此端口号
discovery.zen.ping.timeout
//设置发现其他节点并得到响应的等待时间,在网络慢的情况下,设置更高的等待值。

创建数据存放路径并授权

mkdir -p /data/es_data
mkdir /data/es_logs
chown -R elasticsearch:elasticsearch /data

创建新的终端会话并切换用户

	screen -S es
	su - elasticsearch
	cd /usr/local/elasticsearch-6.0.1/bin/
	./elasticsearch
快捷键:Alt+A+D后台运行。

查看端口:

[root@es6 opt]# netstat -anput | grep 9200
tcp6       0      0 :::9200                 :::*                    LISTEN      53278/java          
[root@es6 opt]# netstat -anput | grep 9300
tcp6       0      0 :::9300                 :::*                    LISTEN      53278/java 

WEB页面查看节点情况:
通过浏览器中输入 http://IP:9200/_cluster/health?pretty 查看集群的健康情况,可以看到 status 为 green 绿色。
Elasticsearch高可用集群搭建部署调优生产可用_第3张图片
通过浏览器中输入 http://IP:9200/_cluster/state?pretty 查看集群的状态信息
Elasticsearch高可用集群搭建部署调优生产可用_第4张图片
以上方式查看集群状态都不是很直观,可以安装 elasticsearch-head 插件,以便方便管理集群。

安装 elasticsearch-head 插件,其余节点相同,这里我只在master节点上安装了。
注意:需要
安装基本命令:

yum install git npm
下载elasticsearch-head
安装 docker 镜像或者通过 github 下载 elasticsearch-head 项目都是可以的,1 或 者 2 两种方式选择一种安装使用即可
1. 使用 docker 的集成好的 elasticsearch-head
	 # docker run -p 9100:9100 mobz/elasticsearch-head:5
	 docker 容器下载成功并启动以后,运行浏览器打开 http://localhost:9100/
2.git安装
		git clone git://github.com/mobz/elasticsearch-head.git
		cd elasticsearch-head/
		npm install
		npm run start
检查端口是否起来
	 netstat -antp |grep 9100

浏览器访问测试是否正常
http://IP:9100/
Elasticsearch高可用集群搭建部署调优生产可用_第5张图片
Elasticsearch高可用集群搭建部署调优生产可用_第6张图片
插入测试数据
[root@ES1 ~]# curl -XPUT ‘192.168.2.21:9200/index-demo/test/1?pretty&pretty’ -H ‘Content-Type: application/json’ -d ‘{ “user”: “zhangsan”,“mesg”:“hello world” }’
{
“_index” : “index-demo”,
“_type” : “test”,
“_id” : “1”,
“_version” : 1,
“result” : “created”,
“_shards” : {
“total” : 2,
“successful” : 2,
“failed” : 0
},
“_seq_no” : 0,
“_primary_term” : 1
}
Elasticsearch高可用集群搭建部署调优生产可用_第7张图片
可以明确的看到索引存储在了数据节点上。

使用postman Post elasticsearch数据
Elasticsearch高可用集群搭建部署调优生产可用_第8张图片
【总结】
Elasticsearch节点角色类型
在生产中,高并发的场景容易出现脑裂问题,而在Elasticsearch集群亦是如此,Elasticsearch集群中的每个节点都可以成为主节点,存储数据,提供查询服务
而这些事由两个属性参数控制的也就是node,master和node.data
1:这两种组合表示这个节点有资格成为主节点,又要存储数据,如果该节点真的成为主节点的话,那么自己还要存储数据,压力是相当大的,生产不建议这样配置
node.master: true
node.data:true
2:这种组合是数据存储节点,既不参与选举,也不会成为成为主节点,因为没有成为主节点的资格,只能是数据存储节点
node.master:false
node.date: true
3:拥有参与选举主节点的资格,不会存储节点数据,该节点我们称之为master主节点
node.master: true
node.data: false
4:该节点为客户端节点,数据存储和主节点资格两项都没有,只能处理客户端请求,对海量的请求进行负载均衡
node.master: false
node.date: false

在一个生产集群中我们可以对这些节点的职责进行划分。
建议集群中设置3台以上的节点作为master节点【node.master: true node.data: false】这些节点只负责成为主节点,维护整个集群的状态。
再根据数据量设置一批data节点【node.master: false node.data: true】
这些节点只负责存储数据,后期提供建立索引和查询索引的服务,这样的话如果用户请求比较频繁,这些节点的压力也会比较大所以在集群中建议再设置一批client节点【node.master: false node.data: true】这些节点只负责处理用户请求,实现请求转发,负载均衡等功能。通过client node导入可以实现数据分片负载。

你可能感兴趣的:(Elasticsearch,elasticsearch,分布式,大数据,运维,linux)