Redis 叢集搭建及使用Golang示例

pathbox發表於2018-01-05

Redis 在3.x版本之後,自身支援了叢集模式。Redis的叢集主要是 master-slave的形式。叢集定義了 16384個hash slot。這些hash slot分佈在所有master上。we simply take the CRC16 of the key modulo 16384 將key計算得到對應的hash slot的值,然後看這個hash slot在哪個redis服務上,這個key就會儲存在對應的這個redis服務。和Elasticsearch、MongoDB不一樣,redis通過這種方式進行sharding。不能不說這是一種簡單,但對redis來說是有效的一種叢集方式。能夠最大限度的保留原有redis的屬性。 [Document]

下面是部署過程的例子。

有三臺伺服器 A、B、C。外網ip分別為 A_IP,B_IP,C_IP。

三臺伺服器先解除安裝原有redis版本,安裝最新的redis版本

$ wget http://download.redis.io/relea ... ar.gz
$ tar xzf redis-4.0.6.tar.gz
$ cd redis-4.0.6
$ make
cd /src
cp redis-server /usr/bin/
cp redis-cli /usr/bin/
cp redis-trib.rb /usr/bin/

mkdir redis-cluster
cd redis-cluster
mkdir 7000
mkdir 7100

進入7000,新建redis.conf 檔案,編寫配置檔案

cd 7000
vim redis.conf

配置內容為

port 7000                      # 繫結的埠
bind A_IP                      # 繫結的IP,如果你要開放出去,需要使用外網IP
cluster-enabled yes            # 是否啟用叢集模式
cluster-config-file nodes.conf # 節點配置檔案
cluster-node-timeout 5000      # 超時設定
appendonly yes                 # appendonly 配置 持久化設定
cluster-require-full-coverage no  

cluster-require-full-coverage預設是yes。如果某個redis掛了,沒有對應的slave升級為master,這時候,整個redis叢集不可用。

所以建議設為no, 這樣某個redis掛了,只是影響這一部分的hash slot查詢有問題,不影響叢集的其他redis的讀寫。

同理完成 7100的redis.conf配置檔案內容。將三臺機器都安裝上述進行安裝配置。

在A、B、C機器上

cd 7000
redis-server redis.conf
cd 7001
redis-server redis.conf  

到A機器上, 執行

redis-trib.rb create --replicas 1 A_IP:7000 B_IP:7000 \
C_IP:7000 A_IP:7100 B_IP:7100 C_IP:7100

之後會提示輸入yes,執行完後。

redis-cli -p 7000 -h A_IP cluster nodes

檢視叢集狀態,會得到類似這樣的資訊。

aedabb4bd830978905d68ab8d88a94a031b515fe A_IP:7000@17000 master - 0 1513840545000 2 connected 5461-10922
861ff3beac7a6a3023424a64446f1101f8193d9d A_IP:7100@17100 slave 3d9e37599f6547387503e165d21838556435bac4 0 1513840544011 4 connected
3d9e37599f6547387503e165d21838556435bac4 B_IP:7000@17000 myself,master - 0 1513840545000 1 connected 0-5460
3ef82f387086931dbdedbd24b379671b8bd03289 C_IP:7000@17000 master - 0 1513840544411 3 connected 10923-16383
27764a4a521e4e5bd8e2e108c472ef6ed51645cd B_IP:7100@17100 slave aedabb4bd830978905d68ab8d88a94a031b515fe 0 1513840543912 5 connected
7f6ef6f05968ee869359c0771d42d768243e4ca1 C_IP:7100@17100 slave 3ef82f387086931dbdedbd24b379671b8bd03289 0 1513840545414 6 connected

Bingo~ redis叢集服務就跑起來了。 三臺機器,每臺機器一個master,一個slave

redis叢集增加節點或Resharding操作是使用redis-trib指令碼命令,這個指令碼是Ruby寫的。每個node有一個node ID,比如: aedabb4bd830978905d68ab8d88a94a031b515fe

Golang 程式碼示例

package redis

import (
    "time"

    "github.com/go-redis/redis"
)

// redis資料超時時間
var Timeout = 5 * time.Hour

var Client = GetClusterClient()

func GetClusterClient() *redis.ClusterClient {
    var client *redis.ClusterClient
    client = redis.NewClusterClient(&redis.ClusterOptions{
        Addrs: []string{"A_IP:7000", "B_IP:7000", "C_IP:7000","A_IP:7100", "B_IP:7100", "C_IP:7100"},
    })
    err := client.Ping().Err()
    if err == nil {
        log.Info("Redis cluster OK")
    } else {
        log.Error("Redis cluster wrong")
    }
    return client
}

redis.Client.Set("word", "Hello World", redis.Timeout)
str, _ := rediscluster.Client.Get("word").Result()
fmt.Println(str) // => "Hello World"

相關文章