linux安裝redis-6.0.1單機和叢集

[一劍霜寒十四州發表於2020-06-09

redis作為一個直接操作記憶體的key-value儲存系統,也是一個支援資料持久化的Nosql資料庫,具有非常快速的讀寫速度,可用於資料快取、訊息佇列等。

一、單機版安裝

1.下載redis

  進入redis官網下載安裝包,這裡使用的是目前最新版6.0.4

  http://download.redis.io/releases/redis-6.0.4.tar.gz

2.上傳到伺服器並解壓

  上傳到伺服器/usr/local目錄並解壓

  tar -zxvf redis-6.0.4.tar.gz

3.編譯和安裝

  3.1 編譯,進入redis根目錄,執行命令

  make

  若編譯報錯,可能是缺少編譯環境gcc和tcl

  1)安裝gcc,先清理掉上一步編譯產生的檔案,執行命令

  make distclean

  安裝gcc,執行命令

  yum install gcc -y

  這個遇到一個問題:在安裝6.0.1版本make時會遇到這樣一個錯誤,server.c:xxxx:xx: error: ‘xxxxxxxx’ has no member named ‘xxxxx

    原因:gcc編譯工具版本的問題,centos7預設安裝的版本是4.8.5,但是要求對應版本要在5.3以上,檢視gcc版本命令

    gcc -v

    解決方法:升級到5.3以上版本,依次執行命令

    yum -y install centos-release-scl

    yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils

    scl enable devtoolset-9 bash

    echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile  --使永久生效

  2)安裝tcl,執行命令

  yum install tcl -y

  重新編譯make

  3.2 安裝,進入src目錄,執行命令

  make install PREFIX=/usr/local

  這時就會在/usr/local目錄下生成一個redis目錄,後面操作redis均使用此目錄下檔案,解壓編譯的目錄作為源目錄。

4.配置

  複製源目錄根目錄下的redis.conf檔案到生成的/usr/local/redis目錄下,執行命令

  cp redis.conf /usr/local/redis

  使用vi編輯配置redis.conf

  bind 0.0.0.0  設定繫結的主機ip,0.0.0.0表示監聽所有地址

  protected-mode no  關閉安全模式,允許外網訪問

  daemonize yes  後臺啟動

5.新增開放埠號到防火牆

  新增埠並重啟防火牆

  firewall-cmd  --zone=public --add-port=6379/tcp --permanent && firewall-cmd --reload

  列出已經開放的埠號

  firewall-cmd --zone=public --permanent --list-ports

6.啟動

  啟動redis,進入redis根目錄,執行命令

  ./bin/redis-server redis.conf

  使用redis工具或API遠端訪問。

OK,單機版搭建成功!

二、叢集版安裝

所謂知其然知其所以然,為什麼要用redis叢集?

  1)首先,redis是一個記憶體資料庫,也就是說儲存資料的容量不能超過主機記憶體大小(一般幾十G),有時我們要在redis中儲存大量的資料,比如上百個G,如果只是單個的redis例項,這樣很難動態水平擴充套件,這時候就要考慮叢集。

  2)其次,redis單例項具有流量壓力上限問題,所以需要構建資料分割槽,多個master例項同時提供讀寫服務。

  redis 3.0版本以上開始支援cluster,採用的是hash slot(hash槽,redis共有16384個hash槽),它可以把多個redis例項整合在一起,將hash槽均分給每個master,形成redis叢集也就是將資料分散在叢集中的多個redis例項上,當我們建立資料時一個key只被分配到一個例項上。redis cluster是一個無中心的結構,每個節點儲存著自己的資料和其它節點的資訊,知道其它節點負責的槽,並且會與其它節點定時傳送心跳資訊,能夠及時感知叢集中異常的節點。

  那麼,當我們新建一個key時,redis叢集是怎樣將資料分配到節點上的呢?

  當需要在redis叢集中放置一個key-value時,redis先對key使用crc16演算法計算出一個結果,然後將這個數值與16384求餘,這樣就確定了hash槽的位置,再根據hash槽的值確定將資料分配給之前均分hash槽的節點上。

  當我們取出一個key時,又是怎樣進行定位的呢?

  噹噹前redis節點接收到獲取資料的命令時,會計算出要處理的資料庫鍵屬於哪個槽與儲存時使用同樣的演算法,並檢查這個槽是否指派給了自己,若正好指派給了當前節點,則直接在這個節點上執行命令獲取資料。否則節點會向客戶端返回一個moved指令,指引客戶端轉向(redirect)至正確的節點,並在此傳送之前執行的命令獲取資料。

  redis使用叢集,就要包保證叢集的高可用性,使用主從複製(repliaction)和自動故障轉移--哨兵機制(sentinel),可以解決單點故障。通過資料分割槽與主從複製提高redis叢集的效能和高可用性。

  redis叢集是怎樣保證叢集高可用的呢?

  redis cluster採用投票容錯機制,叢集角色有master和slave。master之間分配slots,slave向它指定的master同步資料,實現備份。master用於寫資料,slave用於讀資料,向slave寫資料會發生錯誤。當其中一個master無法提供服務時,該master的slave提升為master,代替master提供服務。保證叢集中slot的完整性,即叢集資料的完整性。一旦叢集中其中一個master和它的所有slave全部失效,導致slot不完整,那麼叢集將會不可用,這是就需要人工去處理了。

  投票過程是叢集中所有master參與,如果半數以上的節點與節點之間的通訊時間超過cluster-node-timeout,則認為當前節點掛掉。所以一般master節點數量均為奇數個,且不少於3個。

  什麼情況下整個叢集不可用?

  a.如果叢集中任一master節點掛掉且沒有slave節點頂替,叢集進入不可用狀態;

  當叢集不可用時,對叢集中的任何操作都不可用。

叢集搭建:

  我們這裡搭建一個偽分散式的叢集,叢集中有3個節點,每個節點有一主一備,理論需要6臺虛擬機器,我們採用6個redis例項來模擬建立。

注意:這裡的叢集環境ruby環境是用於後面建立叢集命令的執行環境,但是在高版本例如redis-5.0.5版本及以上就不需要安裝此環境了,因為高版本建立叢集已經不用redis-trib.rb這個指令碼,而是使用自帶的redis-cli建立。(嗚嗚,環境坑了我一下午,最後建立叢集時才發現...)

1.安裝叢集環境ruby

  安裝ruby,執行命令

  yum install ruby rubygems  -y

  安裝redis與ruby的連線包,執行命令

    gem install redis

    如果提示ruby版本過低,需要升級ruby版本,需要安裝rvm(命令列工具,提供ruby環境管理和版本切換),安裝rvm前需要安裝curl(檔案傳輸工具),執行命令

    yum install curl -y

    使用curl安裝rvm,執行命令

    curl -L get.rvm.io | bash -s stable

    安裝會報錯,併產生一串公鑰,執行命令

    gpg --keyserver hkp://keys.gnupg.net --recv-keys (這裡跟上上面的公鑰)

    再次執行命令,一次不行多執行幾次

    curl -sSL https://get.rvm.io | bash -s stable

    安裝完成後會在/user/local目錄下發現rvm目錄,將命令放入shell,執行命令

    source /usr/local/rvm/scripts/rvm

    檢視rvm管理的ruby版本,執行命令

    rvm list known

    安裝新版本,可以參照安裝連線包時提示的最低版本安裝,我這裡安裝2.5.7版本,執行命令

    rvm install ruby-2.5.7

    等待ruby安裝完成,檢視已安裝的版本,

    rvm list

    使用此版本

    rvm use ruby-2.5.7

    檢查一下當前使用的版本,ruby -v

  最後再次執行命令

    gem install redis

  環境安裝完成!!

2.建立叢集目錄

  進入/usr/local目錄,執行命令

  mkdir redis_cluster

3.複製redis例項

  將redis目錄複製到redis_cluster中,執行命令

  cp -r /usr/local/redis /usr/local/redis_cluster/redis7001

  ps:這裡注意一點,如果此時資料庫中有資料,那麼將rdb檔案一起復制時會導致後面叢集建立失敗,有資料時不能建立叢集。解決:刪除例項下rdb備份檔案以及後面會生成的nodes.conf檔案。

4.更改配置

  更改redis7001中配置redis.conf引數

  port 7001  修改埠號

  cluster-enabled yes  開啟叢集支援

  將redis7001例項複製6份到當前資料夾,

  cp redis7001 redis7002

  cp redis7001 redis7003

  ......

  修改各個例項下的埠號

5.把建立叢集的ruby指令碼複製到叢集目錄

  進入redis的src目錄,執行命令

  cp redis-trib.rb /usr/local/redis_cluster/

6.建立叢集

  啟動6個redis例項,這裡為了方便編寫一個啟動指令碼,在redis_cluste目錄下新建檔案

  touch start-all.sh

  編輯輸入如下內容:  

    cd ./redis7001
    ./bin/redis-server redis.conf
    echo "啟動redis7001成功..."

    cd ../redis7002
    ./bin/redis-server redis.conf
    echo "啟動redis7002成功..."

    cd ../redis7003
    ./bin/redis-server redis.conf
    echo "啟動redis7003成功..."

    cd ../redis7004
    ./bin/redis-server redis.conf
    echo "啟動redis7004成功..."

    cd ../redis7005
    ./bin/redis-server redis.conf
    echo "啟動redis7005成功..."

    cd ../redis7006
    ./bin/redis-server redis.conf
    echo "啟動redis7006成功..."

  賦予執行許可權

  chmod +x start-all.sh

  新建關閉redis叢集指令碼

    touch stop-all.sh

  編輯輸入如下內容:  

    cd ./redis7001
    bin/redis-cli -p 7001 shutwodn
    echo "關閉redis7001成功..."

    cd ../redis7002
    bin/redis-cli -p 7002 shutdown
    echo "關閉redis7002成功..."

    cd ../redis7003
    bin/redis-cli -p 7003 shutdown
    echo "關閉redis7003成功..."

    cd ../redis7004
    bin/redis-cli -p 7004 shutdown
    echo "關閉redis7004成功..."

    cd ../redis7005
    bin/redis-cli -p 7005 shutdown
    echo "關閉redis7005成功..."

    cd ../redis7006
    bin/redis-cli -p 7006 shutdown
    echo "關閉redis7006成功..."

  建立叢集命令:

    進入到叢集中某個例項下的bin目錄,高版本執行

    ./redis-cli --cluster create --cluster-replicas 1 192.168.2.75:7001 192.168.2.75:7002 192.168.2.75:7003 192.168.2.75:7004 192.168.2.75:7005 192.168.2.75:7006 

    低版本執行

    ./redis-trib.rb create --replicas 1 192.168.2.75:7001 192.168.2.75:7002 192.168.2.75:7003 192.168.2.75:7004 192.168.2.75:7005 192.168.2.75:7006

    注:replicas參數列示一個master有接個slave

  然後就會按照預設的方式進行分配matser,主從關係。

7.測試

  使用命令連線上叢集某個節點

  ./redis-cli -p 7001 -c

  使用命令 cluster info 和 cluster nodes可檢視叢集資訊。

  注意:一定要加引數-c,否則無法進行各節點通訊。

至此,叢集版搭建完成!!

好累,歇會~~~

如有錯誤,感謝您的指正!

相關文章