日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Redis主从原理+哨兵模式

發布時間:2024/1/18 数据库 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Redis主从原理+哨兵模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、主從復制原理
    • 1、如果在主從傳輸過程中,從節點掛了怎么辦?
    • 2.什么是主從復制風暴?
    • 3.主從復制優缺點
      • 1.優點
      • 2.缺點
  • 二、Redis項目部署
    • 1. 項目拓撲圖
    • 2.環境
      • 1.安裝redis
      • 2.配置Redis主從復制服務
    • 3.模擬主服務器掛掉后
  • 三、哨兵模式原理
    • 1.哨兵的主要作用
      • 1.現象
      • 2.原因
    • 2.哨兵部署流程
      • 1.模擬主服務器出現問題down下來,查看從服務器狀態變化
      • 2.查看之前配置的哨兵檢測的主服務器地址情況
      • 3.查看當原master服務器恢復上線時,狀態變化

一、主從復制原理


①:從服務器slave先于主服務器master建立socket長連接
②:從服務器slave向主服務器master發送一個PSYNC命令,請求復制數據。
③:主服務器master接收到PSYNC命令后,會通過bgsave命令利用子線程生成最新的rdb快照文件,并發送給從服務器slave。
持久化期間,master會繼續接收客戶端的請求,它會把這些可能修改數據集的請求緩存在內存repl buffer中
④:slave清掉無用數據,并接受master傳來的數據加載到內存中
⑤:master再將之前持久化時緩存在內存中的命令發送給slave。
⑥:slave接受master發過來的新命令并執行
⑦:此時數據已同步完畢,當master再有新的寫操作,會通過socket長連接持續的發給slave,保證主從數據一致性!
注意: 如果master收到了多個slave并發連接請求,它只會進行一次持久化,而不是一個連接一次,然后再把這一份持久化的數據發送給多個并發連接的slave。

1、如果在主從傳輸過程中,從節點掛了怎么辦?

當salve因為網絡等原因接收到一半數據時掛掉了,經過一段時間后,人為的重啟了salve從節點,那么此時的數據傳輸是怎么處理呢?
答:從redis2.8版本開始,redis改用可以支持部分數據復制的命令PSYNC去master同步數據,slave與master能夠在網絡連接斷開重連后只進行部分數據復制(斷點續傳)。流程圖如下:

①:首先redis在運行時會默認開啟一個緩存池,用于緩存最近的redis命令,可以在6379.conf中配置
repl-backlog-size 1mb ####redis命令緩存池,默認大小為1Mb
②:當slave與master斷開并重新建立連接時,slave會向master發送PSYNC命令,并通過offset偏移量定位到斷開連接時傳輸數據的位置,從這個位置開始進行斷點續傳
③:如果slave節點斷開時間太久,導致偏移量太舊,已經在master中的命令緩存池中找不到對應的位置,那么就會進行一次全量數據的復制。無法使用斷點續傳了!

2.什么是主從復制風暴?

主從復制風暴:多個從節點同時復制主節點導致主節點壓力過大
為了解決主從復制風暴問題,可以讓部分從節點與從節點同步數據,架構如下設計:

3.主從復制優缺點

1.優點

2.缺點

二、Redis項目部署

1. 項目拓撲圖

2.環境

一臺主服務器 master :192.168.1.10 兩臺備服務器 slave1 :192.168.1.11slave2 :192.168.1.12

1.安裝redis

主備服務器都需安裝
通過xshell文件傳輸redis安裝包

1.解壓縮

[root@master ~]# tar zxvf redis-5.0.4.tar.gz [root@master ~]# cd redis-5.0.4/ [root@master redis-5.0.4]# make 配置安裝 [root@master redis-5.0.4]# make DREFIX=/usr/local/redis install 更改安裝路徑可以用make PREFIX=安裝路徑 install [root@master redis-5.0.4]# cd

2.創建鏈接

[root@master ~]# ln -s /usr/local/redis/bin/* /usr/local/bin/ [root@master ~]# cd redis-5.0.4/utils/ [root@master utils]# ls -lh 查看安裝腳本 [root@master utils]# ./install_server.sh 運行腳本 [root@master utils]# netstat -anpt | grep redis 查看端口狀態


提示安裝成功后,表示Redis的基礎配置完成

2.配置Redis主從復制服務

在主master服務器上

[root@master utils]# cd [root@master ~]# vi /etc/redis/6379.conf [root@master ~]# /etc/init.d/redis_6379 stop #服務關閉 [root@master ~]# /etc/init.d/redis_6379 start #服務開啟 修改添加 bind 0.0.0.0 修改監聽地址為0.0.0.0 daemonize yes 開啟守護進程 logfile /var/log/redis_6379.log 修改日志文件目錄 dir /var/lib/redis/6379 修改工作目錄 appendonly yes 開啟AOF持久化功能






在備1、2上編輯配置

[root@slave1 utils]# vi /etc/redis/6379.conf [root@slave1 utils]# /etc/init.d/redis_6379 restart 服務重啟 修改添加 bind 0.0.0.0 修改監聽地址為0.0.0.0 appendonly yes 開啟AOF持久化功能 replicaof 192.168.1.10 6379 增加一個同步master節點IP和端口




在master服務器上查看
驗證主從效果

[root@master ~]# tail -f /var/log/redis_6379.log


備2服務器同上

測試主從數據復制功能
在master主服務器上

[root@master ~]# redis-cli #進入數據庫 127.0.0.1:6379> set fa a #設置fa鍵得值為a 127.0.0.1:6379> get fa #查看fa鍵得值 127.0.0.1:6379> info replication #信息復制,狀態信息


在備1服務器上

[root@slave1 ~]# redis-cli #進入數據庫 127.0.0.1:6379> get fa #獲取fa鍵得值 127.0.0.1:6379> info replication #信息復制,狀態信息


在備2服務器上

// An highlighted block var foo = 'bar';

3.模擬主服務器掛掉后

在master主服務器上,關閉服務

[root@master ~]# /etc/init.d/redis_6379 stop 關閉服務 [root@master ~]# tail -f /var/log/redis_6379.log 查看日志


在備1服務器查看現象

[root@slave1 ~]# tail -f /var/log/redis_6379.log 查看日志 [root@slave1 ~]# redis-cli 進入數據庫 127.0.0.1:6379> get k 獲取k的鍵值 "aa" 127.0.0.1:6379> info replication 信息復制,狀態信息 # Replication role:slave 狀態:從服務器 master_host:192.168.1.10


在備2服務器上

可以看到把主服務器關閉后,從服務器的狀態不會轉化成主服務器,但數據會復制轉移過來,是可以讀取查看到的

解決辦法:
通過哨兵功能可以實現在主服務器失效時,主從的狀態自動轉換

先恢復到之前狀態
master上
恢復上線

[root@master ~]# /etc/init.d/redis_6379 start 服務啟動 [root@master ~]# tail -f /var/log/redis_6379.log 查看日志 [root@master ~]# redis-cli 進入數據庫 127.0.0.1:6379> info replication 信息復制,狀態查看 # Replication role:master 主服務 connected_slaves:2 連接2個服務器 slave0:ip=192.168.1.11,port=6379,state=online,offset=84,lag=1 slave1:ip=192.168.1.12,port=6379,state=online,offset=84,lag=0 master_replid:087088c1aa398b11c1e4759e93eb8abb6bc277e2 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:84 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:84 127.0.0.1:6379> set nb b 添加nb鍵值為b OK 127.0.0.1:6379> get nb 獲取nb的鍵值 "b"


在備1服務器上

[root@slave1 ~]# tail -f /var/log/redis_6379.log #查看日志 [root@slave1 ~]# redis-cli

三、哨兵模式原理

  • sentinel哨兵是特殊的redis服務,不提供讀寫服務,主要用來監控redis實例節點的狀態!
  • 哨兵架構下client端第一次請求redis服務時,會先從哨兵找出redis的主節點,后續就直接訪問redis的主節點,不會每次都通過sentinel代理訪問redis的主節點,當redis的主節點發生變化,哨兵會第一時間感知到,并且將新的redis主節點通知給client端(這里面redis的client端一般都實現了訂閱功能,訂閱sentinel發布的節點變動消息)

1.哨兵的主要作用

1.現象

當master節點掛掉后,服務端控制臺會打印 連接超時錯誤,當過一段時間后,又恢復正常,可以繼續向redis中寫入數據!

2.原因

  • 原因就是哨兵會時刻監視著master節點,當master節點掛掉,此時服務端控制臺會打印連接超時錯誤。但同時哨兵經過半數機制確認master掛掉,會選舉出一個slave作為新的master
  • 選舉的這頓時間內,控制臺還是會打印錯誤,一旦選舉成功,就會恢復正常連接,這也是出現以上現象的原因!!
  • 當原來掛掉的master節點重新恢復時,將自動稱為新的master的叢節點,完成哨兵高可用架構!

哨兵要設為奇數,最少三臺,里面涉及到投票問題!!

2.哨兵部署流程

在master服務器上
編輯哨兵模式的配置文件

[root@master ~]# vi redis-5.0.4/sentinel.conf 修改添加 protected-mode no 關閉安全模式 daemonize yes 指定sentine1為后臺啟動,開啟守護進程 logfile "/var/log/sentinel.log" 指定日志存放路徑 dir /var/lib/redis/6379 指定數據庫存放路徑sentinel monitor mymaster 192.168.1.10 6379 2 指定幾個哨兵(slave)檢測主服務器故障,才會進行故障遷移(主服務器ip地址,端口號,slave數)sentinel down-after-milliseconds mymaster 3000 判定服務器down掉的時間周期,默認30000毫秒(30秒)sentinel failover-timeout mymaster 100000 故障節點的最大超時時間為100000毫秒(100秒)





拷貝文件到slave1,slave2上

[root@master ~]# scp redis-5.0.4/sentinel.conf root@192.168.1.11:/root/redis-5.0.4 [root@master ~]# scp redis-5.0.4/sentinel.conf root@192.168.1.12:/root/redis-5.0.4


啟動哨兵模式
先啟master服務器,后啟slave服務器

[root@master ~]# redis-sentinel redis-5.0.4/sentinel.conf & [1] 69742 [root@slave1 ~]# redis-sentinel redis-5.0.4/sentinel.conf & [1] 62685 [root@slave2 ~]# redis-sentinel redis-5.0.4/sentinel.conf & [1] 62250

在master服務器上
1.查看日志

[root@master ~]# tail -f /var/log/sentinel.log

2.查看進程狀態

[root@master ~]# ps aux | grep redis [root@master ~]# ps aux | grep sentinel


表明哨兵服務已經啟動
3.遠程登錄數據庫查看哨兵狀態

[root@master ~]# redis-cli -h 192.168.1.10 -p 26379 info sentinel [root@master ~]# redis-cli -h 192.168.1.10 -p 6379 info replication

1.模擬主服務器出現問題down下來,查看從服務器狀態變化

在master服務器上

[root@master ~]# /etc/init.d/redis_6379 stop 停止服務 [root@master ~]# ps aux | grep redis 查看進程狀態


在從服務器上進行日志查看

[root@slave1 ~]# tail -f /var/log/sentinel.log

發現master狀態轉移到從備1上

在slave2查看遠程登錄查看哨兵信息

[root@slave2 ~]# redis-cli -h 192.168.1.11 -p 26379 info sentinel

2.查看之前配置的哨兵檢測的主服務器地址情況

在備1服務器上

[root@slave1 ~]# vi redis-5.0.4/sentinel.conf


在主服務器上

發現的配置地址變化,在自動切換主狀態時也會自動變更檢測地址

3.查看當原master服務器恢復上線時,狀態變化

在master服務器上

[root@master ~]# /etc/init.d/redis_6379 start 服務啟動 [root@master ~]# ps aux | grep redis 查看進程端口狀態 [root@master ~]# tail -f /var/log/sentinel.log 查看日志文件

在slave2上
查看數據庫哨兵狀態

[root@slave2 ~]# redis-cli -h 192.168.1.11 -p 26379 info sentinel

發現在原主服務器出現上線后,master狀態并不會再次轉換重新到自己上,這一點不同于vrrp服務,原因vrrp有優先級設置,此處服務沒有。

總結

以上是生活随笔為你收集整理的Redis主从原理+哨兵模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。