Redis

前言

redis是一個開源的、使用C語言編寫的、支持網絡交互的、可基于內存也可持久化的Key-Value數據庫

redis的官網:redis.io
注:域名后綴io屬于國家域名,是british Indian Ocean territory,即英屬印度洋領地

redis的特點

1.支持數據持久化 (可以將數據存儲在磁盤中,當redis重啟之后會自動加載磁盤中的數據)
2.支持事務 
3.支持搭建集群 (mencached不支持集群)
4.豐富的數據結構 ----- string,list,set,zset,hash等數據結構的存儲

安裝Redis

單機版安裝

redis版本下載地址

redis的安裝

##獲取源碼包
 wget https://download.redis.io/releases/redis-7.4.0.tar.gz
##解壓重命名
 tar xvzf redis-7.4.0.tar.gz -C /usr/local/
 cd /usr/local/
 mv redis-7.4.0/ redis
##安裝編譯工具對redis進行編譯
 yum -y install gcc make
 cd redis/
 make
##出現以下頁面就表示編譯完成
    LINK redis-cli
    CC redis-benchmark.o
    LINK redis-benchmark
    INSTALL redis-check-rdb
    INSTALL redis-check-aof

Hint: It's a good idea to run 'make test' ;)

make[1]: Leaving directory `/usr/local/redis/src'
redis修改配置文件并啟動
 vim /usr/local/redis/redis.conf

bind 0.0.0.0
daemonize yes	     #開啟后臺模式將no改為yes
timeout 300      #連接超時時間
port 6379            #端口號
dir ./data           ###存放在安裝目錄下的data目錄下 用于存放數據
logfile "/var/log/redis.log"       ###存放日志
pidfile /var/run/redis_6379.pid    #定義pid文件

--##創建redis數據存放目錄
 cd /usr/local/redis
 mkdir data/

--##配置redis為systemctl啟動
 vim /lib/systemd/system/redis.service

[Unit]
Description=Redis
After=network.target

[Service]
ExecStart=/usr/local/redis/src/redis-server /usr/local/redis/redis.conf  --daemonize no
ExecStop=/usr/local/redis/src/redis-cli -h 127.0.0.1 -p 6379 shutdown

[Install]
WantedBy=multi-user.target
redis啟動
--##啟動redis(systemctl啟動):
 systemctl daemon-reload
 systemctl start redis.service

--##啟動redis
 cd /usr/local/redis
 nohup src/redis-server redis.conf &
 ./src/redis-cli
image-20240926142111393
[root@redis-master src]# pwd
/usr/local/redis/src
[root@redis-master src]# ./redis-cli 
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set name jack
OK
127.0.0.1:6379> get name
"jack"

keys *查看所有key
del 刪除key
expire 給key設置過期時間
ttl 查看key的剩余有效期
exists 查看key是否存在,0為不存在,1為存在
info 查看redis的信息
flushdb 清空數據(慎用)
redis相關的工具
./redis-benchmark     #用于進行redis性能測試的工具 
./redis-check-dump    #用于修復出問題的dump.rdb文件	
./redis-cli           #redis的客戶端
./redis-server        #redis的服務端
./redis-check-aof     #用于修復出問題的AOF文件
./redis-sentinel      #用于集群管理

redis一主兩從三哨兵

一主兩從配置文件修改

環境準備

redis版本 redis7.4.0

192.168.13.111 redis主節點 redis、sentinel

192.168.13.112 redis從節點 redis、sentinel

192.168.13.115 redis從節點 redis、sentinel

主節點修改配置文件

 vim /usr/local/redis/redis.conf
 
bind 0.0.0.0
protected no  		 #關閉加密保護 否則從節點無法連接
daemonize yes	     #開啟后臺模式將no改為yes
timeout 300      #連接超時時間
port 6379            #端口號
logfile "/var/log/redis.log"       ###存放日志
pidfile /var/run/redis_6379.pid    #定義pid文件
dbfilename dump.rdb
dir ./data           ###存放在安裝目錄下的data目錄下 用于存放數據(目錄需要提前創建)
save 3600 1 300 100 60 10000	   #snapshot觸發的時機
stop-writes-on-bgsave-error yes    #當snapshot時出現錯誤無法繼續時,阻塞客戶端“變更操作”,“錯誤”可能因為磁盤已滿/磁盤故障/OS級別異常等 
rdbcompression yes	 #啟用rdb文件壓縮,默認為“yes”,壓縮往往意味著“額外的cpu消耗”,同時也意味這較小的文件尺寸以及較短的網絡傳輸時間
appendonly yes		 #開啟aof功能,只有在“yes”下,aof重寫/文件同步等特性才會生效

將主服務器的redis安裝目錄發送到從服務器

 scp -r /usr/local/redis/ 192.168.13.112:/usr/local/
 scp -r /usr/local/redis/ 192.168.13.115:/usr/local/

修改從節點配置文件

 vim /usr/local/redis/redis.conf
 
replicaof 192.168.13.111 6379 	##添加 master IP和端口(注意:老版本的redis是搜索 slaveof 有些許區別)

啟動測試

##-->master節點操作
 pkill -9 redis
 ./src/redis-server redis.conf
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set name jack
OK
127.0.0.1:6379> get name
"jack"
##查看連接狀態
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2  ##兩個從節點
slave0:ip=192.168.13.112,port=6379,state=online,offset=6535,lag=0
slave1:ip=192.168.13.115,port=6379,state=online,offset=6535,lag=0

##-->從節點操作
 ./src/redis-server redis.conf
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> get name
"jack" 
##查看連接狀態
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.13.111
master_port:6379
master_link_status:up

一主兩從搭建成功

下面開始配置三哨兵

哨兵搭建

配置文件修改

 vim /usr/local/redis/sentinel.conf
 
protected-mode no
daemonize yes
logfile "/var/log/sentinel.log"
sentinel monitor mymaster 192.168.13.111 6379 2  ##監控的主節點信息 “2”表示有兩個sentinel認為主節點主觀下線,則將主機點判斷為客觀下線
sentinel down-after-milliseconds mymaster 30000  ##30s后主機點無反應,則判斷為主觀下線
sentinel failover-timeout mymaster 180000        

將配置文件發送到另外兩臺服務器

 scp /usr/local/redis/sentinel.conf 192.168.13.112:/usr/local/redis/
 scp /usr/local/redis/sentinel.conf 192.168.13.115:/usr/local/redis/

啟動測試

##--啟動哨兵(三臺機器均啟動)
 ./src/redis-sentinel sentinel.conf
##--動態查看
 tailf /var/log/sentinel.log 
image-20240926185854631
##主節點
 cd /usr/local/redis
 ./src/redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.13.115,port=6379,state=online,offset=684083,lag=1
slave1:ip=192.168.13.112,port=6379,state=online,offset=684226,lag=0

##--停止主節點redis
[root@redis-master redis]# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      7544/./src/redis-se 
tcp        0      0 0.0.0.0:26379           0.0.0.0:*               LISTEN      7479/./src/redis-se 
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      961/sshd            
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1204/master         
tcp6       0      0 :::26379                :::*                    LISTEN      7479/./src/redis-se 
tcp6       0      0 :::22                   :::*                    LISTEN      961/sshd            
tcp6       0      0 ::1:25                  :::*                    LISTEN      1204/master         
[root@redis-master redis]# kill 7544
image-20240926190337611
##--新的主節點機器
 cd /usr/local/redis
 ./src/redis-cli
 
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.13.112,port=6379,state=online,offset=743594,lag=1

##已實現故障轉移
##--啟動故障機器
 ./src/redis-server redis.conf 
 ./src/redis-cli

127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.13.115
master_port:6379
master_link_status:up

恢復的機器會自動加入集群降為從節點