Redis分散式叢集部署安裝及細節(一臺主機搭建多個服務--偽叢集)
Redis分散式叢集部署安裝及細節
一: redis cluster介紹篇
1:redis cluster的現狀
目前redis支援的cluster特性(已親測):
1):節點自動發現
2):slave->master選舉,叢集容錯
3):Hotresharding:線上分片
4):進群管理:cluster xxx
5):基於配置(nodes-port.conf)的叢集管理
6):ASK轉向/MOVED 轉向機制.
2:redis cluster 架構
redis-cluster架構圖
架構細節:
(1)所有的redis節點彼此互聯(PING-PONG機制),內部使用二進位制協議優化傳輸速度和頻寬.
(2)節點的fail是通過叢集中超過半數的節點檢測失效時才生效.
(3)客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連線叢集所有節點,連線叢集中任何一個可用節點即可
(4)redis-cluster把所有的物理節點對映到[0-16383]slot上,cluster 負責維護node<->slot<->value2) redis-cluster
選舉:容錯
(1)領著選舉過程是叢集中所有master參與,如果半數以上master節點與master節點通訊超過(cluster-node-timeout),認為當前master節點掛掉.
(2):什麼時候整個叢集不可用(cluster_state:fail),當叢集不可用時,所有對叢集的操作做都不可用,收到((error) CLUSTERDOWN Thecluster is down)錯誤 a:如果叢集任意master掛掉,且當前master沒有slave.叢集進入fail狀態,也可以理解成進群的slot對映[0-16383]不完成時進入fail狀態. b:如果進群超過半數以上master掛掉,無論是否有slave叢集進入fail狀態.
二:.Redis叢集安裝篇
虛擬機器環境:
要讓叢集正常工作至少需要3個主節點,在這裡我們要建立6個redis節點,其中三個為主節點,三個為從節點,對應的redis節點的ip和埠對應關係如下
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
1:上傳redis
必須為3.0以上版本(支援rediscluser)
檔案位置: caches/redis3.0/redis-3.2.1.tar.gz
2:上傳伺服器,解壓,編譯
或者直接下載,如果下載失敗,請按第一步上傳後下載
$ wget http://download.redis.io/releases/redis-2.8.17.tar.gz
$ tar xzf redis-3.2.1.tar.gz
$ cd redis-3.2.1
$ make
$ make install
以下提示:則服務安裝成功
3:建立叢集需要的目錄
[/]表示根目錄
以下操作命令在根目錄下(否則路徑會出問題)
mkdir-p root/caches/cluster
cdroot/caches/cluster
mkdir7000
mkdir7001
mkdir7002
mkdir7003
mkdir7004
mkdir7005
4:修改配置檔案redis.conf
cpredis.conf /usr.local/cluster
viredis.conf
##修改配置檔案中的下面選項
port7000
daemonizeyes
cluster-enabledyes
cluster-config-filenodes.conf
cluster-node-timeout5000
appendonlyyes
dir//usr/local/cluster/ 設定快照dump.rdb在叢集中
其他配置項
TCP listen()10000
TCP監聽的最大容納數量,在高併發的環境下,你需要把這個值調高以避免客戶端連線緩慢的問題。Linux 核心會把這個值縮小成/proc/sys/net/core/somaxconn對應的值,要提升併發量需要修改這兩個值才能達到目的
bind 127.0.0.1 bind 192.168.1.100 |
繫結redis伺服器網絡卡IP,預設為127.0.0.1,即本地迴環地址。這樣的話,訪問redis服務只能通過本機的客戶端連線,而無法通過遠端連線。如果bind選項為空的話,那會接受所有來自於可用網路介面的連線。如上配置,繫結一個127.0.0.1的本機地址和192.168.1.100的外網地址。
protected-mode yes
保護模式,預設是開啟狀態,只允許本地客戶端連線, 可以設定密碼或新增bind來連線
tcp-keepalive 300
單位是秒,表示將週期性的使用SO_KEEPALIVE檢測客戶端是否還處於健康狀態,避免伺服器一直阻塞,官方給出的建議值是300s,如果設定為0,則不會週期性的檢測
maxclients 10000
設定客戶端最大併發連線數,預設無限制,Redis可以同時開啟的客戶端連線數為Redis程序可以開啟的最大檔案
描述符數-32(redis server自身會使用一些),如果設定 maxclients為0
表示不作限制。當客戶端連線數到達限制時,Redis會關閉新的連線並向客戶端返回max number of clientsreached錯誤資訊
首先按ESC鍵回到命令模式,輸入: 進入末行,然後輸入:w儲存即可,也可以輸入:wq!儲存檔案並退出。
##修改完redis.conf配置檔案中的這些配置項之後把這個配置檔案分別拷貝到7000/7001/7002/7003/7004/7005目錄下面
cp/caches/cluster/redis.conf /caches/cluster/7000
cp/caches/cluster/redis.conf /caches/cluster/7001
cp/caches/cluster/redis.conf /caches/cluster/7002
cp/caches/cluster/redis.conf /caches/cluster/7003
cp/caches/cluster/redis.conf /caches/cluster/7004
cp/caches/cluster/redis.conf /caches/cluster/7005
##注意:拷貝完成之後要修改7001/7002/7003/7004/7005目錄下面redis.conf檔案中的port引數,分別改為對應的資料夾的名稱
[[email protected] 7003]# cd ../7004
[[email protected] 7004]#
[[email protected] 7004]# vi redis.conf
找到對應的 port 7004 按i 進入到插入狀態
修改後按ESC退出到命令模式
按 : 跳到文件末行 輸入 wq! (儲存並退出 到系統路徑裡)
5:分別啟動這6個redis例項
cd/usr/local/cluster/7000 redis-server redis.conf
cd/usr/local/cluster/7001 redis-server redis.conf
cd/usr/local/cluster/7002 redis-server redis.conf
cd/usr/local/cluster/7003 redis-server redis.conf
cd/usr/local/cluster/7004 redis-server redis.conf
cd/usr/local/cluster/7005 redis-server redis.conf
##啟動之後使用命令檢視redis的啟動情況
ps-ef|grep redis
如下顯示則說明啟動成功
6.升級ruby 安裝gem
檢查ruby 版本:
#ruby -v
ruby 1.8.7(2013-06-27 patchlevel 374) [x86_64-linux]
是否安裝rubygems:
# rpm -qa|grep ruby
ruby-rdoc-1.8.7.374-2.el5
ruby-1.8.7.374-2.el5
ruby-devel-1.8.7.374-2.el5
ruby-devel-1.8.7.374-2.el5
ruby-mode-1.8.5-24.el5
ruby-irb-1.8.7.374-2.el5
ruby-libs-1.8.7.374-2.el5
ruby-libs-1.8.7.374-2.el5
rubygems-1.3.7-1.el5
如果沒有
安裝gem 需要ruby的版本在1.8.7 以上,預設的centos5 上都是1.8.5 版本,所以首先你的升級你的ruby ,rpm -ivh
yum install ruby ruby-devel rubygems rpm-build
7.gem 安裝redis ruby 介面
gem install redis
此時巨坑,會報巨多的錯誤
比如
再比如:
再次執行第步的命令,還會報錯,提示不能載入redis,是因為缺少redis的介面錯誤內容:
/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in`gem_original_require': no such file to load -- redis (LoadError)
from/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
from ./redis-trib.rb:25
gem install redis
這裡可能無法安裝,因為無法連線gem伺服器:
[@zw_22_90 src]# gem install redis --version3.0.0
ERROR: Could not find a valid gem 'redis' (=3.0.0) in any repository
ERROR: While executing gem ...(Gem::RemoteFetcher::FetchError)
需要手工下載並安裝:
wgethttps://rubygems.global.ssl.fastly.net/gems/redis-3.2.1.gem
gem install -l ./redis-3.2.1.gem
因為種種原因,此時gem檔案仍舊無法下載,至於原因就不深究了
解決方案:
1. 網址請求頭:https更換為http
2. 在windows本地下載redis-3.2.1.gem 上傳到主機環境中再安裝
gem install -1 ./redis-3.2.1.gem
8:執行redis的建立叢集命令建立叢集
#redis-trib.rb的create子命令構建 #--replicas 則指定了為Redis Cluster中的每個Master節點配備幾個Slave節點#節點角色由順序決定,先master之後是slave
建立方式:
cd/usr/local/redis3.0/src ./redis-trib.rb create --replicas 1 127.0.0.1:7000127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
錯誤筆記備註
8.1執行上面的命令的時候會報錯,因為是執行的ruby的指令碼,需要ruby的環境
錯誤內容:/usr/bin/env:ruby: No such file or directory 所以需要安裝ruby的環境,這裡推薦使用yum install ruby安裝
yum installruby
8.2然後再執行第6步的建立叢集命令,還會報錯,提示缺少rubygems元件,使用yum安裝 錯誤內容: ./redis-trib.rb:24:in `require':no such file to load -- rubygems (LoadError) from ./redis-trib.rb:24
yum installrubygems
8.3再次執行第8步的命令,還會報錯,提示不能載入redis,是因為缺少redis和ruby的介面,使用gem 安裝錯誤內容:
/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in
`gem_original_require':no such file to load -- redis (LoadError) from/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require' from./redis-trib.rb:25
gem install redis
8.4 再次執行第8步的命令,正常執行 輸入yes,然後配置完成。
注意觀察 主從的配置: 預設是前三個節點 7000 7001 7002 是主, 後3個節點 7003 7004 7005 是從 如果是部署在不同的伺服器,請根據主從分部規則,分開在不同的伺服器
至此,叢集搭建成功
9: 使用redis-cli命令進入叢集環境
redis-cli -c -p 7000
結果: 127.0.0.1:7000> ping
PONG
三:測試篇
1.檢查叢集的狀態
#redis-trib.rb的check子命令構建 #ip:port可以是叢集的任意節點
./redis-trib.rb check 1 127.0.0.1:7000 最後輸出如下資訊,沒有任何警告或錯誤,表示叢集啟動成功並處於ok狀態