【技術貼】如何部署Apache Kylin集群實現負載均衡?
Apache Kylin作為一個開源的OLAP-on-Hadoop引擎,由於亞秒級的強大查詢能力被廣大用戶熟知。超高的查詢性能也決定了Apache Kylin具有強大的高並發優勢,同時支持良好的線性擴展。本文將介紹如何部署一個Apache Kylin集群,以及通過負載均衡提高查詢並發度。感謝Kyligence技術合伙人&高級軟體架構師,KyBot技術負責人,Apache Kylin核心開發者和項目管理委員會成員(PMC),李棟撰文。
Apache Kylin?是一個開源的分散式分析引擎,提供Hadoop之上的SQL查詢介面及多維分析(OLAP)能力以支持超大規模數據,能在亞秒內查詢巨大的Hive表。
有關Apache Kylin的性能及並發性數據,社區上已經有很多介紹的文章,感興趣的同學可以到Apache Kylin的官網(http://kylin.apache.org/)進行查找。
下圖所示是Apache Kylin集群部署的架構圖,本文將主要以Apache Kylin 1.6為例,介紹集群部署的詳細步驟。
Apache Kylin是一個無狀態的服務,所有的狀態信息都保存在HBase中。因此,只要把多個Kylin實例部署在同一個HBase集群上,就可以對這些 Kylin實例進行負載均衡。因此,部署的多個Kylin實例需要滿足以下條件:
共享同一個Hadoop集群和HBase集群;無埠衝突,最好能分別部署在不同伺服器上,以做到互不影響;共享同一個元資料庫,即kylin.properties中kylin.metadata.url值相同;只有一個Kylin實例運行任務引擎(即kylin.server.mode=all),其它 Kylin實例都作為查詢引擎(即kylin.server.mode=query)
為了將外部的查詢請求轉發給Apache Kylin集群中的單個節點,需要部署一個負載均衡器(Load Balancer),如Nginx等。負載均衡器通過一定策略對請求進行分發,並在節點失效時重試其他節點。Kylin用戶直接可以通過負載均衡器的地址進行訪問。
以Nginx為例,需要為Apache Kylin站點新建一個配置文件(如kylin.conf),內容如下:
upstream kylin { server 127.0.0.1:7070; #Kylin Server 1 server 127.0.0.1:17070; # Kylin Server 2}server { listen 18080; location / { proxy_pass http://kylin; }}
默認情況下,Nginx是以輪詢的方式進行負載均衡,即每個請求按時間順序逐一分配到不同的Apache Kylin實例,如果一個實例失效,會自動將其剔除。但是,默認情況下,Apache Kylin的用戶Session信息是保存在本地的,當同一個用戶的多個請求發送給不同Apache Kylin實例時,並不是所有的實例都能識別用戶的登陸信息。因此,可以簡單地配置Nginx使用ip_hash方式,使每個請求按照客戶端ip的hash結果固定地訪問一個Kylin實例。
但是ip_hash的方式可能導致Kylin實例的負載不平衡,特別是只有少量應用伺服器頻繁訪問Kylin時會導致大部分查詢請求分發給個別Kylin實例。為解決這個問題,可以通過配置Kylin將Session信息保存到Redis集群中(或MySQL、MemCache等),實現多個Kylin實例的Session共享。這樣,Nginx輪詢方式就不會出現Session丟失的問題了。
Apache Kylin使用Apache Tomcat作為Web伺服器,簡單修改Tomcat配置文件即可完成配置。具體配置步驟如下:
1. 下載Redis相關的Jar包,並放置在$KYLIN_HOME/tomcat/lib目錄下:wget http://central.maven.org/maven2/redis/clients/jedis/2.0.0/jedis-2.0.0.jarwget http://central.maven.org/maven2/org/apache/commons/commons-pool2/2.2/commons-pool2-2.2.jarwget https://github.com/downloads/jcoleman/tomcat-redis-session-manager/tomcat-redis-session-manager-1.2-tomcat-7-java-7.jar2. 修改$KYLIN_HOME/tomcat/context.xml,增加如下項目:<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" /><Manager className="com.radiadesign.catalina.session.RedisSessionManager" host="localhost" port="6379" database="0" maxInactiveInterval="60"/>其中,host和port指向所使用的Redis集群地址。
修改完畢之後,重啟Kylin服務。再次訪問負載均衡器,即可發現Session問題已經解決了。
綜上所述,用戶只需要通過簡單的配置就可以實現Apache Kylin的集群部署和負載均衡,加上秒級甚至亞秒級的查詢速度,在高並發高性能的應用場景依然能夠帶來良好的用戶體驗。
推薦閱讀:
※城市靈巧散步指南
※快速部署MongoDB集群(開源)
※資料庫的自我修鍊——阿里雲MongoDB備份恢復功能說明和原理介紹
※有50台普通PC,能不能用虛擬化/雲計算技術把他們整合成一個整體,相當於一台高性能計算機,來執行數據密集性計算任務(處理衛星數據)?如果可以的話,具體有哪些技術/軟體可以考慮?