1. 程式人生 > >redis叢集的實現及使用php進行呼叫

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覆蓋05460;
      節點B覆蓋546110922;
      節點C覆蓋1092316383.

看不懂,,,,

     獲取資料:

      如果存入一個值,按照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,7002
cluster-enabled  yes                           //開啟叢集  把註釋#去掉
cluster-config-file  nodes.conf   //叢集的配置  配置檔案首次啟動自動生成 7000,7001,7002
cluster-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');

搞定

相關推薦

redis叢集實現使用php進行呼叫

一、搭建redis叢集 1.概念解釋 redis 3.0之後版本支援redis-cluster叢集,Redis-Cluster採用無中心結構,每個節點儲存資料和整個叢集狀態,每個節點都和其他所有節點連線。其redis-cluster架構圖如下:

Redis叢集方案實現

之前做了一個Redis的叢集方案,跑了小半年,線上執行的很穩定差不多可以跟大家分享下經驗,前面寫了一篇文章 資料線上服務的一些探索經驗,可以做為背景閱讀應用我們的Redis叢集主要承擔了以下服務:1. 實時推薦2. 使用者畫像3. 誠信分值服務叢集狀況叢集峰值QPS 1W左右

redis 叢集部署分散式鎖的實現

一、redis叢集的部署安裝redis確保安裝資料夾有redis-trib.rb檔案,通過rudy構建redis叢集安裝ruby環境配置好環境變數,gem install redis 安裝redis依賴詳細環境安裝教程:點選開啟連結叢集搭建      redis叢集最小包含3

高效運維最佳實踐(03):Redis叢集技術Codis實踐 (轉)

專欄介紹 “高效運維最佳實踐”是InfoQ在2015年推出的精品專欄,由觸控科技運維總監蕭田國撰寫,InfoQ總編輯崔康策劃。 前言 誠如開篇文章所言,高效運維包括管理的專業化和技術的專業化。前兩篇我們主要在說些管理相關的內容,本篇說一下技術專業化。希望讀者朋友們能適應這個轉

一文輕鬆搞懂redis叢集原理搭建與使用

三種叢集策略: https://blog.csdn.net/q649381130/article/details/79931791 https://blog.csdn.net/qq_34337272/article/details/79982529 redis主從複製和叢集實現原理:

redis叢集搭建問題的決方法(一)

一、叢集搭建主要配置如下: P61 bind 127.0.0.1//預設ip為127.0.0.1改為其他節點機器可訪問 的ip 註釋掉bind;可以監聽連線當前服務的所有-h 後的ip;例如;綁定了 127.0.0.1,但是登入時使用-h 10.9.17.153

redis叢集搭建問題的決方法(二)

一、準備好有三個主節點的叢集 127.0.0.1:8000> cluster nodes 8ce851252f32fcab268e77d3b3ed976d57d2f498 10.211.55.5:8000 myself,master - 0 0 1 con

基於nutcracker的redis叢集實現 阿里雲

坑還是比較多的吧 安全組必不可少開啟 22121 22122 22123 22124 22222 aliyun 搭建redis叢集https://my.oschina.net/u/3647713/blog/1982995 安裝autoconf cd /usr/local wget http://f

redis叢集實現(六) 容災與宕機恢復

實現叢集,一個重要的保證就是高可用性,要在各種軟體和硬體的故障情況下仍然能夠提供服務。一般來說有兩種解決思路,一種是每一個節點互相之間都會進行資料互動以及監控,出現故障的時候,各個節點都可以做協調任務。另一種就是增加一個協調元件來對叢集進行實時監控以及故障處理。現在使用比較

redis叢集實現(三)叢集刪除節點

redis叢集裡的節點支援動態刪除,但是一般情況下不會這麼做,只有在節點軟硬體升級的時候才會主動讓節點下線。刪除節點的方式就是redis-cli客戶端連線到伺服器,然後執行cluster forget node-id就可以了,如果是刪除一個從節點的話,叢集仍然是可用狀態,如

redis叢集實現(四) 資料的和槽位的分配

不知道有沒有人思考過redis是如何把資料分配到叢集中的每一個節點的,可能有人會說,把叢集中的每一個節點編號,先放第一個節點,放滿了就放第二個節點,以此類推。。如果真的是這樣的話,伺服器的利用率和效能

Redis 叢集詳解 環境搭建 呼叫案例

http://www.jianshu.com/p/dbc62ed27f03 這是redis叢集介紹的上篇,主要是關於Redis叢集的搭建。後續將為大家介紹Redis叢集的常用命令、Java操作Redis叢集、以及與Spring/Spring MVC的整合等知識。 Re

Redis叢集架構對比

1.     Redis3.0 ·        優點 a. 無中心節點 b. 資料按照 slot 儲存分佈在多個 Redis 例項上 c. 平滑的進行擴容/縮容節點 d. 自動故障轉移(節點之間通過 Gossip 協議交換狀態資訊,進行投票機制完成 Slave 到 Ma

高效運維之Redis叢集技術Codis實踐

這篇是《中生代》轉載的一個關於運維的文章。作者是觸控科技運維總監蕭田國。文章在運維圈子流傳甚廣。特別也發在社群,分享給感興趣的朋友。 前言 誠如開篇文章所言,高效運維包括管理的專業化和技術的專業化。前兩篇我們主要在說些管理相關的內容,本篇說一下技術專業化。希望讀者朋友們

Linux下搭建Redis叢集環境測試叢集 關閉redis

Redis叢集環境 Redis叢集相關概念 各redis節點彼此互聯(PING-PONG機制),內部使用二進位制協議優化傳輸速度和頻寬,無主機,客戶端隨意連線一個節點都可以 節點的fail是通過叢集中超過半數的節點檢測失效才生效 (1)領

Redis叢集監控Redis桌面客戶端

之前在生產環境部署了Redis叢集,一直苦於沒有工具監控,最近找了下網上推薦redmon和Redislive的比較多,查看了兩個專案的github,都幾年沒有更新,這兩個專案應該沒有人在維護了,如果哪位有更好的替代方案麻煩告知! 僅將自己的部署方案貼出來,以供自己翻查! 具

redis叢集實現(二)叢集新增節點

在redis-3.0.0裡,叢集新增節點是通過客戶端執行cluster meet命令來實現的,命令格式是cluster meet <ip> <port>,如果客戶端向A節點發送這條命令,ip和port分別是B節點的ip和port,就會把ip:port

Spring 整合redis叢集 實現 以及過程中需要注意的問題點

一,準備工作: 1.首先安裝好redis叢集,啟動並配置叢集。 2.SpringMVC環境,看專案或個人需要,可以使SpringMVC的web專案,也可以是隻使用SpringBean管理器。 二,著手配置: 由於專案是由maven管理的所以需要的jar 包新增到maven

redis叢集實現(八)redis+twemproxy叢集

redis的確是一個非常高效的快取伺服器,但是單臺redis伺服器的記憶體管理能力有限,如果一味的加大記憶體的話會導致redis伺服器的效能下降,所以就必須要搭建redis叢集來提供服務。在redis官方在3.0.0版本給出叢集方案之前,大部分的企業都使用twemproxy

redis叢集實現(五) sentinel的架構與raft協議

redis在3.0.0版本開始支援叢集功能,但是實現叢集就要求redis能夠承受單點故障,保證redis的高可用性,在各種軟體和硬體的故障情況下仍然能夠提供服務。一般來說有兩種解決思路,一種是每一個節