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的主从和哨兵两种集群方案,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();
}
}
推荐阅读