Redis分布式

1.1 数据库主从
  • 作用
    • 数据备份
    • 读写分离
  • 特点
    • 只能一主多从
  • 配置
# 主从数据库分别配置ip/端口
bind 127.0.0.1
port 6379
# 从数据库配置slaveof参数
slaveof 127.0.0.1 6379

# 以下两条连起来: 当至少有2个从数据库可以进行复制并且响应延迟都在10秒以内时, 主数据库才允许写操作
min-slaves-to-write 2
min-slaves-max-lag 10

# ubuntu的redis安装目录, 其中包含了redis和sentinel的配置模板
/usr/local/redis/
# ubuntu中 启动/重启/停止 默认的redis服务
/etc/init.d/redis-server start/stop/restart
1.2 哨兵
  • 作用
    • 监控redis服务器的运行状态,可以进自动故障转移(failover), 实现高可用
    • 数据库主从配合使用的机制
  • 特点
    • 独立的进程, 每台redis服务器应该至少配置一个哨兵程序
    • 监控redis主服务器的运行状态
    • 出现故障后可以向管理员/其他程序发出通知
    • 针对故障, 可以进行自动转移, 并向客户端提供新的访问地址
  • 哨兵机制
    • 流言协议
      • 当某个哨兵程序发现监视的主服务器下线后(心跳检测), 会向监听该服务器的其他哨兵询问, 是否确认主服务器下线, 当确认的哨兵数量达到要求(配置文件中设置)后, 会确认主服务器下线(客观下线), 然后进入投票环节
    • 投票协议
      • 当确认的主服务器下线后, 哨兵会通过投票的的方式来授权其中一个哨兵主导故障转移处理
      • 只有在大多数哨兵都参加投票的前提下, 才会进行授权, 比如有5个哨兵, 则需要至少3个哨兵投票才可能授权
    • 建议最低配置
      • 至少在3台服务器上分别启动至少一个哨兵
      • 如果只有一台, 则服务器宕机后, 姜无法进行故障转移
      • 如果只有两台, 一旦一个哨兵挂掉了, 则投票会失败
    • 相关配置(sentinel.conf)
bind 127.0.0.1  # 哨兵绑定的ip
port 26381  # 哨兵监听的端口号, redis客户端需要访问哨兵的ip和端口号
sentinel monitor mymaster 127.0.0.1 6380 2  # 设置哨兵  (主数据库别名 主数据库ip 主数据库端口 确认下线的最小哨兵数量)
sentinel down-after-milliseconds mumaster 60000  # 服务器断线超时时长
sentinel failover-timeout-mymaster 180000  # 故障转移的超时时间
sentinel parallel-syncs mymaster 1  # 执行故障转移时, 最多几个从数据库可以同步主数据库(数量少会增加完成转移的时长; 数量多可能会影响主数据库的数量查询)

min-slave-to-write 2  # 可执行故障转移的从数据库的最小数量(低于当数量时, 主数据库将禁止写入操作)
min-slave-max-lag 10  # 从数据库的最大响应时长
# 以上两条连起来: 当至少有2个从数据库可以进行复制并且响应延时都在10秒之内时, 主数据库才允许写操作
  • 启动哨兵
redis-sentinel sentinel.conf
  • python代码实现
from redis import Sentinel

# 设置哨兵的ip和端口
REDIS_SENTINEL= [
	('127.0.0.1', 26380),
	('127.0.0.1', 26381),
	('127.0.0.1', 26382)
]
# 设置主数据库的别名
REDIS_SENTINEL_NAME= 'mymaster'
# 创建哨兵
sentinel = Sentinel(REDIS_SENTINEL)
# 通过哨兵来获取朱从数据库
master_redis = sentinel.master_for(REDIS_SENTINELNAME)
slave_redis = sentinel.slave_for(REDIS_SENTINELNAME)
# 正常的使用redis操作
master_redis.set('name', 'zhangsan')
print(slave_redis.get('name').decode('utf-8'))

读写分离建议:

  • 如果只需要读, 可以选择从数据库谅解
  • 如果既有读也有写, 建议只是用主数据库连接
    1>. 可以使用管道批量发送命令
    2>. 数据库主从不支持事务和乐观锁
1.3 集群
  • 多个节点共同保存数据
    • 作用
      • 扩展存储空间
      • 提高吞吐量, 提高写能力
    • 和单机的不用点
      • 不再区分数据库, 只有0号库, 单机默认0-15
      • 不支持事务/管道/多值操作
    • 特点
      • 要求至少三主三从
      • 要求必须开启 AOF持久化
      • 自动选择集群节点进行存储
      • 默认集成哨兵,自动故障转移
  • 配置
# 每个节点分别配置ip/端口
bind 127.0.0.1
port 6379
# 集群配置
cluster-enabled yes  # 开启集群
cluster-config-file nodes-7000.conf  # 节点日志文件
cluster-node-timeout 15000  # 节点超时时长 15秒
# 开启AOF 及相关配置
appendonly yes
  • 创建集群
    • redis的安装包中包含了redis-trib.rb, 用于创建集群
    • 创建集群后, 重启redis会自动启动集群
# 将命令复制, 这样可以在任何目录下调用此命令
sudo cp /usr/share/doc/redis-tools/examples/redis-trib.rb /usr/local/bin/
# 安装ruby环境, 因为redis-trib.rb使用ruby开发的
sudo apt-get inistall ruby
gem sources --add https://gems.ruby-china.com/  --remove https://rubygems.org/
sudo gem install redis

# 启动主从数据库 7000-7005.conf
sudo redis-server 7001.conf
...

# 创建集群(命令行)
redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 
# 访问集群 访问集群必须加-c选项, 否则无法进行读写操作
redis-cli -p 7000 -c
  • redis集群不能支持事务和WATCH, 并发控制只能自己设计悲观锁(分布式锁)
  • python操作redis集群
    • 安装 pip install redis-cluster
from rediscluster import StrictRedisCluster

# 设置集群中的主数据库的ip和端口
startup_nodes = [
	{'host': '127.0.0.1', 'port': 7000},
	{'host': '127.0.0.1', 'port': 7001},
	{'host': '127.0.0.1', 'port': 7002}
]

# 创建集群对象
cluster = StrictRedisCluster(startup_nodes=startup_nodes, decode_responses=True)
# 正常操作redis即可
cluster.set('name', 'zhangsan')
print(cluster.get('name'))
<think>好的,用户想了解Redis分布式环境下的应用或配置,特别是分布式部署与实现。首先,我需要回顾一下Redis分布式方案,尤其是Redis Cluster,因为这是官方推荐的。记得引用[1]和[3]提到Redis Cluster是官方3.0版本推出的,支持自动分片和故障转移。 接下来,用户可能需要知道不同的分布式方案之间的区别。比如主从复制、哨兵模式和Cluster模式的区别。主从复制主要是数据备份和读写分离,但需要手动故障转移。而哨兵模式可以自动处理故障转移,但分片还是得自己处理。Cluster模式则解决了分片和自动故障转移的问题,适合大规模应用。 然后,Redis Cluster的核心机制是什么?根据引用[4],数据分区是通过哈希槽(hash slot)实现的,总共有16384个槽。每个主节点负责一部分槽,数据根据key的CRC16值分配到对应的槽。这需要详细说明一下,包括节点间的通信和故障检测机制,比如Gossip协议。 另外,分布式部署的具体步骤可能也是用户关心的。比如如何配置集群,需要多少个节点,以及如何分配槽。可能需要提到使用redis-cli工具创建集群,以及节点添加和删除的过程。还有,从节点的作用,作为备份和故障转移的支持,引用[4]提到从节点复制主节点数据和状态。 应用场景方面,用户可能想知道什么时候该用Redis Cluster。比如高并发、大数据量需要水平扩展,或者需要高可用性的场景。引用[1]和[3]提到适合大规模分布式系统,所以可以强调这些情况下的优势。 还需要考虑一些注意事项,比如客户端需要支持集群协议,避免跨槽操作,以及批量操作可能受到限制。此外,网络稳定性很重要,节点间的延迟会影响性能。可能还要提到Redisson框架(引用[2])如何帮助实现分布式锁,作为分布式环境中的一个应用例子。 最后,用户可能需要相关的问题,比如如何选择不同的分布式方案,Cluster的扩容步骤,或者与代理分片的区别。这可以帮助他们进一步探索。</think>### Redis 分布式部署与实现 Redis分布式环境下的核心方案是 **Redis Cluster**,其通过数据分片和主从复制实现高可用与横向扩展。以下是关键实现细节与应用场景: --- #### 一、Redis 分布式方案对比 1. **主从复制** - **作用**:数据冗余与读写分离(主节点写,从节点读)。 - **局限**:需手动处理主节点故障,无自动分片能力。 2. **哨兵模式(Sentinel)** - **作用**:监控主节点状态,自动选举新主节点实现故障转移[^3]。 - **局限**:数据分片仍需客户端或代理层实现。 3. **Redis Cluster(官方推荐)** - **核心能力**: - **自动分片**:数据按哈希槽(16384 个槽)分布到多个主节点[^4]。 - **故障转移**:主节点宕机时,从节点自动升级为主节点[^1]。 - **适用场景**:大规模数据、高并发读写需求[^3]。 --- #### 二、Redis Cluster 实现机制 1. **数据分片** - 每个键通过公式 `CRC16(key) % 16384` 映射到哈希槽。 - 节点启动时声明负责的槽范围,例如: ```bash redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 ... --cluster-replicas 1 ``` 2. **节点通信** - 节点间通过 **Gossip 协议**交换状态信息(如槽分配、节点存活)。 - 客户端可连接任意节点,若请求的键不属于当前节点,返回 `MOVED` 重定向指令。 3. **故障转移** - 主节点宕机后,从节点发起选举,获得多数主节点投票后接替主节点角色。 --- #### 三、配置示例 ```bash # 启动 6 个节点(3 主 + 3 从) redis-server /path/to/redis_7000.conf --port 7000 --cluster-enabled yes redis-server /path/to/redis_7001.conf --port 7001 --cluster-enabled yes # ...其他节点同理 # 创建集群(1 个从节点对应 1 个主节点) redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 \ 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1 ``` --- #### 四、应用场景 1. **高并发读写**:如电商秒杀系统,分片降低单节点压力。 2. **高可用需求**:金融交易系统,故障转移保障服务连续性。 3. **海量数据存储**:日志分析场景,横向扩展突破单机内存限制。 --- #### 五、注意事项 1. **客户端兼容性**:需支持集群协议(如 JedisCluster、Redisson[^2])。 2. **跨槽操作限制**:事务、Lua 脚本中的键需在同一节点。 3. **网络要求**:节点间延迟过高可能导致集群状态异常。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值