1、redis cluster的重要配置
cluster-enabled <yes/no>
cluster-config-file <filename>:这是指定一个文件,供cluster模式下的redis实例将集群状态保存在那里,包括集群中其他机器的信息,比如节点的上线和下限,故障转移,不是我们去维护的,给它指定一个文件,让redis自己去维护的
cluster-node-timeout <milliseconds>:节点存活超时时长,超过一定时长,认为节点宕机,master宕机的话就会触发主备切换,slave宕机就不会提供服务
2、在三台机器上启动6个redis实例
(1)在eshop-03上部署目录
/etc/redis(存放redis的配置文件),/var/redis/6379(存放redis的持久化文件)
(2)编写配置文件
redis cluster集群,要求至少3个master,去组成一个高可用,健壮的分布式的集群,每个master都建议至少给一个slave,3个master,3个slave,最少的要求,正式环境下,建议都是说在6台机器上去搭建,至少3台机器,保证,每个master都跟自己的slave不在同一台机器上,如果是6台自然更好,一个master+一个slave就死了,3台机器去搭建6个redis实例的redis cluster
每台机器都创建以下目录:
mkdir -p /etc/redis-cluster (集群文件)
mkdir -p /var/log/redis (日志文件)
mkdir -p /var/redis/7001-7006 (端口配置文件)
port 7001
cluster-enabled yes
cluster-config-file /etc/redis-cluster/node-7001.conf
cluster-node-timeout 15000
daemonize yes
pidfile /var/run/redis_7001.pid
dir /var/redis/7001
logfile /var/log/redis/7001.log
bind 192.168.31.187
appendonly yes
至少要用3个master节点启动,每个master加一个slave节点,先选择6个节点,启动6个实例,将上面的配置文件,在/etc/redis下放6个,分别为: 7001.conf,7002.conf,7003.conf,7004.conf,7005.conf,7006.conf
(3)准备生产环境的启动脚本
在/etc/init.d下,放6个启动脚本,分别为: redis_7001, redis_7002, redis_7003, redis_7004, redis_7005, redis_7006
每个启动脚本内,都修改对应的端口号
(4)分别在3台机器上,启动6个redis实例
注意:将每个配置文件中的slaveof给删除
3、创建集群
注:安装集群之前需要安装ruby
(1)安装ruby(随意一台安装即可)
(1)我使用以下命令安装出现ruby版本太低的问题,没解决
yum install -y ruby
yum install -y rubygems
gem install redis
(2)自己去官网下载
https://www.ruby-lang.org/en/news/2018/03/28/ruby-2-3-7-released/
解压 tar -zxvf ruby-2.2.3.tar.gz -C /usr/local/(自定义位置)
执行以下命令:
./configure
make
make install
查看ruby vresion 命令:ruby -v 如果没有查看到版本那说明失败了
cp /usr/local/redis-3.2.8/src/redis-trib.rb /usr/local/bin
redis-trib.rb create --replicas 1 172.16.1.185:7001 172.16.1.185:7002 172.16.1.187:7003 172.16.1.187:7004 172.16.1.188:7005 172.16.1.188:7006
--replicas: 每个master有几个slave
6台机器,3个master,3个slave,尽量自己让master和slave不在一台机器上
4、 检查集群状况
redis-trib.rb check 192.168.31.187:7001
redis-trib.rb check 172.16.1.188:7005
5、测试读写分离+高可用+多master
读写分离:每个master都有一个slave
高可用:master宕机,slave自动被切换过去
多master:横向扩容支持更大数据量
集群状况
异常停止Masters主节点7001
重新查看节点情况 7004成为了主节点
重新启动7001
6、reids集群读写操作演示
redis cluster,提供了多个master,数据可以分布式存储在多个master上; 每个master都带着slave,自动就做读写分离; 每个master如果故障,那么久会自动将slave切换成master,高可用
1、实验多master写入 -> 海量数据的分布式存储
你在redis cluster写入数据的时候,其实是你可以将请求发送到任意一个master上去执行,但是,每个master都会计算这个key对应的CRC16值,然后对16384个hashslot取模,找到key对应的hashslot,找到hashslot对应的master,如果对应的master就在自己本地的话,set mykey1 v1,mykey1这个key对应的hashslot就在自己本地,那么自己就处理掉了,但是如果计算出来的hashslot在其他master上,那么就会给客户端返回一个moved error,告诉你,你得到哪个master上去执行这条写入的命令
什么叫做多master的写入,就是每条数据只能存在于一个master上,不同的master负责存储不同的数据,分布式的数据存储
2、实验不同master各自的slave读取 -> 读写分离
在这个redis cluster中,如果你要在slave读取数据,那么需要带上readonly指令,get mykey1
redis-cli -c启动,就会自动进行各种底层的重定向的操作
redis cluster的读写分离的时候,会发现有一定的限制性,默认情况下,redis cluster的核心的理念,主要是用slave做高可用的,每个master挂一两个slave,主要是做数据的热备,还有master故障时的主备切换,实现高可用的
redis cluster默认是不支持slave节点读或者写的,跟我们手动基于replication搭建的主从架构不一样的
slave node,readonly,get,这个时候才能在slave node进行读取
redis cluster,主从架构是出来,读写分离,复杂了点,也可以做,jedis客户端,对redis cluster的读写分离支持不太好的,默认的话就是读和写都到master上去执行的
核心的思路,就是说,redis cluster的时候,就没有所谓的读写分离的概念了
读写分离,是为了什么,主要是因为要建立一主多从的架构,才能横向任意扩展slave node去支撑更大的读吞吐量,redis cluster的架构下,实际上本身master就是可以任意扩展的,你如果要支撑更大的读吞吐量,或者写吞吐量,或者数据量,都可以直接对master进行横向扩展就可以了,也可以实现支撑更高的读吞吐的效果
redis cluster,不太好,server层面,jedis client层面,对master做扩容,所以说扩容master,跟之前扩容slave,效果是一样的
redis cluster模式下,不建议做物理的读写分离了.我们建议通过master的水平扩容,来横向扩展读写吞吐量,还有支撑更多的海量数据,redis单机
读吞吐是5w/s,写吞吐2w/s,扩展redis更多master,那么如果有5台master,不就读吞吐可以达到总量25/s QPS,写可以达到10w/s QPS
7、reids集群加入新master
redis是怎么扩容的? 这时就可以添加新的master
1.在eshop-3创建一个新的redis 7007实例
mkdir -p /var/redis/7007
port 7007
cluster-enabled yes
cluster-config-file /etc/redis-cluster/node-7007.conf
cluster-node-timeout 15000
daemonize yes
pidfile /var/run/redis_7007.pid
dir /var/redis/7007
logfile /var/log/redis/7007.log
bind 192.168.31.227
appendonly yes
搞一个7007.conf,再搞一个redis_7007启动脚本
手动启动一个新的redis实例,在7007端口上
将节点7007加入集群
redis-trib.rb add-node 172.16.1.188:7007 172.16.1.185:7001
查看集群情况
redis-trib.rb check 172.16.1.185:7001
2、reshard一些数据过去
resharding的意思就是把一部分hash slot从一些node上迁移到另外一些node上,从上面可以看下新的node节点slot数量为0,需要从别的node节点转移部分slot数量过来
redis-trib.rb reshard 172.16.1.185:7001
要把之前3个master上,总共4096(平均分到每一个master上面 16384/4=4096)个hashslot迁移到新的第四个master上去
How many slots do you want to move (from 1 to 16384)? 4096
接着就填入迁移目的地的7007的id,
接着填写迁移目标源的id 7001 7005 7003 的id确认即可
done
注意:
我这迁移过程出了点小情况,截图如下:( 在迁移一个节点上的slot到另一个节点的时候卡在其中的一个slot报错,查询发现在12233的这个slot上面存在一个key,但是并没有发现这个key有什么问题。使用fix进行修复也还是不行。)
解决办法:
登入提示错误的两个节点执行以下清除命令
cluster setslot 12233 stable
redis-trib.rb fix 172.16.1.188:7005
查看最后集群情况:
7、reids集群加入node作为slave
1.在eshop-3创建一个新的redis 7008实例
mkdir -p /var/redis/7008
port 7008
cluster-enabled yes
cluster-config-file /etc/redis-cluster/node-7008.conf
cluster-node-timeout 15000
daemonize yes
pidfile /var/run/redis_7008.pid
dir /var/redis/7008
logfile /var/log/redis/7008.log
bind 192.168.31.227
appendonly yes
添加一个slave到指定id的master节点上
redis-trib.rb add-node --slave --master-id 60555814167f1604345f1d706ce860a3bfbde541 (master 的Id)172.16.1.188:7008 172.16.1.185:7001
8、reids集群删除node
先用resharding将数据都移除到其他节点,确保node为空之后,才能执行remove操作
redis-trib.rb reshard 172.16.1.185:7001(参考添加节点)
未resharding之前:
7001 4096 + 1366 = 5462
7002 4151 + 1310 = 5461
7003 4096 + 1365 = 5461
之后:
redis-trib.rb del-node 172.16.1.185:7001 33417112506ff0414708ccc5ec1574d602d0ed68(node-id)
当你清空了一个master的hashslot时,redis cluster就会自动将其slave挂载到其他master上去,这个时候就只要删除掉master就可以了
9、reids集群slave的自动迁移
比如现在有10个master,每个有1个slave,然后新增了3个slave作为冗余,有的master就有2个slave了,有的master出现了salve冗余
如果某个master的slave挂了,那么redis cluster会自动迁移一个冗余的slave给那个master
参考:https://segmentfault.com/a/1190000017545214?utm_source=tag-newest