【死磕 Redis】----- Redis 集群搭建
Redis 是一個可基于內存亦可持久化的日志型(aof,rdb)、高性能 Key-Value 數(shù)據(jù)庫,并提供多種語言的API ,Redis 支持主從同步。數(shù)據(jù)可以從主服務器向任意數(shù)量的從服務器上同步,從服務器可以是關聯(lián)其他從服務器的主服務器。
本文將詳細介紹 Redis cluster 搭建過程,集群為三主三從。
準備工作
本次集群準備三臺服務器(虛擬機也可以),每臺服務器上面安裝兩個 Redis 實例,端口分別是 6379 和 6380,如下:
| IP | Redis 實例 |
|---|---|
| 192.168.2.170 | Redis1(6379/主)、Redis2(6380/從) |
| 192.168.2.142 | Redis1(6379/主)、Redis2(6380/從) |
| 192.168.2.151 | Redis1(6379/主)、Redis2(6380/從) |
Redis 安裝
從 Redis 官網(wǎng)下載安裝包,本文采用的版本是 5.0.3 版本。Redis 的 cluster 集群是從 Redis3.0 開始支持的。
wget http://download.redis.io/releases/redis-5.0.3.tar.gz
開始解壓
tar -xzvf redis-5.0.3.tar.gz
mv redis-5.0.3 redis
編譯。在編譯的時候可能會遇到如下錯誤:
zmalloc.h:50:31: 致命錯誤:jemalloc/jemalloc.h:沒有那個文件或目錄
解決辦法是:
make MALLOC=libc
編譯完成后就可以進行下面的集群安裝了
集群安裝
我們只需要配置好一臺機器的配置,其余的配置直接采用 scp 命令進行。
配置
1、創(chuàng)建 Redis 目錄
為 6379、6380 兩個 Redis 實例創(chuàng)建數(shù)據(jù)目錄,該目錄用于存放 Redis 配置文件、日志數(shù)據(jù)等等。
mkdir -p /var/redis/{6379,6380}
2、Redis 配置文件
將 Redis 目錄下的 redis.conf 配置文件 copy 到 /var/redis/6379,目錄下
cp redis.conf /var/redis/redis6379.conf
修改配置配置文件,內容如下:
注釋# bind 127.0.0.1
protected-mode no
port 6379
daemonize yes
cluster-enabled yes
supervised no
pidfile /var/run/redis_6379.pid
logfile "/var/redis/6379/log"
cluster-config-file /var/redis/nodes-6379.conf
修改完成后,將該文件 copy 到 /var/redis/6380 目錄,同時將其內容中所有的 6379 修改為 6380
3、啟動 Redis
執(zhí)行如下兩個命令,啟動兩個 Redis 實例
/usr/local/redis/src/redis-server /var/redis/6379/redis6379.conf
/usr/local/redis/src/redis-server /var/redis/6379/redis6379.conf
可以看看 Redis 啟動信息:

同時,節(jié)點啟動后會在相應的目錄生成節(jié)點集群配置信息(cluster-config-file),文件內容記錄了集群初始狀態(tài),內容如下:
[root@localhost 6379]# cat /var/redis/6379/nodes-6379.conf
4a903627773fe1b4a77d24a5aaa3a1ec0fe238e3:6379@16379 myself,master - 000 connected
內容中最重要的是節(jié)點 ID(4a903627773fe1b4a77d24a5aaa3a1ec0fe238e3),他是一個 40 位 16 進制的字符串,用來唯一標識集群內的一個節(jié)點。節(jié)點 ID 在集群初始化時只創(chuàng)建一次,節(jié)點重啟時會加載集群配置文件進行重用。
6 個 Redis 實例都已經(jīng)啟動成功了,但是 Redis 集群并沒有搭建完成,這些實例都不知道其他實例的存在,都是孤立的并沒有形成一個集群。查看集群節(jié)點新如下:
4a903627773fe1b4a77d24a5aaa3a1ec0fe238e3192.168.2.170:6379@16379 myself,master - 015552326790000 connected
6 個節(jié)點相互獨立,如下:

節(jié)點握手
可以通過節(jié)點握手讓 6 個 Redis 節(jié)點建立聯(lián)系,從而形成一個集群。
節(jié)點握手是指一批運行在集群模式下的節(jié)點通過 Gossip 協(xié)議彼此通信,達到感知對方的過程。
通過在客戶端執(zhí)行命令 cluster meet{ip}{port} 就可以建立兩個節(jié)點之間的握手,該命令是一個異步命令,執(zhí)行后立刻返回,內部執(zhí)行握手的過程。過程如下:
節(jié)點 6379 本地創(chuàng)建 6380 節(jié)點信息對象,并發(fā)送 meet 消息。
節(jié)點 6380 接受到 meet 消息后,保存 6379 節(jié)點信息并回復 pong 消息。
之后節(jié)點 6379 和 6380 彼此定期通過 ping/pong 消息進行正常的節(jié)點通信。
在節(jié)點 192.168.2.170:6379 節(jié)點執(zhí)行如下命令:
cluster meet 192.168.2.1706380
這樣 6379 節(jié)點就與 6380 之間建立了聯(lián)系,如下:

繼續(xù)在該節(jié)點執(zhí)行如下命令:
cluster meet 192.168.2.1516379
cluster meet 192.168.2.1516380
cluster meet 192.168.2.1426379
cluster meet 192.168.2.1426380
上面命令是可以在任意節(jié)點上面執(zhí)行,握手狀態(tài)會通過消息在集群內傳播,這樣其他節(jié)點會自動發(fā)現(xiàn)新節(jié)點并發(fā)起握手流程,這樣 6 個節(jié)點都互相感知了,建立了一個集群,如下圖:

查看集群節(jié)點信息。

在其余 5 個節(jié)點查看都可以得到相同的信息。
6 個節(jié)點建立握手后,集群還是不能正常工作,這是因為還有槽沒有分配。Redis 集群一共 16384 個槽點,只有這些槽點全部分配節(jié)點后,集群才會進入在線狀態(tài)。
分配槽點
分配槽點的命令如下:
redis-cli -h IP -p 端口 cluster addslots {begin.. end}
Redis 集群分為主從,其中首次啟動的節(jié)點和被分配槽的節(jié)點都是主節(jié)點,從節(jié)點負責復制主節(jié)點槽信息和相關的數(shù)據(jù)。這里我們配置的三主三從,主節(jié)點為三臺服務器的 6379 節(jié)點,從節(jié)點為 6380 節(jié)點。所以整個命令如下:
redis-cli -h 192.168.2.170-p 6379 cluster addslots {0..5460}
redis-cli -h 192.168.2.151-p 6379 cluster addslots {5461..10922}
redis-cli -h 192.168.2.142-p 6379 cluster addslots {10923..16383}
這樣主節(jié)點就已經(jīng)配置完成了,下面則是配置從節(jié)點。cluster replicate{nodeId} 可以讓某個節(jié)點成為從節(jié)點,在三臺服務器執(zhí)行如下三個命令,注意 Redis 節(jié)點是 6380,不是 6379。
cluster replicate 4a903627773fe1b4a77d24a5aaa3a1ec0fe238e3
cluster replicate 03d20cfe6e98f4b6f09d5299a465845ce70008c3
cluster replicate 00c46cd6b8875a4c8fafac6f773c5c90a5331c7d
再次查看集群節(jié)點信息:

到這里我們就已經(jīng)完成了 Redis 集群的搭建,整個集群圖例如下:

我們測試下:


驗證成功!!
小編使用的是 Redis 5 ,而 Redis 5 不支持 redis-trib.rb 來搭建集群了,推薦使用 redis-cli 來操作,所以關于 redis-trib.rb 搭建集群的方式,小編就不介紹了,各位可以自行 Google。下面演示利用 redis-cli 來操作集群
redis-cli 操作集群
所有配置依然采用上面的 Redis 配置,啟動所有 Redis 服務(如果是復用上面的配置,需要刪除掉所有的 node-xx.conf)。
我們可以利用 redis-cli--cluster help 查看利用 redis-cli 操作集群的命令幫助文檔,如下:

搭建集群
搭建集群的命令如下:
create host1:port1 ... hostN:portN --cluster-replicas
對于文中集群命令如下:
redis-cli --cluster create 192.168.2.170:6379192.168.2.170:6380192.168.2.151:6379192.168.2.151:6380192.168.2.142:6379192.168.2.142:6380--cluster-replicas 1
--cluster-replicas 1 表示一主一從,我們有 6個節(jié)點,即三主三從。運行結果如下:
使用命令 redis-cli--cluster check 檢查創(chuàng)建集群的狀態(tài)
redis-cli --cluster check 192.168.2.170:6379## 可以填寫任意節(jié)點,會帶出所有的

從圖中可以看出,該命令自動
使用命令 redis-cli--cluster info 查看集群信息,如下:

更加的詳細信息如下:

對于集群節(jié)點的刪除和添加,這里就不做演示了,兩個命令分別是 redis-cli--clusterdel-node host:port node_id 和 redis-cli--cluster add-node new_host:new_port existing_host:existing_port--cluster-slave--cluster-master-id
【死磕 Redis】----- Redis 通信協(xié)議 RESP
【死磕 Redis】----- 理解 pipeline 管道
【死磕 Redis】-----如何排查 Redis 中的慢查詢
