提示:本文原創作品,良心製作,乾貨為主,簡潔清晰,一看就會

文章目錄

  • 一、非關係型數據庫
  • 1.1 什麼是非關係型數據庫
  • 1.2 關係型數據庫和非關係型數據庫的區別
  • 1.3 關係型數據庫和非關係型數據庫優缺點
  • 1.4 非關係型數據庫的作用
  • 二、Redis安裝
  • 2.1 下載redis
  • 2.2 修改redis.conf
  • 2.3 添加systemctl管理(可選)
  • 2.4 啓動redis並測試
  • 2.5 redis重要目錄介紹
  • 2.6 redis常用命令工具
  • 2.7 redis的簡單操作
  • 三、 數據持久化
  • 3.1 基本知識
  • 3.1.1 什麼時數據持久化
  • 3.1.2 持久化的方式有哪些
  • 3.1.3 RDB和AOF特點
  • 3.1.4 大部分企業用的哪種方法?
  • 3.2 RDB實戰
  • 3.2.1 配置RDB
  • 3.2.2 擴展:備份文件導入另一台數據
  • 3.3 AOF實戰
  • 四、Redis主從同步
  • 4.1 主從同步簡介
  • 4.2 主從同步原理
  • 4.3 一主兩從實戰
  • 4.3.1 環境介紹
  • 4.3.2 主數據庫配置
  • 4.3.3 從數據庫配置
  • 4.3.4 測試主從同步
  • 五、Redis高可用--哨兵模式
  • 5.1 高可用--哨兵模式簡介
  • 5.2 哨兵模式工作原理
  • 5.3 哨兵模式實戰
  • 5.3.1 環境介紹
  • 5.3.2 主數據庫配置
  • 5.3.3 從數據庫配置
  • 5.3.4 測試主從同步
  • 5.3.5 測試高可用


一、非關係型數據庫

1.1 什麼是非關係型數據庫

非關係型數據庫(NoSQL,Not Only SQL)是不依賴傳統關係模型(表、行、列)的數據庫,非關係型數據庫則以靈活性、擴展性和高性能為核心,適合互聯網、大數據等快速迭代、數據量大的場景


1.2 關係型數據庫和非關係型數據庫的區別

對比維度

關係型數據庫

非關係型數據庫

代表數據庫

MySQL、Oracle、PostgreSQL

Redis、MongoDB、HBase

存儲數據類型

結構化數據,基於表、行、列,需預設固定 Schema(字段定義)

非結構化/半結構化數據,支持鍵值對、文檔、列族、圖等靈活結構,無需固定 Schema

事務支持

強事務一致性,支持複雜事務和回滾

多數弱化事務,僅核心場景支持 ACID(如 Redis 事務、MongoDB 4.0+ 事務)

查詢能力

支持 SQL 語句、可以複雜查詢

不提供sql

存儲數據

只能使用硬盤存儲

內存,硬盤或者隨機存儲器


1.3 關係型數據庫和非關係型數據庫優缺點

對比維度

關係型數據庫

非關係型數據庫

優點

都是表結構,易於維護,sq語言通用,可複雜查詢,支持sql

存儲數據的格式靈活,讀寫速度快

缺點

讀寫性能差,尤其是海量數據的高效率讀寫;固定表結構,靈活度稍欠;對於高併發讀寫需求,硬盤I/O是一個很大的瓶頸

不支持sql,無事務處理


1.4 非關係型數據庫的作用

NoSQL 並非要替代關係型數據庫,而是補全其能力短板 ,它以 “犧牲部分事務一致性” 為代價,換取高性能、高擴展和靈活性,成為海量數據、高併發、靈活結構場景的核心支撐 ,像Redis 這類鍵值型 NoSQL 常被用作緩存層,部署在 SQL 數據庫前方,緩存熱點數據以減輕 SQL 壓力、提升響應速度(如下圖)

【Redis 從入門到實戰:詳細講解 Redis 安裝配置、RDB/AOF 數據持久化方案、一主兩從同步部署,深入剖析哨兵模式工作原理與哨兵模式高可用全攻略】 - 指南_redis


二、Redis安裝

Redis(Remote Dictionary Server)是一款基於內存的高性能鍵值型非關係型數據庫,支持多種數據結構,兼具緩存、持久化、分佈式等核心能力,是互聯網架構中不可或缺的中間件
redis特點:豐富的數據結構,支持持久化、事務、主從

2.1 下載redis

Redis官網:https://redis.io/downloads/

root@redis:~# wget https://download.redis.io/releases/redis-6.2.7.tar.gz
root@redis:~# ls
redis-6.2.7.tar.gz
root@redis:~# mkdir -p /data/application
root@redis:~# tar xf redis-6.2.7.tar.gz -C /data/application
root@redis:~# mv /data/application/redis-6.2.7/ /data/application/redis
root@redis:~# ls /data/application/
redis
root@redis:~# cd /data/application/redis/
root@redis:/data/application/redis# apt -y install gcc make  #centos用yum -y install gcc make
root@redis:/data/application/redis# make  #這裏只需要編譯就行,redis自帶的有預編譯文件Makefile


2.2 修改redis.conf

root@redis:/data/application/redis# vim redis.conf     ---修改如下
bind 0.0.0.0          #允許所有人連接
daemonize yes               #開啓後台模式將no改為yes
port 6379                       #端口號
dir /data/application/redis/data  #本地數據庫存放持久化數據的目錄.redis的數據也會存到硬盤裏,開機的時候會讀硬盤的數據到內存
root@redis:/data/application/redis# mkdir /data/application/redis/data #創建存放數據的目錄


2.3 添加systemctl管理(可選)

root@redis:/data/application/redis# vim /lib/systemd/system/redis.service
[Unit]
Description=Redis
After=network.target  #在網絡服務啓動後啓動
[Service]
ExecStart=/data/application/redis/src/redis-server /data/application/redis/redis.conf  --daemonize no   # Redis 啓動命令及配置文件路徑
ExecStop=/data/application/redis/src/redis-cli -h 127.0.0.1 -p 6379   # 停止命令shutdown
[Install]
WantedBy=multi-user.target  #當系統以多用户方式(默認的運行級別)啓動時,這個服務需要被自動運行
root@redis:/data/application/redis# systemctl daemon-reload


2.4 啓動redis並測試

#啓動redis
root@redis:/data/application/redis# nohup src/redis-server redis.conf &   #啓動redis,如果做了上一步直接systemctl start redis
root@redis:/data/application/redis# netstat -tnlp   #redis默認監聽端口6379
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      1283/systemd-resolv
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1743/sshd
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      9520/redis-server 0
tcp6       0      0 :::21                   :::*                   LISTEN      1524/vsftpd
tcp6       0      0 :::22                   :::*                    LISTEN      1743/sshd
root@redis:/data/application/redis#
#測試
root@redis:/data/application/redis# src/redis-cli 
127.0.0.1:6379> ping  #ping pong成功
PONG
127.0.0.1:6379> quit  #退出
root@redis:/data/application/redis#


2.5 redis重要目錄介紹

root@redis:/data/application/redis# tree -L 1 -l
.
├── 00-RELEASENOTES
├── BUGS
├── CONDUCT
├── CONTRIBUTING
├── COPYING
├── data  #存儲數據的目錄
├── deps
├── INSTALL
├── Makefile   #redis自帶的預編譯文件,所以redis只需要make
├── MANIFESTO
├── nohup.out  #用nohup啓動後會產生的日誌輸出文件
├── README.md
├── redis.conf  #redis主配置文件
├── runtest
├── runtest-cluster
├── runtest-moduleapi
├── runtest-sentinel
├── sentinel.conf   #哨兵模式配置文件,用於redis高可用部署
├── src   #存放編譯後的核心可執行文件
├── tests
├── TLS.md
└── utils


2.6 redis常用命令工具

src/redis-cli           #redis的客户端
src/redis-server        #redis的服務端
src/redis-check-aof     #用於修復出問題的AOF文件
src/redis-sentinel      #用於集羣管理


2.7 redis的簡單操作

root@redis:/data/application/redis# src/redis-cli 
127.0.0.1:6379> set name1 lisa  #字段賦值
OK
127.0.0.1:6379> get name1   #查詢字段
"lisa"
127.0.0.1:6379> set name2 tom
OK
127.0.0.1:6379> get name2
"tom"
127.0.0.1:6379> del name1  #刪除字段
(integer) 1
127.0.0.1:6379> get name1
(nil)
#EX和PX
127.0.0.1:6379> set name1 alan EX 5  # EX:設置後5秒內有效
OK
127.0.0.1:6379> get name1
"alan"
127.0.0.1:6379> get name1  #5秒過後該字段失效
(nil)
127.0.0.1:6379> set name3 lili PX 5000  # PX:設置後5000毫秒內有效
OK
127.0.0.1:6379> get name3
"lili"
127.0.0.1:6379> get name3   #5000毫秒後失效
(nil)
#NX和XX
127.0.0.1:6379> set class 101 NX  # NX:如果該字段不存在則生效
OK
127.0.0.1:6379> get class
"101"
127.0.0.1:6379> set class 102 NX  # 對已經存在的字段不生效
(nil)
127.0.0.1:6379> get class
"101"
127.0.0.1:6379> set class 103 XX  # XX:如果該字段存在則生效
OK
127.0.0.1:6379> get class
"103"
127.0.0.1:6379> set class1 104 XX  #如果該字段不存在則不生效
(nil)
127.0.0.1:6379> get class1
(nil)
127.0.0.1:6379>


三、 數據持久化

3.1 基本知識

3.1.1 什麼時數據持久化

數據持久化就是把數據保存到可永久保存的存儲設備中(如磁盤)

3.1.2 持久化的方式有哪些

redis提供了兩種持久化方式:RDBAOF

RDB:是在不同的時間點,將redis存儲的數據生成快照存儲到磁盤等介質上,RDB會啓動子進程,備份所有數據,當前進程,繼續提供數據的讀寫,當備份完成,才替換老的備份文件

AOF:將redis執行過的所有指令記錄下來,然後在下次重新啓動時只要把這些指令從前到後再重複執行一遍,就可以實現數據恢復

3.1.3 RDB和AOF特點

特性

RDB

AOF

數據持久化方式

週期性生成內存數據的快照

實時記錄所有寫操作指令

對寫入的影響

不影響數據寫入,快照生成時通過子進程處理,主進程繼續服務

可能輕微影響性能(需實時將指令寫入日誌)

恢復效率

高效,一次性加載整個快照文件還原所有數據

相對較低,需重新執行所有指令,指令越多恢復越慢

數據完整性

較差,故障時可能丟失最後一次快照到故障點之間的所有數據

較好

文件體積

較小(二進制壓縮存儲)

較大(記錄所有操作指令)

3.1.4 大部分企業用的哪種方法?

大部分企業採用RDB+AOF 的混合持久化方案,在這種情況下,如果redis重啓,則會優先採用AOF方式來進行數據恢復


3.2 RDB實戰

3.2.1 配置RDB

RDB默認開啓狀態

root@redis:/data/application/redis# pkill redis
root@redis:/data/application/redis# vim redis.conf  #修改如下
dbfilename dump.rdb  #dbfilename:持久化數據存儲在本地的文件
dir /data/application/redis/data
save 900 1  #若在900秒內發生了 至少 1 次寫操作,則觸發 RDB 快照
save 300 10  #若在300 秒內發生了 至少 10 次寫操作,則觸發 RDB 快照
save 60 10000   #若在60秒內發生了 至少 10000 次寫操作,則觸發 RDB 快照
stop-writes-on-bgsave-error yes  #持久化如果出錯則停止備份,no表明忽略錯誤繼續寫文件  
rdbcompression yes   #壓縮備份文件,壓縮會額外消耗cpu但網絡傳輸時間變短
root@redis:/data/application/redis# nohup src/redis-server redis.conf & #啓動redis

到此rdb模式就配置好了,只要觸發條件,data目錄下就會有持久化文件
注:每次快照持久化都是將內存數據完整寫入到磁盤一次,如果數據量大的話,而且寫操作比較多,會引起大量的磁盤I/O,可能會嚴重影響性能

3.2.2 擴展:備份文件導入另一台數據

有的時候我們需要遷移redis,需要導入數據

root@redis:/data/application/redis# src/redis-cli
127.0.0.1:6379> bgsave   #手動備份
127.0.0.1:6379> quit
root@redis:/data/application/redis# ls data/  
dump.rdb
#將備份文件導入另一台redis,這裏我提前準備好了另一台配置一模一樣的redis,
root@redis:~# scp -P 22 /data/application/redis/data/dump.rdb 192.168.136.135:/data/application/redis/data/   #只要把備份文件傳送到對方存儲數據目錄下,啓動redis即可導入成功
#第二台redis
root@4:/data/application/redis# nohup src/redis-server redis.conf &  #啓動
root@4:/data/application/redis# src/redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> get name2  #數據同步成功
"tom"
127.0.0.1:6379> get class
"103"


3.3 AOF實戰

AOF默認不開啓

root@redis:~# vim /data/application/redis/redis.conf #修改配置文件
appendonly yes #開啓aof
appendfilename appendonly.aof  #指定aof文件名稱
appendfsync everysec  #每秒同步一次,這裏有三個參數:always,everysec,no
root@redis:~# systemctl start redis
root@redis:~# ls /data/application/redis/data/  #產生備份文件
appendonly.aof  dump.rdb


四、Redis主從同步

4.1 主從同步簡介

redis主從結構,一是為了純粹的冗餘備份,二是為了提升讀性能,很消耗性能的操作就可以由從服務器來處理,比如redis的主從同步是異步進行的,這意味着主從同步不會影響主邏輯,也不會降低redis的處理性能。主從架構中,可以考慮關閉主服務器的數據持久化功能,只讓從服務器進行持久化,這樣可以提高主服務器的處理性能


4.2 主從同步原理

  • 同步觸發:從服務器主動向主服務器發送SYNC指令,請求數據同步
  • 主庫數據快照:主服務器接收指令後,立即調用 BGSAVE 生成子進程,專門將內存數據持久化為 RDB 文件;此期間主庫的所有寫指令會暫存於內存緩存,不影響正常服務
  • RDB 文件傳輸與加載BGSAVE 完成後,主服務器將 RDB 文件發送給從服務器;從服務器接收後先寫入磁盤,再加載至內存,實現基礎數據對齊
  • 增量指令同步RDB 加載完成後,主服務器將快照期間緩存的寫指令,以 Redis 協議格式同步給從服務器,確保數據完全一致

此外,主服務器具備“請求合併”優化:若多個從服務器同時發送 SYNC 指令,主服務器僅執行一次 BGSAVE,再將同一 RDB 文件分發給所有從庫,避免資源浪費


4.3 一主兩從實戰

4.3.1 環境介紹

首先準備三台已經安裝好redis的機器

主機名

IP地址

服務

安裝目錄

redis-master

192.168.136.10

redis6.2.7

/data/application/

redis-slave1

192.168.136.134

redis6.2.7

/data/application/

redis-slave2

192.168.136.135

redis6.2.7

/data/application/

4.3.2 主數據庫配置

[root@redis-master redis]# vim redis.conf 
protected-mode no #將加密保護關閉,因為我沒有設置密碼,所以我這裏把它關掉
[root@redis-master redis]# nohup src/redis-server redis.conf &  #後台啓動redis

4.3.3 從數據庫配置

#slave1配置
root@redis-slave1:~# cd /data/application/redis/
root@redis-slave1:/data/application/redis# vim redis.conf #添加一行
replicaof 192.168.136.10 6379 #配置主數據庫ip加端口
root@redis-slave1:/data/application/redis# nohup src/redis-server redis.conf &  #後台啓動redis
#slave2配置
root@redis-slave2:~# cd /data/application/redis/
root@redis-slave2:/data/application/redis# vim redis.conf #添加一行
replicaof 192.168.136.10 6379 #配置主數據庫ip加端口
root@redis-slave2:/data/application/redis# nohup src/redis-server redis.conf &  #後台啓動redis

4.3.4 測試主從同步

[root@redis-master redis]# src/redis-cli  #登錄主數據庫
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> info replication   #查看主從狀態
# Replication
role:master
connected_slaves:2   #表示
slave0:ip=192.168.136.134,port=6379,state=online,offset=266,lag=1
slave1:ip=192.168.136.135,port=6379,state=online,offset=266,lag=0
master_failover_state:no-failover
master_replid:2386e5eaeb2387a62a11a84b98eb737ed3fdddb6
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:266
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:266
127.0.0.1:6379> set Name alan  #新建測試數據
OK
127.0.0.1:6379> get Name
"alan"
127.0.0.1:6379>
#salve1查看是否同步
root@redis-slave1:/data/application/redis# src/redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> get Name  #同步成功
"alan"
#salve2查看是否同步
root@redis-slave2:/data/application/redis# src/redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> get Name  #同步成功
"alan"


五、Redis高可用–哨兵模式

5.1 高可用–哨兵模式簡介

Redis 自帶的 Sentinel(哨兵)工具用於監控集羣中主節點狀態。當主節點異常時,哨兵會自動執行主從切換:將一個從節點升級為新主節點,原主節點降級為從節點,同時自動更新哨兵配置(sentinel.conf)中的監控目標


5.2 哨兵模式工作原理

  • 每個哨兵以每秒鐘一次的頻率向它所知的Master,Slave以及其他 哨兵 實例發送一個 PING 命令
  • 如果一個實例距離最後一次有效回覆 PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 則這個實例會被哨兵標記為主觀下線
  • 如果一個Master被標記為主觀下線,則正在監視這個Master的所有 哨兵 要以每秒一次的頻率確認Master的確進入了主觀下線狀態
  • 當有足夠數量的 哨兵(大於等於配置文件指定的值)在指定的時間範圍內確認Master的確進入了主觀下線狀態, 則Master會被標記為客觀下線
  • 主從切換,這時從節點會通過選舉來成為主節點


5.3 哨兵模式實戰

5.3.1 環境介紹

首先準備三台已經安裝好redis的機器,哨兵模式的前提是要做主從同步,不然,當主節點故障自動切換到從節點後,從節點沒有同步主節點的數據,這樣的切換沒有意義

主機名

IP地址

服務

安裝目錄

redis-master

192.168.136.10

redis6.2.7

/data/application/

redis-slave1

192.168.136.134

redis6.2.7

/data/application/

redis-slave2

192.168.136.135

redis6.2.7

/data/application/

注:配置redis時redis.conf文件設置:bind 0.0.0.0

5.3.2 主數據庫配置

[root@redis-master redis]# vim sentinel.conf
sentinel monitor mymaster 127.0.0.1 6379 2 #當集羣中有2個sentinel認為master死了時,才能真正認為該master已經不可用了
sentinel down-after-milliseconds mymaster 3000   #單位毫秒
#若sentinel在該配置值內未能完成failover(故障轉移)操作(即故障時master/slave自動切換),則認為本次failover失敗。
sentinel failover-timeout mymaster 10000
protected-mode no #如果redis沒有設置密碼,可以把這個加密模式關掉
[root@redis-master redis]# nohup src/redis-server redis.conf &  #後台啓動redis
[root@redis-master redis]# nohup src/redis-sentinel sentinel.conf & #啓動哨兵模式

5.3.3 從數據庫配置

#slave1配置
root@redis-slave1:/data/application/redis# vim sentinel.conf 
sentinel monitor mymaster 192.168.136.10 6379 2 #slave上面寫的是master的ip
sentinel down-after-milliseconds mymaster 3000   #單位毫秒
#若sentinel在該配置值內未能完成failover(故障轉移)操作(即故障時master/slave自動切換),則認為本次failover失敗。
sentinel failover-timeout mymaster 10000
protected-mode no #如果redis沒有設置密碼,可以把這個加密模式關掉
root@redis-slave2:/data/application/redis# nohup src/redis-server redis.conf &  #後台啓動redis
root@redis-slave1:/data/application/redis# nohup src/redis-sentinel sentinel.conf &
#slave2配置
root@redis-slave2:/data/application/redis# vim sentinel.conf 
sentinel monitor mymaster 192.168.136.10 6379 2 #slave上面寫的是master的ip
sentinel down-after-milliseconds mymaster 3000   #單位毫秒
#若sentinel在該配置值內未能完成failover(故障轉移)操作(即故障時master/slave自動切換),則認為本次failover失敗。
sentinel failover-timeout mymaster 10000
protected-mode no #如果redis沒有設置密碼,可以把這個加密模式關掉
root@redis-slave2:/data/application/redis# nohup src/redis-server redis.conf &  #後台啓動redis
root@redis-slave2:/data/application/redis# nohup src/redis-sentinel sentinel.conf &

5.3.4 測試主從同步

#驗證主從同步
[root@redis-master redis]# src/redis-cli  #master創建測試數據
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set addr china
OK
127.0.0.1:6379> get addr
"china"
127.0.0.1:6379> quit
root@redis-slave1:/data/application/redis# src/redis-cli  
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> get addr  #slave1同步成功
"china"
root@redis-slave2:/data/application/redis# src/redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> get addr  #slave2同步成功
"china"

5.3.5 測試高可用

#停掉master服務,看是否有高可用效果
[root@redis-master redis]# ps aux | grep redis
root      23562  0.1  0.2 165080  9508 ?        Ssl  15:10   0:00 src/redis-server 0.0.0.0:6379
root      23789  0.3  0.2 162520 10388 pts/1    Sl   15:15   0:00 src/redis-sentinel *:26379 [sentinel]
root      23960  0.0  0.0 112824   988 pts/1    S+   15:18   0:00 grep --color=auto redis
[root@redis-master redis]# kill 23562  #kill掉server,別把kill掉了
[root@redis-master redis]# ps aux | grep redis
root      23789  0.3  0.2 162520 10488 pts/1    Sl   15:15   0:00 src/redis-sentinel *:26379 [sentinel]
root      23986  0.0  0.0 112824   988 pts/1    S+   15:18   0:00 grep --color=auto redis
[root@redis-master redis]#
#查看slave1或slave2
root@redis-slave1:/data/application/redis# src/redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> info replication  #查看slave1的主從情況,可見此時slave1選舉成為主節點
# Replication
role:master
connected_slaves:1   #表示有一個從節點是192.168.136.135
slave0:ip=192.168.136.135,port=6379,state=online,offset=567315,lag=1
master_failover_state:no-failover
master_replid:05b52bddd888820c8be743d1b6ee00685f81e47e
master_replid2:63aedef95111d7ff5361dd643e4867862a0cd5fc
master_repl_offset:567474
second_repl_offset:51891
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:567474
127.0.0.1:6379>
#驗證主從同步
root@redis-slave1:/data/application/redis# src/redis-cli   
127.0.0.1:6379> set name lisa   #slave1創建測試數據
OK
127.0.0.1:6379> get name
"lisa"
127.0.0.1:6379>
root@redis-slave2:/data/application/redis# src/redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> get name  #slave2同步成功
"lisa"
127.0.0.1:6379>



注:
文中若有疏漏,歡迎大家指正賜教。
本文為100%原創,轉載請務必標註原創作者,尊重勞動成果。
求贊、求關注、求評論!你的支持是我更新的最大動力,評論區等你~