redis叢集(偽叢集)搭建
知識點
—— redis叢集是從redis3.0之後的版本才有的,redis3.0之前的版本是搭不了叢集的。
—— redis叢集中沒有特定入口,連結任意節點都可以。redis叢集內建了16384個slot,會分配到每個主節點,例:節點1-(0-5460),節點2-(5461-10922),節點3-(10923-13684)。當存入值得時候,會通過一個演算法crc16(key)%16384得到一個數字,這個數字就是要存入的slot。
—— redis各個節點都是互聯的,當一個節點向目標節點發送PING命令時,目標節點如若沒有在有效時限內回覆PING命令,那麼傳送命令的節點會為目標節點標記一個狀態PFAIL(possible failure 可能已失效),並將目標節點可能已失效廣播給其它節點。當節點收到某一節點被標記為PEAIL轉態它會記下這個節點,在叢集中如果有超過半數的節點認為某一節點可能已失效,則標記這一節點的狀態為FAIL(已失效)。
—— redis中當一個節點失效了,如果該節點有從節點,則從節點頂上,否則叢集就掛了。
—— redis叢集至少要有6臺伺服器,其中3個節點,3個從節點。因為叢集中標記一個節點已失效至少要有超過半數的節點認為某一節點失效,所以需要至少3個節點。如果其中一個及節點失效了,沒有從節點頂上,那叢集就掛了,所以需要3個從節點做替補。
搭建叢集
—— 這裡不描述redis安裝過程,假設已經安裝成功。
—— 首先關閉防火牆,因為是搭建偽叢集,是在同一臺伺服器上部署6個redis例項,不確定會佔用哪些埠。
—— redis例項,這是一個redis例項,就是原先原始碼包安裝的redis程式。
—— 建立一個檔案,存放redis例項,名稱位置隨意,複製一個redis例項到 redis-cluster檔案,如果例項中有dump.rdb檔案,刪除dump.rdb。
—— 修改redis.conf檔案
—— port 7001 #埠
—— cluster-enabled yes #此redis例項作為叢集的一個節點
—— cluster-node-timeout 15000 #節點能夠失聯的最大時間
—— cluster-config-file nodes-7001.conf #叢集配置檔案,系統自動維護,不能人工編輯,主要記錄叢集中有哪些節點,狀態等引數
—— pidfile /var/run/redis_7001.pid #redis以守護程序方式執行時,系統預設會把pid寫入/var/run/redis_7001.pid
—— daemonize yes #以守護程序執行
—— bind 192.168.10.136 #繫結本機ip地址
—— 複製剛剛修改過的redis例項,最後一共6個
——幾個例項都修改redis.conf檔案。
—— port對應7001-7006
—— cluster-config-file對應nodes-7001.conf-nodes-7006.conf
—— pidfile對應/var/run/redis_7001.pid - redis_7006.pid
—— 建立一個批處理檔案,啟動所有的redis例項。
—— 修改satrt-all.sh檔案可執行許可權。
—— [[email protected] redis-cluster]# chmod +x start-all.sh
—— 執行批處理檔案start-all.sh,啟動所有redis例項。
—— 檢視redis程序。
—— 叢集搭建需要ruby的執行環境,安裝ruby。 安裝過程中如果需要輸入,全部輸入y或yes。為什麼要ruby環境,因為要執行一個redis-trib.rb的指令碼。
—— yum install ruby
—— yum install rubygems
—— 使用gem命令安裝redis介面,gem是ruby的一個工具包。
—— 我們這邊去官網下載一個,然後手動安裝。
—— 安裝ruby-redis外掛
—— gem install -l redis-3.2.2.gem
—— 將redis原始碼包下src目錄中的redis-trib.rb指令碼複製到存放redis例項的資料夾下。
—— 補充一句裝了半天的環境(原帖中作者是線上裝的工具包,所以比較慢),其實就是為了能執行這個redis-trib.rb的指令碼,使用ruby的redis-trib.rb搭建叢集。
—— 接下來執行命令:./redis-trib.rb create --replicas 1 192.168.10.136:7001 192.168.10.136:7002 192.168.10.136:7003 192.168.10.136:7004 192.168.10.136:7005 192.168.10.136:7006
—— --replicas 1 代表每個節點有一個備份機,redis叢集至少要有三個節點,每個節點有一個備份機,就代表一共有6個節點,所以後面要跟上6個IP+埠。
—— 192.168.10.136 代表你本機的IP,至於埠就是上面配置的那些。
—— 這裡解釋一下:
—— Performing hash slots allocation on 6 nodes... # 代表一共有6個節點
—— Using 3 masters:# 有三個主節點 分別是埠 7001、7002、7003
—— Adding replica 192.168.10.136:7005 to 192.168.10.136:7002 # 埠7005的節點是埠7002節點的從節點,以此類推
—— M: a9b7d432ae7094ca20daa06ed1501cb7f9eaf843 192.168.10.136:7001 # 前面內一串是ID唯一標識
—— slots:0-5460 (5461 slots) master# 代表當前節點的雜湊槽為0-5460,主節點才有雜湊槽,redis叢集中內建了16384(0-16383)個雜湊槽。
—— 然後yes,開始搭建
—— 到此redis叢集就搭完了。
測試
—— 連結redis客戶端:redis-cli
—— redis叢集是沒有指定入口的,所以連哪個客戶端都可以,當然同樣的連哪個埠都可以,包括從節點。
—— -h 對應的IP地址,不寫的話預設就是本機,也就是bind中設定的地址。
—— -p 對應的是埠,哪個埠都可以,但是必須是及群中redis例項中的。
—— -c 這是必須的,代表叢集啟動,這是叢集啟動與單機啟動唯一的區別。
—— 存幾個值試試
—— [8736]、[742]代表的是通過演算法計算出的當前key的雜湊槽,每個節點都有對應的雜湊槽範圍,儲存的的資料是根據key的雜湊槽儲存到對應節點。