Elasticsearch升级踩坑记之使用snapshot备份数据
参考文档:https://www.elastic.co/guide/en/elasticsearch/reference/2.4/modules-snapshots.html 环境:有三台机器192.168.1.146,192.168.1.151,192.168.1.152,系统均是Centos7,上面分别安装了elasticsearch2.4.6(为了学习之用才安装的2.4.6版本)。
在使用snapshot备份数据过程中碰到过不少问题,其实都是和权限有关(后面会讲),具体踩坑记录这里就不写了,直接写正确的操作过程吧。
第一步创建共享目录 创建共享目录 参考:http://blog.csdn.net/rznice/article/details/72654826 共享目录相关的服务需要打开好几个端口,为了避免防火墙的影响,这里直接关闭防火墙。
systemctl stop firewalld
创建相应的文件夹 146上创建/data/essnapshot和/data/backup_es,151和152上建/data/backup_es,因为在创建snapshot时,elasticsearch是用elasticsearch用户来执行的,所以需要个这些文件夹分别授权(下面的elasticsearch用户就是你执行elasticsearch的用户,根据你自己的来) 服务端
chown -R elasticsearch:elasticsearch /data/essnapshot
chown -R elasticsearch:elasticsearch /data/backup_es
客户端
chown -R elasticsearch:elasticsearch /data/backup_es
将46作为NFS服务端,在上面安装相应的服务
yum install -y nfs-utils
在NFS服务端146编辑/etc/exports文件,添加
/data/essnapshot *(insecure,rw,no_root_squash,sync)
NFS服务做成开机启动
systemctl enable rpcbind.service systemctl enable nfs-server.service
启动NFS相应的服务
systemctl start rpcbind.service systemctl start nfs-server.service
确认服务是否启动
rpcinfo -p
看到一堆与nfs相关的服务,说明启动成功了 在客户端151,152安装相应的服务,并启动
yum install -y nfs-utils
systemctl enable rpcbind.service
systemctl start rpcbind.service
在客户端查看服务端共享目录
[root@localhost data]# showmount -e 192.168.1.146
Export list for 192.168.1.146:
/data/essnapshot *
分别在客户端机器151,152上挂载共享目录,将服务端共享目录挂载在客户端/data/backup_es这个位置
mount -t nfs 192.168.1.146:/data/essnapshot /data/backup_es -o proto=tcp -o nolock
到此共享目录已经创建完成,可以测试是否成功了,测试的方法很简单。切换到elasticsearch用户,首先在NFS服务端146的/data/essnapshot上创建一个test.txt文件,再分别到151和152的/data/backup_es上以elasticsearch用户查看test.txt文件是否存在。如果存在则可以说明共享目录创建成功了。但是别开心的太早,现在在来来看看另一个致命的问题,仔细看看text.txt文件的user和group。如果你比较幸运,发现三台机器上test2.txt文件的user和group都是一致的,如下所示
-rw-rw-r-- 1 elasticsearch elasticsearch 39 3月 12 17:36 test.txt
那么很好,接下来的操作你就不需要了,如果不是一致的,如下所示(我们的机器不一样,所以显示的可能是不一致的):
146:-rw-rw-r-- 1 elasticsearch 1005 39 3月 12 17:36 test.txt
151:-rw-rw-r-- 1 nginx elasticsearch 39 3月 12 17:36 test.txt
152:-rw-rw-r-- 1 1004 elasticsearch 39 3月 12 17:36 test.txt
那么说明,你三台机器的elasticsearch用户的uid不一致,gid也不一致,为什么会这样呢?实际上是因为你在其中一台机器创建test.txt文件时,其它机器在共享这个文件时,这个文件的uid和gid也被共享了,虽然你是用elasticsearch用户创建的test.txt文件,但是由于三台机器的elasticsearch用户uid和gid不一致,结果在不同机器上看到的用户和用户组不一致,这样就存在权限问题了,设想一下,你在使用snapshot备份的时候,在一台机器上创建了一个备份,而由于三台机器的用户uid和gid不一样在写入的时候,是不是会发生拒绝访问的问题。所以解决方法就是得确保三台机器的uid一致,gid也一致。
解决方法很简单,重新创建一个elastic用户和用户组,使三台机器的elastic用户和用户组的uid,gid一样。
指定gid创建用户组(1020这个uid和gid确保没有被其它用户和用户组使用,可以在/etc/passwd里面查看,只要比最大的大就没问题)
groupadd -g 1020 elastic
创建用户,指定uid和用户组
useradd -u 1020 -g elastic elastic
在三台机器都执行上面的操作,那么三台机器的elastic用户uid都是1020,elastic用户组的gid都是1020
将三台机器所有相关目录全部设置权限为elastic
Elasticsearch启动目录
chown -R elastic:elastic elasticsearch-2.4.6
存放elasticsearch数据的目录,我的在esData下
chown -R elastic:elastic /data/esData/
日志目录,我的在es下
chown -R elastic:elastic /data/es/
Snapshot存放的目录
chown -R elastic:elastic /data/backup_es/
最后再执行创建snapshot仓库,OK成功了。
[root@localhost data]# curl -XPUT 'http://192.168.1.146:9200/_snapshot/my_backup' -d '{
> "type": "fs",
> "settings": {
> "location": "/data/backup_es",
> "compress": true
> }
> }'
{"acknowledged":true}
查看仓库
[root@localhost backup_es]# curl -XGET 'http://192.168.1.146:9200/_snapshot/my_backup?pretty'
{
"my_backup" : {
"type" : "fs",
"settings" : {
"compress" : "true",
"location" : "/data/backup_es"
}
}
}
创建快照备份 1.创建所有索引的快照
[root@localhost backup_es]# curl -XPUT http://192.168.1.146:9200/_snapshot/my_backup/snapshot_test20180312
{"accepted":true}
2.查看备份
[root@localhost backup_es]# curl -XGET http://192.168.1.146:9200/_snapshot/my_backup/snapshot_test20180312?pretty
{
"snapshots" : [ {
"snapshot" : "snapshot_test20180312",
"version_id" : 2040699,
"version" : "2.4.6",
"indices" : [ "megacorp", "website", "logstash-2013.12.11", "my_index_v1", "my_index_v2", "cars", "logstash-18-02-26", "logstash-2018.03.06", "my_index", "my_store", "logstash-2011.05.19", "my_index2", "logstash-2011.05.18", "logstash-2015.01.04" ],
"state" : "SUCCESS",
"start_time" : "2018-03-12T09:36:19.345Z",
"start_time_in_millis" : 1520847379345,
"end_time" : "2018-03-12T09:36:20.741Z",
"end_time_in_millis" : 1520847380741,
"duration_in_millis" : 1396,
"failures" : [ ],
"shards" : {
"total" : 42,
"failed" : 0,
"successful" : 42
}
} ]
}
也可以到/data/backup_es目录下查看,备份是否创建成功。确认索引都备份完成之后,可以开始升级elasticsearch了。
备注:上面我是使用共享目录方式来备份的,不知道不使用共享目录的方式能不能备份,没试过,感兴趣的可以尝试一下。
升级elasticsearch请参考: http://blog.csdn.net/u012062455/article/details/79571898
- 【死磕Java并发】—- 深入分析CAS
- [SQLServer大对象]——FileTable从文件系统迁移文件
- [机器学习]-[数据预处理]-中心化 缩放 KNN(二)
- [数据清洗]-看上去一样的数字
- [数据清洗]- Pandas 清洗“脏”数据(三)
- [数据清洗]- Pandas 清洗“脏”数据(二)
- [数据清洗]-Pandas 清洗“脏”数据(一)
- [数据清洗]-混乱的邮编数据
- 10行代码,Python实现爬取淘宝/天猫评论
- 4.请求安全-- 结合使用的安全优势总结
- TensorFlow强化学习入门(4)——深度Q网络(DQN)及其扩展
- 3.请求安全-- 如何验证请求的唯一性
- 2.请求安全-- MD5的必要性以及实际应用场景
- 1.请求安全-- 一个简单的 单设备登录 单点登录
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法