本篇內容主要講解“redis5.0集群的安裝過程”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“redis5.0集群的安裝過程”吧!
創(chuàng)新互聯(lián)建站服務項目包括汕尾網(wǎng)站建設、汕尾網(wǎng)站制作、汕尾網(wǎng)頁制作以及汕尾網(wǎng)絡營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關系等,向廣大中小型企業(yè)、政府機構等提供互聯(lián)網(wǎng)行業(yè)的解決方案,汕尾網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務的客戶以成都為中心已經(jīng)輻射到汕尾省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!
Redis 集群沒有使用一致性hash, 而是引入了 哈希槽的概念.
Redis 集群有16384個哈希槽,每個key通過CRC16校驗后對16384取模來決定放置哪個槽.集群的每個節(jié)點負責一部分hash槽,舉個例子,比如當前集群有3個節(jié)點,那么:
節(jié)點 A 包含 0 到 5500號哈希槽.
節(jié)點 B 包含5501 到 11000 號哈希槽.
節(jié)點 C 包含11001 到 16384號哈希槽.
這種結構很容易添加或者刪除節(jié)點. 比如如果我想新添加個節(jié)點D, 我需要從節(jié)點 A, B, C中得部分槽到D上. 如果我想移除節(jié)點A,需要將A中的槽移到B和C節(jié)點上,然后將沒有任何槽的A節(jié)點從集群中移除即可. 由于從一個節(jié)點將哈希槽移動到另一個節(jié)點并不會停止服務,所以無論添加刪除或者改變某個節(jié)點的哈希槽的數(shù)量都不會造成集群不可用的狀態(tài).
圖中描述的是六個redis實例構成的集群
6379端口為客戶端通訊端口
16379端口為集群總線端口
集群內部劃分為16384個數(shù)據(jù)分槽,分布在三個主redis中。
從redis中沒有分槽,不會參與集群投票,也不會幫忙加快讀取數(shù)據(jù),僅僅作為主機的備份。
三個主節(jié)點中平均分布著16384數(shù)據(jù)分槽的三分之一,每個節(jié)點中不會存有有重復數(shù)據(jù),僅僅有自己的從機幫忙冗余。
注意:redis cluster至少要有三個主節(jié)點,為了冗余,至少還要有三個從節(jié)點。
為了使在部分節(jié)點失敗或者大部分節(jié)點無法通信的情況下集群仍然可用,所以集群使用了主從復制模型,每個節(jié)點都會有N-1個復制品.
在我們例子中具有A,B,C三個節(jié)點的集群,在沒有復制模型的情況下,如果節(jié)點B失敗了,那么整個集群就會以為缺少5501-11000這個范圍的槽而不可用.
然而如果在集群創(chuàng)建的時候(或者過一段時間)我們?yōu)槊總€節(jié)點添加一個從節(jié)點A1,B1,C1,那么整個集群便有三個master節(jié)點和三個slave節(jié)點組成,這樣在節(jié)點B失敗后,集群便會選舉B1為新的主節(jié)點繼續(xù)服務,整個集群便不會因為槽找不到而不可用了。
不過當B和B1 都失敗后,集群是不可用的.
Redis 并不能保證數(shù)據(jù)的強一致性. 這意味這在實際中集群在特定的條件下可能會丟失寫操作.
第一個原因是因為集群是用了異步復制. 寫操作過程:
客戶端向主節(jié)點B寫入一條命令.
主節(jié)點B向客戶端回復命令狀態(tài).
主節(jié)點將寫操作復制給他得從節(jié)點 B1, B2 和 B3.
主節(jié)點對命令的復制工作發(fā)生在返回命令回復之后, 因為如果每次處理命令請求都需要等待復制操作完成的話, 那么主節(jié)點處理命令請求的速度將極大地降低 —— 我們必須在性能和一致性之間做出權衡。 注意:Redis 集群可能會在將來提供同步寫的方法。
Redis 集群另外一種可能會丟失命令的情況是集群出現(xiàn)了網(wǎng)絡分區(qū), 并且一個客戶端與至少包括一個主節(jié)點在內的少數(shù)實例被孤立。
舉個例子 假設集群包含 A 、 B 、 C 、 A1 、 B1 、 C1 六個節(jié)點, 其中 A 、B 、C 為主節(jié)點, A1 、B1 、C1 為A,B,C的從節(jié)點, 還有一個客戶端 Z1 假設集群中發(fā)生網(wǎng)絡分區(qū),那么集群可能會分為兩方,大部分的一方包含節(jié)點 A 、C 、A1 、B1 和 C1 ,小部分的一方則包含節(jié)點 B 和客戶端 Z1 .
Z1仍然能夠向主節(jié)點B中寫入, 如果網(wǎng)絡分區(qū)發(fā)生時間較短,那么集群將會繼續(xù)正常運作,如果分區(qū)的時間足夠讓大部分的一方將B1選舉為新的master,那么Z1寫入B中得數(shù)據(jù)便丟失了.
注意, 在網(wǎng)絡分裂出現(xiàn)期間, 客戶端 Z1 可以向主節(jié)點 B 發(fā)送寫命令的最大時間是有限制的, 這一時間限制稱為節(jié)點超時時間(cluster-node-timeout), 是 Redis 集群的一個重要的配置選項:
node1:172.18.22.100 node2:172.18.22.101
https://redis.io/download
我下載的是redis-5.0.3.tar.gz
[root@node1 ~]# cd /opt/ [root@node1 opt]# tar -xvf redis-5.0.3.tar.gz [root@node1 opt]# cd redis-5.0.3/ [root@node1 opt]# make MALLOC=lib [root@node1 opt]# make install
node1服務器上: [root@node1 ~]# cd /opt/ [root@node1 opt]# tar -xvf redis-5.0.3.tar.gz [root@node1 opt]# cd redis-5.0.3/ [root@node1 redis-5.0.3]# mkdir -p redis_cluster/7000/data [root@node1 redis-5.0.3]# mkdir -p redis_cluster/7001/data [root@node1 redis-5.0.3]# mkdir -p redis_cluster/7002/data
在上面的三個目錄里面創(chuàng)建redis.conf文件,需要修改的地方下面已經(jīng)標注:
#redis.conf默認配置 daemonize yes ############多實例情況下需修改,例如redis_6380.pid pidfile /var/run/redis_7000.pid ##############多實例情況下需要修改,例如6380 port 7000 tcp-backlog 511 bind 0.0.0.0 timeout 0 tcp-keepalive 0 loglevel notice ###################多實例情況下需要修改,例如6380.log logfile /var/log/redis_7000.log databases 16 save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes ##################多實例情況下需要修改,例如dump.6380.rdb dbfilename dump.7000.rdb 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 #######################多實例情況下需要修改,例如 appendonly_6380.aof appendfilename "appendonly_7000.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-entries 512 list-max-ziplist-value 64 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 #系統(tǒng)配置 #vim /etc/sysctl.conf #vm.overcommit_memory = 1 #自定義配置 aof-rewrite-incremental-fsync yes maxmemory 4096mb maxmemory-policy allkeys-lru ######################多實例情況下需要修改,例如/data/6380 dir /opt/redis-5.0.3/redis_cluster/7000/data #集群配置 cluster-enabled yes ######################多實例情況下需要修改 cluster-config-file /opt/redis-5.0.3/redis_cluster/7000/nodes.conf cluster-node-timeout 5000 #從ping主間隔默認10秒 #復制超時時間 #repl-timeout 60 #遠距離主從 #config set client-output-buffer-limit "slave 536870912 536870912 0" #config set repl-backlog-size 209715200
[root@node1 redis-5.0.3]# scp -pr /opt/redis-5.0.3/ node2:/opt/
cluster-node-timeout這個參數(shù)很重要,設置太小,會頻繁發(fā)生主從自動切換,設置時間太大,會發(fā)生主宕機了,不能及時進行主從切換。
一旦某個主節(jié)點進入了FAIL狀態(tài),如果這個主節(jié)點有一個或者多個從節(jié)點存在,那么其中一個從節(jié)點會被升級為主節(jié)點,而其它從節(jié)點會開始對這個新主節(jié)點進行復制
[root@node1 redis-5.0.3]# /opt/redis-5.0.3/src/redis-server /opt/redis-5.0.3/redis_cluster/7000/redis.conf [root@node1 redis-5.0.3]# /opt/redis-5.0.3/src/redis-server /opt/redis-5.0.3/redis_cluster/7001/redis.conf [root@node1 redis-5.0.3]# /opt/redis-5.0.3/src/redis-server /opt/redis-5.0.3/redis_cluster/7002/redis.conf 備注: [root@node1 redis-5.0.3]# /opt/redis-5.0.3/src/redis-cli -h localhost -p 7000 shutdown [root@node1 redis-5.0.3]# /opt/redis-5.0.3/src/redis-cli -h localhost -p 7000 -c localhost:7000> ping PONG
備注: -c是啟動集群模式
[root@node1 opt]# /opt/redis-5.0.3/src/redis-cli --cluster create 172.18.22.100:7000 172.18.22.100:7001 172.18.22.100:7002 172.18.22.101:7000 172.18.22.101:7001 172.18.22.101:7002 --cluster-replicas 1
中間要輸入一次yes。
選項–replicas 1 表示我們希望為集群中的每個主節(jié)點創(chuàng)建一個從節(jié)點。
[root@node1 opt]# /opt/redis-5.0.3/src/redis-cli -h localhost -p 7001
localhost:7001> 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:2 cluster_stats_messages_ping_sent:1302 cluster_stats_messages_pong_sent:946 cluster_stats_messages_meet_sent:4 cluster_stats_messages_sent:2252 cluster_stats_messages_ping_received:945 cluster_stats_messages_pong_received:1306 cluster_stats_messages_meet_received:1 cluster_stats_messages_received:2252 localhost:7001>
localhost:7001> CLUSTER NODES ed9ac7cfe6847f39dfcf56ad4244c4213a0965b1 172.18.22.100:7002@17002 slave f881aa4c6fdce6f7ac058600ca712fd9df110b1a 0 1551346045000 4 connected fb56d260650dfad25e6b54c1519e9530e1b33b62 172.18.22.100:7001@17001 myself,master - 0 1551346046000 2 connected 10923-16383 09f371cfd0933a343dd6d84159a6f8ad508b1eff 172.18.22.100:7000@17000 master - 0 1551346047131 1 connected 0-5460 a7573d643ede9facb1e9b3b629a1604ed88b6a61 172.18.22.101:7002@17002 slave fb56d260650dfad25e6b54c1519e9530e1b33b62 0 1551346046000 6 connected f881aa4c6fdce6f7ac058600ca712fd9df110b1a 172.18.22.101:7000@17000 master - 0 1551346046629 4 connected 5461-10922 8d3b210324f24aac0c146363e95d3c87a7eb474c 172.18.22.101:7001@17001 slave 09f371cfd0933a343dd6d84159a6f8ad508b1eff 0 1551346045627 5 connected
在第一臺機器上連接集群的7000端口的節(jié)點,在另外一臺連接7002節(jié)點,連接方式為 redis-cli -h localhost -c -p 7002 ,
加參數(shù) -C 可連接到集群。
在7000節(jié)點執(zhí)行命令 set hello world ,執(zhí)行結果如下:
localhost:7000> set hello world OK localhost:7000> get hello "world"
然后在另外一臺7002端口,查看 key 為 hello 的內容, get hello ,執(zhí)行結果如下:
localhost:7002> get hello -> Redirected to slot [866] located at 172.18.22.100:7000 "world"
說明集群運作正常。
簡單說一下原理
redis cluster在設計的時候,就考慮到了去中心化,去中間件,也就是說,集群中的每個節(jié)點都是平等的關系,都是對等的,
每個節(jié)點都保存各自的數(shù)據(jù)和整個集群的狀態(tài)。每個節(jié)點都和其他所有節(jié)點連接,而且這些連接保持活躍,這樣就保證了我
們只需要連接集群中的任意一個節(jié)點,就可以獲取到其他節(jié)點的數(shù)據(jù)。
Redis 集群沒有并使用傳統(tǒng)的一致性哈希來分配數(shù)據(jù),而是采用另外一種叫做哈希槽 (hash slot)的方式來分配的。
redis cluster 默認分配了 16384 個slot,當我們set一個key 時,會用CRC16算法來取模得到所屬的slot,然后將這個key
分到哈希槽區(qū)間的節(jié)點上,具體算法就是:CRC16(key) % 16384。所以我們在測試的時候看到set 和 get 的時候,直接跳轉
到了7000端口的節(jié)點。
Redis 集群會把數(shù)據(jù)存在一個 master 節(jié)點,然后在這個 master 和其對應的salve 之間進行數(shù)據(jù)同步。當讀取數(shù)據(jù)時,
也根據(jù)一致性哈希算法到對應的 master 節(jié)點獲取數(shù)據(jù)。只有當一個master 掛掉之后,才會啟動一個對應的 salve 節(jié)點,
充當 master 。
需要注意的是:必須要3個或以上的主節(jié)點,否則在創(chuàng)建集群時會失敗,并且當存活的主節(jié)點數(shù)小于總節(jié)點數(shù)的一半時,
整個集群就無法提供服務了。
到此,相信大家對“redis5.0集群的安裝過程”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!