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