首先注意:在配置ACL的時候,請關閉solr運行實例!!否則可能對集群造成不可恢復的損壞
開始:
1.修改solr.xml,在solrCloud節點添加,告訴solr要使用的provider:
<!--zkACL--> <str name="zkCredientialsProvider">org.apache.solr.common.cloud.VMParamsSingleSetCredentialsDigestZkCredentialsProvider</str> <str name="zkACLProvider">org.apache.solr.common.cloud.VMParamsAllAndReadonlyDigestZkACLProvider</str>
2.給zkcli.sh添加兩個變量,並把變量加到PATH變量中,這樣使用zkcli.sh訪問zk的時候,就提供了provider和相關用戶名密碼
添加的內容:
#ZK_ACLS SOLR_ZK_CREDS_AND_ACLS="-DzkDigestUsername=admin-user -DzkDigestPassword=admin-password -DzkDigestReadonlyUsername=readonly-user -DzkDigestReadonlyPassword=readonly-password" SOLR_ZK_PROVIDERS="-DzkACLProvider=org.apache.solr.common.cloud.VMParamsAllAndReadonlyDigestZkACLProvider -DzkCredentialsProvider=org.apache.solr.common.cloud.VMParamsSingleSetCredentialsDigestZkCredentialsProvider"
修改的內容:
3.在bin/solr.in.sh底部添加如下用戶名密碼的配置,目的是為了讓bin/solr 腳本能夠有訪問zk配置文件的權限(也就是說讓solr的web界面里能夠顯示zk配置文件)
#ZK ACLS SOLR_ZK_CREDS_AND_ACLS="-DzkDigestUsername=admin-user -DzkDigestPassword=admin-password -DzkDigestReadonlyUsername=readonly-user -DzkDigestReadonlyPassword=readonly-password" SOLR_OPTS="$SOLR_OPTS $SOLR_ZK_CREDS_AND_ACLS"
好了,配置完成。
下面我們來測試一下,
假設我們原本的zk里面文件夾節點/collections,我們來給它添加權限,執行:
sh zkcli.sh -zkhost 10.172.85.105 -cmd updateacls /collections
執行完成后我們進入zk客戶端命令行,執行:
ls /collections,結果如下:
證明我們成功給/collections這個節點添加了權限。
我們來查看一下/collections這個節點的權限設置:
如圖中所示,代表有兩個用戶admin-user和readonly-user擁有這個節點的權限,admin-user的權限是cdrwa,readonly-user的權限是r。
我們授予權限admin-user,然后再查看,這時候就可以查看了:
接下來我們啟動solr,在solr admin的管理頁面里查看zk的配置文件:
如圖,查看成功,這說明之前我們配置的solr.xml和solr.in.sh成功的在solr啟動時給予solr集群訪問zk的權限。
備注:
1.上述我們是手動給/collections添加了權限,對於solr自動創建的文件,如果是在我們配置ACL之前已經生成的文件,都需要我們手動添加權限,對於配置ACL之后生成的文件,全部會自動添加solr.in.sh中配置的權限。
2.zk的權限設置是非繼承的,也就是說如果A文件夾節點里有子文件夾節點B,我們在zk的客戶端命令行中給A設置權限,那么B不會受影響,任意用戶都可以訪問B。然而上述我們用zkcli.sh的updateacls命令給/collections目錄節點設置權限時,實際上solr內部的org.apache.solr.cloud.ZkCLI 會遞歸地將collections下的全部文件夾節點/文件節點都設置上權限。