Elasticsearch集群多租戶解決方案探索
概述
Elasticsearch是一款強大的實時搜索和分析引擎,設計用于處理海量數(shù)據(jù)。它采用分布式架構(gòu),能夠輕松地擴展以應對大規(guī)模數(shù)據(jù)的需求。通過使用JSON格式存儲數(shù)據(jù),Elasticsearch提供了靈活性,同時具備強大的查詢語言,能夠支持全文搜索、范圍查詢和聚合操作。它在處理大規(guī)模數(shù)據(jù)方面也是非常出色,適用于各種實時應用,如監(jiān)控日志、數(shù)據(jù)分析等業(yè)務場景。
單租戶面臨的問題
這里的租戶特指訪問集群的用戶
單租戶場景:所有訪問者使用相同用戶身份操作集群數(shù)據(jù)
多租戶場景:不同用戶有不同的用戶角色(Role),不同用戶對不同資源有不同權(quán)限
- 索引命名混亂:索引名稱很隨意,如果沒有運維平臺管理,從索引名稱也無法追隨到具體的業(yè)務歸屬。成為孤兒索引
- 索引生命周期管理: 沒有清理策略,每次都是發(fā)現(xiàn)集群容量到達水位,臨時刪除數(shù)據(jù)量大、歷史歸檔的索引
- 權(quán)限及隔離性:無,都是管理員,都有最大權(quán)限,索引無隔離性,索引被其他業(yè)務無意刪除等問題
解決思路
對于上面的幾個突出問題,我們可以通過一些規(guī)范+ES本身的能力,可以規(guī)避這些問題。
- 命名規(guī)范:這里的索引命名很重要,這里的命名規(guī)則會作用到后面介紹的權(quán)限的配置,做好命名規(guī)范對集群管理和自動化都是基本要求,我司使用基于資產(chǎn)服務樹體系結(jié)構(gòu)命名。比如:{團隊}_{產(chǎn)品線}_{服務組}_{服務}_xxx
- 生命周期管理:ES自身的 index lifecycle policy 就可以滿足我們的需求
- 權(quán)限控制:ElasticSearch在6.8以后的版本中支持了RBAC(基于角色的訪問控制),可以在role中配置集群、索引級別的權(quán)限,role綁定到user上,即可完成基于indexs級別的控制
實踐流程
創(chuàng)建賬戶及權(quán)限
用戶名: 可以使用標識業(yè)務屬性的名稱。比如我們公司以{app_name}作為用戶名稱
Role:指定權(quán)限??梢钥刂频剿饕С终齽t。
通過kibana創(chuàng)建Role,并分配權(quán)限。(inno_sweetfans_*,只允許訪問inno_sweetfans開通的索引)。
創(chuàng)建User,關聯(lián)Role。(User關聯(lián)到Role之后,就獲得了Role規(guī)定的權(quán)限)。
索引生命周期管理
如果業(yè)務索引數(shù)據(jù)量過大,有索引歸檔需求,比如按照天、周、月切分索引的,可以配置索引生命周期
配置步驟
- 添加 Index Lifecycle Policies
- 創(chuàng)建index template
- Index Lifecycle Policies 運用到 index template
具體流程
添加Index Lifecycle Policies策略,(Hot phase:多大開始切割;Delete phase:刪除多久之前的)。
創(chuàng)建索引模版。(index_patterns寫索引前綴來匹配索引)。
刪除策略和索引模版關聯(lián)。運用規(guī)則。
方案總結(jié)
我們借助ES的RBAC機制構(gòu)建了一個具有權(quán)限控制、資源隔離的環(huán)境,解決了單租戶模式下的諸多問題,運用了集群的生命周期管理補充了對索引的管理。這個demo只是多租戶的一個引子,真實場景需要考慮到業(yè)務的復雜性和運維性。
擴展和思考
低于6.8版本的ES不支持權(quán)限控制和索引生命周期管理,如何破局?
- 安全:可以使用http-basic、search guard 等增加權(quán)限控制。
- 生命周期管理:Curator。
通過權(quán)限控制雖然解決了資源的訪問控制,但是資源搶占、業(yè)務優(yōu)先級等問題依然存在?
- ES支持對節(jié)點打標簽(TAG), 可以通過索引和tag綁定做到資源獨占。
ES運維過程中的問題?
- 分片不合理,數(shù)據(jù)傾斜。
- 故障定位復雜、分布式集群維護困難。
- 太多了,不總結(jié)了,遇到問題,干就對了。