1. 程式人生 > >使用三臺雲伺服器搭建真正的Redis叢集

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

#三臺雲伺服器搭建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操作可能導致主程序阻塞,主從環境下主機切換時可能導致從節點長時間無法提供服務,全量複製階段主節點的複製緩衝區可能溢位……。 1. 高可用:叢集支援主從複製和主節點的自動故障轉移(與哨兵類似);當任一節點發生故障時,叢集仍然可以對外提供服務。 ---------- 值得一提的是這幾天的面試遇到一個很有意思的問題(本人親身經歷): > 面試官:讓你設計一個搶票或者秒殺或者紅包系統你該如何實現? > > 我:首先應該加鎖,然後加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舊版本下載地址](http://download.redis.io/releases/ "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,應該是這樣的 ![](https://img2020.cnblogs.com/blog/1604619/202006/1604619-20200616132935056-24886416.png "redis-01") 現在需要修改每一個配置檔案: 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舊版本下載地址](http://download.redis.io/releases/ "redis舊版本") 具體安裝見方式二 之後再redis/src下找到 redis-trib.rb 這個檔案 把他複製到/usr/local/redis裡面 ### **接下來重中之重的是需要清空/var/lib/redis裡面的所有rdb和conf檔案!** 之後就可以啟動三個伺服器上的redis了 啟動完成可以用 ps -ef|grep redis 檢視例項啟動詳情 一般啟動成功是這個樣子 ![](https://img2020.cnblogs.com/blog/1604619/202006/1604619-20200616140456934-1519395697.png) 之後回到安裝了ruby的伺服器: cd /usr/local/redis 執行下面命令 ./redis-trib.rb create --replicas 1 第一臺伺服器公網IP地址:6379 第一臺伺服器公網IP地址:6380 第二臺伺服器公網IP地址:6379 第二臺伺服器公網IP地址:6380 第三臺伺服器公網IP地址:6379 第三臺伺服器公網IP地址:6380 至此伺服器應該是啟動成功了。