一、 概述
Redis從3.0開始支持集群模式。
1.1 架構圖
架構細節:
1)所有的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬.
2)節點的fail是通過集群中超過半數的節點檢測失效時才生效.
3)客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連接集群所有節點,連接集群中任何一個可用節點即可
4)redis-cluster把所有的物理節點映射到[0-16383]slot上,cluster 負責維護node<->slot<->value
1.2 集群特點
1) 節點自動發現:所有節點相互連接
2) 集群消息通信通過集群總線通信,集群總線端口為客戶端服務端口+10000(自動生成)
3) 節點與節點之間通過二進制協議進行通信
4) 數據按照Slot存儲分布在多個Redis實例上
5) 集群節點掛掉會自動故障轉移
一、 集群安裝
本文采用2台主機,三主三從集群模式部署,每台機器部署三個節點。
2.1 服務器規划
主機 |
IP |
端口 |
node-10 |
172.10.10.10 |
6385、6386、6387 |
node-11 |
172.10.10.11 |
6385、6386、6387 |
2.2 下載(以下步驟先以node-10機器為例,node11機器步驟一樣按照執行一遍即可)
[root@node-10 ~]# cd tools/ [root@node-10 tools]# wget http://download.redis.io/releases/redis-3.2.3.tar.gz [root@node-10 tools]# tar -xf redis-3.2.3.tar.gz [root@node-10 tools]# cd redis-3.2.3
2.3 編譯
[root@node-10 redis-3.2.3]# make [root@node-10 redis-3.2.3]# make MALLOC=libc [root@node-10 redis-3.2.3]# make install PREFIX=/opt/redis-cluster 執行完這一步可以看到默認生成以下redis相關命令 [root@node-10 ~]# ll /opt/redis-cluster/bin/ total 6864 -rwxr-xr-x 1 root root 337424 Feb 28 14:06 redis-benchmark -rwxr-xr-x 1 root root 24992 Feb 28 14:06 redis-check-aof -rwxr-xr-x 1 root root 3083072 Feb 28 14:06 redis-check-rdb -rwxr-xr-x 1 root root 490264 Feb 28 14:06 redis-cli lrwxrwxrwx 1 root root 12 Feb 28 14:06 redis-sentinel -> redis-server -rwxr-xr-x 1 root root 3083072 Feb 28 14:06 redis-server
2.4 為三個節點創建對應的根目錄及每個節點數據、日志、配置文件目錄
[root@node-10 ~]# mkdir -p /opt/redis-cluster/{6385,6386,6387} [root@node-10 ~]# mkdir /opt/redis-cluster/6385/{data,conf,logs} [root@node-10 ~]# mkdir /opt/redis-cluster/6386/{data,conf,logs} [root@node-10 ~]# mkdir /opt/redis-cluster/6387/{data,conf,logs}
2.5 編輯配置文件
注意:不同節點端口不同,需要根據實際情況修改對應的實例數據的相應目錄位置信息(這里以6385實例為例,其它按照這個修改即可)。
[root@node-10 ~]# vim /opt/redis-cluster/6385/conf/6385_redis.conf bind 0.0.0.0 protected-mode yes port 6385 tcp-backlog 511 timeout 0 tcp-keepalive 300 daemonize yes supervised no pidfile /var/run/redis_6385.pid loglevel notice logfile "/opt/redis-cluster/6385/logs/redis_6385.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 "/opt/redis-cluster/6385/data" 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 no 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 cluster-enabled yes cluster-config-file "/opt/redis-cluster/6385/conf/nodes.conf" cluster-node-timeout 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
2.6 編輯統一啟動腳本
[root@node-10 ~]# vim /opt/redis-cluster/start_rediscluster.sh #!/bin/bash REDIS_HOME=/opt/redis-cluster $REDIS_HOME/bin/redis-server $REDIS_HOME/6385/conf/6385_redis.conf $REDIS_HOME/bin/redis-server $REDIS_HOME/6386/conf/6386_redis.conf $REDIS_HOME/bin/redis-server $REDIS_HOME/6387/conf/6387_redis.conf [root@node-10 ~]# chmod +x /opt/redis-cluster/start_rediscluster.sh
2.7 啟動
[root@node-10 ~]# cd /opt/redis-cluster/ [root@node-10 redis-cluster]# ./start_rediscluster.sh [root@node-10 redis-cluster]# ps -ef|grep redis root 5247 1 0 14:22 ? 00:00:00 /opt/redis-cluster/bin/redis-server 0.0.0.0:6385 [cluster] root 5249 1 0 14:22 ? 00:00:00 /opt/redis-cluster/bin/redis-server 0.0.0.0:6386 [cluster] root 5251 1 0 14:22 ? 00:00:00 /opt/redis-cluster/bin/redis-server 0.0.0.0:6387 [cluster] root 5260 1507 0 14:22 pts/1 00:00:00 grep --color=auto redis
注:這里只是部署好一台機器的三個redis實例,另一台機器部署與這一台一樣,執行相應的命令即可,這里不再進行演示。
三、 創建集群(隨便一台機器執行)
以上部署只是把單個節點部署好,需要把所有節點整合成一個集群,這樣一個三主三從的Redis集群才算部署完成。
3.1 安裝ruby
集群創建我們使用redis自帶的redis-trib工具,該工具為ruby開發,需要安裝ruby。
[root@node-10 ~]# yum install ruby -y [root@node-10 ~]# gem install redis
如果出現以上安裝錯誤信息。我們需要升級ruby版本:
## 安裝ruby管理工具rvm [root@node-10 ~]# gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB [root@node-10 ~]# curl -sSL https://get.rvm.io | bash -s stable ## 加載 [root@node-10 ~]# source /etc/profile.d/rvm.sh ## 查看ruby版本 [root@node-10 ~]# rvm list known ## 安裝2.4.6 [root@node-10 ~]# rvm install 2.5.1
[root@node-10 ~]# rvm use 2.5.1 –default ## 安裝redis-trib.rb即redis集群工具 [root@node-10 ~]# gem install redis -v 3.3.5 ## 啟動集群 [root@node-10 ~]# cd tools/redis-3.2.3/src/ [root@node-10 src]# ./redis-trib.rb create --replicas 1 172.16.10.10:6385 172.16.10.10:6386 172.16.10.10:6387 172.16.10.11:6385 172.16.10.11:6386 172.16.10.11:6387
--replicas 1:表示我們想為每個master指定一個slave
## 驗證 [root@node-10 bin]# cd /opt/redis-cluster/bin/ [root@node-10 bin]# ./redis-cli -p 6385 -c
11服務器:6385,10服務器:6385、6386為主節點
3.2 集群重啟
由於redis-trib的功能還比較弱,重啟集群的話需要kill各個節點進程,然后再執行啟動腳本 ## kill命令 [root@node-10 ~]# ps -ef | grep redis |grep -v grep|awk '{print $2}'|xargs kill ## 啟動 [root@node-10 ~]# cd /opt/redis-cluster/ [root@node-10 redis-cluster]# ./start_rediscluster.sh