Redis 是一個開源的 key-value 存儲系統,由於出眾的性能,大部分互聯網企業都用來做服務器端緩存。Redis 在3.0版本前只支持單實例模式,雖然支持主從模式、哨兵模式部署來解決單點故障,但是現在互聯網企業動輒大幾百G的數據,可完全是沒法滿足業務的需求,所以,Redis 在 3.0 版本以后就推出了集群模式。
Redis 集群采用了P2P的模式,完全去中心化。Redis 把所有的 Key 分成了 16384 個 slot,每個 Redis 實例負責其中一部分 slot 。集群中的所有信息(節點、端口、slot等),都通過節點之間定期的數據交換而更新。
Redis 客戶端可以在任意一個 Redis 實例發出請求,如果所需數據不在該實例中,通過重定向命令引導客戶端訪問所需的實例。
安裝環境
OS: centos 7.2.1511
redis : 最新版 v4.0.1
單台redis安裝
下載
wget http://download.redis.io/releases/redis-4.0.10.tar.gz tar zxvf redis-4.0.10.tar.gz mv redis-4.0.10 /usr/local/redis/
如果是離線安裝,則需要從官網下載指定版本,然后上傳到生產環境。這里安裝的是最新版redis,指定安裝路徑 /usr/local/redis/
編譯安裝
cd /usr/local/redis make make install
配置redis.conf
$ vim /usr/local/redis/redis.conf
- bind這里配置要注意,默認是只有一個127.0.0.1,這個時候只能自己連接,其他局域網內是連接不上的。所以,需要配置多個 IP ,這樣就可以局域網內進行連接了。我設置的0.0.0.0,雖然這不太安全,方便我在其它地方連接。
- daemonize是設置是否后台啟動 Redis,默認no,正常都需要以服務形式啟動 Redis,所以這里設置為yes。
- 可以設置密碼 requirepass mypassord
- redis v3.0+版本增加了保護機制,默認protected-mode yes, 這樣目標機器調用可能會報錯,需要設置為no
關於更多配置文件參數的解釋,可以參考:https://github.com/linli8/cnblogs/blob/master/redis%E5%89%AF%E6%9C%AC.conf
啟動redis
cd /usr/local/bin/
redis-server /usr/local/redis/redis.conf
測試redis服務
netstat -anp | grep 6379
命令行連接:
➜ redis redis-cli 127.0.0.1:6379> keys * 1) "city" 2) "usage" 3) "idc" 4) "region" 127.0.0.1:6379> set name jzhou OK 127.0.0.1:6379> get name "jzhou" 127.0.0.1:6379>
關閉服務
可以通過殺進程的方式暴力關閉服務,也可以通過命令:
redis-cli shutdown
以上是centos7單機部署redis的過程,下面集群搭建和上述類似,不過在目錄結構和配置文件不同,當然,遇到的坑也多,主要配置集群依賴一些外部包,但說實話光搭建個集群是沒有啥技術含量但。。
redis集群搭建
簡介
redis-cluster架構設計
架構細節:
(1)所有的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬.
(2)節點的fail是通過集群中超過半數的節點檢測失效時才生效.
(3)客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連接集群所有節點,連接集群中任何一個可用節點即可
(4)redis-cluster把所有的物理節點映射到[0-16383]slot上,cluster 負責維護node<->slot<->key
(5)Redis集群預分好16384個桶,當需要在 Redis 集群中放置一個 key-value 時,根據 CRC16(key) mod 16384的值,決定將一個key放到哪個桶中。
環境准備
Redis集群中要求奇數節點,所以至少要有三個節點,並且每個節點至少有一備份節點,所以至少需要6個redis服務實例。
這里演示的是我搭的生產環境redis集群,3台服務器,每台起3個服務,共9個節點,生產環境搭建的很順利,但測試環境一台服務器開6個端口遇到了很多問題,各種依賴包問題,后續會說明。
三台服務器
172.28.37.29 172.28.37.30 172.18.38.219 (每台服務器redis三個端口號 7000~7002)
按照上面搭建單台redis服務的方式在三台服務器分別安裝redis,從配置文件開始會有所不同。下面會說明搭建過程。
依賴包安裝
注意,下述均安裝最新版本,否則會和redis版本不匹配
gcc 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC)
gcc-c++
lib
zlib
ruby 2.4.4(>2.0.0)
rubugems 2.6.14.1
擼起袖子集群搭建
1. 准備目錄結構
三台機器一樣,建立如下目錄結構:
$ mkdir -p /usr/local/redis/redis-cluster/{7000,7001,7002}
分別進入每個端口目錄創建配置文件:
cd /usr/local/redis/redis-cluster/7000 && touch redis.conf
2.redis.conf內容及解釋:
port 7000 # 端口7000,7001,7002,與目錄對應 bind 172.28.37.29 #默認ip為127.0.0.1,需要改為其他節點機器可訪問的ip,否則創建集群時無法訪問對應的端口,無法創建集群 daemonize yes #redis后台運行 cluster-enabled yes #開啟集群 cluster-config-file nodes_7000.conf #集群的配置,配置文件首次啟動自動生成 7000,7001,7002 cluster-node-timeout 8000 #請求超時,默認15秒,可自行設置 appendonly yes #開啟aof持久化模式,每次寫操作請求都追加到appendonly.aof文件中 appendfsync always #每次有寫操作的時候都同步 logfile "/data/redis/logs/redis.log" #redis服務日志 pidfile /var/run/redis_7000.pid #pidfile文件對應7000,7001,7002
注意,上述有些配置項要對應服務和目錄,三個目錄按照上述配置好后,啟動服務
3.啟動/關閉集群服務
可以在每個服務器上寫一個啟動腳本start-redis.sh:
for((i=0;i<3;i++)); do /usr/local/bin/redis-server /usr/local/redis/redis-cluster/700$i/redis.conf; done
關閉服務類似:
for((i=0;i<=2;i++)); do /usr/local/bin/redis-cli -c -h $IP -p 700$i shutdown; done
$IP分別為三台服務器IP。
這時只是啟動了9個單獨的redis服務,它們還不是一個集群,下面就說明創建集群
4.創建集群
注意:在任意一台上運行 不要在每台機器上都運行,一台就夠了
Redis 官方提供了 redis-trib.rb
這個工具,就在解壓目錄的 src 目錄中
在其中一台執行:
$ cd /root/redis-4.0.10/src $ ./redis-trib.rb create --replicas 1 172.28.37.29:7000 172.28.37.29:7001 172.28.37.29:7002 172.28.37.30:7000 172.28.37.30:7001 172.28.37.30:7002 172.18.38.219:7000 172.18.38.219:7001 172.18.38.219:7002
敲完這個命令后會提示是否按照默認的推薦方式配置集群主從,一般選yes就行了


>>> Creating cluster >>> Performing hash slots allocation on 9 nodes... Using 4 masters: 172.28.37.29:7000 172.28.37.30:7000 172.18.38.219:7000 172.28.37.29:7001 Adding replica 172.18.38.219:7001 to 172.28.37.29:7000 Adding replica 172.28.37.29:7002 to 172.28.37.30:7000 Adding replica 172.28.37.30:7002 to 172.18.38.219:7000 Adding replica 172.18.38.219:7002 to 172.28.37.29:7001 Adding replica 172.28.37.30:7001 to 172.28.37.29:7000
下面這個顯示了集群和slot分配結果
5.集群驗證
[root@172-28-37-29 src]# redis-cli -c -p 7000 -h 172.28.37.29 172.28.37.29:7000> set name zhoujie -> Redirected to slot [5798] located at 172.28.37.30:7000 OK 172.28.37.30:7000> get name "zhoujie" 172.28.37.30:7000>
可以看到在29的7000上設置了name,重定向到了30的7000節點。
到此為止集群搭建成功!
友情提示:
當出現集群無法啟動時,刪除集群配置文件,再次重新啟動每一個redis服務,然后重新構件集群環境。
--------------------------------------------華麗的分割線----------------------------------------------------
redis-trib.rb命令常見用法
1)列出集群節點-cluster nodes
[root@172-28-37-30 src]# redis-cli -h 172.28.37.30 -c -p 7000 172.28.37.30:7000> cluster nodes 0d260c47f10ecbbfd9c3c1707da82a3dd7951313 172.18.38.219:7001@17001 slave f85a9a80aca5e4c4a1437c7b58abd5895ee66855 0 1531497002061 8 connected 6d3db545319a8d41f4ad0666885856257fc2ab5f 172.18.38.219:7002@17002 slave 0cdeba26690238582ad7705abac6de71d1817c9e 0 1531497002062 9 connected 3f6c1449e60fe0d868e0bdc655165419ed7cd193 172.18.38.219:7000@17000 master - 0 1531497003000 7 connected 8192-12287 4004ad507da2e7cbae465d7f01864d53972f595c 172.28.37.30:7002@17002 slave 3f6c1449e60fe0d868e0bdc655165419ed7cd193 0 1531497003062 7 connected f85a9a80aca5e4c4a1437c7b58abd5895ee66855 172.28.37.29:7000@17000 master - 0 1531497004064 1 connected 0-4095 7fc5072406e47cd58822f17f5e1ce3b15328352e 172.28.37.30:7000@17000 myself,master - 0 1531497002000 4 connected 4096-8191 fb4554a4fa2bd4af1c213b90ec32d3f7fb12e87b 172.28.37.30:7001@17001 slave f85a9a80aca5e4c4a1437c7b58abd5895ee66855 0 1531497005066 5 connected 967243e807a1c0c32ad56db47007c54a2d1d6e2e 172.28.37.29:7002@17002 slave 7fc5072406e47cd58822f17f5e1ce3b15328352e 0 1531497004064 4 connected 0cdeba26690238582ad7705abac6de71d1817c9e 172.28.37.29:7001@17001 master - 0 1531497004064 2 connected 12288-16383 172.28.37.30:7000>
2)查看集群信息- cluster info
172.28.37.30:7000> cluster info cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:9 cluster_size:4 cluster_current_epoch:9 cluster_my_epoch:4 cluster_stats_messages_ping_sent:2243335 cluster_stats_messages_pong_sent:2220197 cluster_stats_messages_meet_sent:4 cluster_stats_messages_sent:4463536 cluster_stats_messages_ping_received:2220192 cluster_stats_messages_pong_received:2243339 cluster_stats_messages_meet_received:5 cluster_stats_messages_received:4463536 172.28.37.30:7000>
3)檢查集群狀態-check
下面內容是測試環境搭建的,一台服務器6個節點
[root@192-168-151-110 redis]# /root/redis-4.0.10/src/redis-trib.rb check 192.168.151.110:7000 >>> Performing Cluster Check (using node 192.168.151.110:7000) M: 7bf58adaafbfee1643785ea7b5da723d6595bbaf 192.168.151.110:7000 slots:0-5460 (5461 slots) master 1 additional replica(s) S: 90072487e6227544c079b2d8214ef5fd050575b5 192.168.151.110:7004 slots: (0 slots) slave replicates f7374d1b48562c9e54523948915c99bb00a12ba7 M: c6cf17370fc94aabc88e862fa72229ebd9b94166 192.168.151.110:7002 slots:10923-16383 (5461 slots) master 1 additional replica(s) S: 59d25294cbfb63f2d4d75410e66ce58899c65469 192.168.151.110:7003 slots: (0 slots) slave replicates 7bf58adaafbfee1643785ea7b5da723d6595bbaf S: 6256051389337640691e4b44d7de2b7b8c8fa25f 192.168.151.110:7005 slots: (0 slots) slave replicates c6cf17370fc94aabc88e862fa72229ebd9b94166 M: f7374d1b48562c9e54523948915c99bb00a12ba7 192.168.151.110:7001 slots:5461-10922 (5462 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. [root@192-168-151-110 redis]#
4)其它常用命令
- create:創建一個集群環境host1:port1 ... hostN:portN(集群中的主從節點比例)
- call:可以執行redis命令
- add-node:將一個節點添加到集群里,第一個參數為新節點的ip:port,第二個參數為集群中任意一個已經存在的節點的ip:port
- del-node:移除一個節點
- reshard:重新分片
集群操作
//集群(cluster) CLUSTER INFO 打印集群的信息 CLUSTER NODES 列出集群當前已知的所有節點(node),以及這些節點的相關信息。 //節點(node) CLUSTER MEET <ip> <port> 將 ip 和 port 所指定的節點添加到集群當中,讓它成為集群的一份子。 CLUSTER FORGET <node_id> 從集群中移除 node_id 指定的節點。 CLUSTER REPLICATE <node_id> 將當前節點設置為 node_id 指定的節點的從節點。 CLUSTER SAVECONFIG 將節點的配置文件保存到硬盤里面。 //槽(slot) CLUSTER ADDSLOTS <slot> [slot ...] 將一個或多個槽(slot)指派(assign)給當前節點。 CLUSTER DELSLOTS <slot> [slot ...] 移除一個或多個槽對當前節點的指派。 CLUSTER FLUSHSLOTS 移除指派給當前節點的所有槽,讓當前節點變成一個沒有指派任何槽的節點。 CLUSTER SETSLOT <slot> NODE <node_id> 將槽 slot 指派給 node_id 指定的節點,如果槽已經指派給另一個節點,那么先讓另一個節點刪除該槽>,然后再進行指派。 CLUSTER SETSLOT <slot> MIGRATING <node_id> 將本節點的槽 slot 遷移到 node_id 指定的節點中。 CLUSTER SETSLOT <slot> IMPORTING <node_id> 從 node_id 指定的節點中導入槽 slot 到本節點。 CLUSTER SETSLOT <slot> STABLE 取消對槽 slot 的導入(import)或者遷移(migrate)。 //鍵 (key) CLUSTER KEYSLOT <key> 計算鍵 key 應該被放置在哪個槽上。 CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的鍵值對數量。 CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 個 slot 槽中的鍵。
向集群中添加節點或刪除節點
我們新建兩個服務,按照之前搭建的集群方式新增倆個節點:(一主一從 master、slave)。
Mater:7007 slave:7008
創建7007/7008文件夾。拷貝redis.conf文件到對於的7007,7008目錄下 ,再進行修改配置文件。
啟動7007和7008倆個服務並查看服務狀態。
1. 集群中添加一個主節點
步驟一:使用add-node命令:綠色為新增節點,紅色為已知存在節點
[root@wlan124 local]# /usr/local/redis/src/redis-trib.rb add-node 192.168.151.110:7007 192.168.151.110:7001
注意:當添加節點成功以后,新增的節點不會有任何數據,因為他沒有分配任何slot。需要為新節點手動分配slot。
步驟二:reshard命令,分配slot:
[root@wlan124 local]# /usr/local/redis-3.0.0/src/redis-trib.rb reshard 192.168.151.110:7007
(提示一)
How many slots do you want to move (from 1 to 16384)? 2000
(提示二)
What is the receiving node ID? 382634a4025778c040b7213453fd42a709f79e28
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #1:all
(提示三)
Do you want to proceed with the proposed reshard plan (yes/no)? yes
- 提示一:是希望你需要多少個槽移動到新的節點上,可以自己設置,比如200個槽。
- 提示二:是你需要把這200個slot槽移動到那個節點上去(需要指定節點id),並且下個提示是輸入all為從所有主節點(7001 7002 7003)中分別抽取相應的槽數(一共為200個槽到指定的新節點中!,並且會打印執行分片的計划。)
- 提示三:輸入yes確認開始執行分片任務
2. 集群中添加一個從節點
步驟一:使用add-node命令:綠色為新增節點,紅色為已知存在節點
[root@wlan124 local]# /usr/local/redis/src/redis-trib.rb add-node 192.168.151.110:7008 192.168.151.110:7001
步驟二:首先需要登錄到7008節點的客戶端,然后使用集群命令,執行replicate命令來指定當前節點的主節點id為哪一個。把當前的7008(slave)節點指定到一個主節點下(這里使用之前創建的7007主節點,綠色表示節點id)。
[root@wlan124 ~]# /usr/local/redis/bin/redis-cli -c -h 192.168.151.110 -p 7008
192.168.1.124:7008> cluster replicate 4d4cb840519eef342a5730168b6c7e14dd811542
(7007的id)
OK
3.集群中刪除一個主節點
如果主節點有從節點,將從節點轉移到其他主節點。如果主節點有slot,先將主節點里的slot分配到其他可用節點中,然后再刪除節點才行,否則會有數據的丟失。
步驟一:刪除7007(master)節點之前,我們需要先把其全部的數據(slot槽)移動到其他節點上去(目前只能把master的數據遷移到一個節點上,暫時做不了平均分配功能)。
[root@wlan124 ~]# /usr/local/redis/src/redis-trib.rb reshard 192.168.151.110:7007
How many slots do you want to move (from 1 to 16384)? 1999
(注釋:這里不會是正好200個槽)
What is the receiving node ID? 614d0def75663f2620b6402a017014b57c912dad
(注釋:這里是需要把數據移動到哪?7001的主節點id)
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #1:4d4cb840519eef342a5730168b6c7e14dd811542
(注釋:這里是需要數據源,也就是我們的7007節點id)
Source node #2:done
(注釋:這里直接輸入done 開始生成遷移計划)
Do you want to proceed with the proposed reshard plan (yes/no)? yes
(注釋:這里輸入yes開始遷移)
步驟二:最后我們直接使用del-node命令刪除7007主節點即可(藍色表示7007的節點id)。
[root@wlan124 ~]# /usr/local/redis-3.0.0/src/redis-trib.rb del-node 192.168.151.110:7007 4d4cb840519eef342a5730168b6c7e14dd811542
4.集群中刪除一個從節點
步驟一:刪除從節點7008,輸入del-node命令,指定刪除節點ip和端口,以及節點id(藍色為7008節點id),移除了7008 slave節點,前節點的服務進程也會隨之銷毀。
[root@wlan124 ~]# /usr/local/redis-3.0.0/src/redis-trib.rb del-node 192.168.151.110:7008 a78c8a41f6430b51a7eca1fdb50092c463a8f1ac
nodejs連接redis集群示例
目前用得最多的 Node.js Redis 庫是 node redis,不過這個庫基本已經不再維護了,存在很多 bug(在生產環境中碰到過),也缺失了很多功能(如 pipeling 和腳本優化)。而 ioredis 不僅支持了 Cluster 和 Sentinel,還在 API 層面和 node redis 保持了兼容。
const Redis = require('ioredis'); let redis_members = [{ port: 7000, host: '172.28.37.29' }, { port: 7001, host: '172.28.37.29' }, { port: 7002, host: '172.28.37.29' }, { port: 7000, host: '172.28.37.30' }, { port: 7001, host: '172.28.37.30' }, { port: 7002, host: '172.28.37.30' }, { port: 7000, host: '172.18.38.219' }, { port: 7001, host: '172.18.38.219' }, { port: 7002, host: '172.18.38.219' }] var cluster = new Redis.Cluster(redis_members); cluster.set('foo', 'bar'); cluster.get('foo', function (err, res) { console.log('=====',res) //===== bar });
-------------------------------------------------華麗的分割線------------------------------------------------
你以為結束了?其實還沒有!
集群搭建過程的各種奇葩錯誤這里匯總,當然下面錯誤不是一定會遇到,但不保證一定不會不遇到。生產環境我搭的挺順利,但是測試環境幾乎所有能遇到的問題全都遇到了,最后都解決了,特此記錄!
1. 升級ruby版本-redis requires Ruby version >= 2.2.2
錯誤:
# ruby -v ruby 2.0.0p648 (2015-12-16) [x86_64-linux] # gem install redis Fetching: redis-4.0.1.gem (100%) ERROR: Error installing redis: redis requires Ruby version >= 2.2.2.
解決:
在線狀態直接通過yum安裝指定版本
離線狀態下就下載指定ruby版本包編譯安裝就可以了, http://www.ruby-lang.org/en/downloads/
# ruby -v ruby 2.4.4p296 (2018-03-28 revision 63013) [x86_64-linux]
2. 安裝rubygems,注意要和redis版本對應
報錯:
/home/cmfchina/ruby/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- redis (LoadError) from /home/cmfchina/ruby/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require' from ./redis-trib.rb:25:in `<main>'
解決:
這錯誤是提示不能加載redis,因為缺少redis和ruby的接口,使用gem 安裝,我們這個時候其實還需要安裝對應的Redis的Rbuy接口包。我們需要下載對應Redis的gem包安裝才行。Rubygems的官網其實提供了Redis的gem包,我們可以直接取下載https://rubygems.org/gems/redis/ ,這里下載的版本文件是redis-4.0.1.gem,然后執行命令:
# gem -v 2.6.14.1 # gem install redis-4.0.1.gem Successfully installed redis-4.0.1 Parsing documentation for redis-4.0.1 Installing ri documentation for redis-4.0.1 Done installing documentation for redis after 1 seconds WARNING: Unable to pull data from 'https://rubygems.org/': timed out (https://api.rubygems.org/specs.4.8.gz) 1 gem installed #
順利的話會出現上面的結果,但是如果運氣不好,會繼續報下面的錯誤
3. gem install報錯- 安裝zlib依賴


# gem install redis-4.0.1.gem ERROR: Loading command: install (LoadError) cannot load such file -- zlib ERROR: While executing gem ... (NoMethodError) undefined method `invoke_with_build_args' for nil:NilClass
這是因為需要依賴zlib工具。 yum install的zlib版本不符合要求,http://www.zlib.net 從官網下載最新版編譯安裝:
$tar -xvzf zlib-1.2.11.tar.gz $cd zlib-1.2.11.tar.gz $./configure --prefix=/usr/local/zlib #設置安裝路徑,不設置也行 $make $make instal
安裝完zlib之后,我們再需要執行以下命令:
$ cd /root/ruby-2.4.4/ext/zlib #ruby安裝包后解壓的目錄,就是前面提到的ruby離線安裝 $ ruby extconf.rb $ make && make install
運氣好的話安裝成功,但如果最近沒有燒香拜佛,你可能繼續遇到報錯,如下
# ruby extconf.rb checking for deflateReset() in -lz... no checking for deflateReset() in -llibz... no checking for deflateReset() in -lzlib1... no checking for deflateReset() in -lzlib... no checking for deflateReset() in -lzdll... no checking for deflateReset() in -lzlibwapi... no *** extconf.rb failed *** Could not create Makefile due to some reason, probably lack of necessary libraries and/or headers. Check the mkmf.log file for more details. You may need configuration options.
安裝好zlib重新輸入下列命令:
# cd /root/ruby-2.4.4/ext/zlib #ruby安裝包后解壓的目錄 # ruby extconf.rb --with-zlib-include=/usr/local/zlib/include/ --with-zlib-lib=/usr/local/zlib/lib //會生成一個Makefile文件,備注:/usr/local/zlib是zlib安裝目錄 # make && make install
注意:這時在/root/ruby-2.4.4/ext/zlib(ruby安裝包解壓的目錄)會生成一個Makefile文件
# cd /root/ruby-2.4.4/ext/zlib # ll 總用量 1384 -rw-r--r-- 1 1044 1044 533 7月 6 2016 depend -rw-r--r-- 1 1044 1044 2633 9月 24 2016 extconf.rb -rw-r--r-- 1 root root 8451 6月 28 14:55 Makefile -rw-r--r-- 1 root root 8377 6月 28 12:37 mkmf.log -rw-r--r-- 1 1044 1044 128605 2月 3 10:25 zlib.c -rw-r--r-- 1 root root 834032 6月 28 14:55 zlib.o -rwxr-xr-x 1 root root 414254 6月 28 14:55 zlib.so
4.安裝zlib報錯 - 修改上述Makefile文件引用路徑
[root@192-168-151-110 zlib]# make && make install make: *** No rule to make target `/include/ruby.h', needed by `zlib.o'. Stop
解決:
這個時候打開/root/ruby-2.4.4/ext/zlib/Makefile文件,找到下面一行把路徑進行修改一下。
zlib.o: $(top_srcdir)/include/ruby.h 改成:zlib.o: ../../include/ruby.h
修改完成,然后保存:接着我們再make && make install,這個時候安裝成功了~~所以就放心地接着干吧!(沒有看到我也無能為力了)安裝完成后如下顯示:
# make && make install compiling zlib.c linking shared-object zlib.so /usr/bin/install -c -m zlib.so /usr/local/lib/ruby/site_ruby/2.4.4....
解決上述問題后,回到開始 gem install redis-4.0.1.gem 的命令,則又會報下面錯,天了嚕~原來我們還需要安裝OpenSSL,因為Redis集群交互是需要OpenSSL
# gem install redis-4.0.1.gem ERROR: while executing gem ...(Gem:: Exception) unable to require openssl, install OpenSSL and rebuild ruby...
5.安裝openssl報錯 - 修改Makefile文件引用路徑
官網地址:https://www.openssl.org/source/ 上傳壓縮包到服務器,編譯安裝
$ tar -xzvf openssl-1.0.2l.tar.gz $ cd openssl-1.0.2l $ ./config -fPIC --prefix=/usr/local/openssl enable-shared $ ./config -t $ make && make install
安裝好后,到ruby安裝包解壓目錄,和執行zlib一樣的方式執行openssl
$ cd /root/ruby-2.4.4/ext/openssl $ ruby extconf.rb --with-openssl-include=/usr/local/openssl/include/ --with-openssl-lib=/usr/local/openssl/lib
//會生成一個Makefile文件,備注:/usr/local/openssl是我的openssl安裝目錄 $ make && make install
不出意外,make && make install的時候還會報錯,和zlib類似:
make: *** No rule to make target `/include/ruby.h', needed by `ossl.o'. Stop
還是按照剛剛zlib操作一樣,打開ext/openssl/Makefile文件,將所有的$(top_srcdir)全部改成../..
修改后保存,再執行make && make install,這一次安裝成功了
最后終於可以執行 gem install redis-4.0.1.gem了,成功的截圖見第一步。
接下來的操作就是如前所述,運用 redis-trib.rb命令搭建redis集群了。上面所有的錯誤處理都是為了能使用 redis-trib.rb這個命令。