Java上的Redis集羣以實現擴展和高可用性

瞭解有關在Java上構建Redis集羣的更多信息——用於擴展和高可用性。本文分享學習自【優銳課】。


什麼是Redis羣集?

可伸縮性和可用性是任何企業級數據庫的兩個最重要的品質。

你完全可以準確預測數據庫將消耗的最大資源量,這是非常不尋常的,因此,爲了應對需求異常高的時期,必須具有可伸縮性。但是,可伸縮性在沒有可用性的情況下是無用的,這確保了用戶始終可以在需要時訪問數據庫中的信息。

Redis是一個內存數據結構存儲,可用於實現非關係鍵值數據庫。但是,Redis的準系統安裝並未立即提供最佳性能。

爲了提高Redis部署的可伸縮性和可用性,你可以使用Redis Cluster,這是一種在不同Redis節點之間自動分片數據的方法。Redis Cluster將一個很大的Redis數據庫分解爲較小的水平分區,這些分區稱爲分片,分別存儲在單獨的服務器上。

這使得Redis數據庫能夠容納更多的請求,因此具有更大的可伸縮性。而且,由於即使集羣中的某些節點發生故障,數據庫也可以繼續運行,因此可用性得以提高。

3.0版之前,Redis Cluster使用異步複製。實際上,這意味着,如果Redis Cluster中的主服務器在向其所有從服務器發送寫操作之前崩潰,則可以將未接收到該寫操作的一個從設備升級爲主服務器,這將導致寫操作丟失。

3.0版開始,Redis Cluster還具有WAIT命令形式的同步複製選項,該選項會阻止當前客戶端,直到成功完成所有寫命令爲止。儘管這還不足以保證強大的一致性,但這確實使數據傳輸過程更加安全。


如何運行Redis集羣

有兩種方法可以啓動和運行Redis Cluster:簡便方法和困難方法。

簡單的方法涉及使用create-cluster bash腳本,你可以在Redis安裝的utils/create-cluster目錄中找到該腳本。以下兩個命令將創建一個具有6個節點,3個主節點和3個從節點的默認集羣:

create-cluster start
create-cluster create

 

創建集羣后,即可與其進行交互。默認情況下,集羣中的第一個節點從端口30001開始。使用以下命令停止集羣:

create-cluster stop

 

運行Redis Cluster的困難方法包括爲集羣設置自己的配置文件。Redis Cluster的所有實例必須至少包含三個主節點。

以下是單個節點的示例配置文件:

port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

 

顧名思義,啓用集羣的選項啓用集羣模式。cluster-config-file選項包含給定節點的配置文件路徑。

要創建具有三個主節點和三個從節點的測試Redis羣集實例,請在終端中執行以下命令:

mkdir cluster-test
cd cluster-test
mkdir 7000 7001 7002 7003 7004 7005

 

在這六個目錄中的每個目錄中,使用上面給出的示例配置文件創建redis.conf配置文件。然後,將你的redis-server可執行文件複製到cluster-test目錄中,並使用它在終端的六個不同選項卡中啓動六個不同的節點。


Java上連接到Redis集羣

與基本的Redis安裝一樣,Redis Cluster無法立即使用Java編程語言。好消息是,有一些框架使你可以輕鬆地將Redis ClusterJava一起使用。

RedissonRedisJava客戶端,它包括Java中的許多常見構造,包括各種對象,集合,鎖和服務。由於Redisson以分佈式方式重新實現這些構造,因此它們可以在多個應用程序和服務器之間共享,從而使它們可以與Redis Cluster等工具一起使用。

以下代碼演示了Redis集羣與Redis集羣的用法:

package redis.demo;
import org.redisson.Redisson;
import org.redisson.api.RBucket;
import org.redisson.api.RedissonClient;
/**
 * Redis Sentinel Java example
 *
 */
public class Application
{
    public static void main( String[] args )
    {
        Config config = new Config();
        config.useClusterServers()
              .addNodeAddress("redis://127.0.0.1:6379", "redis://127.0.0.1:6380");
        RedissonClient redisson = Redisson.create(config);
        // operations with Redis based Lock
        // implements java.util.concurrent.locks.Lock
        RLock lock = redisson.getLock("simpleLock");
        lock.lock();
        try {
           // do some actions
        } finally {
           lock.unlock();
        }
        // operations with Redis based Map
        // implements java.util.concurrent.ConcurrentMap
        RMap<String, String> map = redisson.getMap("simpleMap");
        map.put("mapKey", "This is a map value");
        String mapValue = map.get("mapKey");
        System.out.println("stored map value: " + mapValue);
        redisson.shutdown();
    }
}

 

Redisson是一個開放源代碼客戶端,它使Java程序員能夠以最小的壓力和複雜性來使用Redis,從而極大地簡化了開發過程並使之更加熟悉。


謝謝閱讀!

更深入的探討歡迎留言或私信,還可以和你分享更多Java學習資料!


抽絲剝繭 細說架構那些事——【優銳課】


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章