redis cluster集群搭建

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值