Redis Cluster是Redis官方提供的分布式解决方案。当遇到内存、并发、流量等瓶颈时,就可以采用Cluster架构达到负载均衡目的。官方文档:https://redis.io/docs/management/scaling/
1.为什么要用redis-cluster集群?
1.首先Redis单实例主要有单点,容量有限,流量压力上限的问题。 Redis单点故障,可以通过主从复制replication,和自动故障转移sentinel哨兵机制。但Redis单Master实例提供写服务,仍然有容量和压力问题,因此需要数据分区,构建多个Master实例同时提供读写服务(不仅限于从replica节点提供读服务)。 2.并发问题 redis官方声称可以达到 10万/s,每秒执行10万条命令 假如业务需要每秒100万的命令执行呢? 解决方案如下 1.正确的应该是考虑分布式,加机器,把数据分到不同的位置,分摊集中式的压力,一堆机器做一件事.还需要一定的机制保证数据分区,并且数据在各个主Master节点间不能混乱,当然最好还能支持在线数据热迁移的特性。
2、什么是Redis-Cluster
为何要搭建Redis集群。Redis是在内存中保存数据的,而我们的电脑一般内存都不大,这也就意味着Redis不适合存储大数据,Redis更适合处理高并发,一台设备的存储能力是很有限的,但是多台设备协同合作,就可以让内存增大很多倍,这就需要用到集群。
Redis集群搭建的方式有多种,例如使用客户端分片、Twemproxy、Codis等,但从redis 3.0之后版本支持redis-cluster集群,它是Redis官方提出的解决方案: Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。其Redis-cluster架构图如下:
2.1 redis cluster特点
1.所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。 2.客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。 3.节点的fail是通过集群中超过半数的节点检测失效时才生效。
2.2 redis-cluster数据分布
Redis-cluster集群中有16384(0-16383)个哈希槽,每个redis实例负责一部分slot/槽位,集群中的所有信息通过节点数据交换而更新。一个hash slot中会有很多key和value。
2.3 数据分布存储原理
Redis 集群使用数据分片(sharding)来实现:Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value(name1: 张三) 时,redis 先对 key 使用 crc16 算法算出一个结果678698,然后把结果对 16384 求余数(集群使用公式 CRC16(key) % 16384),这样每个key 都会对应一个编号在 0-16383 之间的哈希槽,那么redis就会把这个key 分配到对应范围的节点上了。同样,当连接三个节点任何一个节点想获取这个key时,也会这样的算法,然后内部跳转到存放这个key节点上获取数据。
例如三个节点:哈希槽分布的值如下:
cluster1: 0-5460 cluster2: 5461-10922 cluster3: 10923-16383
这种将哈希槽分布到不同节点的做法使得用户可以很容易地向集群中添加或者删除节点。 比如说:
-
如果用户将新节点 D 添加到集群中, 那么集群只需要将节点 A 、B 、 C 中的某些槽移动到节点 D 就可以了。
-
如果用户要从集群中移除节点 A , 那么集群只需要将节点 A 中的所有哈希槽移动到节点 B 和节点 C , 然后再移除空白(不包含任何哈希槽)的节点 A 就可以了。
因为将一个哈希槽从一个节点移动到另一个节点不会造成节点阻塞, 所以无论是添加新节点还是移除已存在节点, 又或者改变某个节点包含的哈希槽数量, 都不会造成集群下线。
3、Redis Cluster主从模式
redis cluster 为了保证数据的高可用性,加入了主从模式,一个主节点对应一个或多个从节点,主节点提供数据存取,从节点则是从主节点拉取数据备份,当这个主节点挂掉后,就会有这个从节点选取一个来充当主节点,从而保证集群不会挂掉. 1.主从切换机制 选举过程是集群中所有master参与,如果半数以上master节点与故障节点通信超过(cluster-node-timeout),认为该节点故障,自动触发故障转移操作. #故障节点对应的从节点自动升级为主节点 2.什么时候整个集群就不能用了? 如果集群任意一个主节点挂掉,且当前主节点没有从节点,则集群将无法继续,因为我们不再有办法为这个节点承担范围内的哈希槽提供服务。但是,如果这个主节点和所对应的从节点同时失败,则Redis Cluster无法继续运行。
二、集群部署
环境准备: 1.准备三机器,关闭防火墙和selinux 2.制作解析并相互做解析 注:规划架构两种方案,一种是单机多实例,这里我们采用多机器部署 三台机器,每台机器上面两个redis实例,一个master一个slave,第一列做主库,第二列做备库 #记得选出控制节点 redis-cluster1 192.168.116.172 7000、7001 redis-cluster2 192.168.116.173 7002、7003 redis-cluster3 192.168.116.174 7004、7005
1.三台机器相同操作
1.安装redis [root@redis-cluster1 ~]# mkdir /data [root@redis-cluster1 ~]# yum -y install gcc automake autoconf libtool make [root@redis-cluster1 ~]# wget https://download.redis.io/releases/redis-6.2.0.tar.gz [root@redis-cluster1 ~]# tar xzvf redis-6.2.0.tar.gz -C /data/ [root@redis-cluster1 ~]# cd /data/ [root@redis-cluster1 data]# mv redis-6.2.0/ redis [root@redis-cluster1 data]# cd redis/ [root@redis-cluster1 redis]# make #编译 [root@redis-cluster1 redis]# mkdir /data/redis/data #创建存放数据的目录
2.创建节点目录:按照规划在每台redis节点的安装目录中创建对应的目录(以端口号命名) [root@redis-cluster1 redis]# pwd /data/redis [root@redis-cluster1 redis]# mkdir cluster #创建集群目录 [root@redis-cluster1 redis]# cd cluster/ [root@redis-cluster1 cluster]# mkdir 7000 7001 #创建节点目录 [root@redis-cluster2 redis]# mkdir cluster [root@redis-cluster2 redis]# cd cluster/ [root@redis-cluster2 cluster]# mkdir 7002 7003 [root@redis-cluster3 redis]# mkdir cluster [root@redis-cluster3 redis]# cd cluster/ [root@redis-cluster3 cluster]# mkdir 7004 7005
3.拷贝配置文件到节点目录中,#三台机器相同操作 [root@redis-cluster1 cluster]# cp /data/redis/redis.conf 7000/ [root@redis-cluster1 cluster]# cp /data/redis/redis.conf 7001/ [root@redis-cluster2 cluster]# cp /data/redis/redis.conf 7002/ [root@redis-cluster2 cluster]# cp /data/redis/redis.conf 7003/ [root@redis-cluster3 cluster]# cp /data/redis/redis.conf 7004/ [root@redis-cluster3 cluster]# cp /data/redis/redis.conf 7005/
4.修改集群每个redis配置文件。(主要是端口、ip、pid文件,三台机器相同操作),修改如下: [root@redis-cluster1 cluster]# cd 7000/ [root@redis-cluster1 7000]# vim redis.conf #修改如下 bind 192.168.116.172 #每个实例的配置文件修改为对应节点的ip地址 port 7000 #