第二章 ElasticSearch安装 v1.0
本文以三节点 ES 7.13.0 集群部署为例,基于 openEuler 24.03 (LTS-SP1) + OpenJDK 17
[一键部署脚本 init.sh]
bash
#!/bin/bash
set -e
### note
# 使用此脚本前请确保对应主机已正确配置对应IP与对应密码
# file path
file_dir=$(dirname "$(realpath "$0")")
cluster_name="es-cluster"
distribute_sh="$file_dir/tools/distribute.sh"
config_path="$file_dir/config"
ssh_config_file="$config_path/config.conf"
elasticsearch_config_file="$config_path/elasticsearch.yml"
kibana_config_file="$config_path/kibana.yml"
download_path="$file_dir/download"
# cluster conf
cluster_ips=("192.168.2.211" "192.168.2.212" "192.168.2.213")
username="root"
password="<password>"
# download source
resource_path="/root/download/resource/elasticsearch"
download_version="7.13.0"
elasticsearch_rpm="elasticsearch-$download_version-x86_64.rpm"
elasticsearch_rpm_download_url="https://artifacts.elastic.co/downloads/elasticsearch/$elasticsearch_rpm"
kibana_rpm="kibana-$download_version-x86_64.rpm"
kibana_rpm_download_url="https://artifacts.elastic.co/downloads/kibana/$kibana_rpm"
# elasticsearch config
elasticsearch_http_port=9200
elasticsearch_transport_port=9300
# kibana config
kibana_server_ip=${cluster_ips[0]}
kibana_server_port=5601
# 生成 SSH 配置文件
function make_ssh_config() {
>"$ssh_config_file"
for ip in "${cluster_ips[@]}"; do
echo "$ip $username $password" >>"$ssh_config_file"
done
echo "SSH配置文件位置: $ssh_config_file"
}
# 生成 ElasticSearch 配置文件
function make_elasticsearch_config() {
seed_hosts_list=""
for ip in "${cluster_ips[@]}"; do
if [ -n "$seed_hosts_list" ]; then
seed_hosts_list="$seed_hosts_list, "
fi
seed_hosts_list="$seed_hosts_list\"$ip:$elasticsearch_transport_port\""
done
initial_master_nodes_list=""
node_count=1
for _ in "${cluster_ips[@]}"; do
if [ -n "$initial_master_nodes_list" ]; then
initial_master_nodes_list="$initial_master_nodes_list, "
fi
initial_master_nodes_list="$initial_master_nodes_list\"node-$node_count\""
((node_count++))
done
cat >"$elasticsearch_config_file" << EOF
cluster.name: $cluster_name
node.name: {{ node_name }}
network.host: 0.0.0.0
http.port: $elasticsearch_http_port
transport.port: $elasticsearch_transport_port
discovery.seed_hosts: [$seed_hosts_list]
cluster.initial_master_nodes: [$initial_master_nodes_list]
# 跨域访问
http.cors.enabled: true
http.cors.allow-origin: "*"
EOF
echo "ElasticSearch配置文件位置: $elasticsearch_config_file"
}
# 生成 Kibana 配置文件
function make_kibana_config() {
elasticsearch_hosts_list=""
for ip in "${cluster_ips[@]}"; do
if [ -n "$elasticsearch_hosts_list" ]; then
elasticsearch_hosts_list="$elasticsearch_hosts_list, "
fi
elasticsearch_hosts_list="$elasticsearch_hosts_list\"http://$ip:$elasticsearch_http_port\""
done
cat >"$kibana_config_file" << EOF
# 国际化
i18n.locale: "zh-CN"
# 默认语言
server.host: "0.0.0.0"
# Kibana 端口
server.port: $kibana_server_port
# 关联的 Elasticsearch 地址
elasticsearch.hosts: [$elasticsearch_hosts_list]
EOF
echo "Kibana配置文件位置: $kibana_config_file"
}
# 批量生成配置文件
function make_configs() {
mkdir -p "$config_path"
make_ssh_config
make_elasticsearch_config
make_kibana_config
}
function write_hosts() {
# 写入各节点的hosts映射
node_count=1
for ip in "${cluster_ips[@]}"; do
record="$ip node-$node_count"
bash $distribute_sh -c "$ssh_config_file" -e "if ! grep -q \"$record\" \"/etc/hosts\"; then echo \"添加hosts映射 /etc/hosts: $record\";bash -c \"echo '$record' >> /etc/hosts\";else echo \"已存在 $record 存在于 /etc/hosts 中,跳过添加。\" ;fi"
((node_count++))
done
}
function install_es() {
mkdir -p $download_path
echo "download $elasticsearch_rpm_download_url to $download_path/$elasticsearch_rpm"
if [ ! -f "$download_path/$elasticsearch_rpm" ]; then
wget "$elasticsearch_rpm_download_url" -O "$download_path/$elasticsearch_rpm"
fi
bash $distribute_sh -c "$ssh_config_file" -e "mkdir -p $resource_path"
bash $distribute_sh -c "$ssh_config_file" -f "$download_path/$elasticsearch_rpm" -d "$resource_path/$elasticsearch_rpm"
bash $distribute_sh -c "$ssh_config_file" -e "cd $resource_path && rpm -ivh $elasticsearch_rpm"
# backup config
bash $distribute_sh -c "$ssh_config_file" -e "cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak"
# distribute config
node_count=1
for ip in "${cluster_ips[@]}"; do
bash $distribute_sh -c "$ssh_config_file" -f "$elasticsearch_config_file" -d "/etc/elasticsearch/elasticsearch.yml" -i "$ip" --node_name "node-$node_count"
((node_count++))
done
# alert permission
bash $distribute_sh -c "$ssh_config_file" -e "mkdir -p /usr/share/elasticsearch/logs && mkdir -p /usr/share/elasticsearch/data"
bash $distribute_sh -c "$ssh_config_file" -e "chown -R elasticsearch:elasticsearch /usr/share/elasticsearch/logs && chmod -R 750 /usr/share/elasticsearch/logs"
bash $distribute_sh -c "$ssh_config_file" -e "chown -R elasticsearch:elasticsearch /usr/share/elasticsearch/data && chmod -R 750 /usr/share/elasticsearch/data"
}
function install_java() {
bash $distribute_sh -c "$ssh_config_file" -e "yum install -y java-17-openjdk-devel"
# java home
bash $distribute_sh -c "$ssh_config_file" -e "echo 'export JAVA_HOME=/usr/lib/jvm/java-17-openjdk' >> /etc/profile"
}
function start_es() {
# firewall
bash $distribute_sh -c "$ssh_config_file" -e "firewall-cmd --zone=public --add-port=$elasticsearch_http_port/tcp --permanent"
bash $distribute_sh -c "$ssh_config_file" -e "firewall-cmd --zone=public --add-port=$elasticsearch_transport_port/tcp --permanent"
bash $distribute_sh -c "$ssh_config_file" -e "firewall-cmd --reload"
# start & enable
bash $distribute_sh -c "$ssh_config_file" -e "systemctl start elasticsearch"
bash $distribute_sh -c "$ssh_config_file" -e "systemctl enable elasticsearch"
}
function install_kibana() {
mkdir -p $download_path
echo "download $kibana_rpm_download_url to $download_path/$kibana_rpm"
if [ ! -f "$download_path/$download_path/$kibana_rpm" ]; then
wget "$kibana_rpm_download_url" -O "$download_path/$kibana_rpm"
fi
bash $distribute_sh -c "$ssh_config_file" -e "mkdir -p $resource_path"
bash $distribute_sh -c "$ssh_config_file" -f "$download_path/$kibana_rpm" -d "$resource_path/$kibana_rpm"
bash $distribute_sh -c "$ssh_config_file" -i "$kibana_server_ip" -e "cd $resource_path && rpm -ivh $kibana_rpm"
# distribute config
bash $distribute_sh -c "$ssh_config_file" -i "$kibana_server_ip" -f "$kibana_config_file" -d "/etc/kibana/kibana.yml"
# alert permission
bash $distribute_sh -c "$ssh_config_file" -i "$kibana_server_ip" -e "chown -R kibana:kibana /var/log/kibana && chown -R kibana:kibana /etc/kibana"
}
function start_kibana() {
# firewall
bash $distribute_sh -c "$ssh_config_file" -i "$kibana_server_ip" -e "firewall-cmd --permanent --add-port=$kibana_server_port/tcp"
bash $distribute_sh -c "$ssh_config_file" -i "$kibana_server_ip" -e "firewall-cmd --reload"
# start & enable
bash $distribute_sh -c "$ssh_config_file" -i "$kibana_server_ip" -e "systemctl start kibana"
bash $distribute_sh -c "$ssh_config_file" -i "$kibana_server_ip" -e "systemctl enable kibana"
}
function install() {
write_hosts
install_java
install_es
start_es
install_kibana
start_kibana
}
function main() {
make_configs
install
}
main一、准备工作
[IP配置]
修改各节点 /etc/sysconfig/network-scripts/ifcfg-ens33 配置静态IP,例如:
bash
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.2.211
NETMASK=255.255.255.0
GATEWAY=192.168.2.1
DNS1=192.168.2.1bash
systemctl restart network[KnowHost配置]
在各节点 /etc/hosts 中添加映射,脚本会自动写入,也可以手动添加:
bash
192.168.2.211 node-1
192.168.2.212 node-2
192.168.2.213 node-3二、安装Java
ElasticSearch 需要 Java 环境,本次使用 OpenJDK 17:
bash
yum install -y java-17-openjdk-devel配置 JAVA_HOME,写入 /etc/profile:
bash
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
export PATH=$PATH:$JAVA_HOME/bin三、安装ElasticSearch
bash
# 下载 RPM 包
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.13.0-x86_64.rpm
# 安装
rpm -ivh elasticsearch-7.13.0-x86_64.rpm四、配置ElasticSearch
编辑 /etc/elasticsearch/elasticsearch.yml,脚本会根据节点IP和名称自动生成,核心配置如下:
yaml
cluster.name: es-cluster
node.name: node-1 # 每个节点不同
network.host: 0.0.0.0
http.port: 9200
transport.port: 9300
discovery.seed_hosts: ["192.168.2.211:9300", "192.168.2.212:9300", "192.168.2.213:9300"]
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]
# 跨域访问
http.cors.enabled: true
http.cors.allow-origin: "*"[目录权限配置]
ElasticSearch 默认使用 elasticsearch 用户运行,需确保日志和数据目录权限正确:
bash
mkdir -p /usr/share/elasticsearch/logs && mkdir -p /usr/share/elasticsearch/data
chown -R elasticsearch:elasticsearch /usr/share/elasticsearch/logs
chmod -R 750 /usr/share/elasticsearch/logs
chown -R elasticsearch:elasticsearch /usr/share/elasticsearch/data
chmod -R 750 /usr/share/elasticsearch/data五、启动ElasticSearch
bash
# 开放防火墙端口(9200=HTTP通信,9300=节点间通信)
firewall-cmd --zone=public --add-port=9200/tcp --permanent
firewall-cmd --zone=public --add-port=9300/tcp --permanent
firewall-cmd --reload
# 启动并设置开机自启
systemctl start elasticsearch
systemctl enable elasticsearch验证集群状态:
bash
curl -X GET "localhost:9200/_cluster/state?pretty"六、安装Kibana
bash
# 下载与 ES 对应版本的 Kibana
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.13.0-x86_64.rpm
# 安装
rpm -ivh kibana-7.13.0-x86_64.rpm编辑 /etc/kibana/kibana.yml:
yaml
# 服务器监听地址
server.host: "0.0.0.0"
# Kibana 服务端口
server.port: 5601
# 关联的 Elasticsearch 地址
elasticsearch.hosts: ["http://node-1:9200", "http://node-2:9200", "http://node-3:9200"][Kibana 权限与启动]
bash
# 目录权限
chown -R kibana:kibana /var/log/kibana
chown -R kibana:kibana /etc/kibana
# 开放防火墙
firewall-cmd --permanent --add-port=5601/tcp
firewall-cmd --reload
# 启动并设置开机自启
systemctl start kibana
systemctl enable kibana七、密码配置
[启用X-Pack认证]
进入 ES 容器或直接编辑配置文件,在 elasticsearch.yml 中添加:
yaml
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true重启 ES 后设置用户密码:
bash
# 交互式设置所有内置用户密码
./bin/elasticsearch-setup-passwords interactive设置完成后再次重启 ES 使配置生效。