Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elasticsearch 数据库中,再通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。
Elasticsearch是与名为Logstash的数据收集和日志解析引擎以及名为Kibana的分析和可视化平台一起开发的。这三个产品被设计成一个集成解决方案,称为“Elastic Stack”(以前称为“ELK stack”)。
Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。Elasticsearch是分布式的,这意味着索引可以被分成分片,每个分片可以有0个或多个副本。每个节点托管一个或多个分片,并充当协调器将操作委托给正确的分片。再平衡和路由是自动完成的。相关数据通常存储在同一个索引中,该索引由一个或多个主分片和零个或多个复制分片组成。一旦创建了索引,就不能更改主分片的数量。
Elasticsearch使用Lucene,并试图通过JSON和Java API提供其所有特性。它支持facetting和percolating,如果新文档与注册查询匹配,这对于通知非常有用。另一个特性称为“网关”,处理索引的长期持久性;例如,在服务器崩溃的情况下,可以从网关恢复索引。Elasticsearch支持实时GET请求,适合作为NoSQL数据存储,但缺少分布式事务。
今天主要介绍Elasticsearch集群部署。
一、解压软件
# 解压缩
tar -zxvf elasticsearch-7.6.1-linux-x86_64.tar.gz -C /opt/module
# 改名
mv elasticsearch-7.8.0 es-cluster
二、分别安装
创建用户
因为安全问题, elasticsearch 不允许 root 用户直接运行,所以要创建新用户,在 root 用户中创建新用户。
useradd es #新增 es 用户
passwd es #为 es 用户设置密码
userdel -r es #如果错了,可以删除再加
修改配置文件—node-1
修改/opt/module/es/config/elasticsearch.yml 文件,分发文件。
# 加入如下配置
#集群名称
cluster.name: cluster-es
#节点名称, 每个节点的名称不能重复
node.name: node-1
#ip 地址, 每个节点的地址不能重复
network.host: 0.0.0.0
#是不是有资格主节点
node.master: true
node.data: true
http.port: 9200
#集群默认是 9300,也可以省略
transport.tcp.port: 9300
# head 插件需要这打开这两个配置
http.cors.allow-origin: "*"
http.cors.enabled: true
http.max_content_length: 200mb
#es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举 master
cluster.initial_master_nodes: ["node-1"]
#es7.x 之后新增的配置,节点发现
discovery.seed_hosts: ["192.168.59.142:9300"," 192.168.59.145 :9300"," 192.168.59.146:9300"]
gateway.recover_after_nodes: 2
network.tcp.keep_alive: true
network.tcp.no_delay: true
transport.tcp.compress: true
#集群内同时启动的数据任务个数,默认是 2 个
cluster.routing.allocation.cluster_concurrent_rebalance: 16
#添加或删除节点及负载均衡时并发恢复的线程个数,默认 4 个
cluster.routing.allocation.node_concurrent_recoveries: 16
#初始化数据恢复时,并发恢复线程的个数,默认 4 个
cluster.routing.allocation.node_initial_primaries_recoveries: 16
为 es 用户配置权限
chown -R es:es /opt/module/es
修改/etc/security/limits.conf ,分发文件
# 在文件末尾中增加下面内容
es soft nofile 65536
es hard nofile 65536
修改/etc/security/limits.d/20-nproc.conf,分发文件
# 在文件末尾中增加下面内容
es soft nofile 65536
es hard nofile 65536
* hard nproc 4096
# 注:* 带表 Linux 所有用户名称
修改/etc/sysctl.conf
# 在文件中增加下面内容
vm.max_map_count=655360
重新加载
sysctl -p
修改配置文件—node-2
# 加入如下配置
#集群名称
cluster.name: cluster-es
#节点名称, 每个节点的名称不能重复
node.name: node-2
#ip 地址, 每个节点的地址不能重复
network.host: 0.0.0.0
#是不是有资格主节点
node.master: true
node.data: true
http.port: 9200
#集群默认是 9300,也可以省略
transport.tcp.port: 9300
# head 插件需要这打开这两个配置
http.cors.allow-origin: "*"
http.cors.enabled: true
http.max_content_length: 200mb
#es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举 master
cluster.initial_master_nodes: ["node-1"]
#es7.x 之后新增的配置,节点发现
discovery.seed_hosts:["192.168.59.142:9300"," 192.168.59.145 :9300"," 192.168.59.146:9300"]
gateway.recover_after_nodes: 2
network.tcp.keep_alive: true
network.tcp.no_delay: true
transport.tcp.compress: true
#集群内同时启动的数据任务个数,默认是 2 个
cluster.routing.allocation.cluster_concurrent_rebalance: 16
#添加或删除节点及负载均衡时并发恢复的线程个数,默认 4 个
cluster.routing.allocation.node_concurrent_recoveries: 16
#初始化数据恢复时,并发恢复线程的个数,默认 4 个
cluster.routing.allocation.node_initial_primaries_recoveries: 16
修改配置文件—node-3
# 加入如下配置
#集群名称
cluster.name: cluster-es
#节点名称, 每个节点的名称不能重复
node.name: node-3
#ip 地址, 每个节点的地址不能重复
network.host: 0.0.0.0
#是不是有资格主节点
node.master: true
node.data: true
http.port: 9200
#集群默认是 9300,也可以省略
transport.tcp.port: 9300
# head 插件需要这打开这两个配置
http.cors.allow-origin: "*"
http.cors.enabled: true
http.max_content_length: 200mb
#es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举 master
cluster.initial_master_nodes: ["node-1"]
#es7.x 之后新增的配置,节点发现
discovery.seed_hosts: ["192.168.59.142:9300","192.168.59.145:9300","192.168.59.146:9300"]
gateway.recover_after_nodes: 2
network.tcp.keep_alive: true
network.tcp.no_delay: true
transport.tcp.compress: true
#集群内同时启动的数据任务个数,默认是 2 个
cluster.routing.allocation.cluster_concurrent_rebalance: 16
#添加或删除节点及负载均衡时并发恢复的线程个数,默认 4 个
cluster.routing.allocation.node_concurrent_recoveries: 16
#初始化数据恢复时,并发恢复线程的个数,默认 4 个
cluster.routing.allocation.node_initial_primaries_recoveries: 16
三、启动软件
./elasticsearch -d
关闭防火墙
systemctl stop firewalld
#永久关闭防火墙
systemctl enable firewalld.service #打开防火墙永久性生效,重启后不会复原
systemctl disable firewalld.service #关闭防火墙,永久性生效,重启后不会复原
四、测试集群
192.168.59.143:9200/_cat/nodes
五、使用可视化集群工具 cerebro
下载安装包
https://github.com/lmenezes/cerebro/releases
rpm -ivh cerebro-0.9.4-1.noarch.rpm
并安装JDK11
yum install java-11-openjdk.x86_64 java-11-openjdk-devel
cd /usr/share/cerebro/conf
cp application.conf application.conf_default
vim application.conf
指定cerebro.db的路径
注释掉data.path ="./cerebro.db
"取消data.path:"/var/lib/cerebro/cerebro.db"的注释
修改成如下data.path: "/var/lib/cerebro/cerebro.db"
#data.path = "./cerebro.db"
2)、例如端口修改为9001端口
server.http.port = ${?CEREBRO_PORT}
修改为server.http.port = 9001
systemctl start cerebro.service
netstat -anp | grep 9001
六、浏览器登陆http://192.168.59.142:9001,看到开始页面即为成功。
Node address输入es集群master节点的一个地址 http://192.168.59.142:9200
使用logstash迁移es集群数据
安装logstash服务。
logstash主目录下:vim es-es.conf
input {
elasticsearch {
hosts => ["X.X.X.X", "X.X.X.X", "X.X.X.X", "X.X.X.X", "X.X.X.X"] 源地址
# user => "*******"
# password => "*********"
index => "*"
size => 1000
scroll => "1m"
}
}
filter {
mutate {
remove_field => ["@timestamp", "@version"]
}
}
output {
elasticsearch {
hosts => ["X.X.X.X", "X.X.X.X", "X.X.X.X", "X.X.X.X", "X.X.X.X"] 目的地址
# user => "********"
# password => "**********"
index => "%{[@metadata][_index]}"
}
}
启动:logstash -f es-es.conf
附ES一键部署脚本
#!/bin/bash
echo -e "\e[31m********一键安装ES任何版本数据库********\e[0m"
echo -e "输入安装版本,如\e[31m7.7.7\e[0m"
read version
find / -name elasticsearch | xargs rm -rf
port=$(netstat -antup|grep elasticsearch|wc -l)
if [ $port != 0 ]
then echo "elasticsearch进程存在,请先杀掉进程"
ps -ef |grep elasticsearch
exit 1
fi
mkdir -p /usr/local/src
mv jdk-8u131-linux-x64.tar.gz /usr/local
tar -xvf jdk-8u131-linux-x64.tar.gz
cat <<EOF >>/etc/profile
JAVA_HOME=/usr/local/jdk1.8.0_131
PATH=${JAVA_HOME}/bin:$PATH
EOF
source /etc/profile
cp elasticsearch-$version-linux-x86_64.tar.gz /usr/local/src
tar -xvf elasticsearch-$version-linux-x86_64.tar.gz
mv elasticsearch-$version elasticsearch7.8
cd /usr/local/src/elasticsearch7.8
mkdir data
cd config
cat <<EOF >>/usr/local/src/elasticsearch7.8/config/elasticsearch.yml
cluster.name: elasticsearch
node.name: node1
path.data: /usr/local/src/elasticsearch7.8/data
path.logs: /usr/local/src/elasticsearch7.8/logs
http.port: 9200
network.host: 0.0.0.0
cluster.initial_master_nodes: ["node1"]
EOF
cat <<EOF >>jvm.options
-Xms512m
-Xmx512m
EOF
useradd elastic
chown -R elastic:elastic /usr/local/src/elasticsearch7.8
cat <<EOF >>/etc/security/limits.conf
* soft nofile 65536
* hard nofile 131072
* soft nproc 4096
* hard nproc 4096
EOF
cat <<EOF >>/etc/sysctl.conf
vm.max_map_count = 262144
EOF
sysctl -p
su - elastic -c /usr/local/src/elasticsearch7.8/bin/elasticsearch -d