作者:唐辉
1.文档编写目的
什么是Ranger Audit?Ranger 审计功能 ,审计功能模块可以帮助我们更好的管理集群组件,例如 HDFS、HBase、Hive 等数据资源的访问,更快的定位权限导致的应用问题。并且使用 Ranger 控制权限的同时也可以很好地监控、查询用户的历史操作,做到有证可查,有理可依。
而在CDP目前的使用存在着部分问题需要处理,Ranger 的审计日志信息存储在Solr,出现如Solr数据目录空间占用过高,Solr shard连接超时亦或者如下数据量过大时,会导致Ranger Audit 界面加载缓慢,甚至如下图无法加载出来情况。
本文主要通过从Solr 存储目录、数据保留时长和调整ranger_audits 的shard 数量3个方面来进行Ranger Audit调优。
- 测试环境
1.CDP7.1.6 、启用Kerberos
2.操作步骤
2.1修改Solr存储目录
在CDP7.1.5之前的版本中,集群中Solr 的索引数据文件存储在HDFS中。虽然能够有效的解决索引文件快速增长的问题,但是同样因为存在HDFS中的缘故,并且需要频繁的更新,导致了性能上的问题(比如Ranger Audit 日志很久的加载不出来的情况)。当集群中的Ranger审计信息比较大时,会导致因为写入延迟的问题而造成spool 目录中日志(目录在/var/log/[service]/audit/solr/spool)的堆积。
因此在CDP7.1.5以后,CDH中已将Solr 的数据目录修改为本地目录,默认在/var/lib/solr-infra 目录,建议在安装的时候修改/var/lib/solr-infra 到存储更大数据目录中。如果集群以及安装好,并且数据目录不在本地或者未修改存储路径,修改步骤如下,参考文档[1]:
情况1:修改本地目录(建议将Solr 数据放在本地)
如下图中,当前我们CDP7.1.6 的本地数据目录在/var/lib/solr-infra,并且已有部分数据,建议先进行备份,然后将本地的数据目录/var/lib/solr-infra 拷贝到/data3 目录下,然后重启生效即可
代码语言:javascript复制cp -rp /var/lib/solr-infra /var/lib/solr-infra-bak
情况2:将本地存储目录修改到HDFS上 (从HDFS到本地只有step2 步骤配置文件有差异,其余步骤一致。)
如果我们想把本地的数据目录迁移到HDFS上,操作步骤如下:
step 1、创建HDFS备份数据目录
代码语言:javascript复制hdfs dfs -mkdir /solr-backups
hdfs dfs -chown solr:solr /solr-backups
step 2、导出ranger_audits 配置,并修改/tmp/ranger_audits/conf下的solrconfig.xml
代码语言:javascript复制solrctl instancedir --get ranger_audits /tmp/ranger_audits
#如果有使用Atlas 参考ranger_audits,本文只讲述Ranger Audit,示例如下,具体可参考连接[1]
#如下是本地数据目录找到如下配置文件,如果是HDFS到本地则配置相反,如图片中圈出的注释部分
<directoryFactory name="DirectoryFactory" class="${solr.directoryFactory:solr.NRTCachingDirectoryFactory}">
<lockType>${solr.lock.type:native}</lockType>
修改为:
<directoryFactory name="DirectoryFactory" class="${solr.directoryFactory:org.apache.solr.core.HdfsDirectoryFactory}">
<lockType>${solr.lock.type:hdfs}</lockType>
如果配置与下图中的配置不一致,请添加以下属性,参考[1]
step 3、然后进行配置更新(此处只修改了ranger_audits 集合信息到HDFS上):
代码语言:javascript复制cd /var/run/cloudera-scm-agent/process/`ls -lrt /var/run/cloudera-scm-agent/process/ | awk '{print $9}' |grep SOLR_SERVER | tail -1`/
solrctl --jaas jaas.conf instancedir --update ranger_audits /tmp/ranger_audits
注意:重启之前建议进行数据备份:
step 4、备份数据到HDFS 目录上
代码语言:javascript复制curl -k --negotiate -u : "http://cdh02.fayson.com:8993/solr/admin/collections?action=BACKUP&name=ranger_audits_backup2&collection=ranger_audits&location=hdfs://cdh01.fayson.com:8020/solr-backups"
如果需要备份其他collection 也类似如下:
并重启Solr Server 后发现有hdfs 中ranger_audits信息了,但是数据量目前对不上,需要先进行删掉ranger_audits,然后从备份中恢复
step5、从备份的数据中进行恢复:
代码语言:javascript复制#恢复数据方法1(推荐):使用如下命令,参数解释如下
# --restore <collection name>
# -l <location path>
# -b <backup name>
# -i <request id, 自行填,勿重复>
solrctl collection --restore ranger_audits -l hdfs://cdh01.fayson.com:8020/solr-backups -b ranger_audits_backup2 -i 1234
#恢复数据方法2:
#或者如下也可以执行恢复:
curl -k --negotiate -u : "http://cdh02.fayson.com:8993/solr/admin/collections?action=RESTORE&name=ranger_audits_backup2&location=hdfs://cdh01.fayson.com:8020/solr-backups&collection=ranger_audits"
方式1如下(推荐):执行后需要等待数据恢复
方式2如下图:
恢复数据前需要先删掉ranger_audits 集合,如果已存在ranger_audits会提示如下异常
通过监控图表也可以看到数据已恢复
进入Ranger Audit检查,到此ranger_audits从本地目录迁移到HDFS已完成
2.2修改Solr 的中ranger_audits 数据保留时长
CDP中Ranger 的审计日志数据默认存储在Solr 的ranger_audits 中,默认的保留时长为90天,对于一个操作频繁的集群90天的保留时长的数据量会相当的大,并且数据量一大也会导致在Ranger 中查看审计信息日志变慢,建议在缩短数据保留时长,比如7天。具体修改操作步骤如下, 参考文档[2]:
1. 在Solr Server或者Solr Gateway主机上运行以下命令,将 Ranger 审计配置下载到 SolrServer 或 Solr Gateway主机:
代码语言:javascript复制 solrctl instancedir --get ranger_audits /tmp/ranger_audits
2. 在文本编辑器中打开以下文件:
代码语言:javascript复制 vim /tmp/ranger_audits/conf/solrconfig.xml
找到如下配置,将保留数据时长修改为7天
代码语言:javascript复制<str name="fieldName">_ttl_</str>
<str name="value"> 7DAYS</str>
注意:此处还有一个配置需要修改,Ranger Audits集合的 Solr 文档中没有_ttl_字段和_expire_at_字段,在solrconfig.xml ranger_audits config 中设置的 updateRequestProcessorChain 中的处理器顺序不正确时,会出现设置的保留 。该问题是请求处理器的顺序引起的。TTL 默认逻辑放置应在runUpdateProcessorFactory 之后,它才会实际执行更新。
修改如下配置的的顺序,将如下配置文件移动到到下图中的位置
代码语言:javascript复制<processor class="solr.LogUpdateProcessorFactory"/>
<processor class="solr.DistributedUpdateProcessorFactory"/>
<processor class="solr.RunUpdateProcessorFactory"/>
然后执行如下命令更新,注意:更新需要在Solr Server 的process 目录下执行:
代码语言:javascript复制#进入最新的Solr Server process 目录
cd /var/run/cloudera-scm-agent/process/`ls -lrt /var/run/cloudera-scm-agent/process/ | awk '{print $9}' |grep SOLR_SERVER | tail -1`/
#执行更新
solrctl --jaas jaas.conf instancedir --update ranger_audits /tmp/ranger_audits
使用 Solr 凭据(启用了kerberos 需要进行认证,否则执行会如下报错401)重新加载 Ranger_audits 集合,以便该集合可以通过运行以下命令来获取修改后的配置:
代码语言:javascript复制 solrctl collection --reload ranger_audits
然后重启Solr Server 生效,可以通过命令get 下来配置文件,查看是否已生效
代码语言:javascript复制solrctl instancedir --get ranger_audits /tmp/ranger_audits
注意:更改配置和重新加载集合后新添加的文档将被自动删除。但是对于修改配置以前的数据文件需要通过命令手动删除,如下
代码语言:javascript复制curl -v --negotiate -u : "http://cdh02.fayson.com:8993/solr/ranger_audits/update?commit=true" -H "Content-Type: text/xml" --data-binary "<delete><query>evtTime:[* TO NOW-7DAYS]</query></delete>"
也可以通过CM的监控页面看到数据的减少
当我们清理完部分历史数据重启完成后,可以很快速的打开Ranger 的Audit 界面
并且更早之前的数据都已清理
2.3修改ranger_audits 中的shard 的数量
该步骤强烈建议在集群安装时配置,在CDP最新版本CDP7.1.6中,ranger_audits 的shards 数量为1,这种情况下容易因硬件故障或者其他因素导致数据丢失的数量,因此建议配置最少配置为2,同时Solr Server 服务也必须存在2个。
操作之前建议按照文章2.1中的step 1,进行使用HDFS备份数据,ranger_audits 的shards 数量修改需要删除已有的ranger_audits集合。然后通过CM 重启Ranger 自动创建ranger_audits 集合,再通过备份数据恢复。
Infra Solr中应该有2个实例,按照以下属性设定,就可以让 Ranger Audit collection,在2个Solr node中都各有2个 shard,互为主备。在 CM>Ranger>配置中搜索solr 进行修改,并重启Ranger 生效
代码语言:javascript复制- ranger.audit.solr.no.shards: 2
- ranger.audit.solr.max.shards.per.node: 2
- ranger.audit.solr.no.replica: 2
3.文档总结
在CDP集群中使用中,相信大部分人在HBase 或者Hive 服务日志中都遇到Solr ranger_audits集合的告警信息,严重的甚至导致默认存放数据目录 /var/lib/solr-infra或者/var/log/[service]/audit/solr/spool 被写满。或者在CDP 7.1.5之前的版本中HDFS 的/solr 目录占用空间大的情况。另外也强烈建议以上的配置在集群安装时就规划好,通过上述文档的调优,相信可以得到有效的解决。
参考文档:
代码语言:javascript复制[1] https://my.cloudera.com/knowledge/Solr-Data-Migration-from-local-FS-to-HDFS-and-vice-versa-for?id=316420
[2] https://my.cloudera.com/knowledge/ERROR-Time-to-live-configuration-for-Ranger-Audits-not-Working?id=315204