一,问题
容量不够,redis如何进行扩容
并发写操作,redis如何进行分摊
主从模式、薪火相传模式,主机宕机,导致ip地址发生变化,应用程序中配置需要对应主机地址,端口信息等。
之前通过代理主机来解决,但是redis3.0中提拱了解决方案,就是无中心化集群配置
代理主机:在客户端和redis服务器之间加一台代理服务器,客户端通过代理服务器来对目标服务器进行访问;
无中心化集群:就是客户端发起请求,可以到任何一台目标服务器,目标服务器发现如果不是自己的任务,可以转交下一台服务器进行处理。
二、介绍
Redis集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库库分布存储在这N个节点中,每个节点存储总数据的1/N。
Redis集群通过分区来提供一定程度上的可用性:即使集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求。
三、搭建
在/myredis目录下操作
1、将rdb,aof文件都删掉
2、制作6个实例,6379,6380,6381,6389,6390,6391
3、添加相应配置(以6379为例,其他替换6379即可)
include /home/du/myredis/redis.conf
pidfile "/var/run/redis_6379.pid"
port 6379
dbfilename "dump6379.rdb"
cluster-enabled yes #开启集群模式
cluster-config-file nodes-6379.conf #设置节点配置名称
cluster-node-timeout 15000 # 设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换
4、启动6个redis服务,将6个节点合成一个集群
4.1 进入到redis的安装目录的src目录 /opt/redis-6.2.8/src
4.2 执行如下命令(这里只是演示)
一个集群至少要有三个主节点
--cluster-replicas 1 以最简单的方式 为每个主节点创建一个从节点
分配原则尽量保证每个主数据库运行在不同的IP地址,每个从库和主库不在一个IP地址上
redis-cli --cluster create --cluster-replicas 1 192.168.xxx.165:6379 192.168.xxx.165:6380 192.168.xxx.165:6381 192.168.xxx.165:6389 192.168.xxx.165:6390 192.168.xxx.165:6391
5、测试连接
-c 采用集群策略进行连接,设置数据会自动切换到相应的写主机
redis-cli -c -p 6379
通过cluster nodes 命令查看集群信息
四、slots插槽
1、介绍
一个Redis集群包括16384个插槽(hash slot),数据库中每个键都属于这16384个插槽的其中一个
集群使用公式CRC16(key)%16384 来计算键key属于哪个插槽,其中CRC16(key)语句用于计算键key的CRC16校验和。
集群中的每个节点负责处理一部分插槽。举个例子,如果一个集群可以有主节点,其中
节点A负责处理0-5460号插槽
节点B负责处理5461-10922号插槽
节点C负责处理10923-16383号插槽
2、演示
1、当添加一个值时,redis会计算插槽值,然切换到对应范围的主机
2、不在同一个slot下的键值,是不能使用mget,mset等多键操作,因为计算出来的slot值不在一个范围时,无法切换主机
3、可以通过{}来定义组的概念,从而使key中的{}内相同内容的键值放到一个slot中去
4、查询集群中的值
:6380> cluster keyslot k1 #计算k1键的插槽值
(integer) 12706
:6380> cluster countkeysinslot 12706 #获取插槽12706值的数量 只能返回当前主机slotf范围的
(integer) 0
:6379> cluster countkeysinslot 449
(integer) 1
192.168.188.165:6379> cluster getkeysinslot 449 2 #获取插槽449两个值,因为只有一个所以返回一个
1) "k2"
五、故障恢复
1、当某主机挂掉之后,从机会接替主机的工作成为主机,并且当原主机启动之后,会成为新主机的从机
2、如果某一段插槽主从都挂掉,而cluster-require-full-coverage为yes,那么整个集群都挂掉。
如果某一段插槽主从都挂掉,而cluster-require-full-coverage为no,那么该插槽的数据群都不能使用,也无法存储。
六、Jedis操作演示
即使连接的不是主机,集群会自动切换主机存储,主机写,从机读。
无中心化主从集群,无论从哪台主机写的数据,其他主机都能读到数据。
/**
* Jedis操作Redis集群演示
*/
@Test
public void redisClusterDemo(){
//创建对象
HostAndPort hostAndPort = new HostAndPort("192.168.xxx.165", 6379);
JedisCluster jedisCluster = new JedisCluster(hostAndPort);
//进行操作
String set = jedisCluster.set("b1", "value1");
String value1 = jedisCluster.get("b1");
System.out.println(value1);
//关闭
jedisCluster.close();
}
七、Redis集群的优势与不足
优点:1、实现扩容
2、分摊压力
3、无中心配置,相对简单
不足:1:多键操作不被支持
2、多键的Redis事务是不被支持的,lua脚本不被支持
3、由于集群方案出现较晚,很多公司已经采用了其他集群方案,而代理或者客户端分片的方案想要迁移至redis cluster,需要整体迁移而不是逐步过渡,复杂度较大。