Infinispan 8 中新的 Redis 快取儲存實現

oschina發表於2015-10-15

Infinispan 8 包含了一個新的在 Redis k/v 伺服器中儲存快取資料的 cache store。這個 cache store 可以把快取資料儲存在一個集中的 Redis 中,所有的 Infinispan 客戶端都可以訪問。

Cache store 支援三種 Redis 的部署方式:單伺服器、主從切換(Sentinel)和叢集(需要 Redis 3 支援)。目前支援的 Redis 版本包括 2.8+ 和 3.0+。

資料過期和清理由 Redis 負責,可以減輕 Infinispan 伺服器人工刪除 cache 項的工作量。

拓撲結構

獨立伺服器

對於單伺服器部署,cache store 會指向所連的 Redis 的 master,將其作為資料的儲存。使用這種結構,Redis 是沒有容災功能的,除非在它上面另外再自己構造一個。下面是獨立伺服器的本地cache store 的配置:

<?xml version="1.0" encoding="UTF-8"?>
<infinispan
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="urn:infinispan:config:8.0 http://www.infinispan.org/schemas/infinispan-config-8.0.xsd

             urn:infinispan:config:store:redis:8.0 
http://www.infinispan.org/schemas/infinispan-cachestore-redis-config-8.0.xsd"
    xmlns="urn:infinispan:config:8.0"
    xmlns:redis="urn:infinispan:config:store:redis:8.0" >

    <cache-container>
        <local-cache>
            <persistence passivation="false">
                <redis-store xmlns="urn:infinispan:config:store:redis:8.0"
                    topology="server" socket-timeout="10000" connection-timeout="10000">
                    <redis-server host="server1" />

       <connection-pool min-idle="6" max-idle="10" max-total="20" 
min-evictable-idle-time="30000" time-between-eviction-runs="30000" />
                </redis-store>
            </persistence>
        </local-cache>
    </cache-container>
</infinispan>

注意 topology 屬性在這裡是 server。這可以保證 cache store 使用的是獨立的 Redis 伺服器拓撲結構。只需要定義一個 Redis 伺服器(如果定義了多個,只有第一個會被使用),埠會使用 Redis 的預設埠 6379,也可以使用 port 屬性覆蓋埠。所有的連線由一個連線池進行管理,連線池同時還負責連線的建立、釋放、選擇處於空閒的連線。

Sentinel模式

Sentinel 模式依賴於 Redis 的 Sentinel 伺服器,以此來連線到 Redis 的 master。具體來說,Infinispan 連線到 Redis 的 Sentinel 伺服器,請求 master 的名字,然後能獲得正確的 master 伺服器地址。這種拓撲結構通過 Redis Sentinel 提供了可用性,實現了對 Redis 伺服器的失效檢測和自動恢復。

<?xml version="1.0" encoding="UTF-8"?>
<infinispan
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="urn:infinispan:config:8.0 http://www.infinispan.org/schemas/infinispan-config-8.0.xsd

             urn:infinispan:config:store:redis:8.0 
http://www.infinispan.org/schemas/infinispan-cachestore-redis-config-8.0.xsd"
    xmlns="urn:infinispan:config:8.0"
    xmlns:redis="urn:infinispan:config:store:redis:8.0" >

    <cache-container>
        <local-cache>
            <persistence passivation="false">
                <redis-store xmlns="urn:infinispan:config:store:redis:8.0"
                    topology="sentinel" master-name="mymaster" socket-timeout="10000" connection-timeout="10000">
                    <sentinel-server host="server1" />
                    <sentinel-server host="server2" />
                    <sentinel-server host="server3" />

       <connection-pool min-idle="6" max-idle="10" max-total="20" 
min-evictable-idle-time="30000" time-between-eviction-runs="30000" />
                </redis-store>
            </persistence>
        </local-cache>
    </cache-container>
</infinispan>

對於 Sentinel 模式,topology 屬性需要改成 sentinel。還需要指定 master 的名字,用於選擇正確的 Redis 的 master,因為一個 Sentinel 伺服器可以監控多個 Redis 的 master。需要注意的是,Sentinel 伺服器通過一個叫 sentinel-server 的 XML 標籤來定義,這與單伺服器和叢集都不一樣。如果沒有指定,Sentinel 的預設埠是。至少需要指定一個 Sentinel 伺服器,如果你有多臺Sentinel 伺服器,也可以都加上,這樣可以 Sentinel 伺服器自身也可以實現容災。

叢集

在叢集拓撲結構下,Infinispan 可以連線到一個 Redis 叢集。一個或多個叢集節點可以加到infinispan (越多越好),被用於儲存所有的資料。Redis 叢集支援失效檢測,所以如果叢集裡有master 掛掉了,就會有 slave 提升為 master。Redis 叢集需要 Redis 3。

<?xml version="1.0" encoding="UTF-8"?>
<infinispan
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="urn:infinispan:config:8.0 http://www.infinispan.org/schemas/infinispan-config-8.0.xsd

             urn:infinispan:config:store:redis:8.0 
http://www.infinispan.org/schemas/infinispan-cachestore-redis-config-8.0.xsd"
    xmlns="urn:infinispan:config:8.0"
    xmlns:redis="urn:infinispan:config:store:redis:8.0" >

    <cache-container>
        <local-cache>
            <persistence passivation="false">
                <redis-store xmlns="urn:infinispan:config:store:redis:8.0"
                    topology="cluster" socket-timeout="10000" connection-timeout="10000">
                    <redis-server host="server1" port="6379" />
                    <redis-server host="server2" port="6379" />
                    <redis-server host="server3" port="6379" />

       <connection-pool min-idle="6" max-idle="10" max-total="20" 
min-evictable-idle-time="30000" time-between-eviction-runs="30000" />
                </redis-store>
            </persistence>
        </local-cache>
    </cache-container>
</infinispan>

對於叢集,topology 屬性必須改成 cluster。必須指定一個或多個 Redis 叢集節點,可以使用 redis-server 標籤來說明。注意如果是操作叢集,不支援 database ID。

一個 Redis 對應多個 Cache Store

Redis 的獨立伺服器模式或者 Sentinel 模式都支援 database ID。一個 database ID 可以讓單個Redis 伺服器支援多個獨立的 database,通過一個整數 ID來區分。這可以讓 Infinispan 在單個Redis 部署上支援多個 cache store,不同的 store 直接的資料可以加以隔離。Redis 叢集不支援database ID。在 redis-store 標籤上可以通過 database 屬性定義 database ID。

<?xml version="1.0" encoding="UTF-8"?>
<infinispan
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="urn:infinispan:config:8.0 http://www.infinispan.org/schemas/infinispan-config-8.0.xsd

             urn:infinispan:config:store:redis:8.0 
http://www.infinispan.org/schemas/infinispan-cachestore-redis-config-8.0.xsd"
    xmlns="urn:infinispan:config:8.0"
    xmlns:redis="urn:infinispan:config:store:redis:8.0" >

    <cache-container>
        <local-cache>
            <persistence passivation="false">
                <redis-store xmlns="urn:infinispan:config:store:redis:8.0"

       topology="sentinel" master-name="mymaster" socket-timeout="10000"
 connection-timeout="10000" database="5">
                    <sentinel-server host="server1" />
                    <sentinel-server host="server2" />
                    <sentinel-server host="server3" />

       <connection-pool min-idle="6" max-idle="10" max-total="20" 
min-evictable-idle-time="30000" time-between-eviction-runs="30000" />
                </redis-store>
            </persistence>
        </local-cache>
    </cache-container>
</infinispan>

Redis的密碼認證

Redis 可選用密碼進行認證,用於增加對伺服器的安全性。這需要在 cache store 連線的時候指定密碼。redis-store 標籤的 password 屬性可以指定這個密碼。

<?xml version="1.0" encoding="UTF-8"?>
<infinispan
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="urn:infinispan:config:8.0 http://www.infinispan.org/schemas/infinispan-config-8.0.xsd

             urn:infinispan:config:store:redis:8.0 
http://www.infinispan.org/schemas/infinispan-cachestore-redis-config-8.0.xsd"
    xmlns="urn:infinispan:config:8.0"
    xmlns:redis="urn:infinispan:config:store:redis:8.0" >

    <cache-container>
        <local-cache>
            <persistence passivation="false">
                <redis-store xmlns="urn:infinispan:config:store:redis:8.0"

       topology="sentinel" master-name="mymaster" socket-timeout="10000"
 connection-timeout="10000" password="mysecret">
                    <sentinel-server host="server1" />
                    <sentinel-server host="server2" />
                    <sentinel-server host="server3" />

       <connection-pool min-idle="6" max-idle="10" max-total="20" 
min-evictable-idle-time="30000" time-between-eviction-runs="30000" />
                </redis-store>
            </persistence>
        </local-cache>
    </cache-container>
</infinispan>

是否有SSL支援?

Redis 沒有提供協議加密,而是將這個留給其他專業的軟體。目前,Infinispan 整合的連線Redis伺服器的 Redis 客戶端(Jedis)還沒有原生的對 SSL 連線的支援。

相關文章