在centos上搭建redis集群并附测试(真集群非伪集群)
環境:centos6.5 x86 32位 redis3.2.8 ruby-2.2.3
一. redis集群原理
redis是單線程,但是一般的作為緩存使用的話,redis足夠了,因為它的讀寫速度太快了。
官方的一個簡單測試:
測試完成了50個并發執行100000個請求。
設置和獲取的值是一個256字節字符串。
結果:讀的速度是110000次/s,寫的速度是81000次/s
在這么快的讀寫速度下,對于一般程序來說足夠用了,但是對于訪問量特別大的網站來說,還是稍有不足。
那么,如何提升redis的性能呢?看標題就知道了,搭建集群。
先來一張redis集群的架構圖:
然后就可以訪問集群中的任何一個節點。對其進行存取和其他操作。
那么redis是怎么做到的呢?首先,在redis的每一個節點上,都有這么兩個東西,一個是插槽(slot)可以理解為是一個可以存儲兩個數值的一個變量。
這個變量的取值范圍是:0-16383。還有一個就是cluster我個人把這個cluster理解為是一個集群管理的插件。當我們的存取的key到達的時候,
redis會根據crc16的算法得出一個結果,然后把結果對 16384 求余數,這樣每個 key 都會對應一個編號在 0-16383 之間的哈希槽,
通過這個值,去找到對應的插槽所對應的節點,然后直接自動跳轉到這個對應的節點上進行存取操作。
還有就是因為如果集群的話,是有好多個redis一起工作的,那么,就需要這個集群不是那么容易掛掉,所以呢,理論上就應該給集群中的每個節點至少一個備用的redis服務。
這個備用的redis稱為從節點(slave)。那么這個集群是如何判斷是否有某個節點掛掉了呢?
首先要說的是,每一個節點都存有這個集群所有主節點以及從節點的信息。
它們之間通過互相的ping-pong判斷是否節點可以連接上。如果有一半以上的節點去ping一個節點的時候沒有回應,集群就認為這個節點宕機了,
然后去連接它的備用節點。如果某個節點和所有從節點全部掛掉,我們集群就進入faill狀態。還有就是如果有一半以上的主節點宕機,那么我們集群同樣進入發力了狀態。
這就是我們的redis的投票機制,具體原理如下圖所示:
(1)投票過程是集群中所有master參與,如果半數以上master節點與master節點通信超時(cluster-node-timeout),認為當前master節點掛掉.
(2):什么時候整個集群不可用(cluster_state:fail)?
a:如果集群任意master掛掉,且當前master沒有slave.集群進入fail狀態,也可以理解成集群的slot映射[0-16383]不完整時進入fail狀態.
ps : redis-3.0.0.rc1加入cluster-require-full-coverage參數,默認關閉,打開集群兼容部分失敗.
b:如果集群超過半數以上master掛掉,無論是否有slave,集群進入fail狀態.
二 . 集群安裝配置
2.1 安裝配置redis
此步省略,請參考我到博文【http://blog.csdn.net/wx5040257/article/details/78347729】【http://blog.csdn.net/wx5040257/article/details/78388588】我準備的服務器ip及各服務器角色如下圖所示:
各節點間互聯互通,master和slave由創建集群時確定。
2.2 安裝cluster依賴環境
只需在任意一臺主機上(如169.254.130.122)安裝即可。
建議進行源碼安裝。
2.2.1 安裝ruby
解壓縮源碼包,并移動到/usr/local/src目錄下tar -zxf
mv ruby-2.2.3 /usr/local/src/ruby
進入源碼目錄進行安裝cd /usr/local/src/ruby
./configure
make && make install
安裝完畢后如圖所示:
提示系統缺失zlib,可能后續還要安裝zlib包,請繼續往下看。可用ruby -v命令查看安裝成功的ruby版本。
2.2.2 安裝ruby redis接口
gem install redis
報錯,如圖所示:
解決方案,安裝zlib-dev,yum命令安裝即可
yum -y install zlib-devel
然后進入ruby源碼文件夾
安裝ruby自身提供的zlib包
#cd ext/zlib
#ruby ./extconf.rb
#make
#make install
接下來再執行
gem install redis
又報錯,如下所示:
[root@localhost zlib]# gem install redisERROR: While executing gem ... (Gem::Exception)Unable to require openssl, install OpenSSL and rebuild ruby (preferred) or use non-HTTPS sources原因:
缺少openssl,需要安裝openssl包,我現在這里來安裝一個openssl-1.0.1s.tar.gz(下載鏈接:http://www.openssl.org/source/)
解決方法步驟:
1.解壓在/usr/local/src目錄下,進入/usr/local/src/openssl目錄準備安裝:
openssl的配置文件必須要配置-fPIC參數,如果沒有該參數下面的安裝中會出現問題!
安裝完成,可以檢測一下是否安裝成功:
2.進入ruby源碼[/usr/local/src/ruby]目錄下的ext/openssl 目錄:
[root@localhost openssl]# cd ../ruby-2.3.0 [root@localhost ruby]# cd ext/openssl [root@localhost openssl]# ruby extconf.rb checking for t_open() in -lnsl... no checking for socket() in -lsocket... no checking for assert.h... yes checking for openssl/ssl.h... no提示沒有找到ssl.h, 因為出現了錯誤:openssl/ssl.h … no ,輸入如下代碼,重新執行:
# ruby extconf.rb --with-openssl-include=/usr/local/openssl/include/ --with-openssl-lib=/usr/local/openssl/lib
ok,成功
3.接下來并且將ruby 源碼目錄下的include目錄軟鏈接到 / 目錄下:
ln -s /usr/local/src/ruby/include /
注意:創建軟鏈的時候一定要寫全路徑,不能寫相對路徑
再次使用gem install 安裝 ruby redis 接口:
gem install redis
仍然報錯:
[root@localhost openssl]# gem install redisERROR: Could not find a valid gem 'redis' (>= 0), here is why:Unable to download data from https://rubygems.org/ - SSL_connect returned=1 errno=0 state=error: certificate verify failed (https://api.rubygems.org/specs.4.8.gz)意思上無法自動下載rubygems安裝,那好吧,我們自己下載安裝,例如我下載的是:redis-3.2.1.gem
[root@localhost soft]# gem install redis-3.2.1.gem Successfully installed redis-3.2.1Parsing documentation for redis-3.2.1Installing ri documentation for redis-3.2.1Done installing documentation for redis after 1 secondsWARNING: Unable to pull data from 'https://rubygems.org/': SSL_connect returned=1 errno=0 state=error: certificate verify failed (https://api.rubygems.org/specs.4.8.gz)1 gem installed
ok,安裝成功了!
2.3 接下來進行集群的創建
vi /usr/redis/redis.conf
cluster-enabled yes ==>表示開啟集群功能
cluster-config-file nodes-6379.conf ====>表示自動生成的集群配置文件
cluster-node-timeout 15000====> 表示集群節點連接超時時間
創建集群環境的命令格式為redis-trib.rb create --replicas masterNode1,masterNode2,masterNodeN,slaveNode1,slaveNode2,slaveNodeN
Node的格式為"IP:port",slaveCount表示每個masterNode對應的slaveNode個數,在集群環境中可以沒有slave(在命令中省略掉slaveNode部分即可)。
但如果有slave,則命令中,前n中個節點都為master,后n個節點都為slave,第n個master節點對應的slave應該是第n個。
注意:創建集群前,每個節點到數據都要清空,用flushall命令
127.0.0.1:6379 > flushall執行命令創建集群:
redis-trib.rb create --replicas 1 169.254.130.122:6379 169.254.130.10:6379 169.254.130.20:6379 169.254.130.12:6379 169.254.130.11:6379 169.254.130.25:6379注意:這條命令沒有跨行
出現如下提示信息:
從上面可看出,六個節點都處于"OK"狀態,并且前三個6379端口的都為master,而都三個6379端口的都為slave。
此時出現提示,鍵入yes后,各節點將會進行互聯操作
輸入yes,接下來報錯了:
錯誤提示是
slot插槽被占用了(這是 搭建集群前時,以前redis的舊數據和配置信息沒有清理干凈。)
解決方案是
用redis-cli 登錄到每個節點執行 flushall 和 cluster reset 就可以了。
然后重新執行創建集群的命令:
redis-trib.rb create --replicas 1 169.254.130.122:6379 169.254.130.10:6379 …(省略)
接下來又卡住了,如下:
Can I set the above configuration? (type 'yes' to accept): yesNodes configuration updatedAssign a different config epoch to each nodeSending CLUSTER MEET messages to join the clusterWaiting for the cluster to join...................................................................................................................................................................................................................................................................原因:
redis集群不僅需要開通redis客戶端連接的端口,而且需要開通集群總線端口
集群總線端口為redis客戶端連接的端口 + 10000
如redis端口為6379
則集群總線端口為16379
故,所有服務器的點需要開通redis的客戶端連接端口和集群總線端口
注意:iptables 放開,如果有安全組,也要放開這兩個端口
受不了啦,把所有節點的防火墻全部關閉算了。重新執行創建集群的命令,這回成功了:
從上面可看出16384個哈希槽已均勻分配給了三個master節點,分別為:
169.254.130.20:6379(10923-16384)
169.254.130.10:6379(5461-10922)
169.254.130.122:6379(0-5460)
大功告成!!!
2.5 進行測試
登錄122主機,用redis-cli -c命令
-c命令在連接集群結點時使用,此選項可防止moved和ask異常。
[root@localhost redis]# redis-cli -c127.0.0.1:6379> set key1 "hello redis cluster"-> Redirected to slot [9189] located at 169.254.130.10:6379OK169.254.130.10:6379> set key2 java-> Redirected to slot [4998] located at 169.254.130.122:6379OK169.254.130.122:6379> 169.254.130.122:6379> keys *1) "key2"169.254.130.122:6379> get key2"java"169.254.130.122:6379> get key1-> Redirected to slot [9189] located at 169.254.130.10:6379"hello redis cluster"169.254.130.10:6379> get key20-> Redirected to slot [905] located at 169.254.130.122:6379"html"169.254.130.122:6379>從中可以發現存時是分布式存儲,取時也是從集群中取,測試成功
總結
以上是生活随笔為你收集整理的在centos上搭建redis集群并附测试(真集群非伪集群)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: redis的安全性及客户端工具的使用
- 下一篇: Django基础一之web框架的本质