一、Elasticsearch从8.8升级到8.17方案

迁移 Elasticsearch 服务器并同时从 8.8 升级到 8.17 的过程可以分为几个步骤。

1. 备份数据

在迁移和升级之前,确保对 Elasticsearch 数据进行完整备份。可以使用快照功能来备份数据:

调整配置文件 elasticsearch.yml ,配置快照仓库

path.repo: ["/data/backups/es_backup"]

修改快照仓库权限(旧用户为es)

sudo chown -R es:es /data/backups/es_backup
sudo chmod -R 750 /data/backups/es_backup
创建快照库
curl -X PUT 'http://localhost:9200/_snapshot/old_backup' -H "Content-Type: application/json" -d '  	   
{  
  "type": "fs",  
  "settings":   
  {
    "location": "/data/backups/es_backup"  
  }  
}';

确保快照仓库目录为空

保存快照
curl -X PUT 'http://localhost:9200/_snapshot/old_backup/snapshot_1?wait_for_completion=true' -H 'Content-Type: application/json' -d '{
  "indices": "*",
  "ignore_unavailable": true,
  "include_global_state": true
}';

2. 准备新服务器

  • 安装 JDK17或JDK21。
  • 安装 Elasticsearch 8.17。

注意:具体参考第二章节

3. 停止旧实例

在进行迁移之前,停止旧的 Elasticsearch 实例以确保数据的完整性:

停止 Elasticsearch 服务
sudo systemctl stop elasticsearch
或者使用以下命令
service elasticsearch stop

4. 传输快照

将备份快照从旧服务器复制到新服务器。可以使用 scp 或其他方式:

scp -r /data/backups/es_backup/* root@新服务器IP:/data/backups/es_backup

5. 在新服务器上恢复快照

在新服务器上恢复快照:

添加快照库
curl -u $ES_USER:$ES_PASSWORD -X PUT 'https://localhost:9200/_snapshot/new_backup' --insecure -H "Content-Type: application/json" -d '
{
  "type": "fs",
  "settings": {
    "location": "/data/backups/es_backup"
  }
}';
恢复快照
curl -u $ES_USER:$ES_PASSWORD -X POST 'https://localhost:9200/_snapshot/new_backup/snapshot_1/_restore' --insecure -H 'Content-Type: application/json' -d '{
  "indices": "*",
  "ignore_unavailable": true,
  "include_global_state": true
}';

注意:恢复快照会将原有数据抹掉,所以需要重置超级用户密码、重新创建自定义角色、自定义用户。

6. 更新配置

根据需要调整新服务器上的 Elasticsearch 配置文件 elasticsearch.yml ,确保网络、集群名和其他设置与旧实例一致。

7. 启动新实例

启动新服务器上的 Elasticsearch 实例:

sudo systemctl start elasticsearch

8. 验证升级和迁移

确保新服务器上的 Elasticsearch 正常运行,并验证索引和数据是否完整:

检查 Elasticsearch 状态
#查看索引
curl -u $ES_USER:$ES_PASSWORD -X GET 'https://localhost:9200/_cat/indices?v&h=index,rep&pretty' -k
#查看集群状态
curl -u $ES_USER:$ES_PASSWORD -X GET 'https://localhost:9200/_cluster/health?pretty' -k
curl -u $ES_USER:$ES_PASSWORD -X GET "https://localhost:9200/_cat/shards?v&h=index,shard,prirep,state,unassigned.reason&s=state&pretty" -k
#查看分配详情
curl -u $ES_USER:$ES_PASSWORD -X GET 'https://localhost:9200/_cluster/allocation/explain?pretty' -k

9. [理论可选]java应用依赖配置

修改项目中的pom.xml文件中elasticsearch-java和jackson-databind版本号:

<dependency>
  <groupId>co.elastic.clients</groupId>
  <artifactId>elasticsearch-java</artifactId>
  <version>8.17.3</version>
</dependency>

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.17.0</version>
</dependency>

10. 完成

在确认一切正常后,可以更新应用程序配置以指向新服务器。

注意事项

  • 请查看官方升级指南,了解版本间的变更和兼容性问题。
  • 在生产环境中进行迁移和升级时,请确保进行充分的测试,避免服务中断。

二、Elasticsearch配置账号和密码,生成API Token

###安装jdk21
下载最近版本jdk

wget https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.tar.gz

解压到opt目录下

sudo tar -xzf jdk-21_linux-x64_bin.tar.gz -C /opt/

修改环境变量(sudo vi /etc/profile)

export JAVA_HOME=/opt/jdk-21.0.6
export PATH=$JAVA_HOME/bin:$PATH

执行 source /etc/profile 立即生效
###安装es8.17.3
下载指定版本es

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.17.3-x86_64.rpm

使用rpm命令安装es

sudo rpm -ivh elasticsearch-8.17.3-x86_64.rpm

注意:记录默认生成的超级管理员密码
修改配置 sudo vi /etc/elasticsearch/elasticsearch.yml

cluster.name: my-application
node.name: node-1
network.host: 0.0.0.0
discovery.seed_hosts: ["127.0.0.1"]
cluster.initial_master_nodes: ["node-1"]
path.repo: ["/data/backups/es_backup"]

分配内存 sudo vi /etc/elasticsearch/jvm.options

#符号-前面不能有空格
-Xms4g
-Xmx4g

修改快照仓库目录权限

mkdir -p /data/backups/es_backup
sudo chown -R elasticsearch:elasticsearch /data/backups/es_backup
sudo chmod -R 750 /data/backups/es_backup

重启ES systemctl restart elasticsearch

1. 启用 Elasticsearch 安全功能

编辑 /etc/elasticsearch/elasticsearch.yml 文件,添加或修改以下配置:

xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true

Elasticsearch 8.x 默认启用了账号密码验证。如果你使用的是默认安装,系统会自动生成一个内置用户(如 elastic)和密码

修改配置后,重启 Elasticsearch 服务以使更改生效

sudo systemctl restart elasticsearch

2. 设置超级用户密码

如果尚未为内置用户(如 elastic)设置密码,运行以下命令:

sudo /usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive

#重置超级用户密码:	
/usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic

将超级用户和密码配置到环境变量(sudo vi /etc/profile)

export ES_USER="elastic"
export ES_PASSWORD="您的密码"

执行 source /etc/profile 立即生效

3. 创建自定义用户(恢复快照后,再执行此步骤)

注意:Elasticsearch 8.x 默认启用了 HTTPS,因此需要使用 https 协议,并添加 --insecure 或 -k 参数(如果使用自签名证书)

创建角色

除了预定义的角色外,还可以创建自定义角色。例如,创建一个名为 es-admin-role 的角色,允许用户读写索引中的数据

curl -u $ES_USER:$ES_PASSWORD -X PUT -i 'https://localhost:9200/_security/role/es-admin-role' --insecure -H 'Content-Type: application/json' -d '{
      "cluster": ["monitor", "manage", "cluster:admin/xpack/security/api_key/create"],
	  "indices": [
		{
		  "names": ["*"],
		  "privileges": ["all"]
		}
	  ]
    }';
创建用户

通过API创建自定义用户:

#用户名:tms	密码:tms2025*	分配角色:es-admin-role
curl -u $ES_USER:$ES_PASSWORD -X POST "https://localhost:9200/_security/user/tms" --insecure -H "Content-Type: application/json" -d '{
	  "password": "tms2025*",
	  "roles": ["es-admin-role"], 
	  "full_name": "tms-es",
	  "email": "tms2025@qq.com"
	}';
#查看用户分配的角色
curl -u $ES_USER:$ES_PASSWORD -X GET "https://localhost:9200/_security/user/tms" --insecure

应用程序可配置自定义的用户和密码,或使用下面的ApiKey

4. 生成 API Token(恢复快照后,再执行此步骤)

使用自定义用户生成 API Token

curl -u tms:tms2025* -X POST "https://localhost:9200/_security/api_key?pretty" --insecure -H "Content-Type: application/json" -d '{
  "name": "tms-es-token"
}';
  • name 是 Token 的名称,设置为:tms-es-token

响应示例:

{
  "id": "AP5asZUB5sU10rRq8JcO",
  "name": "tms-es-token",
  "api_key": "q-KOYtVWQsmdsDfU08MPiQ",
  "encoded": "QVA1YXNaVUI1c1UxMHJScThKY086cS1LT1l0VldRc21kc0RmVTA4TVBpUQ=="
}
  • id 和 api_key 组合起来就是你的 API Token(应用程序可配置id值作为用户名、api_key值作为密码)
  • encoded是经过Base64编码的Token,可配置到应用程序 Authorization: ApiKey xxx
测试使用 API Token

在请求 Elasticsearch API 时,使用生成的 Token 进行认证。例如:

curl -H "Authorization: ApiKey QVA1YXNaVUI1c1UxMHJScThKY086cS1LT1l0VldRc21kc0RmVTA4TVBpUQ==" -X GET "https://localhost:9200/_cluster/health?pretty" -k
Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐