首先,我们将Elasticsearch安装包和IK分词器插件下载到服务器上。下载路径为/home/cms/bag/es
。
cd /home/cms
mkdir bag/es -p
cd bag/es
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.23-linux-x86_64.tar.gz
wget https://release.infinilabs.com/analysis-ik/stable/elasticsearch-analysis-ik-7.17.23.zip
在实际部署环境中,我们有三台服务器,分别为master
、node01
和node02
。IP地址如下:
IP | 主机名 |
---|---|
192.168.10.1 | master |
192.168.10.2 | node01 |
192.168.10.3 | node02 |
Elasticsearch 依赖于 Java 环境,因此需要在所有节点上安装 JDK。安装后需配置环境变量,以确保 Java 能够正确运行。
cd /home/cms/bag/es
tar xf jdk.tar.gz
cd /home/cms/app
mv ../bag/es/jdk1.8.0_221 ./jdk
# 添加环境变量
[cms@localhost app]$ cat /home/cms/.bashrc
...
export JAVA_HOME=/home/cms/app/jdk
export PATH=$JAVA_HOME/bin:$PATH
[cms@localhost app]$ source /home/cms/.bashrc
# 验证 Java 版本
[cms@localhost app]$ java -version
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
[cms@localhost app]$
在这里,你可以使用tar
命令解压缩JDK压缩包,并将其移动到合适的位置。接着,编辑.bashrc
文件,设置Java环境变量。确保使用source
命令让新的环境变量生效,并通过java -version
验证是否安装成功。
supervisor
是一个进程管理工具,可以确保 Elasticsearch 在系统重启后自动启动,并在异常退出时自动重启。
sudo yum install -y supervisor
sudo sed -i 's#minfds=1024#minfds=65535#g' /etc/supervisord.conf
sudo systemctl enable supervisord
sudo systemctl start supervisord
sudo systemctl status supervisord
这里我们使用yum
安装supervisor
,并将默认的文件描述符限制从1024修改为65535,以适应高并发场景。systemctl
命令用于启动和启用supervisord
,确保它开机自启并立即启动。
为保证高并发处理性能,我们需要调整系统的文件描述符和进程数限制。通过编辑/etc/security/limits.conf
文件,可以增加这些系统资源的限制。
[cms@master supervisor]$ sudo vim /etc/security/limits.conf
* soft nofile 65535
* hard nofile 131072
* soft nproc 65535
* hard nproc 65535
同样,为了优化内核参数,我们修改了/etc/sysctl.conf
文件。
# 控制系统在使用SWAP的频率,0表示除非内存不足,否则不使用SWAP
vm.swappiness = 0
# 设置ARP邻居表项超时的时长为120秒
net.ipv4.neigh.default.gc_stale_time = 120
# 禁用对所有接口的源地址验证
net.ipv4.conf.all.rp_filter = 0
# 禁用默认接口的源地址验证
net.ipv4.conf.default.rp_filter = 0
# 控制ARP报文的发送行为。值为2时,系统更倾向于在同一网络中发送ARP请求
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
# 控制TCP连接的TIME_WAIT状态槽的最大数量
net.ipv4.tcp_max_tw_buckets = 5000
# 启用TCP SYN Cookies,用于防御SYN洪泛攻击
net.ipv4.tcp_syncookies = 1
# 设置TCP SYN请求的最大队列长度,避免TCP SYN洪泛攻击
net.ipv4.tcp_max_syn_backlog = 1024
# 设置在重新发送TCP SYNACK包之前的重试次数,默认是5,这里设置为2以加快失败连接的检测
net.ipv4.tcp_synack_retries = 2
# 禁用回环接口的IPv6支持
net.ipv6.conf.lo.disable_ipv6 = 1
# 启用系统请求按键功能,允许执行紧急命令
kernel.sysrq = 1
# 设置进程能够映射的最大内存区域数目,通常需要增加该值以支持大型应用
vm.max_map_count = 262144
别忘了使用sudo sysctl -p
命令使配置生效。
这些配置项调整了文件描述符、进程限制以及内核的一些重要参数,适用于需要处理大量并发连接的场景,尤其是Elasticsearch这种面向大数据的搜索引擎。vm.swappiness
设为 0 可以减少系统使用SWAP的频率,从而提升性能。
在每台服务器上,我们将下载好的Elasticsearch安装包进行解压,并将其放置到指定的应用目录中。
[cms@node01 es]$ tar xf elasticsearch-7.17.23-linux-x86_64.tar.gz
[cms@node01 es]$ cd ../../app/
[cms@node01 app]$ mv ../bag/es/elasticsearch-7.17.23 ./elasticsearch
在每台服务器上,编辑elasticsearch.yml
文件。这里我们主要修改了network.host
、discovery.seed_hosts
、cluster.initial_master_nodes
等参数,以便配置集群环境。
cluster.name: ela
# Elasticsearch集群的名字,所有节点必须使用相同的集群名称才能加入集群。
node.name: es01-al
# 节点的名字,便于识别该节点。
node.master: true
# 设置该节点是否可以作为集群的主节点(Master Node)。
node.data: true
# 设置该节点是否用于存储数据。如果是数据节点,该值应为true。
path.data: /home/cms/app/elasticsearch/data/data
# 指定Elasticsearch存储数据的路径。
path.logs: /home/cms/app/elasticsearch/logs/
# 指定Elasticsearch存储日志文件的路径。
bootstrap.memory_lock: false
# 控制是否锁定内存,避免内存被交换到磁盘上。设置为true可以提高性能,但需要配置系统以允许锁定内存。
network.host: 192.168.10.1
# Elasticsearch监听的网络地址,通常是服务器的IP地址。
network.tcp.no_delay: true
# 启用TCP_NODELAY选项,禁用TCP的Nagle算法,以减少延迟。
network.tcp.keep_alive: true
# 启用TCP的keep-alive选项,保持长时间没有通信的连接活跃。
network.tcp.reuse_address: true
# 启用SO_REUSEADDR选项,允许重新绑定地址,通常在服务器重启时使用。
network.tcp.send_buffer_size: 128mb
# 设置发送TCP数据的缓冲区大小。
network.tcp.receive_buffer_size: 128mb
# 设置接收TCP数据的缓冲区大小。
transport.tcp.port: 9300
# 集群间通信使用的TCP端口,通常默认使用9300。
transport.tcp.compress: true
# 启用集群内部通信的压缩功能,减少带宽占用。
http.max_content_length: 200mb
# 设置通过HTTP传输的最大内容长度,通常用于限制最大请求或响应的大小。
http.cors.enabled: true
# 启用跨域资源共享(CORS),允许浏览器跨域请求Elasticsearch。
http.cors.allow-origin: "*"
# 允许的跨域请求源,"*"表示允许所有来源。
http.port: 9200
# Elasticsearch HTTP服务监听的端口,通常默认使用9200。
discovery.seed_hosts: ["192.168.10.1:9300", "192.168.10.2:9300", "192.168.10.3:9300"]
# 用于发现集群中其他节点的地址,Elasticsearch使用这些地址启动时加入集群。
cluster.initial_master_nodes: ["192.168.10.1:9300", "192.168.10.2:9300", "192.168.10.3:9300"]
# 在集群首次启动时,设置可以作为候选主节点的节点列表,确保能正确选举出主节点。
cluster.fault_detection.leader_check.interval: 15s
# 定义主节点检测其他节点状态的间隔时间。设置为15秒。
discovery.cluster_formation_warning_timeout: 30s
# 当集群形成过程中遇到问题时,触发警告的超时时间,设置为30秒。
cluster.join.timeout: 30s
# 设置节点加入集群的最大超时时间,超时后认为加入失败。
cluster.publish.timeout: 90s
# 定义主节点在选举结果、集群状态变更等信息发布时的超时时间,设置为90秒。
cluster.routing.allocation.cluster_concurrent_rebalance: 32
# 设置集群允许同时进行的分片重新平衡的最大数量,32表示允许并发重新平衡32个分片。
cluster.routing.allocation.node_concurrent_recoveries: 32
# 定义每个节点允许同时进行的数据恢复操作的最大数量。
cluster.routing.allocation.node_initial_primaries_recoveries: 32
# 定义节点启动时允许并发恢复的初始主分片的数量,通常用于加速启动时的恢复过程。
cluster.name: ela
node.name: es02-al
node.master: true
node.data: true
path.data: /home/cms/app/elasticsearch/data/data
path.logs: /home/cms/app/elasticsearch/logs/
bootstrap.memory_lock: false
network.host: 192.168.10.2
network.tcp.no_delay: true
network.tcp.keep_alive: true
network.tcp.reuse_address: true
network.tcp.send_buffer_size: 128mb
network.tcp.receive_buffer_size: 128mb
transport.tcp.port: 9300
transport.tcp.compress: true
http.max_content_length: 200mb
http.cors.enabled: true
http.cors.allow-origin: "*"
http.port: 9200
discovery.seed_hosts: ["192.168.10.1:9300", "192.168.10.2:9300", "192.168.10.3:9300"]
cluster.initial_master_nodes: ["192.168.10.1:9300", "192.168.10.2:9300", "192.168.10.3:9300"]
cluster.fault_detection.leader_check.interval: 15s
discovery.cluster_formation_warning_timeout: 30s
cluster.join.timeout: 30s
cluster.publish.timeout: 90s
cluster.routing.allocation.cluster_concurrent_rebalance: 32
cluster.routing.allocation.node_concurrent_recoveries: 32
cluster.routing.allocation.node_initial_primaries_recoveries: 32
cluster.name: ela
node.name: es03-al
node.master: true
node.data: true
path.data: /home/cms/app/elasticsearch/data/data
path.logs: /home/cms/app/elasticsearch/logs/
bootstrap.memory_lock: false
network.host: 192.168.10.3
network.tcp.no_delay: true
network.tcp.keep_alive: true
network.tcp.reuse_address: true
network.tcp.send_buffer_size: 128mb
network.tcp.receive_buffer_size: 128mb
transport.tcp.port: 9300
transport.tcp.compress: true
http.max_content_length: 200mb
http.cors.enabled: true
http.cors.allow-origin: "*"
http.port: 9200
discovery.seed_hosts: ["192.168.10.1:9300", "192.168.10.2:9300", "192.168.10.3:9300"]
cluster.initial_master_nodes: ["192.168.10.1:9300", "192.168.10.2:9300", "192.168.10.3:9300"]
cluster.fault_detection.leader_check.interval: 15s
discovery.cluster_formation_warning_timeout: 30s
cluster.join.timeout: 30s
cluster.publish.timeout: 90s
cluster.routing.allocation.cluster_concurrent_rebalance: 32
cluster.routing.allocation.node_concurrent_recoveries: 32
cluster.routing.allocation.node_initial_primaries_recoveries: 32
每台服务器的配置略有不同,尤其是在network.host
和node.name
部分。这些参数确保了每个节点在集群中有唯一的标识和正确的网络绑定。
elasticsearch.yml
是 Elasticsearch 的核心配置文件,涵盖了网络、数据路径、集群配置等多方面内容。集群的正确配置依赖于这些参数,因此需确保每个节点的配置项与集群的需求一致。
我们通过在/etc/supervisord.d/
目录下创建一个新的配置文件来将 Elasticsearch 进程纳入 supervisor
的管理中。这样可以确保它在任何时候都能自动启动并稳定运行。
[program:elasticsearch]
command=/home/cms/app/elasticsearch/bin/elasticsearch
user = cms
autostart=true
autorestart=true
stdout_logfile=/home/cms/app/elasticsearch/logs/appspider.log
stderr_logfile=/home/cms/app/elasticsearch/logs/appspider.log
logfile_maxbytes=50MB
logfile_backups=10
[cms@master elasticsearch]$ sudo supervisorctl update
[cms@master elasticsearch]$ sudo supervisorctl status
elasticsearch RUNNING pid 5914, uptime 0:00:06
[cms@master elasticsearch]$
通过 supervisorctl update
和 supervisorctl status
可以更新配置并检查进程状态。
通过这种方式,我们无需手动管理 Elasticsearch 的启动和停止,supervisor
可以自动完成这些操作。同时,日志文件也会按照配置定期轮转,防止磁盘空间被耗尽。
IK 分词器是中文分词的一个常用插件,特别适用于 Elasticsearch 中的中文全文搜索。
cd /home/cms/bag/es
mkdir ik
unzip elasticsearch-analysis-ik-7.17.23.zip -d ik
cd ik
chmod +x ./*
cd /home/cms/app/elasticsearch/plugins/
mv /home/cms/bag/es/ik ./
sudo supervisorctl restart elasticsearch
curl -X POST "192.168.10.1:9200/_analyze?pretty" -H 'Content-Type: application/json' -d '{"analyzer":"ik_max_word","text":"中华人民"}'
curl -X POST "192.168.10.2:9200/_analyze?pretty" -H 'Content-Type: application/json' -d '{"analyzer":"ik_max_word","text":"中华人民"}'
curl -X POST "192.168.10.3:9200/_analyze?pretty" -H 'Content-Type: application/json' -d '{"analyzer":"ik_max_word","text":"中华人民"}'
[cms@master logs]$ curl -X POST "192.168.10.1:9200/_analyze?pretty" -H 'Content-Type: application/json' -d '{"analyzer":"ik_max_word","text":"中华人民"}'
{
"tokens" : [
{
"token" : "中华人民",
"start_offset" : 0,
"end_offset" : 4,
"type" : "CN_WORD",
"position" : 0
},
{
"token" : "中华",
"start_offset" : 0,
"end_offset" : 2,
"type" : "CN_WORD",
"position" : 1
},
{
"token" : "华人",
"start_offset" : 1,
"end_offset" : 3,
"type" : "CN_WORD",
"position" : 2
},
{
"token" : "人民",
"start_offset" : 2,
"end_offset" : 4,
"type" : "CN_WORD",
"position" : 3
}
]
}
[cms@master logs]$
我们通过curl命令测试IK分词器的效果。ik_max_word
模式会将文本最大化分词,例如"中华人民"被分为“中华”、“华人”、“人民”等。这个功能非常适合需要精准检索的应用场景。