Redis分布式

 

 

Redis-2.4.15目前没有提供集群的功能,Redis作者在博客中说将在3.0中实现集群机制。目前Redis实现集群的方法主要是采用一致性哈稀分片(Shard),和MemberCache一样,将不同的key分配到不同的redis server上,达到横向扩展的目的。下面来介绍一种比较常用的分布式场景:

 


在读写操作比较均匀且实时性要求较高,可以用下图的分布式模式:

在读操作远远多于写操作时,可以用下图的分布式模式:

       对于一致性哈稀分片的算法,Jedis-2.0.0已经提供了,下面是使用示例代码(以ShardedJedisPool为例):

package com.redis.client;

import java.util.ArrayList;

import java.util.List;

import redis.clients.jedis.JedisPoolConfig;

import redis.clients.jedis.JedisShardInfo;

import redis.clients.jedis.ShardedJedis;

import redis.clients.jedis.ShardedJedisPool;

import redis.clients.util.Hashing;

import redis.clients.util.Sharded;

 

publicclass RedisShardPoolTest {

    static ShardedJedisPoolpool;

    static{

        JedisPoolConfig config =new JedisPoolConfig();//Jedis池配置

        config.setMaxActive(500);//最大活动的对象个数

          config.setMaxIdle(1000 * 60);//对象最大空闲时间

          config.setMaxWait(1000 * 10);//获取对象时最大等待时间

          config.setTestOnBorrow(true);

        String hostA = "10.10.224.44";

          int portA = 6379;

          String hostB = "10.10.224.48";

          int portB = 6379;

        List<JedisShardInfo> jdsInfoList =new ArrayList<JedisShardInfo>(2);

        JedisShardInfo infoA = new JedisShardInfo(hostA, portA);

        infoA.setPassword("redis.buy");

        JedisShardInfo infoB = new JedisShardInfo(hostB, portB);

        infoB.setPassword("redis.buy");

        jdsInfoList.add(infoA);

        jdsInfoList.add(infoB);

        pool =new ShardedJedisPool(config, jdsInfoList, Hashing.MURMUR_HASH,

Sharded.DEFAULT_KEY_TAG_PATTERN);

    }

  

    /**

     * @param args

     */

    publicstaticvoid main(String[] args) {

        for(int i=0; i<100; i++){

            String key = generateKey();

            //key += "{aaa}";

            ShardedJedis jds = null;

            try {

                jds = pool.getResource();

                System.out.println(key+":"+jds.getShard(key).getClient().getHost());

                System.out.println(jds.set(key,"1111111111111111111111111111111"));

            } catch (Exception e) {

                e.printStackTrace();

            }

            finally{

                pool.returnResource(jds);

            }

        }

    }

 

    privatestaticintindex = 1;

    publicstatic String generateKey(){

        return String.valueOf(Thread.currentThread().getId())+"_"+(index++);

    }

}

 

从运行结果中可以看到,不同的key被分配到不同的Redis-Server上去了。

 

       实际上,上面的集群模式还存在两个问题:

1.       扩容问题:

因为使用了一致性哈稀进行分片,那么不同的key分布到不同的Redis-Server上,当我们需要扩容时,需要增加机器到分片列表中,这时候会使得同样的key算出来落到跟原来不同的机器上,这样如果要取某一个值,会出现取不到的情况,对于这种情况,Redis的作者提出了一种名为Pre-Sharding的方式:

Pre-Sharding方法是将每一个台物理机上,运行多个不同断口的Redis实例,假如有三个物理机,每个物理机运行三个Redis实际,那么我们的分片列表中实际有9个Redis实例,当我们需要扩容时,增加一台物理机,步骤如下:

A.     在新的物理机上运行Redis-Server;

B.      该Redis-Server从属于(slaveof)分片列表中的某一Redis-Server(假设叫RedisA);

C.      等主从复制(Replication)完成后,将客户端分片列表中RedisA的IP和端口改为新物理机上Redis-Server的IP和端口;

D.     停止RedisA。

2.       单点故障问题:

还是用到Redis主从复制的功能,两台物理主机上分别都运行有Redis-Server,其中一个Redis-Server是另一个的从库,采用双机热备技术,客户端通过虚拟IP访问主库的物理IP,当主库宕机时,切换到从库的物理IP。只是事后修复主库时,应该将之前的从库改为主库(使用命令slaveof no one),主库变为其从库(使命令slaveof IP PORT),这样才能保证修复期间新增数据的一致性。

 

 

<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、付费专栏及课程。

余额充值