redis集群是一个由多个主从节点群组成的分布式服务器群,它具有复制、高可用和分片特 性。Redis集群不需要sentinel哨兵也能完成节点移除和故障转移的功能。需要将每个节点 设置成集群模式,这种集群模式没有中心节点,可水平扩展,据官方文档称可以线性扩展到 上万个节点(官方推荐不超过1000个节点)。redis集群的性能和高可用性均优于之前版本的 哨兵模式,且集群配置非常简单 。
redis键值对定位:
(1) Cluster 默认会对 key 值使用 crc16 算法进行 hash 得到一个整数值,然后用这个整 数值对 16384 进行取模来得到具体槽位。 HASH_SLOT = CRC16(key) mod 16384
(2) 当客户端向一个错误的节点发出了指令,该节点会发现指令的 key 所在的槽位并不归 自己管理,这时它会向客户端发送一个特殊的跳转指令携带目标操作的节点地址,告 诉客户端去连这个节点去获取数据。客户端收到指令后除了跳转到正确的节点上去操 作,还会同步更新纠正本地的槽位映射表缓存,后续所有 key 将使用新的槽位映射 表。
redis下载地址:https://github.com/MSOpenTech/redis/releases.选择msi安装或者zip解压即可;
注意:Redis集群内部主节点数为奇数个,所以集群的最低配置是3个主节点与3个从节点,也就是说至少有6个节点。
将 Redis 解压后文件复制出 5 份,配置三主三从集群(放到新建的redis-cluster文件夹下)。 分别放入 redis-7002-zhu2、 redis-7003-zhu3, redis-7004-cong1,redis-7006-cong2,redis-7006-cong3。(实际redis主从不安文件名区分)
(1) daemonize yes (开启守护进程,保证进程安全)
(2) port 7001(分别对每个redis的端口号进行设置,一共五份)
这里默认端口为6379。
(3) cluster-enabled yes(启动集群模式,不开启会报不是集群节点配置)
(4) cluster-config-file nodes-7001.conf (集群节点信息文件,这里700x好和port对应)
(5) cluster-node-timeout 5000 (设置连接超时时间)
(6) # bind 127.0.0.1(去掉bind绑定访问ip信息,否则只能访问本机)
(7) protected-mode no (关闭保护模式)
(8) appendonly yes (设置AOF持久化–非必须)
如果要设置密码需要增加如下配置:
(9) requirepass 123456 (设置redis访问密码)
(10) masterauth 123456 (设置集群节点间访问密码,跟上面一致)
1.进入到每个redis服务的目录下,执行cmd打开命令管理窗口;
2.输入命令:redis-server.exe --service-install redis.windows-service.conf --service-name redis-700x --port 700x。
(1)Ruby下载地址:https://rubyinstaller.org/downloads/.
测试:下载完成后进入Ruby的bin目录下执行cmd,执行 ruby -v 出现版本号证明安装成功。
(2)安装ruby驱动:https://rubygems.org/pages/download.(选择zip)
(3)解压文件,命令窗口切换到解压目录,执行cmd,输入ruby setup.rb 安装环境。
(4)切换到redis-cluster文件夹,执行cmd,输入gem install redis
(5)测试执行gem -v 出现版本号证明Ruby环境搭建完成
1.下载地址:https://github.com/beebol/redis-trib.rb
2.下载完成后放到redis-cluster文件夹下
1.进入到redis-cluster目录,执行cmd;
2.输入集群命令:
redis-trib.rb create --replicas 1 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 127.0.0.1:7006
询问Can I set above configuation?时输入 yes 自动配置集群,最后出现 All 16384 slots covered 证明哈希槽分配成功。
1.进入到任意一个redis服务器,执行cmd;输入启动命令:
redis-cli.exe -a 123456 -c -h 127.0.0.1 -p 7001
-a访问服务端密码,-c表示集群模 式,指定ip地址和端口号,(没设密码不用-a)。
2.进行验证
cluster info(查看集群信息),如果出现如下信息证明redis集群配置完成。
1.导入maven依赖:
redis.clients
jedis
2.9.0
2.集群代码如下:
package com.tuling.redisCluster;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;
/**
* 访问redis集群
*/
public class RedisCluster
{
public static void main(String[] args) throws IOException
{
Set jedisClusterNode = new HashSet();
/*添加集群节点*/
jedisClusterNode.add(new HostAndPort("192.168.0.61", 8001));
jedisClusterNode.add(new HostAndPort("192.168.0.61", 8002));
jedisClusterNode.add(new HostAndPort("192.168.0.62", 8003));
jedisClusterNode.add(new HostAndPort("192.168.0.62", 8004));
jedisClusterNode.add(new HostAndPort("192.168.0.63", 8005));
jedisClusterNode.add(new HostAndPort("192.168.0.63", 8006));
JedisPoolConfig config = new JedisPoolConfig();
/*设置最大连接数*/
config.setMaxTotal(100);
/*设置最大等待连接数*/
config.setMaxIdle(10);
/*设置jedis实例均为可用*/
config.setTestOnBorrow(true);
//connectionTimeout:指的是连接一个url的连接等待时间
//soTimeout:指的是连接上一个url,获取response的返回等待时间
JedisCluster jedisCluster = new JedisCluster(jedisClusterNode, 6000, 5000, 10, config);
System.out.println(jedisCluster.set("student", "zhuge"));
System.out.println(jedisCluster.set("age", "19"));
System.out.println(jedisCluster.get("student"));
System.out.println(jedisCluster.get("age"));
System.out.println(jedisCluster.get("name"));
/*关闭连接,释放资源*/
jedisCluster.close();
}
}