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,否則無法進行各節點通訊。
至此,叢集版搭建完成!!
好累,歇會~~~
如有錯誤,感謝您的指正!