1. 程式人生 > 其它 >記一次redis叢集搭建過程

記一次redis叢集搭建過程

在搭建前,我們先用vmware建立3臺虛擬機器,並確保它們相互之間能夠ping通。

1. redis原始碼安裝

1.1 編譯安裝

apt install gcc make

wget http://download.redis.io/releases/redis-6.2.6.tar.gz
tar -zxvf redis-6.2.6.tar.gz
cd redis-6.2.6
make
make PREFIX=/usr/local/redis install

1.2 配置檔案

mkdir /usr/local/redis/conf
mkdir /usr/local/redis/data
cp redis.conf sentinel.conf /usr/local/redis/conf/
vim /usr/local/redis/conf/redis.conf

#### 配置檔案 ####
#bind 127.0.0.1
protected-mode no     
daemonize yes
logfile "6379.log"         # 指定日誌檔名
save 3600 1                # 開啟RDB
save 300 100
save 60 10000
dir /usr/local/redis/data  # 日誌、rdb和aof檔案會存放在指定的工作目錄下
appendonly yes             # 開啟AOF
port 6379
pidfile "/var/run/redis-6379.pid"
dbfilename "dump-6379.rdb"   # 指定儲存資料的檔名
#############

1.3 啟動服務

# 啟動服務
sudo /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
# 啟動客戶端
/usr/local/redis/bin/redis-cli

2. 主從搭建

我們3臺虛擬機器的ip分別是:192.168.10.128、192.168.10.129、192.168.10.130,我們使用192.168.10.128作為master,其餘兩臺作為slave。修改兩臺slave虛擬機器上的配置檔案:

vim /usr/local/redis/conf/redis.conf
#### 配置檔案 ####
replicaof 192.168.10.128 6379
#################

然後重啟服務,完成主從搭建。可以通過寫資料的方式來驗證是否能成功同步。

3. 哨兵搭建

我們需要在這3臺虛擬機器上啟動3個哨兵例項以搭建哨兵叢集,我們將相應的配置檔案修改如下:

vim /usr/local/redis/conf/sentinel.conf
#### 配置檔案 ####
#bind 0.0.0.0
protected-mode no
daemonize yes
logfile "26379.log"
dir /usr/local/redis/data
sentinel monitor mymaster 192.168.10.128 6379 2 # 這裡ip、port都是主節點的,2代表判定主節點客觀下線的哨兵數量
#################

然後分別啟動3個哨兵服務:

/usr/local/redis/bin/redis-sentinel /usr/local/redis/conf/sentinel.conf

完成後可以通過殺死主節點redis例項的方式,來驗證哨兵選主的過程。

4. 叢集搭建

Redis Cluster的最小叢集模式是三主三從模式,也就是需要六臺機器,這裡我們通過在每臺虛擬機器上起兩個redis服務來實現。

先將之前的redis例項、哨兵例項都kill掉,將之前從節點下面的配置項註釋掉:

#replicaof 192.168.10.128 6379

然後在每臺虛擬機器上覆制一份配置檔案,對所有配置檔案新增或修改相應的配置(複製的檔案將6379的地方改為6380):

cp /usr/local/redis/conf/redis.conf /usr/local/redis/conf/redis-6380.conf
#### 配置檔案 ####
cluster-enabled yes
cluster-config-file nodes-6379.conf  # 生成在dir目錄下
cluster-node-timeout 5000

port 6379
pidfile "/var/run/redis-6379.pid"
logfile "6379.log"
dbfilename "dump-6379.rdb"
appendfilename "appendonly-6379.aof"
#################

然後我們在每臺虛擬機器上啟動2個例項:

sudo /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
sudo /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis-6380.conf

接著可以在任意一臺虛擬上進行叢集的建立:

/usr/local/redis/bin/redis-cli --cluster create 
192.168.10.128:6379 192.168.10.128:6380 192.168.10.129:6379 
192.168.10.129:6380 192.168.10.130:6379 192.168.10.129:6380 --cluster-replicas 1

使用以下命令檢查叢集:

/usr/local/redis/bin/redis-cli --cluster check 192.168.10.128:6379

使用以下命令連線到叢集:

/usr/local/redis/bin/redis-cli -c -h 127.0.0.1 -p 6379

4.1 叢集slot遷移

對照上圖,下面的語句的作用是通過連線到192.168.10.128:6379例項,將192.168.10.130:6379上的1000個slots遷移到192.168.10.128:6379例項。

redis-cli --cluster reshard 192.168.10.128:6379 --cluster-from 0951e8847478bb40804a64b2924c2e857e363997 --cluster-to b707dc738b67c22744081e0cded911d8feaf83bb --cluster-slots 1000 --cluster-yes

然後重新執行下面語句檢查叢集,發現已經遷移成功:

/usr/local/redis/bin/redis-cli --cluster check 192.168.10.128:6379

4.2 叢集擴容

我們在192.168.10.128上再複製兩份配置檔案:redis-6381.conf、redis-6382.conf,然後分別啟動兩個redis例項。我們將192.168.10.128:6381作為主節點新增進叢集:

# 新節點在前,後面跟叢集中的任一節點
/usr/local/redis/bin/redis-cli --cluster add-node 192.168.10.128:6381 127.0.0.1:6379

接著將192.168.10.128:6382作為192.168.10.128:6381的從節點新增進叢集:

/usr/local/redis/bin/redis-cli --cluster add-node 192.168.10.128:6382 127.0.0.1:6379 --cluster-slave --cluster-master-id 45553352aba3cf8580e1eea2befefe6b5b8e8a1c

然後執行下面的命令重新分配雜湊槽:

/usr/local/redis/bin/redis-cli --cluster rebalance --cluster-use-empty-masters 192.168.10.128:6379

4.3 叢集縮容

刪除192.168.10.128:6382節點:

/usr/local/redis/bin/redis-cli --cluster del-node 192.168.10.128:6382 efe50012f87c6a989105846c0ee555fca6d8d95a

如果再次新增該節點到叢集報下面的錯誤:
[ERR] Node 192.168.XX.XX:XXXX is not empty. Either the nodealready knows other nodes (check with CLUSTER NODES) or contains some key in database 0.

可以嘗試刪除nodes-6382.conf、dump-6382.rdb、appendonly-6382.aof這些檔案(具體名字看你的配置檔案)再嘗試,若仍報錯嘗試清空資料庫後再操作。