提示:本文原創作品,良心製作,乾貨為主,簡潔清晰,一看就會
文章目錄
- 一、非關係型數據庫
- 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(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提供了兩種持久化方式:RDB和AOF
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%原創,轉載請務必標註原創作者,尊重勞動成果。
求贊、求關注、求評論!你的支持是我更新的最大動力,評論區等你~