首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Redis-哨兵(Sentinel)和集群(Cluster)链接方式

Redis-哨兵(Sentinel)和集群(Cluster)链接方式

作者头像
运维小路
发布2026-01-28 14:32:23
发布2026-01-28 14:32:23
1930
举报
文章被收录于专栏:运维小路运维小路

作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

数据库是一个系统(应用)最重要的资产之一,所以我们的数据库将从以下几个数据库来进行介绍。

MySQL

PostgreSQL

MongoDB

Redis(本章节)

Etcd

我们前面介绍了单机,主从,哨兵,集群多种Redis部署方式,他们的链接方式也是不一样的,所以我们用一个小节来介绍程序代码应该如何链接不同方式的Redis,后续都时使用Python代码,这里为了简单所以配置都在代码里面。

基础准备

代码语言:javascript
复制
# 安装pip
yum -y install python-pip
# 安装依赖,这个版本才支持低版本的redis
pip install redis==3.5.3
# 如果需要连接集群
pip install redis-py-cluster

单机Redis链接

代码语言:javascript
复制
# coding: utf-8
import redis

# 基础连接
redis_client = redis.Redis(
    host='localhost',
    port=6379,
    db=0,
    password=None,  # 如果有密码
    decode_responses=True  # 自动解码返回字符串
)

# 测试连接
try:
    redis_client.ping()
    print("单机Redis连接成功")
except Exception as e:
    print("连接失败:", str(e))

# 基本操作示例
redis_client.set('key', 'value')
value = redis_client.get('key')
print(value)

主从Redis链接

如果你不需要读写分立,那么可以和单机Redis链接方式一样,

代码语言:javascript
复制
import redis

master = redis.Redis(host='192.168.31.196', port=6379)
slave = redis.Redis(host='192.168.31.197', port=6379)

print("Redis Master-Slave Test")
print("Master: 192.168.31.196:6379")
print("Slave: 192.168.31.197:6379")
print("-" * 30)

# Write to master
print("1. Write to master...")
master.set('test_key', 'test_value')
print("Write success: key=test_key, value=test_value")

# Read from slave
print("\n2. Read from slave...")
result = slave.get('test_key')
if result:
    print("Read success: %s" % result)
else:
    print("Read failed")

print("\n3. Test complete")

哨兵

这里的Redis代码直接链接的是Redis哨兵地址,并没有直接链接Redis实例,当主从切换以后,他还是可以获取当前的Master,进行写入操作。

代码语言:javascript
复制
# -*- coding: utf-8 -*-
import redis
from redis.sentinel import Sentinel
import time

# 哨兵配置
sentinel = Sentinel([
    ('192.168.31.196', 26379),
    ('192.168.31.197', 26379),
    ('192.168.31.197', 26379)
])
print("Redis哨兵写入测试")
print("=" * 40)
try:
    # 第一次写入
    print("第一次写入...")
    master = sentinel.master_for('mymaster', decode_responses=True)
    master_info = sentinel.discover_master('mymaster')
    print("当前主节点: %s:%s" % (master_info[0], master_info[1]))

    master.set('test_key', 'value1')
    print("写入: test_key=value1")

    # 等待30秒
    print("\n等待30秒...")
    for i in range(30):
        time.sleep(1)
        if (i+1) % 10 == 0:
            print("已等待 %d 秒" % (i+1))

    # 第二次写入
    print("\n第二次写入...")
    master = sentinel.master_for('mymaster', decode_responses=True)
    new_master_info = sentinel.discover_master('mymaster')
    print("当前主节点: %s:%s" % (new_master_info[0], new_master_info[1]))

    # 检查是否切换
    if master_info != new_master_info:
        print("主节点已切换!")
        print("原主节点: %s:%s" % (master_info[0], master_info[1]))
        print("新主节点: %s:%s" % (new_master_info[0], new_master_info[1]))
    else:
        print("主节点未切换")

    master.set('test_key', 'value2')
    print("写入: test_key=value2")

    # 显示最终数据
    value = master.get('test_key')
    print("最终数据: test_key=%s" % value)

    print("\n测试完成!")

except Exception as e:
    print("\n错误: %s" % str(e))
    print("请检查哨兵配置和连接")

集群

当然这里只写了一个地址,真实环境肯定会写满地址。

代码语言:javascript
复制
# -*- coding: utf-8 -*-
from rediscluster import RedisCluster
import redis

# 连接到集群
rc = RedisCluster(
    startup_nodes=[{"host": "127.0.0.1", "port": 7001}],
    decode_responses=True,
    skip_full_coverage_check=True
)

print("Redis集群槽位分布测试")
print("=" * 50)

# 测试几个键
test_data = {
    "user:1": "Alice",
    "user:100": "Bob",
    "user:1000": "Charlie",
    "order:1": "Order1",
    "order:100": "Order100",
    "item:A": "ItemA",
    "item:Z": "ItemZ"
}

print("\n键的槽位分布:")
print("Key\t\t\tSlot\tNode")
print("-" * 40)

for key, value in test_data.items():
    rc.set(key, value)

    # 获取槽位
    r = redis.Redis(host='127.0.0.1', port=7001, decode_responses=True)
    slot = r.execute_command('CLUSTER KEYSLOT', key)

    # 判断节点
    if 0 <= slot <= 5460:
        node = "7001"
    elif 5461 <= slot <= 10922:
        node = "7002"
    else:
        node = "7003"

    print("%-15s\t%5d\t%s" % (key, slot, node))

print("\n" + "=" * 50)
print("槽位范围:")
print("7001: 0 - 5460")
print("7002: 5461 - 10922")
print("7003: 10923 - 16383")

历史内容推荐

MongoDB 角色和权限,管理员,复制集,分片集群,wiredtiger,OpLog,纯内存引擎

PostgreSQL 权限,模式,块复制,逻辑复制,Patroni,物理备份,模式

MySQL crud,user,innodb,索引,主从,物理备份,系统表,视图,MariaDB

Elasticsearch(es) 倒排索引,分词,lucene,ELFK,索引,副本,分片,web管理

Hadoop HDFS dn,nn,jn,分块,副本,配额,快照,回收站,追加模式,Kerberos

RabbitMQ,虚拟主机,交换机,队列,绑定,持久化,镜像队列,网络分区,RocketMQ

Kafka-集群部署,Topic,分区,副本,生产者,消费者(组),持久化,顺序读写,零拷贝,扩容

ZooKeeper-集群部署和选举,读写流程,事务日志,数据和快照,ACL,4字命令,监控和备份

Squid,HAProxy,LVS,Keepalived,内网穿透FRP

Web服务器-Nginx反向代理,负载均衡,安全配置,日志,流量镜像,websocket,跨域

Kubernetes(k8s)-基本概念,部署,工作负载,服务,网络,存储,配置,调度,证书,监控

Docker-docker基本信息,基本命令,dockerfile,原理,仓库,存储网络日志,番外篇

云计算&虚拟化-包括服务器购买,虚拟化介绍,虚拟磁盘,虚拟网络,创建虚拟机,安装虚拟机

dashboard,xml解释,克隆,快照,初始化,esxi介绍

Linux进阶-硬件,日常运维,基础软件,日志,进阶命令,防火墙,shell,内核,初始化

Linux基础-包括文件的增删改查,磁盘管理,网络配置,用户配置,权限配置

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-01-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维小路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MongoDB
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档