主從和哨兵可以解決高可用、高并發讀的問題。但是依然有兩個問題沒有解決:
海量數據存儲問題
高并發寫的問題
使用分片集群可以解決上述問題,如圖:
分片集群特征:
集群中有多個master,每個master保存不同數據
每個master都可以有多個slave節點
master之間通過ping監測彼此健康狀態
客戶端請求可以訪問集群任意節點,最終都會被轉發到正確節點
1、集群結構
分片集群需要的節點數量較多,這里我們搭建一個最小的分片集群,包含3個master節點,每個master包含一個slave節點,結構如下:
這里我們會在同一臺虛擬機中開啟6個redis實例,模擬分片集群,信息如下:
IP | PORT | 角色 |
---|---|---|
192.168.150.101 | 7001 | master |
192.168.150.101 | 7002 | master |
192.168.150.101 | 7003 | master |
192.168.150.101 | 8001 | slave |
192.168.150.101 | 8002 | slave |
192.168.150.101 | 8003 | slave |
2、準備實例和配置
刪除之前的7001、7002、7003這幾個目錄,重新創建出7001、7002、7003、8001、8002、8003目錄:
# 進入/tmp目錄
cd /tmp
# 刪除舊的,避免配置干擾
rm -rf 7001 7002 7003
# 創建目錄
mkdir 7001 7002 7003 8001 8002 8003
在/tmp下準備一個新的redis.conf文件,內容如下:
port 6379
# 開啟集群功能
cluster-enabled yes
# 集群的配置文件名稱,不需要我們創建,由redis自己維護
cluster-config-file /tmp/6379/nodes.conf
# 節點心跳失敗的超時時間
cluster-node-timeout 5000
# 持久化文件存放目錄
dir /tmp/6379
# 綁定地址
bind 0.0.0.0
# 讓redis后臺運行
daemonize yes
# 注冊的實例ip
replica-announce-ip 192.168.150.101
# 保護模式
protected-mode no
# 數據庫數量
databases 1
# 日志
logfile /tmp/6379/run.log
將這個文件拷貝到每個目錄下:
# 進入/tmp目錄
cd /tmp
# 執行拷貝
echo 7001 7002 7003 8001 8002 8003 | xargs -t -n 1 cp redis.conf
修改每個目錄下的redis.conf,將其中的6379修改為與所在目錄一致:
# 進入/tmp目錄
cd /tmp
# 修改配置文件
printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t sed -i 's/6379/{}/g' {}/redis.conf
3、啟動
因為已經配置了后臺啟動模式,所以可以直接啟動服務:
# 進入/tmp目錄
cd /tmp
# 一鍵啟動所有服務
printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-server {}/redis.conf
通過ps查看狀態:
ps -ef | grep redis
發現服務都已經正常啟動:
如果要關閉所有進程,可以執行命令:
ps -ef | grep redis | awk '{print $2}' | xargs kill
或者(推薦這種方式):
printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-cli -p {} shutdown
4、創建集群
雖然服務啟動了,但是目前每個服務之間都是獨立的,沒有任何關聯。
我們需要執行命令來創建集群,在Redis5.0之前創建集群比較麻煩,5.0之后集群管理命令都集成到了redis-cli中。
1)Redis5.0之前
Redis5.0之前集群命令都是用redis安裝包下的src/redis-trib.rb來實現的。因為redis-trib.rb是有ruby語言編寫的所以需要安裝ruby環境。
# 安裝依賴
yum -y install zlib ruby rubygems
gem install redis
然后通過命令來管理集群:
# 進入redis的src目錄
cd /tmp/redis-6.2.4/src
# 創建集群
./redis-trib.rb create --replicas 1 192.168.150.101:7001 192.168.150.101:7002 192.168.150.101:7003 192.168.150.101:8001 192.168.150.101:8002 192.168.150.101:8003
2)Redis5.0以后
我們使用的是Redis6.2.4版本,集群管理以及集成到了redis-cli中,格式如下:
redis-cli --cluster create --cluster-replicas 1 192.168.150.101:7001 192.168.150.101:7002 192.168.150.101:7003 192.168.150.101:8001 192.168.150.101:8002 192.168.150.101:8003
命令說明:
redis-cli --cluster
或者./redis-trib.rb
:代表集群操作命令create
:代表是創建集群--replicas 1
或者--cluster-replicas 1
:指定集群中每個master的副本個數為1,此時節點總數 ÷ (replicas + 1)
得到的就是master的數量。因此節點列表中的前n個就是master,其它節點都是slave節點,隨機分配到不同master
運行后的樣子:
這里輸入yes,則集群開始創建:
通過命令可以查看集群狀態:
x?redis-cli -p 7001 cluster nodes
5、測試
嘗試連接7001節點,存儲一個數據:
# 連接
redis-cli -p 7001
# 存儲數據
set num 123
# 讀取數據
get num
# 再次存儲
set a 1
結果悲劇了:
集群操作時,需要給redis-cli
加上-c
參數才可以:
redis-cli -c -p 7001
這次可以了: