Redis集
基于六個redis實列部署redis cluster叢集,并實作節點的擴充與删減;
Redis-Cluster采用無中心結構,每個節點儲存資料和整個叢集狀态,每個節點都和其他所有節點連接配接
其結構特點:
1、所有的redis節點彼此互聯(PING-PONG機制),内部使用二進制協定優化傳輸速度和帶寬。
2、節點的fail是通過叢集中超過半數的節點檢測失效時才生效。
3、用戶端與redis節點直連,不需要中間proxy層.用戶端不需要連接配接叢集所有節點,連接配接叢集中任何一個可用節點即可。
4、redis-cluster把所有的實體節點映射到[0-16383]slot上(不一定是平均配置設定),cluster 負責維護node<->slot<->value。
5、Redis叢集預分好16384個桶,當需要在 Redis 叢集中放置一個 key-value 時,根據 CRC16(key) mod 16384的值,決定将一個key放到哪個桶中。
redis cluster節點配置設定
現在我們是三個主節點分别是:A, B, C 三個節點,它們可以是一台機器上的三個端口,也可以是三台不同的伺服器。那麼,采用哈希槽 (hash slot)的方式來配置設定16384個slot 的話,它們三個節點分别承擔的slot 區間是:
• 節點A覆寫0-5460;
• 節點B覆寫5461-10922;
• 節點C覆寫10923-16383.
擷取資料:
如果存入一個值,按照redis cluster哈希槽的算法: CRC16('key')384 = 6782。 那麼就會把這個key 的存儲配置設定到 B 上了。同樣,當我連接配接(A,B,C)任何一個節點想擷取'key'這個key時,也會這樣的算法,然後内部跳轉到B節點上擷取資料
Redis Cluster主從模式
redis cluster 為了保證資料的高可用性,加入了主從模式,一個主節點對應一個或多個從節點,主節點提供資料存取,從節點則是從主節點拉取資料備份,當這個主節點挂掉後,就會有這個從節點選取一個來充當主節點,進而保證叢集不會挂掉
上面那個例子裡, 叢集有ABC三個主節點, 如果這3個節點都沒有加入從節點,如果B挂掉了,我們就無法通路整個叢集了。A和C的slot也無法通路。
是以我們在叢集建立的時候,一定要為每個主節點都添加了從節點, 比如像這樣, 叢集包含主節點A、B、C, 以及從節點A1、B1、C1, 那麼即使B挂掉系統也可以繼續正确工作。
B1節點替代了B節點,是以Redis叢集将會選擇B1節點作為新的主節點,叢集将會繼續正确地提供服務。 當B重新開啟後,它就會變成B1的從節點。
不過需要注意,如果節點B和B1同時挂了,Redis叢集就無法繼續正确地提供服務了。
1.1上傳redis解壓
Redis的作用是緩存網站的壓力 在大量讀寫進行資料的轉移
分擔壓力
tar xf redis-5.0.5.tar.gz
cd redis-5.0.5
1.2編譯安裝
make PREFIX=/usr/local/redis install
cp redis.conf /usr/local/redis/
1.3啟動後出現的警告
/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf
Backlog主要控制的是三次握手的時候,server端收到确認号後的隊列長度,
echo "vm.overcommit_memory=1" >>/etc/sysctl.conf
0表示 核心會檢查有沒有多的記憶體給進城使用
echo "net.core.somaxconn=512">>/etc/sysctl.conf
第三個報錯是開啟了大頁記憶體動态配置設定,設定關閉,讓redis負責記憶體管理
echo never > /sys/kernel/mm/transparent_hugepage/enabled
sysctl -p
最後執行一下指令,重新開機redis就不會提示警告錯誤資訊了
1.4開啟守護程序
sed -i 's/^daemonize no$/daemonize yes/g' redis.conf
執行初始化的腳本
1.5配置主庫的配置
bind 0.0.0.0
1.6從庫的配置為
REPLICAOF 192.168.217.136 6379 指定主庫是誰
重新開機下
[root@localhost redis]# /etc/init.d/redis_6379 restart
建立redis-cluster目錄
root@localhost redis]# mkdir redis-cluster
[root@localhost redis]# cd redis-cluster/
1.7建立6個執行個體目錄
[root@localhost redis-cluster]# mkdir 7000 7001 7002 7003 7004 7005
複制可執行檔案
[root@localhost redis-5.0.5]# find . -name redis-server
./src/redis-server
[root@localhost redis-5.0.5]# cp ./src/redis-server /usr/local/redis/redis-cluster/
[root@localhost redis-5.0.5]# ./utils/install_server.sh 初始化6個
mkdir 7006
[root@localhost redis-cluster]# cd /usr/local/src/redis-5.0.5
[root@localhost redis-5.0.5]# ./utils/install_server.sh
一備用
1.8配置節點配置
[root@localhost redis-5.0.5]# vim /usr/local/redis/redis-cluster/7000/7000.conf
cluster-enabled yes 開啟叢集
cluster-config-file nodes-7000.conf 指定叢集配置檔案
cluster-node-timeout 5000 逾時時間5秒
appendonly yes 開啟aof
1.9開啟6redis個執行個體
for i in
seq 0 5
;do /etc/init.d/redis_700$i start;sleep 2;done
[root@localhost ~]# ss -ntl
圖中的箭頭一定對應起來才能去進行 不然會出錯
建立6各節點 自動配置設定 master 和slave
3個位master 3個位slave --cluster-replicas 1 指明叢集中的每個主節點建立一個從節點
[root@localhost redis-5.0.5]# /usr/local/redis/bin/redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 \
127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1
2.0檢視節點的狀态
[root@localhost ~]# /usr/local/redis/bin/redis-cli -p 7000 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:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:809
cluster_stats_messages_pong_sent:807
cluster_stats_messages_sent:1616
cluster_stats_messages_ping_received:802
cluster_stats_messages_pong_received:809
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:1616
/usr/local/redis/bin/redis-cli -p 7000 cluster nodes
主7000 ->從7003
主7001->從7004
主7002->從7005
設定鍵值對
/usr/local/redis/bin/redis-cli -p 7000
2.1設定name時候報錯 ,鍵的節點應該到7001中設定
/usr/local/redis/bin/redis-cli -p 7001
或者開啟叢集的模式 寫入資料
/usr/local/redis/bin/redis-cli -p 7000 -c
2.2檢查redis節點狀态
/usr/local/redis/bin/redis-cli -p 7000 --cluster check 127.0.0.1:7000
2.3關閉主節點7001 ,7004順利接管
沒有關閉7001時候鍵的狀态
2.4重新啟動7001 檢視狀态
/etc/init.d/redis_7001 start
2.5配置叢集中節點7006
egrep "cluster-enabled|cluster-config-file|cluster-node-timeout|^appendonly" /usr/local/redis/redis-cluster/7006/7006.conf
配置叢集開啟
sed -ir '/cluster-enabled/s/^# //g' /usr/local/redis/redis-cluster/7006/7006.conf
配置叢集節點
sed -ir '/cluster-config-file/s/^# //g;s/6379/7006/g' /usr/local/redis/redis-cluster/7006/7006.conf
配置逾時時間
sed -ir '/cluster-node-timeout/s/^# //g;s/15000/5000/g' /usr/local/redis/redis-cluster/7006/7006.conf
打開redis持久化
sed -i "/^appendonly/s/no/yes/g" /usr/local/redis/redis-cluster/7006/7006.conf
最後确認下
2.6重新啟動節點以確定能将節點加入叢集
seq 0 6
;do /etc/init.d/redis_700$i restart;sleep 2;done
将7006加入叢集
/usr/local/redis/bin/redis-cli -p 7000 --cluster add-node 127.0.0.1:7006 127.0.0.1:7000
2.7重新分片
/usr/local/redis/bin/redis-cli -p 7000 --cluster reshard 127.0.0.1:7000
2.8增加7006的從節點
/usr/local/redis/bin/redis-cli --cluster add-node --cluster-slave --cluster-master-id 0b3c2d803234a7bf8dcaf2
e34c252ed30b12d03e 127.0.0.1:7007 127.0.0.1:7006
2.9 删除從節點
/usr/local/redis/bin/redis-cli --cluster del-node 127.0.0.1:7007 a1c70b1949e8d6f273b3bce6c750354fdfe11d64
3.0删除主節點,需要删除分片,再删除主節點(任意節點登入)
/usr/local/redis/bin/redis-cli --cluster reshard 127.0.0.1:7002
新分完片的比較大
/usr/local/redis/bin/redis-cli -p 7000 --cluster check 127.0.0.1:7002
删除節點7006
/usr/local/redis/bin/redis-cli --cluster del-node 127.0.0.1:7006 0b3c2d803234a7bf8dcaf2e34c252ed30b12d03e
2.10重新配置設定 分片
/usr/local/redis/bin/redis-cli --cluster rebalance 127.0.0.1:7000