本次的文章介紹的是關於redis叢集的實現及使用php進行調用,給大家分享一下,有需要的朋友可以參考一下
一、搭建redis叢集
1.概念解釋
redis 3.0之後版本支援redis-cluster叢集,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放到哪個桶中。
現在我們是三個主節點分別是: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節點上擷取資料
2、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叢集就無法繼續正確地提供服務了。
3.redis叢集的搭建
叢集中至少應該有奇數個節點,所以至少有三個節點,每個節點至少有一個備份節點,所以下面使用6節點(主節點、備份節點由redis-cluster叢集確定)。
嗯,所有最少要6個redis服務。
然後啟動這6個redis服務,在本機上,但要記得啟動前要進行修改配置。
port 7000 //連接埠7000,7002,7003 bind 10.93.84.53 //預設ip為127.0.0.1 需要改為其他節點機器可訪問的ip 否則建立叢集時無法訪問對應的連接埠,無法建立叢集daemonize yes //redis後台運行pidfile ./redis_7000.pid //pidfile檔案對應7000,7001,7002cluster-enabled yes //開啟叢集 把注釋#去掉cluster-config-file nodes.conf //叢集的配置 設定檔初次開機自動產生 7000,7001,7002cluster-node-timeout 15000 //請求逾時 預設15秒,可自行設定appendonly yes //aof日誌開啟 有需要就開啟,它會每次寫操作都記錄一條日誌
然後把redis源碼中的src目錄中的redis-trib.rb拷到當前路徑中來。
安裝ruby環境
yum install ruby yum install rubygems gem install redis-3.2.2.gem
查的一下本機6個redis的啟動情況
ps -ef | grep redis
最後我們使用redis-trib.rb來建立redis叢集。使用create命令 –replicas 1 參數表示為每個主節點建立一個從節點,一對兩個,第一個為主第二個為從。
./redis-trib.rb create --replicas 1 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 127.0.0.1:7006
使用redis-cli進行測試,要加得加-c參數,以叢集方式進行串連。
redis-cli -c
要進得加-c參數,代表串連的是叢集方式。
至此,redis叢集搭建成功。
但是我這裡只是要本機測試的6個連接埠,真實的話最少都是要兩台機器的。我們怎麼做安全性呢?
1.修改redis.conf把bind選項改成當前的區域網路ip
2.配置防火牆只允許另一台的redis伺服器進行訪問,當然也要允許應用伺服器的ip進行訪問吧。。。不然程式都連不上redis服務,玩毛啊。。。。
//先關掉6379(redis服務使用的連接埠)iptables -I INPUT -p tcp --dport 6379 -j DROP //允許192.168.1.0這個機器進行訪問原生6379連接埠iptables -I INPUT -s 192.168.1.0 -p tcp --dport 6379 -j ACCEPT
二、php中串連到redis叢集
首先使用php –ri redis來查看redis擴充版本。要在3.0版本之上。
參考
第二個參數只要叢集中的一個節點就行了,並不需要全填上
$obj_cluster = new RedisCluster(NULL, ['127.0.0.1:6380']);echo $obj_cluster->get('name1');
搞定