八、Redis集群
1、Redis集群概述
- Redis使用会出现哪些问题?
- 1、容量不够,Redis如何进行扩容?
- 2、并发写操作,Redis如何分摊?
- Redis中的无中心化集群
- Redis集群实现了对Redis的水平扩容,即启动N个Redis节点,将整个数据库分步存储在这N个节点中,每个节点存储总数的1/N
- Redis集群通过分区(partition)来提供一定程度的可用性(availability):即使集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求
2、Redis集群搭建
-
使用六个端口分别开启redis服务器,模拟六台服务器
-
1、将原来保存的rdb或aof文件全部删掉 命令: [root@localhost myredis]# rm -rf *.rdb
-
2、制作6个实例:6379 6380 6381 6389 6390 6391
-
在每个配置文件中配置(注意更改端口相关配置)
include /myredis/redis.conf # 导入配置文件 pidfile /var/run/redis_6391.pid port 6391 # 指定端口号 dbfilename dump6391.rdb # 指定持久化文件名称 cluster-enabled yes # 开启支持集群 cluster-config-file nodes-6391.conf # 设置节点配置文件名称 cluster-node-timeout 15000 # 设定节点失联时间,超过该时间(毫秒),集群自动进入主从切换
-
-
3、启动六个服务
-
redis-server启动服务
[root@localhost myredis]# redis-server redis6379.conf [root@localhost myredis]# redis-server redis6380.conf [root@localhost myredis]# redis-server redis6381.conf [root@localhost myredis]# redis-server redis6389.conf [root@localhost myredis]# redis-server redis6390.conf [root@localhost myredis]# redis-server redis6391.conf
-
查看进程是否启动成功
[root@localhost myredis]# ps -ef | grep redis root 9726 1 0 10:31 ? 00:00:00 redis-server *:6379 [cluster] root 9732 1 0 10:31 ? 00:00:00 redis-server *:6380 [cluster] root 9738 1 0 10:32 ? 00:00:00 redis-server *:6381 [cluster] root 9752 1 0 10:32 ? 00:00:00 redis-server *:6389 [cluster] root 9758 1 0 10:32 ? 00:00:00 redis-server *:6390 [cluster] root 9764 1 0 10:32 ? 00:00:00 redis-server *:6391 [cluster] root 9779 9442 0 10:33 pts/2 00:00:00 grep --color=auto redis
-
-
4、将六个节点合成一个集群
-
1、要保证所有的redis实例启动后,node-xxx.conf文件都能正常生成
-
2、进行合成操作
-
2.1、进入到redis原始目录的src目录下,执行下列操作
redis-cli --cluster create --cluster-replicas 1 192.168.17.143:6379 192.168.17.143:6380 192.168.17.143:6381 192.168.17.143:6389 192.168.17.143:6390 192.168.17.143:6391
-
2.2、注意点:
- 此处不要使用127.0.0.1,使用真实的IP地址
- replicas 1 采用最简单的方式配置集群,一台主机,一台从机,正好三组
-
2.3、示例
[root@localhost myredis]# cd /opt/redis-6.2.1/src [root@localhost src]# redis-cli --cluster create --cluster-replicas 1 192.168.17.143:6379 192.168.17.143:6380 192.168.17.143:6381 192.168.17.143:6389 192.168.17.143:6390 192.168.17.143:6391
-
-
3、完成集群搭建
-
出现下述示例便完成了搭建
-
-
4、客户端登录集群
[root@localhost src]# redis-cli -c -p 6379
-
通过cluster nodes命令查看集群信息
-
-
3、Redis集群插槽(slots)
-
首先要了解Redis集群如何分配节点
- 1、一个集群至少需要3个主节点
- 2、选项 --cluster-replicas 1 表示我们希望为集群中的每个主节点创建一个从节点
- 3、分配原则是什么:尽量保证每个主数据库运行在不同的IP地址,每个从库和主库不在一个IP地址上
-
什么是插槽(slot)?
-
一个Redis集群中包含16384(0-16383)个插槽,数据库中的每一个键通过计算都是属于这16384中的一个
-
通过某种算法计算key属于哪个插槽(类似于java中的Set存储过程)
-
每一个节点享有一部分插槽
-
以上面搭建集群为例,插槽如下分配
节点 A 负责处理 0 号至 5460 号插槽 节点 B 负责处理 5461 号至 10922 号插槽 节点 C 负责处理 10923 号至 16383 号插槽
-
Redis使用插槽分配key的作用
- 使得key能够平均的落在每一个节点中,减少每个节点服务器的压力
-
4、在集群中值操作
-
在redis-cli每次录入、查询键值,redis都会计算出该key的插槽值并送往指定的插槽,如果不是当前客户端连接服务器的插槽,redis会报错,并告知应前往指定的redis实例地址和端口
-
redis-cli客户端提供了 -c 参数 实现了自动重定向的功能,上面登录的命令就是
-
不在slot下的键值,是不能够使用mget,mset等多键操作的
-
可以通过{}来定义组的概念,从而使key中的{}内相同内容的键值放到一个slot中去
-
查询集群中的值
5、故障恢复
- 1、如果主节点宕机(下线),从节点会自动升为主节点 :要注意上述配置文件中配置的超时时间
- 2、主节点恢复后,主从关系变化 : 主节点回来变为从机
- 3、如果某一段插槽的主节点全部宕机,redis服务时候还能继续?
- 若配置文件中,cluster-require-full-coverage 为yes ,那么 ,整个集群都挂掉
- 若配置文件中,cluster-require-full-coverage 为no ,那么 ,该插槽数据全都不能使用,也无法存储
6、java操作Redis集群
public class JedisTest{
public static void main(String[] args){
//创建对象,当然那也可以创建一个set集合,将端口号放进去
//new HashSet(new HostAndPort())
HostAndPort hostAndPort = new HostAndPort("192.168.17.143",6379);
//只需要连接一个端口即可,因为Redis的无中心化集群,会自动切换节点
JedisCluster jedisCluster = new JedisCluster(hostAndPort);
//数据操作
jedisCluster.set("key","value");
String value = jedisCluster.get("key");
}
}
7、Redis集群的优缺点
- Redis集群的优点
- 1、实现了扩容
- 2、分摊压力
- 3、无中心配置相对简单
- Redis集群的不足
- 1、多键操作是不被支持的
- 2、多键的Redis事务不被支持,lua脚本不支持
- 3、该无中心化集群出现较晚,很多公司采用了其他集群方案,迁移难度较大