三臺雲伺服器搭建redis叢集#
今天花了一天的時間弄叢集redis;遇到了很多坑,從頭開始吧
環境講解:
兩臺配置:1核2G,另一臺:1核1G;
作業系統:Centos 7.6
Redis:3.2.12
Ruby:2.3.4
由於是雲伺服器所以預設安裝了JDK1.8和yum以及gcc,如果不是雲伺服器的使用者請試試雲伺服器吧!還是很方便的
瞭解什麼是Redis叢集(可跳過):
答:叢集,即Redis Cluster,是Redis 3.0開始引入的分散式儲存方案。
叢集由多個節點(Node)組成,Redis的資料分佈在這些節點中。叢集中的節點分為主節點和從節點:只有主節點負責讀寫請求和叢集資訊的維護;從節點只進行主節點資料和狀態資訊的複製。
叢集的作用,可以歸納為兩點:
-
資料分割槽:資料分割槽(或稱資料分片)是叢集最核心的功能。
叢集將資料分散到多個節點,一方面突破了Redis單機記憶體大小的限制,儲存容量大大增加;另一方面每個主節點都可以對外提供讀服務和寫服務,大大提高了叢集的響應能力。
Redis單機記憶體大小受限問題,在介紹持久化和主從複製時都有提及;例如,如果單機記憶體太大,bgsave和bgrewriteaof的fork操作可能導致主程式阻塞,主從環境下主機切換時可能導致從節點長時間無法提供服務,全量複製階段主節點的複製緩衝區可能溢位……。 -
高可用:叢集支援主從複製和主節點的自動故障轉移(與哨兵類似);當任一節點發生故障時,叢集仍然可以對外提供服務。
值得一提的是這幾天的面試遇到一個很有意思的問題(本人親身經歷):
面試官:讓你設計一個搶票或者秒殺或者紅包系統你該如何實現?
我:首先應該加鎖,然後加redis的快取和預熱。。。
面試官:沒了?
我:我只知道這麼多。
面試官:那如果是在多個叢集下呢?
我:分散式鎖!
面試官欣慰的點頭說:那你知道分散式鎖的實現方式嗎?
我:zookeeper和redis的redisson。
面試官:redis的分散式叢集玩過嗎?
我:沒有。。。
面試官:有空去玩玩吧,既然你沒玩過那我也不必要和你囉嗦了。
到此我的奇怪的經歷又上漲了!於是今天買了兩個測試伺服器來玩玩redis的叢集;
這是我的使用場景,但是現實中和麵試的例子差不多,都是有需求才去接觸,(可能我比較懶~haha)
當然今天並不是說面試,我們言歸正傳;
搭建,啟動redis叢集#
1、安裝Redis(三臺伺服器都需要安裝)
方式一:
一臺全新的伺服器首先需要配置密碼和SSH登入此處我跳過;
接著可以更新yum(伺服器的yum都是安裝好的)
yum update
在雲伺服器中的安裝則是很簡單的;
yum install redis
安裝需要提示輸入y直接輸入!
接著安裝完成後檢視安裝情況:
redis-server -v
或者
redis-server --version
都可以檢視當前安裝的redis版本
方式二:
直接從官網下載gz檔案
一般都是3.2.12版本。所以此處以3.2.12版本為例;
下載好後上傳到雲伺服器,並且解壓後,make Install 安裝
redis安裝好後,有五個檔案在linux檔案系統的/usr/bin中
- redis-benchmark
- redis-check-aof
- redis-check-rdb
- redis-cli
- redis-sentinel
- redis-server
還有一個配置檔案在/etc中:
- redis.conf
現在我們在/usr/local下建立一個檔名叫redis
cd /usr/local
mkdir redis
接著建立兩個資料夾:
cd redis
mkdir redis-01
mkdir redis-02
接著將上述的檔案分別複製到這兩個01和02檔案內,
這是為了方便我們更好的在本機呼叫:
2、安裝Ruby(只需要一臺安裝即可)
很多小夥伴會有疑問說為什麼需要ruby呢?
因為在redis/src中有一個檔案叫做redis-trib.rb,這個檔案就是作者用Ruby寫的,用來搭建redis叢集(redis3.0版本時才開始支援叢集),redis-trib.rb的字尾就是Ruby的簡寫,所以想要搭建redis叢集需要有一個能執行.rb這種檔案的執行環境,這個環境就是Ruby。
接著又會有小夥伴說:這個安裝簡單!直接 yum install ruby!
你要是這麼想的話,會浪費你將近5-10分鐘的時間(取決你的網速)因為你需要安裝後升級它!
升級的教程我直接用別人的了:[Ruby升級教程](https://www.cnblogs.com/qize/p/11394841.html](https://www.cnblogs.com/qize/p/11394841.html "Ruby升級教程") 在此也感謝這個博主所寫的經驗教程
一般雲伺服器如果安裝的redis是3.2.12,那麼你的ruby使用yum安裝的話一定是2.0版本的!
這個和我們使用的ruby操作redis叢集不適應!
所以人生苦短:
wget https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.5.tar.gz
接著解壓下載好的ruby:
tar -xzvf ruby2.4.5
接著cd ruby2.4.5
執行下面的命令
./configure –-prefix=/usr/local/ruby -prefix
是將ruby安裝到指定目錄,也可以自定義
make && make install
檢查Ruby安裝情況:
ruby -v
不出意外應該是可以顯示版本的,之後安裝這個gem的依賴
yum install rubygems
接著我們需要繼續安裝Redis操作工具
gem install redis
3、檢查配置檔案(三臺伺服器都需要)
上述說到我們有兩個檔案:redis-01和redis-02,應該是這樣的
現在需要修改每一個配置檔案:
daemonize yes
port 6379(每臺機器的埠可以指定為兩個;比如6379和6380)
dbfilename dump-此處新增你的埠.rdb
pidfile /var/run/redis-此處新增你的埠.pid
requirepass 在此輸入你的密碼
masterauth 輸入和上述密碼一樣的
cluster-enabled yes 啟用叢集
cluster-config-file nodes-此處新增你的埠.conf
cluster-node-timeout 15000(預設你過期時間15s)
此處網上有很多提示說你的bind屬性為什麼不加呢?
很多小夥伴加了bind屬性反而不能執行redis,剛開始我也犯了這樣的錯誤,後來我發現,雲伺服器上的redis
其實不需要加bind屬性繫結埠也可以跑叢集。
現在我一共是三臺機器:每臺上面有兩個redis例項,都分別繫結了6379和6380埠
至此我們的配置檔案就結束了。
4、放行埠(三臺伺服器都需要)
根據不同雲伺服器供應商需要進入不同的控制檯管理介面;
但是每臺伺服器的安全組都需要開放對應的埠:
我的三臺伺服器我就需要為每臺伺服器開啟入口6379和6380埠;
但是千萬不要以為這就結束了!
redis叢集還需要一個匯流排埠,這個匯流排埠是你redis例項佔用埠+10000;
比如我一臺伺服器開了兩個redis例項:6379和6380,那麼他的匯流排埠救為16379和16380;
需要在安全組同時開放這兩個埠。
啟動叢集
回到我們剛剛安裝redis的那臺伺服器,現在我們來試試啟動redis叢集
要啟動redis;需要找到你的 redis-trib.rb 這個檔案
一般雲伺服器的安裝redis是沒有這個檔案的,但是如果你用解壓安裝的redis是有叢集的檔案
所以需要你自己從官網拷貝比如我的是3.2.12就需要從官網下載。
具體安裝見方式二
之後再redis/src下找到 redis-trib.rb 這個檔案
把他複製到/usr/local/redis裡面
接下來重中之重的是需要清空/var/lib/redis裡面的所有rdb和conf檔案!
之後就可以啟動三個伺服器上的redis了
啟動完成可以用 ps -ef|grep redis 檢視例項啟動詳情
一般啟動成功是這個樣子
之後回到安裝了ruby的伺服器:
cd /usr/local/redis
執行下面命令
./redis-trib.rb create --replicas 1 第一臺伺服器公網IP地址:6379 第一臺伺服器公網IP地址:6380 第二臺伺服器公網IP地址:6379 第二臺伺服器公網IP地址:6380 第三臺伺服器公網IP地址:6379 第三臺伺服器公網IP地址:6380
至此伺服器應該是啟動成功了。