記一次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這些檔案(具體名字看你的配置檔案)再嘗試,若仍報錯嘗試清空資料庫後再操作。