【死磕 Redis】----- Redis 集群搭建
Redis 是一個(gè)可基于內(nèi)存亦可持久化的日志型(aof,rdb)、高性能 Key-Value 數(shù)據(jù)庫,并提供多種語言的API ,Redis 支持主從同步。數(shù)據(jù)可以從主服務(wù)器向任意數(shù)量的從服務(wù)器上同步,從服務(wù)器可以是關(guān)聯(lián)其他從服務(wù)器的主服務(wù)器。
本文將詳細(xì)介紹 Redis cluster 搭建過程,集群為三主三從。
準(zhǔn)備工作
本次集群準(zhǔn)備三臺(tái)服務(wù)器(虛擬機(jī)也可以),每臺(tái)服務(wù)器上面安裝兩個(gè) Redis 實(shí)例,端口分別是 6379 和 6380,如下:
| IP | Redis 實(shí)例 |
|---|---|
| 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
編譯。在編譯的時(shí)候可能會(huì)遇到如下錯(cuò)誤:
zmalloc.h:50:31: 致命錯(cuò)誤:jemalloc/jemalloc.h:沒有那個(gè)文件或目錄
解決辦法是:
make MALLOC=libc
編譯完成后就可以進(jìn)行下面的集群安裝了
集群安裝
我們只需要配置好一臺(tái)機(jī)器的配置,其余的配置直接采用 scp 命令進(jìn)行。
配置
1、創(chuàng)建 Redis 目錄
為 6379、6380 兩個(gè) Redis 實(shí)例創(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
修改配置配置文件,內(nèi)容如下:
注釋# 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 目錄,同時(shí)將其內(nèi)容中所有的 6379 修改為 6380
3、啟動(dòng) Redis
執(zhí)行如下兩個(gè)命令,啟動(dòng)兩個(gè) Redis 實(shí)例
/usr/local/redis/src/redis-server /var/redis/6379/redis6379.conf
/usr/local/redis/src/redis-server /var/redis/6379/redis6379.conf
可以看看 Redis 啟動(dòng)信息:

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

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

繼續(xù)在該節(jié)點(diǎn)執(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é)點(diǎn)上面執(zhí)行,握手狀態(tài)會(huì)通過消息在集群內(nèi)傳播,這樣其他節(jié)點(diǎn)會(huì)自動(dòng)發(fā)現(xiàn)新節(jié)點(diǎn)并發(fā)起握手流程,這樣 6 個(gè)節(jié)點(diǎn)都互相感知了,建立了一個(gè)集群,如下圖:

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

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

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

我們測(cè)試下:


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

搭建集群
搭建集群的命令如下:
create host1:port1 ... hostN:portN --cluster-replicas
對(duì)于文中集群命令如下:
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個(gè)節(jié)點(diǎn),即三主三從。運(yùn)行結(jié)果如下:
使用命令 redis-cli--cluster check 檢查創(chuàng)建集群的狀態(tài)
redis-cli --cluster check 192.168.2.170:6379## 可以填寫任意節(jié)點(diǎn),會(huì)帶出所有的

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

更加的詳細(xì)信息如下:

對(duì)于集群節(jié)點(diǎn)的刪除和添加,這里就不做演示了,兩個(gè)命令分別是 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 中的慢查詢
【死磕 Redis】----- 主從復(fù)制(一):概述
【死磕 Redis】----- 主從復(fù)制(二):全量復(fù)制和部分復(fù)制
【死磕 Redis】----- 主從復(fù)制(三):注意的問題
