linux安裝redis-6.0.1單機和集群

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

一、單機版安裝

1.下載redis

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

  //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 //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

  使用命令 cluster info 和 cluster nodes可查看集群資訊。

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

好累,歇會~~~

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