02 . Elasticsearch集群搭建

2022-05-09 15:44:01 浏览数 (1)

Elasticsearch发展历史
从开源到上市
同类型产品
起源
Elasticsearch诞生
Elasticsearch分布式架构
Elasticsearch支持多种接入方式
Elasticsearch主要功能
市场反应
Elasticsearch5.x新特性
Elasticsearch6.x新特性
Elasticsearch7.x新特性
Elasticsearch家族成员
Elastic Stack生态圈
Logstash:数据处理管道

主要特性

代码语言:javascript复制
Beats
ELK用户及应用场景
Elasticsearch与数据库的集成
日志分析/指标分析
ES概念简介

Elasticsearch是一个高度可扩展RESTful风格的开源全文搜索和分析引擎,基于JAVA语言编写,它内部使用的是Apache Lucene做索引功能。 Apache Lucene是一款高性能的、可扩展的信息检索工具库,提供索引功能的信息检索工具库。同样由Java语言开发、自由开源的搜索类库,基于Apache协议授权。Lucene只是一个软件类库,如果要发挥Lucene的功能,还需要开发一个调用Lucene类库的应用程序。但是Apache Lucene已被集成在Elasticsearch当中,所以我们并不需要去单独配置Apache Lucene

Cluster 集群

一个 Elasticsearch 集群由一个或多个节点(Node)组成,每个集群都有一个共同的集群名称作为标识

Node节点

一个 Elasticsearch 实例即一个 Node,一台机器可以有多个实例,正常使用下每个实例应该会部署在不同的机器上。 Elasticsearch 的配置文件中可以通过 node.master、 node.data 来设置节点类型 node.master:表示节点是否具有成为主节点的资格

代码语言:javascript复制
# true代表的是有资格竞选主节点
# false代表的是没有资格竞选主节点

node.data:表示节点是否存储数据

代码语言:javascript复制
# true代表存储数据
# false代表不存储数据
Node节点组合

主节点 数据节点(master data)

代码语言:javascript复制
# 节点即有成为主节点的资格,又存储数据
node.master: true
node.data: true

数据节点(data)

代码语言:javascript复制
# 节点没有成为主节点的资格,不参与选举,只会存储数据
node.master: false
node.data: true

客户端节点(client)

代码语言:javascript复制
# 不会成为主节点,也不会存储数据,主要是针对海量请求的时候可以进行负载均衡
node.master: false
node.data: false
分片

每个索引有一个或多个分片,每个分片存储不同的数据。分片可分为主分片( primary shard)和复制分(replica shard),复制分片是主分片的拷贝。默认每个主分片有一个复制分片,一个索引的复制分片的数量可以动态地调整,复制分片从不与它的主分片在同一个节点上.

环境及软件
代码语言:javascript复制
List:
	CentOS7.3.1611
	elasticsearch-7.2.0-linux-x86_64.tar.gz
	jdk-8u121-linux-x64.rpm
	cerebro-0.8.3.tgz
	

# 因为ES7已经内置了所需的java的JDK版本,因此在此不再介绍java安装
# ES7安装方式使用RPM安装方式。

# 架构设计
# ES-Master:  我们设定192.168.0.117为Master节点
# ES-Data:	我们设定192.168.0.115和192.168.0.108专门存储数据节点
ES节点列表

IP

节点名

192.168.43.176

node-a

192.168.43.164

node-b

192.168.43.215

node-c

准备系统环境
代码语言:javascript复制
init_security() {
systemctl stop firewalld
systemctl disable firewalld &>/dev/null
setenforce 0
sed -i '/^SELINUX=/ s/enforcing/disabled/'  /etc/selinux/config
sed -i '/^GSSAPIAu/ s/yes/no/' /etc/ssh/sshd_config
sed -i '/^#UseDNS/ {s/^#//;s/yes/no/}' /etc/ssh/sshd_config
systemctl enable sshd crond &> /dev/null
rpm -e postfix --nodeps
echo -e "33[32m [安全配置] ==> OK 33[0m"
}
init_security

init_yumsource() {
if [ ! -d /etc/yum.repos.d/backup ];then
    mkdir /etc/yum.repos.d/backup
fi
mv /etc/yum.repos.d/* /etc/yum.repos.d/backup 2>/dev/null
if ! ping -c2 www.baidu.com &>/dev/null    
then
    echo "您无法上外网,不能配置yum源"
    exit    
fi
    curl -o /etc/yum.repos.d/163.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo &>/dev/null
    curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo &>/dev/null
    yum clean all
    timedatectl set-timezone Asia/Shanghai
    echo "nameserver 114.114.114.114" > /etc/resolv.conf
    echo "nameserver 8.8.8.8" >> /etc/resolv.conf
    chattr  i /etc/resolv.conf
    echo -e "33[32m [YUM Source] ==> OK 33[0m"
}
init_yumsource
安装ES7.2.0
代码语言:javascript复制
Create_UserLogFile() 
{
	groupadd es
	useradd es -g es
	mkdir -pv /data/elk/{data,logs}
	chown -R es:es /data/
}


Unpackaged_Authorization() 
{
	yum -y install  ntpdate
	rpm -ivh  /root/InstallELKB-Shell/jdk-8u121-linux-x64.rpm
	tar xvf /root/InstallELKB-Shell/elasticsearch-7.2.0-linux-x86_64.tar.gz -C /opt/
	chown -R es:es /opt/elasticsearch-7.2.0/
	ntpdate -b ntp1.aliyun.com
}


Set_System_Parameter() 
{
cat >> /etc/security/limits.conf <<EOF
* soft nproc 2048
* hard nproc 4096
* soft nofile 65536
* hard nofile 131072
EOF

echo "vm.max_map_count = 262144" >> /etc/sysctl.conf && sysctl -p
cat >> /etc/profile <<EOF
export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "
EOF
	source /etc/profile

cat >> /opt/elasticsearch-7.2.0/config/elasticsearch.yml <<EOF
cluster.name: elasticsearch
node.name: node-a
node.master: true
node.data: true
node.max_local_storage_nodes: 3
network.host: 0.0.0.0
network.publish_host: 192.168.43.176 
http.port: 9200
transport.tcp.port: 9300
discovery.seed_hosts: ["192.168.43.176:9300","192.168.43.164:9300","192.168.43.215:9300"]
cluster.initial_master_nodes: ["node-a", "node-b","node-c"]
path.data: /home/es/data
path.logs: /home/es/logs
EOF
	nohup runuser -l es -c '/bin/bash /opt/elasticsearch-7.2.0/bin/elasticsearch ' &> /opt/elasticsearch.log  &
}

Test_Service() 
{
	esport=`ss -antp |grep :::9200 | awk -F::: '{print $2}'`
	if [ $esport -eq 9200 ];then
		echo -e  "33[32m Elasticsearch is OK... 33[0m "
	fi
}

main() {
	Create_UserLogFile
	Unpackaged_Authorization
	Set_System_Parameter
	Test_Service
}

main

# 其他两个data节点配置文件有点不一样需要注意
# node-b
cluster.name: elasticsearch
node.name: node-b
node.master: true
node.data: true
node.max_local_storage_nodes: 3
network.host: 0.0.0.0 
network.publish_host: 192.168.43.164
http.port: 9200
transport.tcp.port: 9300
discovery.seed_hosts: ["192.168.43.176:9300","192.168.43.164:9300","192.168.43.215:9300"]
cluster.initial_master_nodes: ["node-a", "node-b","node-c"]
path.data: /home/es/data
path.logs: /home/es/logs
  
  
  
# es-node-data-02
cluster.name: elasticsearch
node.name: node-c
node.master: true
node.data: true
node.max_local_storage_nodes: 3
network.host: 0.0.0.0
network.publish_host: 192.168.43.215
http.port: 9200
transport.tcp.port: 9300
discovery.seed_hosts: ["192.168.43.176:9300","192.168.43.164:9300","192.168.43.215:9300"]
cluster.initial_master_nodes: ["node-a", "node-b","node-c"]
path.data: /home/es/data
path.logs: /home/es/logs
# 网络绑定,支持外网访问
network.host: 0.0.0.0
http.port: 9200
# 集群发现
discovery.seed_hosts: ["es-node-master-01","es-node-data-01","es-node-data-02"]
# 两个节点分别启动

nohup runuser -l es -c '/bin/bash /opt/elasticsearch-7.2.0/bin/elasticsearch ' &> /opt/elasticsearch.log  &
Elasticsearch文件目录结构

目录

配置文件

描述

bin

脚本文件,包括启动elasticsearch,安装插件,运行统计数据等

config

Elasticsearch.yml

集群配置文件,user,role based相关配置

JDK

JAVA运行环境

data

Path.data

数据文件

lib

Java类库

logs

path.log

日志文件

modules

包含所有ES模块

plugins

包含所有已安装插件

ES配置文件解读
代码语言:javascript复制
# ES通过集群名称区分集群,因此集群内所有节点的节点名称必须保持一致。如:
cluster.name: es-cluster

# 集群内节点的名称,同一集群内的节点名称必须保持唯一。如:
node.name: node01

# 机架感知
node.attr.rack: r1

# 标记节点可以选举为master节点。如果集群内的master节点停止,则该节点就会参与选举,可以成为master节点。如:
node.master: true

# 允许该节点存储索引数据(默认).如:
node.data: true

# 此路径是存放es数据的目录,可以任意指定。如果是生产环境建议设置的路径有足够的存储空间,如:
path.data: /datadrive/elasticsearch/data

# 此路径存储es产生的日志,生产环境建议与`path.logs`分开设置。如:
path.data: /datadrive/elasticsearch/logs

node.name: node-3
# 当前节点是否可以被选举为master节点,是:true、否:false
node.master: true
# 当前节点是否用于存储数据,是:true、否:false
node.data: true 
  
bootstrap.memory_lock: true
# 在ES运行起来后锁定ES所能使用的堆内存大小,锁定内存大小一般为可用内存的一半左右;锁定内存后就不会使用交换分区
# 如果不打开此项,当系统物理内存空间不足,ES将使用交换分区,ES如果使用交换分区,那么ES的性能将会变得很差

network.tcp.no_delay: true
# 是否启用tcp无延迟,true为启用tcp不延迟,默认为false启用tcp延迟

transport.tcp.port: 9301
#设置集群节点通信的TCP端口,默认就是9300

transport.tcp.compress: true
#设置是否压缩TCP传输时的数据,默认为false

http.max_content_length: 200mb
#设置http请求内容的最大容量,默认是100mb

http.cors.enabled: true
#是否开启跨域访问

http.cors.allow-origin: "*"
#开启跨域访问后的地址限制,*表示无限制

# SecComp检测,是:true、否:false
bootstrap.system_call_filter: false

# es绑定的地址,支持IPv4和IPv6。是es的监听地址。如果设置具体的地址,则只能通过改地址访问,也可设置`0.0.0.0`则不限制访问地址.如:
network.host: 0.0.0.0

# 外部访问es的http端口,默认`9200`。如:
http.port: 9200

# 集群节点通讯的tcp的端口,默认`9300`。如:
transport.tcp.port: 9300

# 集群搜索的主机列表。由discovery.zen.ping.unicast.hosts:参数改变而来。如:
discovery.seed_hosts:  ["192.168.0.117:9300","192.168.0.115:9300","192.168.0.108:9300"] 

# 集群主节点初始化列表,master选举列表。
cluster.initial_master_nodes: ["192.168.0.117:9300","192.168.0.115:9300","192.168.0.108:9300"]

参数

说明

cluster.name

集群名称,相同名称为一个集群

node.name

节点名称,集群模式下每个节点名称唯一

node.master

当前节点是否可以被选举为master节点,是:true、否:false

node.data

当前节点是否用于存储数据,是:true、否:false

path.data

索引数据存放的位置

path.logs

日志文件存放的位置

bootstrap.memory_lock

需求锁住物理内存,是:true、否:false

bootstrap.system_call_filter

SecComp检测,是:true、否:false

network.host

监听地址,用于访问该es

network.publish_host

可设置成内网ip,用于集群内各机器间通信

http.port

es对外提供的http端口,默认 9200

discovery.seed_hosts

es7.x 之后新增的配置,写入候选主节点的设备地址,在开启服务后可以被选为主节点

cluster.initial_master_nodes

es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举master

http.cors.enabled

是否支持跨域,是:true,在使用head插件时需要此配置

http.cors.allow-origin

"*" 表示支持所有域名

jvm.options配置文件解读

代码语言:javascript复制
grep -Ev "#|^$"/opt/elasticsearch-7.2.0/config/jvm.options | head -5 

#堆内存配置 
-Xms16g #Xms表示ES堆内存初始大小 
-Xmx16g #Xmx表示ES堆内存的最大可用空间 

#GC配置 
-XX: UseConcMarkSweepGC #使用CMS内存收集 
-XX:CMSInitiatingOccupancyFraction=75 #使用CMS作为垃圾回收使用,75%后开始CMS收集 
-XX: UseCMSInitiatingOccupancyOnly #使用手动定义初始化开始CMS收集 
JVM配置

修改JVM-config/jvm.options

代码语言:javascript复制
# 7.1下载的默认配置1GB
# Xms和Xms设置成一样
# Xms不要超过机器内存的50%.
# 不要超过30GB, 请看https://www.elastic.co/cn/blog/a-heap-of-trouble
配置ES的Head插件
代码语言:javascript复制
tar -xvf node-v10.6.0-linux-x64.tar.xz
# 重命名文件夹
mv node-v10.6.0-linux-x64 nodejs
# 通过建立软连接变为全局
ln -s /usr/local/nodejs/bin/npm /usr/bin/
ln -s /usr/local/nodejs/bin/node /usr/bin/
node -v
# v8.16.0

cd /opt/elasticsearch-7.2.0/elasticsearch-head-master/
npm install^C
npm run start

lsof -i:9100
# COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
# grunt   14567 root   12u  IPv4  41662      0t0  TCP *:jetdirect (LISTEN)

es2020

ES常规操作
代码语言:javascript复制
# 所有节点都启动后可以访问任一节点查看集群状态,可以通过浏览器或curl节点地址。如:
curl -XGET 'http://127.0.0.1:9200/_cluster/state?pretty'


curl http://127.0.0.1:9200/_cat/nodes?v  
# ip             heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
# 192.168.43.215           10          96   1    0.17    0.13     0.13 mdi       -      node-c
# 192.168.43.164           10          77   0    0.00    0.01     0.05 mdi       *      node-b
# 192.168.43.176            6          94   0    0.00    0.01     0.05 mdi       -      node-a

# 查看节点
curl http://127.0.0.1:9200/_cat/nodes?v   #?v人性化显示,*表示主节点	

# 查看整个集群索引
curl http://127.0.0.1:9200/_cat/indices

# 查看集群状态
curl http://127.0.0.1:9200/_cat/health

# 查看集群有多少个插件
curl http://127.0.0.1:9200/_cat/plugins

# 查看集群有多少个线程池
curl http://127.0.0.1:9200/_cat/thread_pool
ES索引操作
创建文档,生成索引
代码语言:javascript复制
curl -H "Content-Type:application/json" -XPUT 'http://127.0.0.1:9200/index_name/type_name/1?pretty' -d '
{ "name": "xuwl", "age": 18, "job": "Linux" }'

# 命令介绍:
# -H:指定内容类型
# -X:指定http请求方式,这里为PUT上传方式
# http://10.211.55.10:9201:指定一台es服务器对外的http端口
# /index_name:文档的索引名称,必须小写
# /type_name:文档的类型名称,必须小写
# /1:文档的ID编号
# ?pretty:人性化创建索引
# -d:指定使用JSON方式来撰写上传文档
# { "name": "xuwl", "age": 18, "job": "Linux" }':使用JSON格式来撰写上传文档内容
创建索引为index_name文档
代码语言:javascript复制
 curl -H "Content-Type:application/json" -XPOST 'http://127.0.0.1:9200/index_name/index_type/1?pretty' -d '{"name":"es-cluster","type": "data_index"}'


{
  "_index" : "index_name",
  "_type" : "index_type",
  "_id" : "1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}
查看索引
代码语言:javascript复制
curl -XGET "http://127.0.0.1:9200/_cat/indices?v"

health status index      uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   index_name irYekUV4S12knIDbE85WUA   1   1          1            0      8.1kb            4kb
查看分片
代码语言:javascript复制
curl -XGET "http://127.0.0.1:9200/_cat/shards?v"

index      shard prirep state   docs store ip            node
index_name 0     p      STARTED    1   4kb 192.168.0.119 es1
index_name 0     r      STARTED    1 4.1kb 192.168.0.101 192.168.0.101
安装Elasticsearch的cerebro插件

cerebro简介

代码语言:javascript复制
tar xvf cerebro-0.8.3.tgz -C /opt/
cat << EOF >> /opt/cerebro-0.8.3/conf/application.conf
            hosts = [
                       {
                           host = "http://192.168.0.119:9200"
                           name = "ES-Cluster"
                       },
                    ]
EOF
nohup  /opt/cerebro-0.8.3/bin/cerebro -Dhttp.port=1234

# cerebro访问测试
# 浏览器输入http://IP:1234

0 人点赞