Redis集群搭建
主要是按照這篇文章的說明搭建的集群環境,本文也會加入自己遇到的一些坑來說明一下。
Redis 集群采用了P2P的模式,完全去中心化。Redis 把所有的 Key 分成了 16384 個 slot,每個 Redis 實例負責其中一部分 slot 。集群中的所有信息(節點、端口、slot等),都通過節點之間定期的數據交換而更新。
環境搭建
系統版本和Redis版本
[root@localhost]~# cat /proc/version
Linux version 3.10.0-957.10.1.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) ) #1 SMP Mon Mar 18 15:06:45 UTC 2019
[root@localhost]~# redis-server --version
Redis server v=5.0.7 sha=00000000:0 malloc=libc bits=64 build=1c859419f67cffa8
下載
wget http://download.redis.io/releases/redis-5.0.7.tar.gz
tar zxvf redis-5.0.7.tar.gz
mv redis-4.0.10 /usr/local/redis/
編譯安裝
cd /usr/local/redis
make
make install
啟動,然后redis-cli 連接測試就可以了,不細說
cd /usr/local/bin/
redis-server /usr/local/redis/redis.conf
集群搭建
架構細節:
所有的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬.
節點的fail是通過集群中超過半數的節點檢測失效時才生效.
客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連接集群所有節點,連接集群中任何一個可用節點即可
redis-cluster把所有的物理節點映射到[0-16383]slot上,cluster 負責維護node<->slot<->key
Redis集群預分好16384個桶,當需要在 Redis 集群中放置一個 key-value 時,根據 CRC16(key) mod 16384的值,決定將一個key放到哪個桶中。
環境準備
Redis集群中要求奇數節點,所以至少要有三個節點,并且每個節點至少有一備份節點,所以至少需要6個redis服務實例。
這里我是用了兩臺服務器,分別開啟三個節點
- 準備結構目錄
兩臺服務器分別建立如下目錄結構
$ mkdir -p /usr/local/redis/redis-cluster/{7000,7001,7002}
2.為每個端口創建配置文件。
注釋千萬別寫在配置的后面,比如 port 7000 # 端口7000
# 端口7000,7001,7002,與目錄對應
port 7000
#默認ip為127.0.0.1,需要改為其他節點機器可訪問的ip,否則創建集群時無法訪問對應的端口,無法創建集群
bind 192.168.3.67
#redis后臺運行
daemonize yes
#開啟集群
cluster-enabled yes
#集群的配置,配置文件首次啟動自動生成 7000,7001,7002
cluster-config-file nodes_7000.conf
#請求超時,默認15秒,可自行設置
cluster-node-timeout 8000
#開啟aof持久化模式,每次寫操作請求都追加到appendonly.aof文件中
appendonly yes
#每次有寫操作的時候都同步
appendfsync always
#redis服務日志
logfile "/data/redis/logs/redis.log"
#pidfile文件對應7000,7001,7002
pidfile /var/run/redis_7000.pid
關于更多配置文件參數的解釋,可以參考:
https://github.com/linli8/cnblogs/blob/master/redis%E5%89%AF%E6%9C%AC.conf
3.為了方便,每個服務器一個啟動腳本
for((i=0;i<3;i++));
do /usr/local/bin/redis-server /usr/local/test/redis-cluster/700$i/redis.conf;
done
關閉服務腳本。ip需要具體的服務器地址
for((i=0;i<=2;i++));
do /usr/local/bin/redis-cli -c -h 192.168.3.67 -p 700$i shutdown;
done
4.啟動各節點后,它們還不是一個集群,需要再創建集群
Redis 5.* 集群的創建
redis-cli --cluster create 192.168.3.67:7000 192.168.3.67:7001 192.168.3.67:7002 192.168.3.19:7000 192.168.3.19:7001 192.168.3.19:7002 --cluster-replicas 1
然后集群創建成功了,三個主節點,三個從節點。
redis-cluster會
連接測試
[root@localhost]/# redis-cli -c -p 7000 -h 192.168.3.67
192.168.3.67:7000> ping
PONG
192.168.3.67:7000> set test hello
-> Redirected to slot [6918] located at 192.168.3.67:7002
OK
192.168.3.67:7002> get test
"hello"
192.168.3.67:7002>
列出集群節點
192.168.3.67:7002> cluster nodes
7e3c8af7c86f9920437ad70520590696fcc0e1b5 192.168.3.67:7002@17002 myself,master - 0 1578570522000 8 connected 5461-10922
f74070c491e275c4731673d47ac6a7e3004f14cb 192.168.3.19:7000@17000 slave 7e3c8af7c86f9920437ad70520590696fcc0e1b5 0 1578570521000 8 connected
2350bc9e786e3a4e12020cfa16e85647515dca00 192.168.3.67:7001@17001 master - 0 1578570522274 2 connected 10923-16383
95a7ac66e0d6e0ffee5dbc0515a61627bb4ed7ee 192.168.3.67:7000@17000 master - 0 1578570520270 1 connected 0-5460
89ca241d20d9927f47176bb47cdc83ffaf6bbd9a 192.168.3.19:7001@17001 slave 2350bc9e786e3a4e12020cfa16e85647515dca00 0 1578570521272 5 connected
93b001ad06b35f5b2a9a750ea4e69fc6652dbabe 192.168.3.19:7002@17002 slave 95a7ac66e0d6e0ffee5dbc0515a61627bb4ed7ee 0 1578570522274 6 connected
查看集群信息- cluster info
192.168.3.67:7002> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:8
cluster_my_epoch:8
cluster_stats_messages_ping_sent:1018448
cluster_stats_messages_pong_sent:200700
cluster_stats_messages_sent:1219148
cluster_stats_messages_ping_received:200700
cluster_stats_messages_pong_received:194506
cluster_stats_messages_received:395206
其他的命令不繼續說明了
遇到的問題
make
錯誤一:
cc: Command not found
原因 :沒有安裝gcc
解決:yum install gcc
然后再次make
錯誤2
:error: jemalloc/jemalloc.h: No such file or directory
原因:一些編譯依賴或原來編譯遺留出現的問題
解決:make distclean 清理一下,
然后再make。
make 成功后 提示Hint: It's a good idea to run 'make test'
輸入:make test
錯誤3:
make[1]: Entering directory `/root/software/redis-3.0.0/src'
You need tcl 8.5 or newer in order to run the Redis test
原因:沒有安裝tcl
解決方案:yum install -y tcl
然后
make test
然后make
錯誤4
Hint: It's a good idea to run 'make test'
安裝完tcl之后還是出錯,如下
實際這根本就不是錯,只是一個提示而已
繼續安裝make install 就可以了
cd src && make all
make[1]: Entering directory `/home/redis-5.0.6/src'
Hint: It's a good idea to run 'make test' ;)
make[1]: Leaving directory `/home/redis-5.0.6/src'