使用三臺雲伺服器搭建真正的Redis叢集

橙發發表於2020-06-16

三臺雲伺服器搭建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的資料分佈在這些節點中。叢集中的節點分為主節點和從節點:只有主節點負責讀寫請求和叢集資訊的維護;從節點只進行主節點資料和狀態資訊的複製。
叢集的作用,可以歸納為兩點:

  1. 資料分割槽:資料分割槽(或稱資料分片)是叢集最核心的功能。
    叢集將資料分散到多個節點,一方面突破了Redis單機記憶體大小的限制,儲存容量大大增加;另一方面每個主節點都可以對外提供讀服務和寫服務,大大提高了叢集的響應能力。
    Redis單機記憶體大小受限問題,在介紹持久化和主從複製時都有提及;例如,如果單機記憶體太大,bgsave和bgrewriteaof的fork操作可能導致主程式阻塞,主從環境下主機切換時可能導致從節點長時間無法提供服務,全量複製階段主節點的複製緩衝區可能溢位……。

  2. 高可用:叢集支援主從複製和主節點的自動故障轉移(與哨兵類似);當任一節點發生故障時,叢集仍然可以對外提供服務。


值得一提的是這幾天的面試遇到一個很有意思的問題(本人親身經歷):

面試官:讓你設計一個搶票或者秒殺或者紅包系統你該如何實現?

我:首先應該加鎖,然後加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檔案

redis舊版本下載地址

一般都是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舊版本下載地址

具體安裝見方式二

之後再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

至此伺服器應該是啟動成功了。

相關文章