Skip to content

第二章 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.1
bash
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 使配置生效。