当前位置:网站首页>Redis分布式緩存-Redis集群
Redis分布式緩存-Redis集群
2022-07-19 11:40:00 【行萬裏路,讀萬卷書】
Redis集群
本章是基於CentOS7下的Redis集群教程,包括:
- 單機安裝Redis
- Redis主從
- Redis分片集群
1.單機安裝Redis
首先需要安裝Redis所需要的依賴:
yum install -y gcc tcl
然後將課前資料提供的Redis安裝包上傳到虛擬機的任意目錄:
例如,我放到了/tmp目錄:
解壓縮:
tar -xzf redis-6.2.4.tar.gz
解壓後:![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-nDWIU3KS-1658034913800)(assets/image-20210629114941810.png)]](/img/4a/5ffe236db5396da067a5c3a870c518.png)
進入redis目錄:
cd redis-6.2.4
運行編譯命令:
make && make install
如果沒有出錯,應該就安裝成功了。
然後修改redis.conf文件中的一些配置:
# 綁定地址,默認是127.0.0.1,會導致只能在本地訪問。修改為0.0.0.0則可以在任意IP訪問
bind 0.0.0.0
# 保護模式,關閉保護模式
protected-mode no
# 數據庫數量,設置為1
databases 1
啟動Redis:
redis-server redis.conf
停止redis服務:
redis-cli shutdown
2.Redis主從集群
2.1.集群結構
我們搭建的主從集群結構如圖:
共包含三個節點,一個主節點,兩個從節點。
這裏我們會在同一臺虛擬機中開啟3個redis實例,模擬主從集群,信息如下:
| IP | PORT | 角色 |
|---|---|---|
| 192.168.150.101 | 7001 | master |
| 192.168.150.101 | 7002 | slave |
| 192.168.150.101 | 7003 | slave |
2.2.准備實例和配置
要在同一臺虛擬機開啟3個實例,必須准備三份不同的配置文件和目錄,配置文件所在目錄也就是工作目錄。
1)創建目錄
我們創建三個文件夾,名字分別叫7001、7002、7003:
# 進入/tmp目錄
cd /tmp
# 創建目錄
mkdir 7001 7002 7003
如圖:
2)恢複原始配置
修改redis-6.2.4/redis.conf文件,將其中的持久化模式改為默認的RDB模式,AOF保持關閉狀態。
# 開啟RDB
# save ""
save 3600 1
save 300 100
save 60 10000
# 關閉AOF
appendonly no
3)拷貝配置文件到每個實例目錄
然後將redis-6.2.4/redis.conf文件拷貝到三個目錄中(在/tmp目錄執行下列命令):
# 方式一:逐個拷貝
cp redis-6.2.4/redis.conf 7001
cp redis-6.2.4/redis.conf 7002
cp redis-6.2.4/redis.conf 7003
# 方式二:管道組合命令,一鍵拷貝
echo 7001 7002 7003 | xargs -t -n 1 cp redis-6.2.4/redis.conf
4)修改每個實例的端口、工作目錄
修改每個文件夾內的配置文件,將端口分別修改為7001、7002、7003,將rdb文件保存比特置都修改為自己所在目錄(在/tmp目錄執行下列命令):
sed -i -e 's/6379/7001/g' -e 's/dir .\//dir \/tmp\/7001\//g' 7001/redis.conf
sed -i -e 's/6379/7002/g' -e 's/dir .\//dir \/tmp\/7002\//g' 7002/redis.conf
sed -i -e 's/6379/7003/g' -e 's/dir .\//dir \/tmp\/7003\//g' 7003/redis.conf
5)修改每個實例的聲明IP
虛擬機本身有多個IP,為了避免將來混亂,我們需要在redis.conf文件中指定每一個實例的綁定ip信息,格式如下:
# redis實例的聲明 IP
replica-announce-ip 192.168.150.101
每個目錄都要改,我們一鍵完成修改(在/tmp目錄執行下列命令):
# 逐一執行
sed -i '1a replica-announce-ip 192.168.169.128' 7001/redis.conf
sed -i '1a replica-announce-ip 192.168.169.128' 7002/redis.conf
sed -i '1a replica-announce-ip 192.168.169.128' 7003/redis.conf
# 或者一鍵修改
printf '%s\n' 7001 7002 7003 | xargs -I{} -t sed -i '1a replica-announce-ip 192.168.150.101' {}/redis.conf
2.3.啟動
為了方便查看日志,我們打開3個ssh窗口,分別啟動3個redis實例,啟動命令:
# 第1個
redis-server 7001/redis.conf
# 第2個
redis-server 7002/redis.conf
# 第3個
redis-server 7003/redis.conf
啟動後:
如果要一鍵停止,可以運行下面命令:
printf '%s\n' 7001 7002 7003 | xargs -I{} -t redis-cli -p {} shutdown
2.4.開啟主從關系
現在三個實例還沒有任何關系,要配置主從可以使用replicaof 或者slaveof(5.0以前)命令。
有臨時和永久兩種模式:
修改配置文件(永久生效)
- 在redis.conf中添加一行配置:
slaveof <masterip> <masterport>
- 在redis.conf中添加一行配置:
使用redis-cli客戶端連接到redis服務,執行slaveof命令(重啟後失效):
slaveof <masterip> <masterport>
注意:在5.0以後新增命令replicaof,與salveof效果一致。
這裏我們為了演示方便,使用方式二。
通過redis-cli命令連接7002,執行下面命令:
# 連接 7002
redis-cli -p 7002
# 執行slaveof
slaveof 192.168.150.101 7001
通過redis-cli命令連接7003,執行下面命令:
# 連接 7003
redis-cli -p 7003
# 執行slaveof
slaveof 192.168.150.101 7001
然後連接 7001節點,查看集群狀態:
# 連接 7001
redis-cli -p 7001
# 查看狀態
info replication
結果:

2.5.測試
執行下列操作以測試:
利用redis-cli連接7001,執行
set num 123利用redis-cli連接7002,執行
get num,再執行set num 666利用redis-cli連接7003,執行
get num,再執行set num 888
可以發現,只有在7001這個master節點上可以執行寫操作,7002和7003這兩個slave節點只能執行讀操作。
3.搭建哨兵集群
3.1.集群結構
這裏我們搭建一個三節點形成的Sentinel集群,來監管之前的Redis主從集群。如圖:
三個sentinel實例信息如下:
| 節點 | IP | PORT |
|---|---|---|
| s1 | 192.168.150.101 | 27001 |
| s2 | 192.168.150.101 | 27002 |
| s3 | 192.168.150.101 | 27003 |
3.2.准備實例和配置
要在同一臺虛擬機開啟3個實例,必須准備三份不同的配置文件和目錄,配置文件所在目錄也就是工作目錄。
我們創建三個文件夾,名字分別叫s1、s2、s3:
# 進入/tmp目錄
cd /tmp
# 創建目錄
mkdir s1 s2 s3
如圖:
然後我們在s1目錄創建一個sentinel.conf文件,添加下面的內容:
port 27001
sentinel announce-ip 192.168.150.101
sentinel monitor mymaster 192.168.150.101 7001 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
dir "/tmp/s1"
解讀:
port 27001:是當前sentinel實例的端口sentinel monitor mymaster 192.168.150.101 7001 2:指定主節點信息mymaster:主節點名稱,自定義,任意寫192.168.150.101 7001:主節點的ip和端口2:選舉master時的quorum值
然後將s1/sentinel.conf文件拷貝到s2、s3兩個目錄中(在/tmp目錄執行下列命令):
# 方式一:逐個拷貝
cp s1/sentinel.conf s2
cp s1/sentinel.conf s3
# 方式二:管道組合命令,一鍵拷貝
echo s2 s3 | xargs -t -n 1 cp s1/sentinel.conf
修改s2、s3兩個文件夾內的配置文件,將端口分別修改為27002、27003:
sed -i -e 's/27001/27002/g' -e 's/s1/s2/g' s2/sentinel.conf
sed -i -e 's/27001/27003/g' -e 's/s1/s3/g' s3/sentinel.conf
3.3.啟動
為了方便查看日志,我們打開3個ssh窗口,分別啟動3個redis實例,啟動命令:
# 第1個
redis-sentinel s1/sentinel.conf
# 第2個
redis-sentinel s2/sentinel.conf
# 第3個
redis-sentinel s3/sentinel.conf
啟動後:

3.4.測試
嘗試讓master節點7001宕機,查看sentinel日志:
查看7003的日志:
查看7002的日志:
4.搭建分片集群
4.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 |
4.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
4.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.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,則集群開始創建:
通過命令可以查看集群狀態:
redis-cli -p 7001 cluster nodes

4.5.測試
嘗試連接7001節點,存儲一個數據:
# 連接
redis-cli -p 7001
# 存儲數據
set num 123
# 讀取數據
get num
# 再次存儲
set a 1
結果悲劇了:
集群操作時,需要給redis-cli加上-c參數才可以:
redis-cli -c -p 7001
這次可以了:
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-i021J0tp-1658034913806)(assets/image-20210702182602145.png)]](/img/2d/9a31188d6ebfce429b1ab06e40aa0c.png)
边栏推荐
猜你喜欢

QT -- excellent open source project

Total number of blocking and waiting in jconsole thread panel (RPM)

华为无线设备配置频谱导航

MySQL autoincrement ID, UUID and snowflake ID

【嵌入式单元测试】C语言单元测试框架搭建

The type of MySQL index (single column index, combined index, BTREE index, clustered index, etc.)

An error, uncaught typeerror: modalfactory is not a constructor

02-3. Difference between pointer and reference

【二叉树】之力扣牛客必刷题

Developing those things: how to solve the problem of long-time encoding and decoding of RK chip video processing?
随机推荐
Qt--优秀开源项目
02-3、指針和引用的區別
What happened to cinder in openstack-m
Similarities and differences between OA system and MES system
AT5147-[AGC036D]Negative Cycle【dp,模型转换】
Robot development -- robot data summary
Total number of blocking and waiting in jconsole thread panel (RPM)
MySQL autoincrement ID, UUID and snowflake ID
LeetCode刷题——查找和最小的 K 对数字#373#Medium
SPI service discovery mechanism
JVM hook hooks function
TiKV 内存参数性能调优
Un modèle de détection par défaut basé sur le réseau neuronal évolutif rapide dans le contrôle de la qualité des produits - lire les notes
Learning outline of the column "MySQL DBA's magic road"
CodeForces - 587E(线性基+线段树+差分)
03-1、内联函数、auto关键字、typeid、nullptr
Round table record: fireside dialogue -- how to realize innovation in Web3
传输层 -------- TCP(一)
Download of common getshell tools
Wechat applet cloud development 1 - Database