1. 程式人生 > >Redis叢集架構搭建詳解

Redis叢集架構搭建詳解

一、簡介

這其實是一種分散式資料庫,就是通過分片的機制儲存資料,cluster中的每個節點僅僅儲存資料哭的一部分資料,本質上就是實現資料庫分片。

這種叢集是一種去中心化的叢集,也就是說,叢集中的每個節點都可以是接入節點。

這裡我簡單說一下這種去中心化的實現方式,比如有4個節點,要儲存1000個key,那麼就可能將這1000個key平均分配在這4個節點上,另外每個節點上除了儲存key還儲存了一個列表,這個列表詳細記錄了每個key具體在哪個節點上,這樣使用者訪問任意一個節點都會知道資料在哪,也就知道接下來去訪
問哪個節點了。

大多數去中心化的結構,都是這樣的原理,也就是每個節點上都有一個完整的元資料,但只有一部分資料。

為什麼要使用Redis叢集呢?比如現在需要在redis中存100G資料,我們知道redis工作的時候所有的資料都是儲存在記憶體中的,因此這100G資料都需要存在記憶體中,一個很明顯的問題就是儲存空間不足,而進行資料分片,也就是將資料存放在不同的節點上就能很好的解決這個問題。

比如有詩歌節點,這樣就可以將這100G的資料存放在這10個節點上,這樣一來每個節點只需要存放10G的資料,雖然解決了儲存問題,但是會帶來另外一個問題,也就是安全問題,因為儲存資料的節點越多,傳送故障的概率也就越高,只要一個節點出現故障那麼全部資料就丟失了,所以為了安全可以給每個節點做一個主從,這樣就解決了資料安全問題。這就是叢集的作用。

這裡簡單介紹一下redis叢集實現資料共享的方法
Redis叢集是通過資料分片的方式,一個redis叢集包含16384個雜湊槽,在這個redis叢集中每個鍵都會儲存在一個雜湊槽中,假如redis叢集中有三個節點,那麼這第三個節點的雜湊槽分佈如下

  • 節點A負責處理0號至5500號雜湊槽
  • 節點B負責處理5501至11000號雜湊槽
  • 節點C負責處理11001號至16384號雜湊槽

當需要在redis叢集中儲存資料的時候,會先進行一次計算,找出一個雜湊槽編號,然後將這個資料存過去。

二、實現redis叢集(基於redis4.0)

redis從3.0版本開始支援叢集。
叢集一般由多個節點組成,節點數量至少6個才能保證組成完整高可用叢集。
規劃:
我這裡使用三臺主機,每個主機上開啟兩個示例,兩個示例做成主從,這樣就有了六個節點。

節點名稱 例項1埠 例項2埠
節點1(171) 16379 16380
節點2(172) 26379 26380
節點3(173) 36379 36380

第一步:在三個節點上安裝Redis4.0

下載地址:https://redis.io/download

  1. 安裝依賴
# 在三個節點都執行
# yum install gcc gcc-c++ zlib zlib-devel -y
  1. 安裝redis4.0.11
# tar xvf redis-4.0.11.tar.gz
# cd redis-4.0.11
# make && make install
說明:安裝過程主要是在src目錄下生成二進位制程式
  1. 配置redis(演示配置171的例項1)
[[email protected] ~]# mkdir -pv /redis/{16379,16380}
[[email protected] ~]# cd /root/redis-4.0.11
[[email protected] redis-4.0.11]# cp redis.conf  /redis/16379/redis-16379.conf
# 修改配置檔案
[[email protected] redis-4.0.11]# vim /redis/16379/redis-16379.conf 
bind 10.220.5.171
port 16379
daemonize yes
pidfile /var/run/redis_16379.pid
dir /redis/16379/
cluster-enabled yes
cluster-config-file nodes-16379.conf
cluster-node-timeout 15000
# 修改/redis目錄的屬主屬組
[[email protected] redis-4.0.11]# useradd -r redis
[[email protected] redis-4.0.11]# chown redis.redis /redis/ -R

171的例項2配置只需將例項1配置中的16379全部改為16380即可,不再演示。其他節點配置同理也不再演示。

  1. 三個節點都啟動redis cluster 服務
# 節點1(171)
# cd /root/redis-4.0.11
# src/redis-server /redis/16379/redis-16379.conf 
# src/redis-server /redis/16380/redis-16380.conf 

其他節點類似不再詳細演示。

第二步:redis-trib.rb環境準備

該檔案存在於/redis/src目錄中,只需要在一臺主機上執行此步驟,redis-trib.rb是採用Ruby實現Redis叢集管理工具,可以幫助我們簡化叢集建立,檢查,槽遷移和均衡等常見操作,使用之前需要安裝Ruby依賴環境。

  1. 配置ruby環境
    下載地址: http://www.ruby-lang.org/en/downloads/
[[email protected] ~]# tar xvf ruby-2.3.5.tar.gz
[[email protected] ruby-2.3.5]# cd ruby-2.3.5
[ro[email protected] ruby-2.3.5]# ./configure --prefix=/usr/local/ruby
[[email protected] ruby-2.3.5]# make && make install
[[email protected] ruby-2.3.5]# ln -sv /usr/local/ruby/bin/ruby  /bin/
‘/bin/ruby’ -> ‘/usr/local/ruby/bin/ruby’
[[email protected] ruby-2.3.5]# ln -sv /usr/local/ruby/bin/gem  /bin/
‘/bin/gem’ -> ‘/usr/local/ruby/bin/gem’
[[email protected] ruby-2.3.5]# ruby  -v
ruby 2.3.5p376 (2017-09-14 revision 59905) [x86_64-linux]
  1. 安裝redis cluster的依賴包
[[email protected] ~]# gem install -l redis-3.3.0.gem
Successfully installed redis-3.3.0
Parsing documentation for redis-3.3.0
Installing ri documentation for redis-3.3.0
Done installing documentation for redis after 0 seconds
1 gem installed
  1. 建立叢集
[[email protected] ~]# redis-4.0.11/src/redis-trib.rb  create --replicas 1 \
> 10.220.5.171:16379 10.220.5.172:26379 10.220.5.173:36379 \
> 10.220.5.171:16380 10.220.5.172:26380 10.220.5.173:36380
說明:選項 --replicas 1 表示為叢集中的所有主節點建立一個從節點

# 最後的輸出報告說明:16384個槽全部被分配完,叢集建立成功。
這裡需要注意的是給redis-trib.rb的節點地址必須是不包含任何槽/資料的節點,否則會拒絕建立叢集。
  1. 檢查叢集的完整性
    叢集完整性是指所有的槽都被分配到存貨的主節點上,只要16384個槽中有任意一個沒有被分配給節點就表示叢集是並不完整的。
    可以用redis-trib.rb check 命令chance之前建立的叢集是否成功,check命令只需要給出集合中的任何一個節點地址就可以
[[email protected] ~]# redis-4.0.11/src/redis-trib.rb  check 10.220.5.172:26379
  1. 登入叢集,並在節點上寫入資料
    登入叢集的時候必須使用選項 -c
[[email protected] ~]# redis-cli -c -h 10.220.5.171 -p 16379
10.220.5.171:16379> set name cx
-> Redirected to slot [5798] located at 10.220.5.172:26379
OK
10.220.5.172:26379> set age 20
-> Redirected to slot [741] located at 10.220.5.171:16379
OK
10.220.5.171:16379> set addr tianjin
-> Redirected to slot [12790] located at 10.220.5.173:36379
OK

細心地你肯定注意到了上面寫入資料時節點是在變化的,第一個key儲存在了5798槽中這個槽在172節點上,寫入第二個key的時候存到了741號槽中這個槽在171節點上,同時前面的提示符也在變化,而在其他節點上登入會發現也可以獲取到這些資料,到這裡redis叢集就搭建完成了。

------做運維之前很矯情的小年輕-----