欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

redis cluster集群实现高可用

程序员文章站 2022-03-22 21:21:29
...
redis cluster集群实现高可用

redis的主从和哨兵两种集群方案,redis从3.0版本开始引入了redis-cluster(集群)。

redis5.0.3    
jedis2.9

整个集群有16384个slot

什么是哈希槽
Redis 集群没有使用一致性hash, 而是引入了哈希槽的概念。
Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽。
这种结构很容易添加或者删除节点,并且无论是添加删除或者修改某一个节点,都不会造成集群不可用的状态。
使用哈希槽的好处就在于可以方便的添加或移除节点。

集群:是一个提供多个Redis(分布式)节点间共享数据的程序集
集群部署:Redis 集群的键空间被分割为 16384 hash个槽(slot), 集群的最大节点数量也是 16384 个
关系:cluster>node>slot>key

数据迁移
数据迁移可以理解为slot(槽)和key的迁移,这个功能很重要,极大地方便了集群做线性扩展,以及实现平滑的扩容或缩容。

集群的节点内置了复制和高可用特性。
特点:
1、节点自动发现
2、slave->master 选举,集群容错
3、Hot resharding:在线分片
4、基于配置(nodes-port.conf)的集群管理
5、客户端与redis节点直连、不需要中间proxy层.
6、所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.

(1)在server1上创建 6个Redis节点
首先在 server1 机器上 /home/redis/目录下;
创建名为6001、6002、6003、6004、6005、6006的目录
进入6001目录,编写redis.conf:
bind 192.168.191.128
protected-mode no
port 6001
daemonize yes

cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000

分别启动redis-server
(2)在server1上创建redis集群
../src/redis-cli --cluster create 192.168.1.128:6001 192.168.1.128:6002 192.168.1.128:6003 192.168.1.128:6004 192.168.1.128:6005 192.168.1.128:6006 --cluster-replicas 1

../src/redis-cli -c -p 6001

cluster info
info Replication
cluster nodes
cluster slots

3个master,3个slave

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;

//redis cluster集群,  jedis连接redis集群
public class RedisConfig {

public static void main(String[] args) {
Set<HostAndPort> hosts=new HashSet<HostAndPort>();
hosts.add(new HostAndPort("192.168.1.128",6001));
hosts.add(new HostAndPort("192.168.1.128",6002));
hosts.add(new HostAndPort("192.168.1.128",6003));
hosts.add(new HostAndPort("192.168.1.128",6004));
hosts.add(new HostAndPort("192.168.1.128",6005));
hosts.add(new HostAndPort("192.168.1.128",6006));

GenericObjectPoolConfig config=new JedisPoolConfig();
// 最大空闲连接数, 默认8个
config.setMaxIdle(10);
        // 最大连接数, 默认8个
config.setMaxTotal(50);
        //最小空闲连接数, 默认0
config.setMinIdle(1);
        // 获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间,  默认-1
config.setMaxWaitMillis(2000); // 设置2秒
        //对拿到的connection进行validateObject校验
config.setTestOnBorrow(true);
JedisCluster cluster=new JedisCluster(hosts,config);

Map sm=cluster.getClusterNodes();
Set<String> k=sm.keySet();
Iterator<String> ik=k.iterator();
while(ik.hasNext()) {
System.out.println(ik.next());
}
//使用jedisCluster操作redis
        cluster.set("test_redis", "my first redis**");
        String str = cluster.get("test_redis");
        System.out.println(str);
        //关闭连接池
        //cluster.close();
}

}
相关标签: redis