如何在linux下搭建僞分佈式redis集羣

Redis簡介

Redis是用C語言開發的一個開源的高性能鍵值對(key-value)數據庫。
它通過提供多種鍵值數據類型來適應不同場景下的存儲需求,
目前爲止Redis支持的鍵值數據類型如下:字符串類型、散列類型 、列表類型 、集合類型 、有序集合類型。

Redis應用場景

Redis應用最多的地方是緩存(數據查詢、短連接、新聞內容、商品內容等等)。

其他的如分佈式集羣架構中的session分離、聊天室的在線好友列表、任務隊列(秒殺、搶購、12306等等)、應用排行榜、網站訪問統計、數據過期處理,Redis也能勝任。

Redis的安裝

Redis是C語言開發的,因此建議在Linux上運行。
筆者在虛擬機下使用的Linux版本爲 CentOS6.4,Redis版本爲3.0
其他版本的Linux也可以參照本教程。

1.redis官網下載源碼包,因爲使用的是虛擬機,所以先把源碼包上傳到linux。我用的xshell客戶端,上傳命令:
rz 文件名
2.Redis的編譯依賴gcc環境,如果沒有gcc環境,需要先安裝gcc
yum install gcc-c++
3.解壓源碼包
tar -zxvf redis-3.0.0.tar.gz
4.編譯源碼包
cd redis-3.0.0
make
稍等片刻,出現如下界面,ok下一步
在這裏插入圖片描述
5.安裝
make install PREFIX=/usr/local/redis
PREFIX指定安裝路徑,如下安裝成功
在這裏插入圖片描述
6.redis目錄結構
在這裏插入圖片描述

啓動redis

(1)前端啓動:./redis-server
直接運行bin/redis-server將以前端模式啓動,前端模式啓動的缺點是ssh命令窗口關閉則redis-server程序結束,不推薦使用此方式啓動redis。
(2)後端模式啓動
修改redis.conf文件
vim redis.conf
將其中的daemonize 改爲yes
在這裏插入圖片描述
執行如下命令啓動redis
cd /usr/local/redis/bin
./redis-server redis.conf
redis默認使用6379端口
ps aux|grep redis
在這裏插入圖片描述

Redis集羣

集羣原理

3.1.1.	redis-cluster架構圖
(1)所有的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬.
(2)節點的fail是通過集羣中超過半數的節點檢測失效時才生效.
(3)客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連接集羣所有節點,連接集羣中任何一個可用節點即可
(4)redis-cluster把所有的物理節點映射到[0-16383]slot上,cluster 負責維護node<->slot<->value

Redis 集羣中內置了 16384 個哈希槽,當需要在 Redis 集羣中放置一個 key-value 時,redis 先對 key 使用 crc16 算法算出一個結果,然後把結果對 16384 求餘數,這樣每個 key 都會對應一個編號在 0-16383 之間的哈希槽,redis 會根據節點數量大致均等的將哈希槽映射到不同的節點。

集羣容錯

3.1.2.	redis-cluster投票:容錯
(1)整個投票過程是集羣中所有master參與,如果半數以上master節點與master節點通信超過(cluster-node-timeout),認爲當前master節點掛掉了.
(2):什麼時候整個集羣不可用(cluster_state:fail)?
a:如果集羣任意master掛掉,且當前master沒有slave.集羣進入fail狀態,也可以理解成集羣的slot映射[0-16383]不完成時進入fail狀態. ps : redis-3.0.0.rc1加入cluster-require-full-coverage參數,默認關閉,打開集羣兼容部分失敗.
b:如果集羣超過半數以上master掛掉,無論是否有slave集羣進入fail狀態.
ps:當集羣不可用時,所有對集羣的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)錯誤。

Ruby環境安裝

redis集羣管理工具redis-trib.rb依賴ruby環境,首先需要安裝ruby環境。
1.安裝ruby
yum install ruby
yum install rubygems
2.安裝ruby和redis的接口程序
redis-3.0.0.gem
提取碼(txd6)
拷貝redis-3.0.0.gem至/usr/local下
執行gem install /usr/local/redis-3.0.0.gem

創建集羣

這裏在同一臺服務器用不同的端口表示不同的redis服務器,如下:
主節點:192.168.101.3:7001 192.168.101.3:7002 192.168.101.3:7003
從節點:192.168.101.3:7004 192.168.101.3:7005 192.168.101.3:7006
PS:IP地址根據自己的來改!
(1)創建6個redis的實例,在/usr/local下創建redis-cluster目錄,在該目錄下創建redis01,redis02,……redis06目錄,如下
在這裏插入圖片描述
(2)將redis安裝目錄bin下的文件拷貝到每個redis0x目錄下,同時將redis源碼目錄src下的redis-trib.rb拷貝到redis-cluster目錄下,
cp *.rb /usr/local/redis-cluster
修改每個redis0x目錄下的redis.conf配置文件:
port 7001
port 7002
.
.
.
port 7006
打開cluster-enable前面的註釋
(3)啓動6個實例,編寫腳本一次啓動全部實例
vim startall.sh
加入以下內容:
cd redis01
./redis-server redis.conf
cd …
cd redis02
./redis-server redis.conf
cd …
cd redis03
./redis-server redis.conf
cd …
cd redis04
./redis-server redis.conf
cd …
cd redis05
./redis-server redis.conf
cd …
cd redis06
./redis-server redis.conf
cd …
注意,cd …全部是兩個點,markdown編輯器不知道怎麼顯示三個,這裏說明一下。
添加可執行權限
chmod +x startall.sh
在這裏插入圖片描述
啓動6個redis實例
./startall.sh
查看是否啓動成功
ps -aux|grep redis
在這裏插入圖片描述
(4)創建集羣
執行redis-trib.rb,此腳本是ruby腳本,它依賴ruby環境。
./redis-trib.rb create --replicas 1 192.168.101.3:7001 192.168.101.3:7002 192.168.101.3:7003 192.168.101.3:7004 192.168.101.3:7005 192.168.101.3:7006
說明:
redis集羣至少需要3個主節點,每個主節點有一個從節點總共6個節點
replicas指定爲1表示每個主節點有一個從節點

注意:
如果執行時報如下錯誤:
[ERR] Node XXXXXX is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0
解決方法是刪除生成的配置文件nodes.conf,如果不行則說明現在創建的結點包括了舊集羣的結點信息,需要刪除redis的持久化文件後再重啓redis,比如:appendonly.aof、dump.rdb。
創建成功輸出如下信息:

Creating cluster
Connecting to node 192.168.198.128:7001: OK
Connecting to node 192.168.198.128:7002: OK
Connecting to node 192.168.198.128:7003: OK
Connecting to node 192.168.198.128:7004: OK
Connecting to node 192.168.198.128:7005: OK
Connecting to node 192.168.198.128:7006: OK

Performing hash slots allocation on 6 nodes…
Using 3 masters:
192.168.198.128:7001
192.168.198.128:7002
192.168.198.128:7003
Adding replica 192.168.198.128:7004 to 192.168.198.128:7001
Adding replica 192.168.198.128:7005 to 192.168.198.128:7002
Adding replica 192.168.198.128:7006 to 192.168.198.128:7003
M: cfbbbd2d61e553d1c2f024363e4c1520455394ce 192.168.198.128:7001
slots:0-5460 (5461 slots) master
M: 2f6b8ac8e9bf0f8156d42601a4eb03fba4c3063e 192.168.198.128:7002
slots:5461-10922 (5462 slots) master
M: 1b321b141945d3c3094f074d1a1b016cde333ce8 192.168.198.128:7003
slots:10923-16383 (5461 slots) master
S: 678a94277581abbe2b0559694f45bb76ab2ef8f6 192.168.198.128:7004
replicates cfbbbd2d61e553d1c2f024363e4c1520455394ce
S: 3fd7c216b4cc634f5fd13a43f6534c6bce8f3d8d 192.168.198.128:7005
replicates 2f6b8ac8e9bf0f8156d42601a4eb03fba4c3063e
S: 96140038a4417ccc1e0b1f20a135263284aeae07 192.168.198.128:7006
replicates 1b321b141945d3c3094f074d1a1b016cde333ce8
Can I set the above configuration? (type ‘yes’ to accept): yes

Nodes configuration updated
Assign a different config epoch to each node
Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join…

Performing Cluster Check (using node 192.168.198.128:7001)
M: cfbbbd2d61e553d1c2f024363e4c1520455394ce 192.168.198.128:7001
slots:0-5460 (5461 slots) master
M: 2f6b8ac8e9bf0f8156d42601a4eb03fba4c3063e 192.168.198.128:7002
slots:5461-10922 (5462 slots) master
M: 1b321b141945d3c3094f074d1a1b016cde333ce8 192.168.198.128:7003
slots:10923-16383 (5461 slots) master
M: 678a94277581abbe2b0559694f45bb76ab2ef8f6 192.168.198.128:7004
slots: (0 slots) master
replicates cfbbbd2d61e553d1c2f024363e4c1520455394ce
M: 3fd7c216b4cc634f5fd13a43f6534c6bce8f3d8d 192.168.198.128:7005
slots: (0 slots) master
replicates 2f6b8ac8e9bf0f8156d42601a4eb03fba4c3063e
M: 96140038a4417ccc1e0b1f20a135263284aeae07 192.168.198.128:7006
slots: (0 slots) master
replicates 1b321b141945d3c3094f074d1a1b016cde333ce8
[OK] All nodes agree about slots configuration.
Check for open slots…
Check slots coverage…
[OK] All 16384 slots covered.

(5)測試集羣

redis01/redis-cli -h 192.168.25.153 -p 7002 -c
ps:-c參數不要忘記,表示以集羣方式連接redis,不帶能連上,但操作時會報錯!
(6)關閉集羣,使用腳本全部關閉,在redis-cluster目錄下創建腳本
vim shutdownall.sh
添加如下信息:
redis01/redis-cli -p 7001 shutdown
redis02/redis-cli -p 7002 shutdown
redis03/redis-cli -p 7003 shutdown
redis04/redis-cli -p 7004 shutdown
redis05/redis-cli -p 7005 shutdown
redis06/redis-cli -p 7006 shutdown
chmod +x shutdownall.sh

在這裏插入圖片描述

關閉

./shutdownall.sh
ps -aux|grep redis
Warning: bad syntax, perhaps a bogus ‘-’? See /usr/share/doc/procps-3.2.8/FAQ
root 11616 0.0 0.0 103248 836 pts/0 S+ 16:07 0:00 grep redis

啓動

./startall.sh
ps -aux|grep redis
Warning: bad syntax, perhaps a bogus ‘-’? See /usr/share/doc/procps-3.2.8/FAQ
root 11625 0.5 0.7 137436 7388 ? Ssl 16:08 0:00 ./redis-server *:7001 [cluster]
root 11629 0.0 0.7 137436 7388 ? Ssl 16:08 0:00 ./redis-server *:7002 [cluster]
root 11633 0.0 0.7 137436 7396 ? Ssl 16:08 0:00 ./redis-server *:7003 [cluster]
root 11637 0.0 0.7 137436 7380 ? Ssl 16:08 0:00 ./redis-server *:7004 [cluster]
root 11641 0.0 0.7 137436 7380 ? Ssl 16:08 0:00 ./redis-server *:7005 [cluster]
root 11645 0.0 0.7 137436 7384 ? Ssl 16:08 0:00 ./redis-server *:7006 [cluster]
root 11652 0.0 0.0 103248 836 pts/0 S+ 16:08 0:00 grep redis

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章