偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Redis哨兵集群原理講解和Docker-compose安裝Redis哨兵集群

數(shù)據(jù)庫 Redis
當(dāng)master節(jié)點宕機(jī)后,我們就不能寫數(shù)據(jù)到Redis,所以需要搭建一個三節(jié)點形成的Sentinel集群,來監(jiān)管之前的Redis主從集群

今日目標(biāo)

  • 掌握Docker-compose安裝Redis哨兵集群

單節(jié)點Redis的并發(fā)能力是有上限的,要進(jìn)一步提高Redis的并發(fā)能力,就需要搭建主從集群,實現(xiàn)讀寫分離

  • 主節(jié)點: 可以對Redis實現(xiàn)讀寫操作
  • 從節(jié)點: 只可以對Redis實現(xiàn)讀操作

但是,當(dāng)master節(jié)點宕機(jī)后,我們就不能寫數(shù)據(jù)到Redis,所以需要搭建一個三節(jié)點形成的Sentinel集群,來監(jiān)管之前的Redis主從集群

1.Redis哨兵

Redis提供了哨兵(Sentinel)機(jī)制來實現(xiàn)主從集群的自動故障恢復(fù)。

哨兵的結(jié)構(gòu)如圖:

圖片圖片

共包含6個節(jié)點,一個主兩個從和三個哨兵。這里我們會在同一臺虛擬機(jī)中開啟6個redis實例,模擬主從集群,信息如下:

IP

PORT

角色

192.168.150.102

6380

master

192.168.150.102

6381

slave

192.168.150.102

6382


slave

192.168.150.102

26379

sentinel

192.168.150.102

26380

sentinel

192.168.150.102

26381

sentinel

哨兵的作用如下:

  • 監(jiān)控:Sentinel 會不斷檢查您的master和slave是否按預(yù)期工作
  • 自動故障恢復(fù):如果master故障Sentinel會將一個slave提升為master。當(dāng)故障實例恢復(fù)后也以新的master為主
  • 通知:Sentinel充當(dāng)Redis客戶端的服務(wù)發(fā)現(xiàn)來源,當(dāng)集群發(fā)生故障轉(zhuǎn)移時會將最新信息推送給Redis的客戶端

2. 準(zhǔn)備實例和配置

要在同一臺虛擬機(jī)開啟6個實例,必須準(zhǔn)備6份不同的配置文件和目錄,配置文件所在目錄也就是工作目錄。 確保下面的配置已經(jīng)更改(位置也別錯)

# master
mkdir -p /redis-master-slave-sentinel/redis/master/config /redis-master-slave-sentinel/redis/master/data
cd /redis-master-slave-sentinel/redis/master/config
curl -O -L http://download.redis.io/releases/redis-6.0.20.tar.gz
tar -zxvf redis-6.0.20.tar.gz
cp /redis-master-slave-sentinel/redis/master/config/redis-6.0.20/redis.conf  /redis-master-slave-sentinel/redis/master/config/redis.conf
sed -i 's/bind 127.0.0.1/bind 0.0.0.0/' /redis-master-slave-sentinel/redis/master/config/redis.conf

# slave-1
mkdir -p /redis-master-slave-sentinel/redis/slave-1/config /redis-master-slave-sentinel/redis/slave-1/data
cd /redis-master-slave-sentinel/redis/slave-1/config/
cp /redis-master-slave-sentinel/redis/master/config/redis-6.0.20/redis.conf   /redis-master-slave-sentinel/redis/slave-1/config/redis.conf
sed -i 's/bind 127.0.0.1/bind 0.0.0.0/' /redis-master-slave-sentinel/redis/slave-1/config/redis.conf 

# slave-2
mkdir -p /redis-master-slave-sentinel/redis/slave-2/config /redis-master-slave-sentinel/redis/slave-2/data
cd /redis-master-slave-sentinel/redis/slave-2/config/
cp /redis-master-slave-sentinel/redis/master/config/redis-6.0.20/redis.conf   /redis-master-slave-sentinel/redis/slave-2/config/redis.conf
sed -i 's/bind 127.0.0.1/bind 0.0.0.0/' /redis-master-slave-sentinel/redis/slave-2/config/redis.conf


#redis-sentinel-1
mkdir -p /redis-master-slave-sentinel/sentinel/redis-sentinel-1  /redis-master-slave-sentinel/sentinel/redis-sentinel-1/s1
cd  /redis-master-slave-sentinel/sentinel/redis-sentinel-1


cat >> /redis-master-slave-sentinel/sentinel/redis-sentinel-1/sentinel.conf <<EOF
# 配置可參考 http://download.redis.io/redis-stable/sentinel.conf
# 配置說明 https://redis.io/topics/sentinel
port 26379
dir /tmp
sentinel monitor mymaster 192.168.150.102 6380 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel auth-pass mymaster 123456
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
EOF



#redis-sentinel-2
mkdir -p /redis-master-slave-sentinel/sentinel/redis-sentinel-2  /redis-master-slave-sentinel/sentinel/redis-sentinel-2/s2
cd  /redis-master-slave-sentinel/sentinel/redis-sentinel-2


cat >> /redis-master-slave-sentinel/sentinel/redis-sentinel-2/sentinel.conf <<EOF
# 配置可參考 http://download.redis.io/redis-stable/sentinel.conf
# 配置說明 https://redis.io/topics/sentinel
port 26379
dir /tmp
sentinel monitor mymaster 192.168.150.102 6380 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel auth-pass mymaster 123456
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
EOF


#redis-sentinel-3
mkdir -p /redis-master-slave-sentinel/sentinel/redis-sentinel-3  /redis-master-slave-sentinel/sentinel/redis-sentinel-3/s3
cd  /redis-master-slave-sentinel/sentinel/redis-sentinel-3


cat >> /redis-master-slave-sentinel/sentinel/redis-sentinel-3/sentinel.conf <<EOF
# 配置可參考 http://download.redis.io/redis-stable/sentinel.conf
# 配置說明 https://redis.io/topics/sentinel
port 26379
dir /tmp
sentinel monitor mymaster 192.168.150.102 6380 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel auth-pass mymaster 123456
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
EOF

sentinel.conf說明

port 26379
dir /tmp
sentinel monitor mymaster 192.168.150.102 6380 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel auth-pass mymaster 123456
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes

sentinel.conf解讀

  • port 26379:是當(dāng)前sentinel實例的端口
  • sentinel monitor mymaster 192.168.150.102 6380 2:指定主節(jié)點信息 ○ mymaster:主節(jié)點名稱,自定義,任意寫 ○ 192.168.150.102 6380:主節(jié)點的ip和端口 ○ 2:選舉master時的quorum值
  • sentinel auth-pass mymaster 123456 :訪問主節(jié)點時的密碼

如果您覺得本文不錯,歡迎關(guān)注,點贊,收藏支持,您的關(guān)注是我堅持的動力!

3. docker-compose-redis-master-slave-sentinel.yml文件的編寫

創(chuàng)建名稱為docker-compose-redis-master-slave-sentinel.yml用于安裝Redis哨兵集群docker-compose文件

version: '3'

# 網(wǎng)橋redis -> 方便相互通訊
networks:
  redis:

services:
  # ============================ ↓↓↓↓↓↓ redis ↓↓↓↓↓↓ ============================

  # 主
  redis-master:
    image: redis:6.0.20                    # 鏡像'redis:6.0.20'
    container_name: redis-master                                                      # 容器名為'redis-master'
    restart: unless-stopped                                                                   # 指定容器退出后的重啟策略為始終重啟,但是不考慮在Docker守護(hù)進(jìn)程啟動時就已經(jīng)停止了的容器
    command: redis-server /etc/redis/redis.conf --port 6380 --requirepass 123456 --masterauth 123456 --appendonly no # 啟動redis服務(wù)并添加密碼為:123456, 當(dāng)主redis下線重啟后變成從redis時認(rèn)證主redis密碼:123456, 默認(rèn)不開啟redis-aof方式持久化配置
    environment:                        # 設(shè)置環(huán)境變量,相當(dāng)于docker run命令中的-e
      TZ: Asia/Shanghai
      LANG: en_US.UTF-8
    volumes:                            # 數(shù)據(jù)卷掛載路徑設(shè)置,將本機(jī)目錄映射到容器目錄
      - "/redis-master-slave-sentinel/redis/master/data:/data"
      - "/redis-master-slave-sentinel/redis/master/config/redis.conf:/etc/redis/redis.conf"  # `redis.conf`文件內(nèi)容`http://download.redis.io/redis-stable/redis.conf`
    ports:                              # 映射端口
      - "6380:6380"
  # 從1
  redis-slave-1:
    image: redis:6.0.20                   # 鏡像'redis:6.0.20'
    container_name: redis-slave-1                                                    # 容器名為'redis-slave-1'
    restart: unless-stopped                                                                   # 指定容器退出后的重啟策略為始終重啟,但是不考慮在Docker守護(hù)進(jìn)程啟動時就已經(jīng)停止了的容器
    command: redis-server /etc/redis/redis.conf --port 6381 --requirepass 123456 --appendonly no --slaveof 192.168.150.102 6380 --masterauth 123456 # 啟動redis服務(wù)并添加密碼為:123456,默認(rèn)不開啟redis-aof方式持久化配置,連接并認(rèn)證master節(jié)點
    environment:                        # 設(shè)置環(huán)境變量,相當(dāng)于docker run命令中的-e
      TZ: Asia/Shanghai
      LANG: en_US.UTF-8
    volumes:                            # 數(shù)據(jù)卷掛載路徑設(shè)置,將本機(jī)目錄映射到容器目錄
      - "/redis-master-slave-sentinel/redis/slave-1/data:/data"
      - "/redis-master-slave-sentinel/redis/slave-1/config/redis.conf:/etc/redis/redis.conf"  # `redis.conf`文件內(nèi)容`http://download.redis.io/redis-stable/redis.conf`
    ports:                              # 映射端口
      - "6381:6381"
    depends_on:
      - redis-master
    links:
      - redis-master
  # 從2
  redis-slave-2:
    image: redis:6.0.20                   # 鏡像'redis:6.0.20'
    container_name: redis-slave-2                                                    # 容器名為'redis-slave-2'
    restart: unless-stopped                                                                   # 指定容器退出后的重啟策略為始終重啟,但是不考慮在Docker守護(hù)進(jìn)程啟動時就已經(jīng)停止了的容器
    command: redis-server /etc/redis/redis.conf --port 6382 --requirepass 123456 --appendonly no --slaveof 192.168.150.102 6380 --masterauth 123456 # 啟動redis服務(wù)并添加密碼為:123456,默認(rèn)不開啟redis-aof方式持久化配置,連接并認(rèn)證master節(jié)點
    environment:                        # 設(shè)置環(huán)境變量,相當(dāng)于docker run命令中的-e
      TZ: Asia/Shanghai
      LANG: en_US.UTF-8
    volumes:                            # 數(shù)據(jù)卷掛載路徑設(shè)置,將本機(jī)目錄映射到容器目錄
      - "/redis-master-slave-sentinel/redis/slave-2/data:/data"
      - "/redis-master-slave-sentinel/redis/slave-2/config/redis.conf:/etc/redis/redis.conf"  # `redis.conf`文件內(nèi)容`http://download.redis.io/redis-stable/redis.conf`
    ports:                              # 映射端口
      - "6382:6382"
    depends_on:
      - redis-master
    links:
      - redis-master

  # ============================ ↓↓↓↓↓↓ sentinel ↓↓↓↓↓↓ ============================

  redis-sentinel-1:
    image: redis:6.0.20                    # 鏡像'redis:6.0.20'
    container_name: redis-sentinel-1                                                  # 容器名為'redis-sentinel-1'
    restart: unless-stopped                                                                   # 指定容器退出后的重啟策略為始終重啟,但是不考慮在Docker守護(hù)進(jìn)程啟動時就已經(jīng)停止了的容器
    command: redis-sentinel /etc/redis/sentinel.conf
    environment:                        # 設(shè)置環(huán)境變量,相當(dāng)于docker run命令中的-e
      TZ: Asia/Shanghai
      LANG: en_US.UTF-8
    ports:
      - "26379:26379"
    volumes:
      - "/redis-master-slave-sentinel/sentinel/redis-sentinel-1/sentinel.conf:/etc/redis/sentinel.conf" # `sentinel.conf`文件內(nèi)容`http://download.redis.io/redis-stable/sentinel.conf`
    depends_on:
      - redis-master
      - redis-slave-1
      - redis-slave-2
    links:
      - redis-master
      - redis-slave-1
      - redis-slave-2
  redis-sentinel-2:
    image: redis:6.0.20                    # 鏡像'redis:6.0.20'
    container_name: redis-sentinel-2                                                  # 容器名為'redis-sentinel-2'
    restart: unless-stopped                                                                   # 指定容器退出后的重啟策略為始終重啟,但是不考慮在Docker守護(hù)進(jìn)程啟動時就已經(jīng)停止了的容器
    command: redis-sentinel /etc/redis/sentinel.conf
    environment:                        # 設(shè)置環(huán)境變量,相當(dāng)于docker run命令中的-e
      TZ: Asia/Shanghai
      LANG: en_US.UTF-8
    ports:
      - "26380:26379"
    volumes:
      - "/redis-master-slave-sentinel/sentinel/redis-sentinel-2/sentinel.conf:/etc/redis/sentinel.conf" # `sentinel.conf`文件內(nèi)容`http://download.redis.io/redis-stable/sentinel.conf`
    depends_on:
      - redis-master
      - redis-slave-1
      - redis-slave-2
      - redis-sentinel-1
    links:
      - redis-master
      - redis-slave-1
      - redis-slave-2
  redis-sentinel-3:
    image: redis:6.0.20                    # 鏡像'redis:6.0.20'
    container_name: redis-sentinel-3                                                  # 容器名為'redis-sentinel-3'
    restart: unless-stopped                                                                   # 指定容器退出后的重啟策略為始終重啟,但是不考慮在Docker守護(hù)進(jìn)程啟動時就已經(jīng)停止了的容器
    command: redis-sentinel /etc/redis/sentinel.conf
    environment:                        # 設(shè)置環(huán)境變量,相當(dāng)于docker run命令中的-e
      TZ: Asia/Shanghai
      LANG: en_US.UTF-8
    ports:
      - "26381:26379"
    volumes:
      - "/redis-master-slave-sentinel/sentinel/redis-sentinel-3/sentinel.conf:/etc/redis/sentinel.conf" # `sentinel.conf`文件內(nèi)容`http://download.redis.io/redis-stable/sentinel.conf`
    depends_on:
      - redis-master
      - redis-slave-1
      - redis-slave-2
      - redis-sentinel-1
      - redis-sentinel-2
    links:
      - redis-master
      - redis-slave-1
      - redis-slave-2

3.1. 運行 -- 哨兵模式(sentinel監(jiān)視redis主從服務(wù)

運行 -- 哨兵模式(sentinel監(jiān)視redis主從服務(wù),當(dāng)某個master服務(wù)下線時,自動將該master下的某個從服務(wù)升級為master服務(wù)替代已下線的master服務(wù)繼續(xù)處理請求 -- 即主節(jié)點切換)

docker-compose -f docker-compose-redis-master-slave-sentinel.yml -p redis up -d

圖片圖片

3.2 測試

  • 1.哨兵模式查看
# 連接redis-sentinel-1
docker exec -it redis-sentinel-1 redis-cli -p 26379
  • 2.查看redis主信息
sentinel master mymaster

圖片圖片

  1. 查看redis從信息
sentinel slaves mymaster

圖片圖片

  • 4.查看 哨兵redis-sentinel-1日志
docker logs -f redis-sentinel-1

圖片圖片

  1. 進(jìn)入redis-slave-1容器
docker exec -it redis-master redis-cli -h 192.168.150.102 -p 6381 -a 123456

圖片圖片

  1. 關(guān)閉redis-master主節(jié)點
docker stop redis-master

發(fā)現(xiàn)主節(jié)點從master節(jié)點,轉(zhuǎn)換為slave-2節(jié)點

圖片圖片

  1. 進(jìn)入redis-slave-2容器
docker exec -it redis-master redis-cli -h 192.168.150.102 -p 6382 -a 123456
  • 7.查看集群狀態(tài)
info replication

發(fā)現(xiàn)現(xiàn)在從節(jié)點只剩一個

圖片圖片

  • 8.重啟master節(jié)點
docker start redis-master

圖片圖片

  • 9.再次查看集群狀態(tài)
info replication

發(fā)現(xiàn)master節(jié)點添加回來了,但是變成了從節(jié)點

圖片圖片

3.3. 卸載哨兵集群

docker-compose -f docker-compose-redis-master-slave-sentinel.yml -p redis down

3.4. 集群故障恢復(fù)原理

哨兵master自己從當(dāng)前集群中的slave節(jié)點中選出一個新的master,原則是

  • 1-首先會判斷slave節(jié)點與master節(jié)點斷開時間長短,如果超過指定值(down-after-milliseconds * 10)則會排除該slave節(jié)點
  • 2-然后判斷slave節(jié)點的slave-priority值,越小優(yōu)先級越高,如果是0則永不參與選舉
  • 3-如果slave-prority一樣,則判斷slave節(jié)點的offset值,越大說明數(shù)據(jù)越新,優(yōu)先級越高
  • 4-最后是判斷slave節(jié)點的運行id大小,越小優(yōu)先級越高。

3.5. 哨兵集群監(jiān)控原理

Sentinel基于心跳機(jī)制監(jiān)測服務(wù)狀態(tài),每隔1秒向集群的每個實例發(fā)送ping命令:

  • 主觀下線:如果某sentinel節(jié)點發(fā)現(xiàn)某實例未在規(guī)定時間響應(yīng),則認(rèn)為該實例主觀下線。
  • 客觀下線:若超過指定數(shù)量(quorum)的sentinel都認(rèn)為該實例主觀下線,則該實例客觀下線。quorum值最好超過Sentinel實例數(shù)量的一半。

圖片圖片

總結(jié)

Sentinel的三個作用是什么

  • 監(jiān)控
  • 故障轉(zhuǎn)移
  • 通知

Sentinel如何判斷一個redis實例是否健康

  • 每隔1秒發(fā)送一次ping命令,如果超過一定時間沒有相向則認(rèn)為是主觀下線
  • 如果大多數(shù)sentinel都認(rèn)為實例主觀下線,則判定服務(wù)下線
責(zé)任編輯:武曉燕 來源: springboot葵花寶典
相關(guān)推薦

2023-09-26 01:07:34

2023-10-26 07:47:53

Redis哨兵集群

2020-02-07 09:44:30

Redis哨兵數(shù)據(jù)庫

2021-03-31 05:57:40

集群搭建哨兵集群Redis

2022-02-11 08:41:19

WindowsRedis集群

2020-04-14 21:12:42

Redis集群Linux

2021-04-01 08:50:54

SentinelRedis 集群原理

2019-09-03 15:45:31

Redis分片集群

2025-06-27 02:44:00

2023-04-11 08:30:52

2022-06-28 07:31:11

哨兵模式redis

2024-04-29 08:06:19

Redis分布式系統(tǒng)

2022-02-14 08:33:51

Redis哨兵集群

2023-11-13 09:03:10

2024-07-16 08:38:06

2020-06-08 08:20:11

Redis高可用集群

2020-06-17 08:53:19

Redis集群SSH

2022-05-31 08:04:03

Redis高可用集群

2025-02-20 08:24:41

2022-05-17 22:20:41

哨兵Redis機(jī)制
點贊
收藏

51CTO技術(shù)棧公眾號