Docker环境中安装Elasticsearch和ES快照与恢复
- 安装ES的docker版本
- ES快照介绍
- 存储库的安装
- 创建存储库
- 只读网址存储库
- 源存储库
- 存储库的验证
- 执行快照操作
- 快照恢复
- 还原时改变设置
- 监控快照或还原的进度
- 启动失败和纠错过程
安装ES的docker版本
- 拉取镜像
docker pull elasticsearch:7.2.0
- 创建并启动容器
docker run -d --name es -p 9200:9200 -p 9300:9300 -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -e "discovery.type=single-node" elasticsearch:7.2.0
创建时,调整内存的分配“ES_JAVA_OPTS=-Xms512m -Xmx512m”。
增加9200/9300的端口映射
- 检测是否可以正常访问
- 进入容器修改配置文件
docker exec -it es /bin/bash
cd config
vi elasticsearch.yaml
- cluster.name:自定义集群名称;
- network.host:当前es节点绑定的ip地址;
- http.cors.enabled:是否支持跨域,默认为false;
- http.cors.allow-origin:当设置允许跨域,默认为*,表示支持所有域名,如果我们只是允许某些网站能访问,那么可以使用正则表达式。
- 重启容器
docker restart es
ES快照介绍
快照是对于一个正在运行的ES集群的备份,可以对于一个或多个索引进行快照,快照是增量的。这意味着,当创建索引快照时,Elasticsearch避免复制任何已存储在存储库中的数据。因此,可以非常频繁地为群集创建快照。
版本兼容性问题:
- 在6.x中创建的索引快照可以恢复到7.x。
- 在5.x中创建的索引快照可以恢复到6.x。
- 在2.x中创建的索引快照可以恢复到5.x。
- 可以将在1.x中创建的索引快照恢复到2.x。
- 无法将1.X中创建的索引直接的恢复到5.x或6.x …
- 同时不建议从后期版本向前期版本恢复快照,在某些情况下,无法还原,例如在在7.6.0中创建的快照无法还原到7.5.0。
存储库的安装
创建存储库
必须先注册快照存储库,才能执行快照和还原的操作,如果多个集群同时注册同一个快照存储库,只有一个可以有写权限,其余集群设置为readonly模式
PUT /_snapshot/my_backup
{
"type": "fs",
"settings": {
"location": "my_backup_location"
}
}
直接发送put命令会提示错误,需要再进行以下几步的操作:
- 首先进入容器,创建存储库地址,并修改文件夹所有者
进入指定容器
docker exec -it es /bin/bash
创建存储库地址
mkdir backup
使用修改文件夹所有者
chown -R elasticsearch backup
- 查看文件在docker中所属的路径
查看文件在docker中所属路径
pwd
- 修改elasticsearch.yml文件
增加设置
path.repo: ["/usr/share/elasticsearch/backup"]
- 重启容器
docker restart es
- 再次发送PUT命令已经可以正常创建存储库了
支持以下设置:
- location 快照的位置。必选
- compress 打开快照文件的压缩。压缩仅应用于元数据文件(索引映射和设置)。数据文件未压缩。默认为true。
- chunk_size 如果需要,可以在快照过程中将大文件分解为多个块。指定块尺寸的值,并且单元,例如:1GB,10MB,5KB,500B。默认为null(无限制的块大小)。
- max_restore_bytes_per_sec 每个节点的恢复速度。默认为40mb每秒。
- max_snapshot_bytes_per_sec 每个节点的快照速率。默认为40mb每秒。
- readonly 使存储库为只读。默认为false。
- 查看存储库的信息
GET /_snapshot/my_backup
所有的存储库信息
GET /_snapshot
或者
GET /_snapshot/_all
只读网址存储库
URL存储库支持以下协议:“ http”,“ https”,“ ftp”,“ file”和“ jar”。URL与储存库http:, https:以及ftp:网址必须由指定允许的URL被列入白名单repositories.url.allowed_urls设置。此设置在主机,路径,查询和片段的位置支持通配符。例如:
repositories.url.allowed_urls: ["http://www.example.org/root/*", "https://*.mydomain.com/*?*#*"]
源存储库
通过源存储库,您可以创建最少的仅源快照,这些磁盘占用的磁盘空间最多减少50%。仅源快照包含存储的字段和索引元数据。它们不包括索引或doc值结构,并且在还原后不可搜索。恢复的唯一来源快照后,必须重新索引 数据到一个新的索引
PUT _snapshot/my_src_only_repository
{
"type": "source",
"settings": {
"delegate_type": "fs",
"location": "my_backup_location"
}
}
存储库的验证
注册存储库后,需要在主节点和数据节点上对存储库进行验证,保证集群中存在的所有节点上都可以正常运行,会返回已经成功验证的节点列表,或验证失败的错误消息
PUT /_snapshot/my_unverified_backup?verify=false
{
"type": "fs",
"settings": {
"location": "my_unverified_backup_location"
}
}
或
POST /_snapshot/my_unverified_backup/_verify
执行快照操作
一个存储库可以包含同一个集群的许多快照,快照由集群中的唯一名称作为标识,创建一个名称为snapshot_1 的快照命令:
PUT /_snapshot/my_backup/snapshot_1?wait_for_completion=true
默认情况下回生成集群中所有打开和启动的索引,如果需要修改,使用一下的命令
PUT /_snapshot/my_backup/snapshot_2?wait_for_completion=true
{
"indices": "index_1,index_2",
"ignore_unavailable": true,
"include_global_state": false
}
- gnore_unavailable选项。将其设置为true将会导致快照创建期间不存在的索引被忽略。默认情况下,如果ignore_unavailable未设置选项并且缺少索引,则快照请求将失败。
- include_global_state为false,可以防止将群集全局状态存储为快照的一部分。默认情况下,如果参与快照的一个或多个索引没有所有可用的主分片,则整个快照将失败。可以通过设置为partial来更改此行为true。
快照名称可以使用日期数学表达式自动导出,类似于创建新索引时。请注意,特殊字符需要进行URI编码。
例如,snapshot-2018.05.11可以使用以下命令来创建名称为like的当前日期的快照:
# PUT /_snapshot/my_backup/<snapshot-{now/d}>
PUT /_snapshot/my_backup/%3Csnapshot-%7Bnow%2Fd%7D%3E
索引快照过程是增量的。在制作索引快照的过程中,Elasticsearch分析已存储在存储库中的索引文件的列表,并仅复制自上次快照以来创建或更改的文件。这样可以将多个快照以紧凑的形式保存在存储库中。快照过程以非阻塞方式执行。可以继续对正在快照的索引执行所有索引和搜索操作。但是,快照代表的是时间点视图,在快照创建后添加进索引的记录,不会出现在快照中。
群集中任何时间都只能执行一个快照过程。在创建特定分片的快照时,该分片无法移动到另一个节点,这可能会干扰重新平衡过程和分配筛选。Elasticsearch等待快照完成后将分片移动到另一个节点
创建快照后,可以使用以下命令获取有关该快照的信息:
GET /_snapshot/my_backup/snapshot_1
- IN_PROGRESS 快照当前正在运行。
- SUCCESS 快照完成,所有分片已成功存储。
- FAILED 快照以错误结束,无法存储任何数据。
- PARTIAL 全局群集状态已存储,但至少一个分片的数据没有成功存储,在这种情况下,该部分应包含有关未正确处理的分片的更多详细信息。
- INCOMPATIBLE 快照是使用旧版本的Elasticsearch创建的,因此与集群的当前版本不兼容。
与存储库类似,可以一次性查询有关多个快照的信息,并支持通配符:
GET /_snapshot/my_backup/snapshot_*,some_other_sn
查询所有
GET /_snapshot/my_backup/_all
如果某些快照不可用,该命令将失败。布尔参数ignore_unavailable可用于返回当前可用的所有快照。
查看正在运行的快照
GET /_snapshot/my_backup/_current
删除快照
DELETE /_snapshot/my_backup/snapshot_2
从存储库中删除快照后,Elasticsearch会删除与删除的快照相关联且未被其他任何快照使用的所有文件。如果在创建快照时执行了删除的快照操作,则快照过程将中止,并且将清理作为快照过程一部分创建的所有文件。因此,删除快照操作可用于取消误启动的长时间运行的快照操作。
可以使用以下命令注销存储库:
DELETE /_snapshot/my_backup
取消注册存储库后,Elasticsearch仅删除对该存储库存储快照的位置的引用。快照本身保持不变。
快照恢复
- 首先,拷贝出快照
# backup/. 会将backup的内容复制到外部backup文件夹中,如果不加/.就会导致backup文件夹到backup文件夹中变成 backup/backup/...
docker cp es:/usr/share/elasticsearch/backup/. /backup/
- 拷贝到本地打开看一下完全是看不懂
首先拷贝到第二台虚拟机中
- 重复一遍注册数据仓库的动作,创建仓库,查询无误
- 拷贝快照文件夹至容器内部
docker cp /backup/. es:/usr/share/elasticsearch/backup/
- 查看是否拷贝成功
- 先查看目前的ES中是否有数据
- 进行恢复操作
POST /_snapshot/my_backup/snapshot_1/_restore
返回true
- 再进行查询操作,第一台ES的数据已经被恢复到第二台ES中
默认情况下,将还原快照中的所有索引,并且不还原群集状态 。通过使用还原请求主体中的indices和include_global_state选项,可以选择应该还原的索引以及允许还原全局群集状态。索引列表支持多索引语法。该rename_pattern 和rename_replacement选项也可用于使用正则表达式重命名索引。设置include_aliases为false防止别名与关联索引一起还原
POST /_snapshot/my_backup/snapshot_1/_restore
{
"indices": "index_1,index_2",
"ignore_unavailable": true,
"include_global_state": true,
"rename_pattern": "index_(.+)",
"rename_replacement": "restored_index_$1"
}
还原时改变设置
在还原过程中,可以覆盖大多数索引设置。例如,以下命令将index_1还原索引而不创建任何副本
POST /_snapshot/my_backup/snapshot_1/_restore
{
"indices": "index_1",
"index_settings": {
"index.number_of_replicas": 0
},
"ignore_index_settings": [
"index.refresh_interval"
]
}
监控快照或还原的进度
有几种方法可以监视快照的进度并在进程运行时还原它们。这两个操作都支持wait_for_completion阻塞客户端直到操作完成。这是最简单的方法,可用于获取有关操作完成的通知。
也可以通过定期调用快照信息来监视快照操作:
GET /_snapshot/my_backup/snapshot_1
请注意,快照信息操作使用与快照操作相同的资源和线程池。因此,在对大型碎片进行快照时执行快照信息操作可能会导致快照信息操作在返回结果之前等待可用资源。在很大的碎片上,等待时间可能很长。
要获取有关快照的更多即时信息和完整信息,可以改为使用快照状态命令:
GET / _snapshot / my_backup / snapshot_1 / _status
启动失败和纠错过程
在第一次进行配置后,启动失败,在此记录一下排错的过程
- 查看容器日志
查看指定容器最后100行的日志
docker logs --tail 100 es
日志显示没有backup文件夹的访问权限
需要导出日志文件,恢复配置后导入,才能继续启动
导出
docker cp 容器id:docker容器中配置文件路径 主机路径
docker cp es:/usr/share/elasticsearch/config/elasticsearch.yml /backup
删除配置 path.repo
导入
docker cp /backup/elasticsearch.yml es:/usr/share/elasticsearch/config/elasticsearch.yml
重新导入配置文件后执行docker start es,启动正常