redis叢集配置
為什麼要使用叢集
- redis官方生成可以達到 10萬/每秒,每秒執行10萬條命令,假如業務需要每秒100萬的命令執行呢。該怎麼處理呢
- 一臺伺服器記憶體正常是16~256G,假如你的業務需要500G記憶體,又該如何解決
叢集的核心思想是將資料分片(sharding)儲存於多個redis例項當中。
叢集的方案有:
- twemproxy由Twitter開源
- Codis由豌豆莢開發,基於GO和C開發
- redis-cluster官方3.0版本後的叢集方案
這裡介紹redis的redis-cluster叢集
叢集原理
其中所有的子集就是一個叢集。
redis3.0叢集採用P2P模式,完全去中心化,將redis所有的key分成了16384個槽位,每個redis例項負責一部分slot,叢集中的所有資訊透過節點資料交換而更新。
分割槽規則
常見的分割槽規則有以下幾種
-
順序分割槽
按照數字的順序進行key的分割槽。
-
節點取餘分割槽
按照對每個節點的資料取餘進行分割槽。
例如按照節點取餘的方式,分三個節點1~100的資料對3取餘,可以分為三類:
- 餘數為0
- 餘數為1
- 餘數為2
-
虛擬槽分割槽
虛擬槽分割槽巧妙地使用了雜湊空間,使用分散度良好的雜湊函式把所有的資料對映到一個固定範圍內的整數集合,整數定義為槽(slot)。
Redis Cluster槽的範圍是0 ~ 16383。
槽是叢集內資料管理和遷移的基本單位。採用大範圍的槽的主要目的是為了方便資料的拆分和叢集的擴充套件,
每個節點負責一定數量的槽。
redis cluster實驗
本次叢集的搭建分為:
- 準備六臺叢集伺服器(三主三從)
- 使用rudy指令碼進行槽位分配。
配置檔案
redis支援多例項的功能,我們在單機演示叢集搭建,需要6個例項,三個是主節點,三個是從節點,數量為6個節點才能保證高可用的叢集。
其中單例項的配置檔案如下:
port 7000
daemonize yes
dir "/opt/redis/data"
logfile "7000.log"
dbfilename "dump-7000.rdb"
cluster-enabled yes #開啟叢集模式
cluster-config-file nodes-7000.conf #叢集內部的配置檔案
cluster-require-full-coverage no #redis cluster需要16384個slot都正常的時候才能對外提供服務,換句話說,只要任何一個slot異常那麼整個cluster不對外提供服務。 因此生產環境一般為no
我們在7000-7005搭6個服務。
檢查它們是否成功執行:
root@long:/opt/test_redis# ls
cluster-7000.conf cluster-7001.conf cluster-7002.conf cluster-7003.conf cluster-7004.conf cluster-7005.conf
root@long:/opt/test_redis# redis-server cluster-7000.conf
root@long:/opt/test_redis# redis-server cluster-7001.conf
root@long:/opt/test_redis# redis-server cluster-7002.conf
root@long:/opt/test_redis# redis-server cluster-7003.conf
root@long:/opt/test_redis# redis-server cluster-7004.conf
root@long:/opt/test_redis# redis-server cluster-7005.conf
檢視是否成功執行:
槽位配置
此時叢集還不可以,可以登入redis-cli檢查是否能夠設定key,會發現報錯:
注意-c是以叢集模式開啟客戶端
接下來演示的是使用ruby指令碼來進行槽位自動分配
-
配置ruby環境
# 下載ruby wget http://ftp.ruby-lang.org/pub/ruby/ruby-2.6.4.tar.gz # 安裝ruby tar -zxvf ruby-2.6.4.tar.gz #解壓 ./configure --prefix=/opt/ruby/ #解包makefile make && make install # 編譯安裝 # 配置環境變數,這裡不做程式碼描述
-
下載redis官方提供的ruby指令碼分配槽(redis-trib.rb)
這裡踩了一下坑,教程上介紹的是提供ruby安裝redis提供的gem包。可是安裝完成後沒找到安裝了相關命令。
解決方式是直接下redis的包,去裡面找ruby指令碼
# 可以嘗試一下安裝gem包試試,不行再下redis包去找指令碼 # 下載gem軟體包 wget http://rubygems.org/downloads/redis-3.3.0.gem # gem裝包 gem install -l redis-3.3.0.gem # 接下來在全域性或者ruby路徑查詢redis-trib.rb指令碼 find / -name redis-trib.rb
再附上直接轉redis包的過程(redis原始碼包:http://download.redis.io/releases/redis-3.2.3.tar.gz)
-
進行槽位的自動分配
注意執行之前要確保叢集啟動。(即6個叢集節點都跑起來了)
# 執行redis-trib.rb進行槽位分配(--replicas 1 代表每一個主節點分配一個從節點) ./redis-trib.rb create --replicas 1 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
執行情況
至此,redis cluster已經完成執行。本實驗展示的是在一臺宿主機上做的叢集部署。如果在多臺機器上執行redis,就可以有效的做好資訊分片。
結果如下:
- 叢集狀態
- 叢集寫入和讀取資訊(注意需要-c引數才能啟動以叢集啟動redis)