小序
最新有收到一些小伙伴的反馈,说他们在测试Solr的Backup功能的时候,发现单机模式的Solr在一个Collection一个分片的情况下可以备份,但是多个分片和SolrCloud模式下备份失败,报“Could not backup all replica”的错误。
Solr也是好久没接触,我一时还没反应过来原因,于是去看官方Reference,找到snapshot的API对了一下,发现他们也没用错。于是继续阅读文档,其中的一个字眼让我立刻想到了原因:“Shared File System”。于是我问他们你们的数据没有存在HDFS或者NFS吧,他们说是,那我就知道原因了,因为snapshot API只能应用于共享文件系统!
这一点跟我负责的组件ES是一样的,ES也有snapshot的功能,也只能应用于共享文件系统,例如Azure、S3、NFS或者HDFS等。于是自己试着也玩了一把,留做笔记。
版本
- Centos7.4
- ES:7.3.2
- HADOOP:3.2.1
- JAVA:1.8
- 用到的ES插件为repository-hdfs-7.3.2.zip,“The HDFS snapshot/restore plugin is built against the latest Apache Hadoop 2.x (currently 2.7.1).” 官网说这个插件的版本基于2.7.1的内核,但我想作为客户端应该也用不了多少个API,暂且使用了3.2.1版本去验证,暂时未发现兼容性问题。网速好的可以去这里下载这个插件,像我网速不好的,每秒钟几个b的,干脆选择了使用本地的源码gradlew assemble --parallel编译了一把,找到了打包好的repository-hdfs-7.3.2.zip插件(注意,这个插件默认没有打包到ES的安装包中)。
测试过程
为了简单起见,我采用了伪分布式的部署方式部署Hadoop在自己的虚拟机上(小本本开两个虚拟机都发烫,就跑一个吧。。),其他部署方式可以参考这里
- 解压hadoop-3.2.1.tar.gz包(tar xzvf)
- cd到解压好的目录(hadoop:hadoop权限),vim etc/hadoop/hadoop-env.sh,set一下JAVA_HOME,如果想要使用hdfs dfs命令方便的话,可以再在/etc/profile中设置一下HADOOP_HOME,我这里并未执行这个。
# set to the root of your Java installation
export JAVA_HOME=/opt/jdk1.8.0_121
- 配置好SSH,测试一下ssh localhost是否需要密码,需要密码的话,执行以下命令
$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys
- 配置hadoop
- etc/hadoop/core-site.xml:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://192.168.82.133:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hbase/hadoop-3.2.1/hadoop</value>
</property>
</configuration>
- etc/hadoop/hdfs-site.xml:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.client.read.shortcircuit</name>
<value>true</value>
</property>
<property>
<name>dfs.domain.socket.path</name>
<value>/opt/hbase/hadoop-3.2.1/dn_socket</value>
</property>
</configuration>
- 启动hadoop
./sbin/start-dfs.sh
没有问题的话这里一切正常启动,有问题查找原因并解决。 - 安装ES以及hdfs-repo插件
解压elasticsearch-7.3.2.tar.gz
chown elastic:elastic elasticsearch-7.3.2 -R
bin/elasticsearch-plugin install file:///opt/repository-hdfs-7.3.2.zip
启动ES,看到启动日志中已经正常加载了repository-hdfs 插件。 - 发送命令创建仓库
curl -X PUT "http://192.168.82.133:9200/_snapshot/my_hdfs_repository?pretty" -H 'Content-Type: application/json' -d'
{
"type": "hdfs",
"settings": {
"uri": "hdfs://192.168.82.133:9000/",
"path": "elasticsearch/repositories/my_hdfs_repository"
}
}
'
- 发送命令备份所有索引,目前我的ES里面只有一个my_index索引
curl -X PUT "http://192.168.82.133:9200/_snapshot/my_hdfs_repository/all_indices_snapshot_1?pretty"
- 这里我遇到一个报错:
Caused by: java.io.UncheckedIOException: Cannot create HDFS repository for uri [hdfs://192.168.82.133:9000/]
at org.elasticsearch.repositories.hdfs.HdfsRepository.createBlobstore(HdfsRepository.java:146) ~[?:?]
at org.elasticsearch.repositories.hdfs.HdfsRepository.lambda$createBlobStore$1(HdfsRepository.java:232) ~[?:?]
at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_121]
at org.elasticsearch.repositories.hdfs.HdfsRepository.createBlobStore(HdfsRepository.java:231) ~[?:?]
at org.elasticsearch.repositories.hdfs.HdfsRepository.createBlobStore(HdfsRepository.java:54) ~[?:?]
at org.elasticsearch.repositories.blobstore.BlobStoreRepository.blobStore(BlobStoreRepository.java:338) ~[elasticsearch-7.3.2.jar:7.3.2]
... 6 more
Caused by: org.apache.hadoop.security.AccessControlException: Permission denied: user=elastic, access=WRITE, inode="/user":hadoop:supergroup:drwxr-xr-x
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:399)
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:255)
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:193)
at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPermission(FSDirectory.java:1879)
at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPermission(FSDirectory.java:1863)
- 说的原因也很明显,是我创建的/user目录,elastic用户没有权限访问。
- 一个简单的解决方案就是使用hdfs命令给elastic用户赋予权限即可
[hadoop@insight1 root]$ hdfs dfs -mkdir /user/elastic
[hadoop@insight1 root]$ hdfs dfs -chown elastic:hdfs /user/elastic
[hadoop@insight1 root]$ hdfs dfs -ls /
Found 1 items
drwxr-xr-x - hadoop supergroup 0 2020-03-25 11:24 /user
[hadoop@insight1 root]$ hdfs dfs -ls /user
Found 1 items
drwxr-xr-x - elastic hdfs 0 2020-03-25 11:24 /user/elastic
- 再次执行命令
curl -X PUT "http://192.168.82.133:9200/_snapshot/my_hdfs_repository/all_indices_snapshot_1?pretty"
{
"accepted" : true
}
- 删除ES索引
[root@insight1 ~]# curl -X GET "http://192.168.82.133:9200/_cat/indices?v"
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open my_index K4L6Be-pR9ebSQJBstOdcQ 1 1 4 0 7.7kb 7.7kb
[root@insight1 ~]# curl -X DELETE "http://192.168.82.133:9200/my_index?pretty"
{
"acknowledged" : true
}
- 执行restore
[root@insight1 ~]# curl -X POST "http://192.168.82.133:9200/_snapshot/my_hdfs_repository/all_indices_snapshot_1/_restore?pretty"
{
"accepted" : true
}
[root@insight1 ~]#
[root@insight1 ~]# curl -X GET "http://192.168.82.133:9200/_cat/indices?v"
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open my_index T0s7m1fRR6KGhGsgnnmE2Q 1 1 4 0 7.7kb 7.7kb