1. 程式人生 > >Redis分散式叢集部署安裝及細節(一臺主機搭建多個服務--偽叢集)

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狀態