" name="sm-site-verification"/>
侧边栏壁纸
博主头像
PySuper 博主等级

千里之行,始于足下

  • 累计撰写 227 篇文章
  • 累计创建 15 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

Redis高可用 -- Sentinel + Docker

PySuper
2022-06-12 / 0 评论 / 0 点赞 / 10 阅读 / 0 字
温馨提示:
所有牛逼的人都有一段苦逼的岁月。 但是你只要像SB一样去坚持,终将牛逼!!! ✊✊✊

主从复制

配置

修改配置文件

Master

protected-mode no

Worker

# 从服务器添加(527行): replicaof <masterip> <masterport>
replicaof 103.36.222.30 36379

# 任意地址访问 ==> 这个主节点也要配置
protected-mode no

# 从服务器添加 主服务器密码(536行)
masterauth PySuper

# 从服务器添加 主服务器用户名(536行)
# masteruser pingpong

# 这里不修改,docker映射不进来
port 16379

校验

# 在一台redis服务器上执行查看: -a后面跟的是密码

redis-cli -h 103.36.222.30 -p 63079 -a PySuper info replication

redis-cli -h 156.238.247.211 -p 16379 -a PySuper info replication

Sentinel

这里要修改这个文件,直接映射文件会报错:Device or resource busy

解决方法:

  • 修改sentinel.conf的权限: chmod 666 sentinel.conf

  • 不能直接映射文件,需要先创建文件夹,然后再映射

建议用 docker-compose 来创建,更方便

sentinel.conf

# 哨兵实例的端口
port 26379

# 绑定地址,确保哨兵可以监听所有网络接口
bind 0.0.0.0

# 监控的主节点名称、IP 和端口,最后一个参数是法定人数
sentinel monitor mymaster 103.36.222.30 63079 2

# 主节点被认为失效的时间(毫秒)
sentinel down-after-milliseconds mymaster 5000

# 故障转移超时时间(毫秒)
sentinel failover-timeout mymaster 10000

# 在故障转移时,最多可以同时对多少个从节点进行同步
sentinel parallel-syncs mymaster 1

# 设置哨兵的日志文件
logfile "/var/log/redis/sentinel.log"

# 设置哨兵的持久化文件
dir "/var/lib/redis"

# 设置哨兵的配置文件路径
sentinel config-epoch mymaster 0

# 为主节点设置密码
sentinel auth-pass mymaster PySuper

# 设置哨兵的通知脚本(可选)
# sentinel notification-script mymaster /path/to/notification-script.sh

# 设置哨兵的客户端重配置脚本(可选)
# sentinel client-reconfig-script mymaster /path/to/reconfig-script.sh

docker run

# 创建相关文件
mkdir sentinel && cd sentinel && mkdir redis && touch sentinel.conf && touch sentinel.log

docker run -dit \
  --name sentinel \
  -h sentinel \
  -p 26379:26379 \
  -v $PWD/redis:/var/lib/redis \
  -v $PWD/sentinel.conf:/etc/redis/sentinel.conf \
  -v $PWD/sentinel.log:/var/log/redis/sentinel.log \
  --restart=on-failure \
  redis:7.4.1 \
  redis-sentinel /etc/redis/sentinel.conf

docker-compose.yaml

使用docker-compose会便于管理,但是这样三个哨兵就都在同一节点上了

其实使用Kubernetes的话更好一些,可以在服务器集群上管理各个哨兵

services:
  sentinel1:
    image: 'redis:7.4.1'
    container_name: sentinel-1
    restart: always
    command: redis-sentinel /etc/redis/sentinel.conf
    volumes:
      - $PWD/conf-1:/etc/redis
    ports:
      - 26379:26379

  sentinel2:
    image: 'redis:7.4.1'
    container_name: sentinel-2
    restart: always
    command: redis-sentinel /etc/redis/sentinel.conf
    volumes:
      - $PWD/conf-2:/etc/redis
    ports:
      - 26380:26379

  sentinel3:
    image: 'redis:7.4.1'
    container_name: sentinel-3
    restart: always
    command: redis-sentinel /etc/redis/sentinel.conf
    volumes:
      - $PWD/conf-3:/etc/redis
    ports:
      - 26381:26379
# 启动
docker-compose up -d

# 查看日志
docker-compose logs

# 重启
docker-compose restart 

# 停止
docekr-compose stop

# 删除
docker-compose rm

校验

# 进入redis-sentinel容器
docker exec -it sentinel bash

# 执行命令
redis-cli -p 26379 sentinel masters

# 连接到 Sentinel 实例
redis-cli -h 103.36.222.30 -p 26379

# 查看主节点信息
SENTINEL masters

# 查看从节点信息
SENTINEL slaves mymaster

# 查看 Sentinel 实例信息
SENTINEL sentinels mymaster

其他命令

# 在一台redis服务器上执行查看: -a后面跟的是密码
redis-cli -h 103.36.222.30 -p 63079 -a PySuper info replication
redis-cli -h 156.238.247.211 -p 16379 -a PySuper info replication
redis-cli -h 156.238.247.211 -p 16379 -a PySuper SLAVEOF NO ONE
redis-cli -h 156.238.247.211 -p 16379 -a PySuper SLAVEOF 103.36.222.30 63079
redis-cli -h 156.238.247.211 -p 16379 -a PySuper CONFIG GET slave-priority


# 通过redis-sentinel命令查看集群信息
# 进入redis-sentinel容器
docker exec -it sentinel-1 bash

# 执行命令
redis-cli -p 26379 sentinel masters

# 连接到 Sentinel 实例
redis-cli -h 103.36.222.30 -p 26379 SENTINEL masters
redis-cli -h 103.36.222.30 -p 26379 SENTINEL slaves mymaster
redis-cli -h 103.36.222.30 -p 26379 SENTINEL RESET mymaster

# 查看主节点信息
SENTINEL masters

# 查看从节点信息
SENTINEL slaves mymaster

# 查看 Sentinel 实例信息
SENTINEL sentinels mymaster

Python连接

import time

from redis import Sentinel

# 创建 Sentinel 实例,连接到 Redis 哨兵集群
# 第一个参数为 Redis 哨兵集群的地址和端口,可以有多个哨兵地址,格式为:(ip, port)
# 第二个参数为 socket_timeout 超时时间
sentinel = Sentinel(
    [
        ("103.36.222.30", 26379),
        ("103.36.222.30", 26380),
        ("156.238.247.211", 26381),
    ],
    socket_timeout=1,
)


def get_master_address(sentinel, master_name):
    try:
        master = sentinel.discover_master(master_name)
        return master
    except Exception as e:
        print(f"Error: {e}")
        return None


while True:
    master = get_master_address(sentinel, "Master")
    if master:
        print(master)
    time.sleep(5)

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区