天天看點

如何使用docker搭建redis cluster叢集?

作者:路多辛

要搭建的叢集情況說明

在一台Linux伺服器上使用docker搭建一個cluster模式的redis叢集。三個master節點,三個slave節點,六個節點因為在同一台伺服器上,是以每個節點使用不同的端口,端口範圍是6380到6385。

redis cluster叢集具有如下幾個特點:

  • 去中心化,采用多主多從模式。所有節點彼此互聯(PING-PONG機制),内部使用二進制協定傳輸。
  • 用戶端不需要連接配接叢集所有節點,連接配接叢集中任何一個可用節點即可。
  • 每一個分區都是由一個主節點和多個從節點組成,分片和分片之間平行。
  • 每一個master節點負責維護一部分槽,以及槽所映射的鍵值資料;叢集中每個節點都有全量的槽資訊,通過槽每個node都知道具體資料存儲到哪個node上。

拉取redis鏡像

可以選擇指定版本的redis,本文為了友善示範,使用最新版本

docker pull redis           

建立使用固定的network

docker network create rediscluster           

建立redis配置檔案

因為六個節點監聽端口不同,是以配置檔案也有差別,可以使用如下shell腳本生成對應配置檔案(假如命名為createRedisConf.sh):

#!/bin/sh

for port in $(seq 6380 6385);
do
mkdir -p ~/redisCluster/node-${port}/conf
touch ~/redisCluster/node-${port}/conf/redis.conf
cat  << EOF > ~/redisCluster/node-${port}/conf/redis.conf
#節點端口
port ${port}
#添加通路認證
requirepass luduoxin
#如果主節點開啟了通路認證,從節點通路主節點需要認證
masterauth luduoxin
#保護模式,預設值 yes,即開啟。開啟保護模式以後,需配置 bind ip 或者設定通路密碼;關閉保護模式,外部網絡可以直接通路
protected-mode no
#bind 0.0.0.0

#是否以守護線程的方式啟動(背景啟動),預設 no
daemonize no
#是否開啟 AOF 持久化模式,預設 no
appendonly yes
#是否開啟叢集模式,預設 no
cluster-enabled yes 
#叢集節點資訊檔案
cluster-config-file nodes.conf
#群節點連接配接逾時時間
cluster-node-timeout 5000
#叢集節點 IP,我使用的服務的ip為172.16.3.110,替換為自己的伺服器的即可
cluster-announce-ip 172.16.3.110
#叢集節點映射端口
cluster-announce-port ${port}
#叢集節點總線端口
cluster-announce-bus-port 1${port}
EOF
done           

建立此檔案後,先賦予執行權限,然後執行生成配置檔案

$ chmod 755 ./createRedisConf.sh
$ sh ./createRedisConf.sh           

建立出六個Redis節點

可以使用如下shell腳本快速建立出來(createRedis.sh)

#!/bin/sh

## 首次建立并運作redis容器
if [ "$1" = "create" ]; then
        for port in $(seq 6380 6385);
        do
              docker run -di --restart always --name redis-${port} --net rediscluster -p ${port}:${port} -p 1${port}:1${port} -v ~/redisCluster/node-${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf -v ~/redisCluster/node-${port}/data:/data redis redis-server /usr/local/etc/redis/redis.conf
        done
fi

##停止redis容器
if [ "$1" = "stop" ]; then
        for port in $(seq 6380 6385);
        do
                docker stop redis-${port}
        done
fi

##啟動已有的redis容器
if [ "$1" = "start" ]; then
        for port in $(seq 6380 6385);
        do
                docker start redis-${port}
        done
fi

## 删除redis容器
if [ "$1" = "rm" ]; then
        for port in $(seq 6380 6385);
        do
                docker rm redis-${port}
        done
fi           

建立此檔案後,先賦予執行權限,然後執行建立出redis服務

$ chmod 755 ./createRedis.sh
$ sh ./createRedis.sh create           

建立完成後,可以使用指令 docker ps -a 檢視容器。

建立cluster叢集

選擇一個redis容器,例如選擇redis-6380容器,進入容器

docker exec -it redis-6380 /bin/bash           

在容器裡面執行如下指令

redis-cli -a luduoxin --cluster create 172.16.3.110:6380 172.16.3.110:6381 172.16.3.110:6382 172.16.3.110:6383 172.16.3.110:6384 172.16.3.110:6385 --cluster-replicas 1           

然後出現如下提示,輸入 yes 繼續

Can I set the above configuration ? (type 'yes' to accept):           

建立過程如下:

# redis-cli -a luduoxin --cluster create 172.16.3.110:6380 172.16.3.110:6381 172.16.3.110:6382 172.16.3.110:6383 172.16.3.110:6384 172.16.3.110:6385 --cluster-replicas 1
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 172.16.3.110:6384 to 172.16.3.110:6380
Adding replica 172.16.3.110:6385 to 172.16.3.110:6381
Adding replica 172.16.3.110:6383 to 172.16.3.110:6382
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 78891932599b7497c8dd921295ba19eb0f549285 172.16.3.110:6380
   slots:[0-5460] (5461 slots) master
M: 43c735f5e5bd1dfd7e4fa80aed467dc6e10a9081 172.16.3.110:6381
   slots:[5461-10922] (5462 slots) master
M: 254d130ac0f88ec36be9cda27e59500e04c283cc 172.16.3.110:6382
   slots:[10923-16383] (5461 slots) master
S: e2875613c12f0754e485e5eb56d968dd78493bae 172.16.3.110:6383
   replicates 78891932599b7497c8dd921295ba19eb0f549285
S: a87af69f190a86455864c5ca73fabb60290abd1e 172.16.3.110:6384
   replicates 43c735f5e5bd1dfd7e4fa80aed467dc6e10a9081
S: 846fa01cecc7fa75fc558eb8fcfb2788abb2a83d 172.16.3.110:6385
   replicates 254d130ac0f88ec36be9cda27e59500e04c283cc
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.
>>> Performing Cluster Check (using node 172.16.3.110:6380)
M: 78891932599b7497c8dd921295ba19eb0f549285 172.16.3.110:6380
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 254d130ac0f88ec36be9cda27e59500e04c283cc 172.16.3.110:6382
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: 43c735f5e5bd1dfd7e4fa80aed467dc6e10a9081 172.16.3.110:6381
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: a87af69f190a86455864c5ca73fabb60290abd1e 172.16.3.110:6384
   slots: (0 slots) slave
   replicates 43c735f5e5bd1dfd7e4fa80aed467dc6e10a9081
S: 846fa01cecc7fa75fc558eb8fcfb2788abb2a83d 172.16.3.110:6385
   slots: (0 slots) slave
   replicates 254d130ac0f88ec36be9cda27e59500e04c283cc
S: e2875613c12f0754e485e5eb56d968dd78493bae 172.16.3.110:6383
   slots: (0 slots) slave
   replicates 78891932599b7497c8dd921295ba19eb0f549285
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.           

到這裡叢集就建立成功了。

檢查叢集狀态

redis-cli -a luduoxin --cluster check 172.16.3.110:6382           

連接配接叢集某個節點

$ redis-cli -c -a luduoxin -h 172.16.3.110 -p 6382
//檢視叢集資訊
172.16.3.110:6381> cluster info
//檢視叢集結點資訊
172.16.3.110:6381> cluster nodes
//檢視叢集的slot配置設定區間及對應的主從節點映射關系
172.16.3.110:6381> cluster slots           

小結

本文主要講了如何在一台Linux伺服器上使用docker搭建一個cluster模式的redis叢集,這種方式搭建的叢集主要用于測試用途,不建議在生産環境使用。

繼續閱讀