一.集群簡介
cluster介紹
redis cluster是去中心化的,集群中的每個節點都是平等的關系,每個節點都保存各自的數據和整個集群的狀態。每個節點都和其他所有節點連接,而且這些連接保持活躍。
這樣就保證了我們只需要連接集群中的任意一個節點,就可以獲取到其他節點的數據。
cluster原理
Redis集群采用一致性哈希槽的方式將集群中每個主節點都分配一定的哈希槽,對寫入的數據進行哈希后分配到某個主節點進行存儲。
集群中每個主節點將承擔一部分槽點的維護,而槽點中存儲着數據,每個主節點都有至少一個從節點用於高可用。
節點通信方式:
開啟一個端口 設置的端口號+10000,用於集群之間節點通信交換信息。每個節點默認每秒10次選擇隨機5個節點發送ping消息,將自身信息和知道的集群信息傳遞,收到ping消息后返回pong消息做回復。最后通過這種隨機的消息交換,最終每個節點將獲得所有信息。
當某個主節點掛掉,所有節點將會發現主節點掛掉了,作為主節點的從節點,就會接替主節點的工作,然后告訴所有其它節點,他成為了主。這樣其它存活節點,就將它們維護的信息表更新。
這樣當新的數據從任何一個節點從節點將接任做主,如果都掛掉集群將報錯。當從一個節點操作,根據計算后將存儲在其中一個主節點中,從節點將同步主的數據。
cluster特點
- 無中心
- 在線自動擴容縮減
- 自動故障切換
- 單層框架響應時間短
- 對mget/mset支持不友好
- 對pipline支持不友好
會開啟一個單獨端口 端口號為設置端口+10000,用於節點間通信,會不斷和知道的節點交換信息表,最后知道集群全部信息,這會導致集群中不同節點之間要等一會信息才能一致。
應用場景
適用於單台Redis縱向擴展已經無法滿足需求,集群將橫向擴展。每個節點將承擔一部分數據的維護,並且有從節點用於高可用。
二.集群部署
環境介紹
[Redis-Server-1]
主機名 = host-1
系統 = centos-7.3
地址 = 1.1.1.1
軟件 = redis-3.2.9 7000 7001
[Redis-Server-2]
主機名 = host-2
系統 = centos-7.3
地址 = 1.1.1.2
軟件 = redis-3.2.9 7002 7003
[Redis-Server-3]
主機名 = host-3
系統 = centos-7.3
地址 = 1.1.1.3
軟件 = redis-3.2.9 7004 7005
節點部署
1.參照Centos7源碼部署Redis3.2.9文檔在每個節點上部署redis。
2.每台機器上創建2個節點,以第一台為例子
cd /usr/local/redis/
mkdir -p cluster/{7000,7001}
3.創建配置文件,編輯如下內容。在7000目錄創建7000.conf配置文件,其他服務器和這台一樣,都更改如下項目,端口對應即可。
[root@linkops ~]# vim 7000.conf
bind 1.1.1.1 127.0.0.1 #更改為綁定地址,127一定要在后面
protected-mode yes
port 7000 #監聽端口
cluster-enabled yes
cluster-config-file nodes_7000.conf #加載配置文件
cluster-node-timeout 5000
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile /var/log/redis/redis_7000.pid #PID文件,需要修改對應的端口
loglevel notice
logfile "/var/log/redis/redis-server.log"
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
4.創建啟動腳本(3台操作),啟動腳本創建,3台都一樣,需要更改如下內容
vim /etc/init.d/redis7000
#!/bin/sh
REDISPORT=7000 #更改全局變量端口
EXEC=/usr/local/redis/bin/redis-server
CLIEXEC=/usr/local/redis/bin/redis-cli
PIDFILE=/var/log/redis/redis_${REDISPORT}.pid
CONF="/usr/local/redis/cluster/${REDISPORT}/${REDISPORT}.conf"
case "$1" in
start)
if [ -f $PIDFILE ]
then
echo "$PIDFILE exists, process is already running or crashed"
else
echo "Starting Redis server..."
$EXEC $CONF
fi
;;
stop)
if [ ! -f $PIDFILE ]
then
echo "$PIDFILE does not exist, process is not running"
else
PID=$(cat $PIDFILE)
echo "Stopping ..."
$CLIEXEC -p $REDISPORT shutdown
while [ -x /proc/${PID} ]
do
echo "Waiting for Redis to shutdown ..."
sleep 1
done
echo "Redis stopped"
fi
;;
*)
echo "Please use start or stop as first argument"
;;
esac
5.啟動這些服務,加入自啟動項目(3台都同樣操作)
bash /etc/init.d/redis7000
啟動集群
1.參照文檔安裝ruby(隨便找一台即可操作)
2.安裝redis的gem
wget http://shell-auto-install.oss-cn-zhangjiakou.aliyuncs.com/package/redis-4.0.1.gem
gem install package/redis-4.0.1.gem
3.啟動集群
這里使用create命令,ruby腳本將創建集群。 --replicas 1 表示1主1從,前3個為主節點
/usr/local/redis/src/redis-trib.rb create --replicas 1 1.1.1.1:7000 1.1.1.1:7001 1.1.1.2:7002 1.1.1.2:7003 1.1.1.3:7004 1.1.1.3:7005
三.集群測試
連接集群后,查看集群信息
/usr/local/redis/bin/redis-cli -c -h 192.168.4.212 -p 7001
CLUSTER INFO