成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

從單點 Redis 到 1 主 2 從 3 哨兵的架構演進之路

數據庫 Redis
本篇講解了在真實的多臺服務器上如何部署 Redis 主從架構、哨兵集群,以及驗證主從復制和故障轉移。然后對項目中使用 Redis 的地方,加入了哨兵配置,使其可以自動感知主從切換后的 IP 變化,從而和新的 Redis 主節點進行連接。

?一、前言

我們有個項目中用的 MySQL、Redis、ES、微服務都是單節點部署的,沒有做集群模式部署,為了提高整體的可用性,對項目的部署架構進行了升級,支持高可用。

通過本篇,你可以學到以下內容:

  • Redis真實的多服務器部署實戰
  • Redis真實的主從模式部署實戰。
  • Redis真實的哨兵集群模式部署實戰。
  • Redis 主節點宕機后,Redis 哨兵如何進行故障轉移的。
  • Redis 切換主節點后,客戶端如何自動感知并連接新的主節點。

二、部署拓撲圖

我們項目的測試環境 12 臺服務器已經部署好了,其中三臺用來部署 Redis 的 一主 + 兩從 + 三哨兵的服務器。服務器資源清單如下:

圖片

另外 Redis 的端口都是 6379,Sentinel(哨兵) 的端口都是 26379。

部署的拓撲圖如下,三臺服務器上都部署了一個哨兵。

圖片

三、搭建 Redis 一主兩從

我們原來的單點的服務器上是有運行的 Redis 容器的,把這個容器的鏡像打包備份下,然后拷貝和還原到新的服務器上就好了。

搭建 Redis 一主兩從的步驟如下:

  • 拷貝和還原 Redis 鏡像到三臺服務器上。
  • 其中一臺服務器作為主節點,配置文件為主節點的,用 docker 啟動 Redis 主節點。
  • 另外兩臺服務器作為從節點,配置文件為從節點的,用 docker 啟動兩個 Redis 從節點。
  • 進入到主節點和從節點容器中,查看主從復制狀態。

1.備份和還原 Redis 鏡像

打包測試環境的 Redis 鏡像,這個命令會將服務器上 redis 鏡像打包成 tar 包,這樣我們就方便拷貝到其他服務器上了。執行打包鏡像命令:

sudo docker save -o redis.tar redis:0.1

因為保存的 tar 包權限不夠,所以設置下權限為 777。執行修改權限的命令:

sudo chmod 777 redis.tar

將這個 tar 包拷貝新環境的三臺服務器上。執行導入鏡像的命令:

sudo docker load -i redis.tar

添加配置文件 redis.conf 放在本地,作為 redis 容器的配置文件。這個文件也可以在 redis 官網下載 https://redis.io/。redis.conf 文件放到 /home/redis 目錄下。

sudo mkdir /home/redis

2.主節點配置

修改本地的 redis.conf 文件:

requirepass abc123
masterauth abc123

requirepass 和 masterauth:對于數據比較重要的節點,主節點會通過設置requirepass參數進行密碼 驗證,這時所有的客戶端訪問必須使用auth命令實行校驗。從節點與主節點 的復制連接是通過一個特殊標識的客戶端來完成,因此需要配置從節點的 masterauth參數與主節點密碼保持一致,這樣從節點才可以正確地連接到主 節點并發起復制流程。

3.從節點配置

slave-read-only yes
requirepass abc123
masterauth abc123
slaveof 10.2.1.61 6379
1.4 啟動容器

4.啟動容器

需要注意的是需要映射本地文件夾。

sudo docker run -p 6379:6379 --restart=always --name redis \
-v /home/redis/redis.conf:/usr/local/etc/redis/redis.conf \
-v /home/redisdata:/data/ \
-d 301

-v 代表映射的文件或文件夾,這里映射了 redis.conf 文件和 data 目錄。data 目錄會存放 Redis 的 AOF? 和 RDB 持久化文件。

-d 表示后臺運行,46b 代表鏡像 id。因為我們服務器是沒有外網的,所以用的是本地鏡像啟動的,如果你的服務器有外網,完全可以用官網的 redis 鏡像啟動。

5.查看 Redis 狀態

進入容器,連接 redis,node1的 redis 密碼是 abc123。

# 查詢容器 id
docker ps

# 進入 mysql 容器
docker exec -it <容器 id> /bin/bash

# 連接 redis
redis-cli -h localhost -p 6379 -a abc123

# 查看復制信息
info replication

只啟動 node1 時查看 redis 復制信息

圖片

可以看到 role:master 信息,代表當前節點作為主節點。

connected_slaves:0 代表連接的從節點為 0 個。

當三個節點的 redis 容器都啟動后,再次查看主節點的復制信息。發現有 connected_slaves:2 有兩個從節點連上了。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-QPHj8Ohi-1654673955923)(../../images/image-20220608111236463.png)]

然后我們進入到從節點容器,查看從節點的復制信息。

發現 role:slave,說明此節點作為從節點。

master_host:10.2.1.61,說明了主節點的 IP 是 10.2.1.61。

圖片

6.測試主從復制

我們可以用 Redis Desktop 工具測試主從數據是否一致。在主節點中寫入 abc=當前時間,發現另外兩個從節點也同步了這個數據,說明主從復制成功。

圖片

四、搭建哨兵集群

1.哨兵集群拓撲圖

三臺機器上分別部署三個哨兵服務。部署拓撲圖如下所示:

圖片

2.哨兵服務是怎么啟動的

其實哨兵服務也是用 Redis 容器啟動的,只是用的不同命令的啟動的。

我們可以在 redis 容器中執行如下命令啟動哨兵服務。

redis-sentinel /usr/local/etc/redis/sentinel.conf

因為我們是通過 docker 啟動的,所以在啟動 docker 容器時,帶上這個命令參數就可以啟動哨兵服務了,就不用到容器里面執行這個命令了。

3.哨兵配置

首先創建兩個映射文件:sentinel.conf 和 sentinel-26379.log,第一個是配置哨兵參數的,第二個文件是哨兵的日志文件,這兩個文件都會在啟動 redis 容器時,映射到容器中,方便我們修改配置以及查看日志。

sentinel.conf 這個配置文件可以從官方的 redis 安裝包中拷貝,也可以自己創建一個配置文件,修改幾個參數就可以了。可以直接拷貝我的配置。

mkdir /home/redis
vim /home/redis/sentinel.conf

配置內容如下:

# sentile 端口
port 26379
# 是否在后臺啟動,默認為 no,注意這里需要設置為 no,否則容器啟動不起來。
daemonize no
pidfile /var/run/redis-sentinel.pid
# 日志文件
logfile /var/log/sentinel-26379.log
# 工作目錄
dir /tmp
# 監控 redis 的 IP 和端口,這里監控的 redis 的主節點
sentinel monitor mymaster 10.2.1.61 6379 2
# down-after-milliseconds:每個 Sentinel節點都要通過定期發送 ping 命令來判斷Redis數據節點和其 余Sentinel節點是否可達,如果超過了down-after-milliseconds配置的時間且沒 有有效的回復,則判定節點不可達,<times>(單位為毫秒)就是超時時 間。這個配置是對節點失敗判定的重要依據。對 Sentinel節點、主節點、從節點的失敗判定同時有效。
sentinel down-after-milliseconds mymaster 30000
# parallel-syncs 就是用來限制在一次故障轉移之后,每次向新的主節 點發起復制操作的從節點個數。
sentinel parallel-syncs mymaster 1
# 故障轉移超時時間
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
# 當 redis 主從復制配置了密碼的話,則需要在這里配置密碼
sentinel auth-pass mymaster WHredis2020!
  • daemonize:是否在后臺啟動,默認為 no,注意這里需要設置為 no,否則容器啟動不起來。
  • logfile:日志文件,哨兵監控和故障轉移的日志都會存到這個日志里面。
  • sentinel monitor mymaster:監控 redis 的 IP 和端口,這里監控的 redis 的主節點。
  • down-after-milliseconds:每個 Sentinel節點都要通過定期發送 ping 命令來判斷Redis數據節點和其 余Sentinel節點是否可達,如果超過了down-after-milliseconds配置的時間且沒 有有效的回復,則判定節點不可達,(單位為毫秒)就是超時時間。這個配置是對節點失敗判定的重要依據。對 Sentinel節點、主節點、從節點的失敗判定同時有效。
  • parallel-syncs:就是用來限制在一次故障轉移之后,每次向新的主節 點發起復制操作的從節點個數。
  • failover-timeout:故障轉移超時時間。
  • auth-pass:當 redis 主從復制配置了密碼的話,則需要在這里配置密碼。

首先在本地創建日志文件用來存放哨兵日志。

mkdir /home/redis/sentinel
vim /home/redis/sentinel/sentinel-26379.log

4.啟動哨兵容器

4.1 啟動一個 sentinel 容器

docker run --name mysentinel1 --restart=always -p 26379:26379 \
-v /home/redis/sentinel.conf:/usr/local/etc/redis/sentinel.conf \
-v /home/redis/sentinel/sentinel-26379.log:/var/log/sentinel-26379.log \
-d 9a2f \
redis-sentinel /usr/local/etc/redis/sentinel.conf
  • --name mysentinel1,指定哨兵容器的名稱為 mysentinel1。
  • --restart=always,重啟機器后,自動重啟容器。
  • -v,掛載哨兵配置文件和日志文件。

這里的 -d 9a2f 是 本地的 redis 容器 id,因為本機沒有網絡,所以這個鏡像是從其他有網絡的機器加載進來的。如果你們的機器有網絡,完全可以用 -d redis 參數替換,也就是使用最新的 redis 鏡像來啟動 sentinel。

查看啟動的容器,第一個是哨兵容器,名字是 mysentinel1?, 第二個是 redis 容器,名字是 redis。如下圖所示:

圖片

當在三臺服務器上分別啟動 Redis 哨兵后,查看哨兵日志文件 sentinel-26379.log。

圖片

打印出了 Redis 的當前版本(5.0.14),運行模式(哨兵模式),端口號 26379,哨兵 id,監控的 Redis 中的主節點,兩個 Redis 從節點和一個主節點的 IP 和 端口。

而且當我們去查看 Sentinel 配置文件時,發現配置文件中的內容發生了變化,在文件末尾追加了以下內容,含義就是 Sentinel 自動發現了其他 Redis 從節點

圖片

4.2 啟動第二個容器

執行以下命令啟動第二個容器:

docker run --name mysentinel2 --restart=always -p 26379:26379 \
-v /home/redis/sentinel.conf:/usr/local/etc/redis/sentinel.conf \
-v /home/redis/sentinel/sentinel-26379.log:/var/log/sentinel-26379.log \
-d 9a2f \
redis-sentinel /usr/local/etc/redis/sentinel.conf

圖片

4.3 啟動第三個容器

執行以下命令啟動第三個容器:

docker run --name mysentinel3 --restart=always -p 26379:26379 \
-v /home/redis/sentinel.conf:/usr/local/etc/redis/sentinel.conf \
-v /home/redis/sentinel/sentinel-26379.log:/var/log/sentinel-26379.log \
-d 9a2f \
redis-sentinel /usr/local/etc/redis/sentinel.conf

4.4 驗證 Redis 主從切換

停掉主節點的 redis 容器后,進入到第二個哨兵容器中,執行以下命令查看哨兵的狀態:

redis-cli -h 127.0.0.1 -p 26379 info Sentinel 

發現主節點的 IP 已經從 10.2.1.61 切換為從節點的 IP(10.2.1.63)了。

圖片

進入到第二個 redis 容器中,查看同步狀態。主節點的 IP 也是 10.2.1.63

圖片

查看第三個哨兵的日志,可以看到哨兵通過以下步驟進行了主從切換。

圖片

重要的步驟說明如下:

  • ①主觀宕機,+sdown 表示當前哨兵認為這個 Redis 節點(10.2.1.61)宕機了。
  • ②客觀宕機,+odown 表示有幾個哨兵認為這個 Redis 節點(10.2.1.61)宕機了。看到的 quorun 4/2,表示有 4 個哨兵認為 Redis 節點宕機了,大于設置的 2,所以這個 Redis 節點是真的宕機了。(這里為什么是 4,而不是哨兵數 3,筆者也沒有弄清楚,歡迎留言討論。)
  • ③投票選舉新的哨兵 Leader,三個哨兵都將票投給了 id = 2abxxx 的哨兵,也就是第三個哨兵節點,將由這個哨兵進行主從切換。
  • ④開始故障轉移,failover-state-select-slave 表示要轉移哪個故障節點。這里就是切換主節點。
  • ⑤選出主節點為第三個 Redis 節點(10.2.1.63)。
  • ⑥切換主節點為第三個 Redis 節點(10.2.1.63)。

說明哨兵集群模式下對 Redis 的狀態監控和主從切換成功。

五、客戶端自動感知故障

如何實現自動感知故障

我們項目中,都是用 Redis 客戶端去讀寫 Redis,在單機情況下,單節點 Redis 宕機后,客戶端肯定會報錯,我們可以嘗試恢復這個服務器上的 Redis 就好了。

但是我們現在是有多個 Redis 節點的,應用程序該如何配置呢?

可能的思路是這樣:應用程序配置主節點的 IP 地址和端口。缺點:主節點切換后,需要改配置并重啟應用。

那有沒有一種方案是自動感知到 Redis 宕機后,連接到新的主節點的呢?

有的,我們加下 Redis 的哨兵配置就可以了。配置內容如下所示:

spring:
redis:
database: 0
password: abc123 # 密碼(默認為空)
timeout: 10000 # 連接超時時長(毫秒)
sentinel: #哨兵模式
master: mymaster #主服務器所在集群名稱
nodes: 10.2.1.63:26379,10.2.1.62:26379,10.2.1.61:26379

配置好了后,重啟應用程序,然后停掉 Redis 主節點的容器。測試往 redis 寫入數據,程序會報錯。

寫入數據的代碼:

stringRedisTemplate.opsForValue()
.setIfAbsent(key, toJson(value),
millisecond, TimeUnit.MILLISECONDS);

報錯信息如下:

nested exception is redis.clients
.jedis.exceptions.JedisConnectionException:
Unexpected end of stream.

因為故障轉移是需要一定時間的,過幾秒后后發現控制臺窗口打印出 Redis 的主節點為 10.2.1.63:6379,說明故障轉移成功了。

圖片

[MasterListener-mymaster-[10.2.1.61:26379]] 
INFO redis.clients.jedis.JedisSentinelPool
-Created JedisPool to master at
10.2.1.63:6379

再次測試讀寫 Redis,都是正常的,且往第三個節點寫入數據后,第二個節點也進行了主從復制。

客戶端自動感知的原理

我們項目中用的 Jedis 客戶端,它有一個連接池 JedisPool,當訪問 Redis 時,會從連接池里面獲取一個連接。我們看下這個連接池里面的信息。如下圖所示:

圖片

  • masterListeners 代表對三個 Redis 節點的監聽器。里面指定了 Redis 節點的 IP 和 Port。
  • currentHostMaster 代表當前連接的主節點。目前為第三個節點。

當我們停掉 Redis 主節點后,哨兵會切換主節點,這個連接池里面的 currentHostMaster 也會被更新為新的主節點。當我們再次訪問 Redis 時,會和新的主節點建立連接。

六、遇到的問題

1.提示不能寫只讀的 redis 節點

READONLY You can't write against a read only replica.;

解決方案:每個哨兵都需要配置成監控主節點 node1 的 IP。

2.提示連接 Redis 失敗

ERR Client sent AUTH, but no password is set

解決方案:主從節點都需要配置 requirepass  和 masterauth。

七、總結

本篇講解了在真實的多臺服務器上如何部署 Redis 主從架構、哨兵集群,以及驗證主從復制和故障轉移。

然后對項目中使用 Redis 的地方,加入了哨兵配置,使其可以自動感知主從切換后的 IP 變化,從而和新的 Redis 主節點進行連接。

責任編輯:武曉燕 來源: 悟空聊架構
相關推薦

2022-06-02 08:37:10

架構DDDMVC

2017-10-30 09:09:41

2024-05-16 07:51:55

分布式系統架構

2025-03-04 09:02:25

JavaSPI機制

2015-04-07 11:05:15

VMwareOpenStack

2025-02-20 08:24:41

2022-06-21 10:10:14

HTTP協議TCP

2022-07-01 08:26:22

區塊鏈去中心化以太坊

2022-05-09 08:35:43

面試產品互聯網

2023-08-28 16:10:00

容器化DockerKubernetes

2019-04-25 14:16:37

主數據工業4.0物聯網

2020-05-08 11:42:24

JavaScript編程語言技術

2021-06-30 15:25:13

操作系統Java

2021-07-01 11:56:35

操作系統Java IO

2019-07-18 11:55:53

架構運維技術

2021-04-29 19:07:33

Redis演進微服務

2014-11-06 13:35:03

負載均衡應用交付

2024-06-14 08:19:45

2024-11-29 08:40:34

2011-04-01 09:29:52

MySQLMongoDB
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 999久久久久久久 | 午夜精品久久久久久久久久久久 | 麻豆天堂| 国产精品乱码一区二区三区 | 成人国产精品免费观看视频 | 高清国产午夜精品久久久久久 | 自拍偷拍亚洲欧美 | 九九亚洲| 免费观看成人鲁鲁鲁鲁鲁视频 | 欧美一级大黄 | 精品自拍视频在线观看 | 国产亚洲一区二区三区 | 国产欧美日韩一区二区三区在线观看 | av网址在线| 免费观看羞羞视频网站 | 精品成人在线观看 | 在线免费av电影 | 日日干日日色 | 国产我和子的乱视频网站 | 91极品尤物在线播放国产 | 久久久综合久久 | 自拍偷拍在线视频 | 狠狠干天天干 | 精品91久久 | 在线免费观看视频黄 | 国产高清精品一区二区三区 | 国产97久久 | 日本激情一区二区 | 亚洲一二三区精品 | 蜜桃官网 | 91网站在线看 | 亚洲成年在线 | 在线免费视频一区 | av男人的天堂在线 | 操网站 | 国产综合av| 毛片一区二区三区 | 91精品久久久久久久久中文字幕 | 久草久 | 欧美日本韩国一区二区 | 一级a毛片 |