与优快云前500强大佬谈 Redis - Cluster — 论后感

本文详细介绍了如何在一台机器上搭建Redis Cluster,包括安装、配置、创建集群、扩增主从节点、分配槽位以及缩容过程。适合理解高可用集群和需要提升QPS的企业级应用。

目录

前言

搭建集群

安装Redis

修改配置文件

创建集群

横向扩容集群

添加新的主与从节点

新扩容节点分配槽位

集群的缩容

将剔除master节点的所有槽位移到redis其他集群master节点上

 测试是否成功

总结

 

前言

          关于redis类的文章我,我前面也写过几篇,redis的介绍、安装、主从等等。本以为自己已经炉火纯青,直到和排名前500的大佬深入了解之后,才发现自己啥也不是,于是乎夜以继日的学习,今天决定把这篇文章写出来。redis最开始使用主从模式做集群,若master宕机需要手动配置slave转为master,后来为了高可用提出来哨兵模式,该模式下有一个哨兵监视master和slave,若master宕机可自动将slave转为master,但它也有一个问题,就是不能动态扩充。所以在3.x提出cluster集群模式,关于redis-cluster集群下我总结了以下几个方面的特点:

  • 能够实行高可用的主从复制,不会出现单点
  • 业务提高需要更多的QPS,横向扩展则可以解决这问题
  • 离线计算,需要中间环节缓冲等别的需求
  • 网络流量需求:业务的流量已经超过服务器的网卡的上限值,可以使用分布式来进行分流

下图则是集群的一个工作规范,下面我来详细的搭建一下:

搭建集群

安装Redis

1)下载安装包上传并解压

##注意redis5.0以下可能跟我创建集群的方式有所不同!!!
[root@redis-cluster opt]# ls
redis-5.0.5.tar.gz
[root@redis-cluster opt]# tar xzf redis-5.0.5.tar.gz 

2)安装

##注意先要安装redis的依赖包,否则无法安装
[root@redis-cluster opt]# yum -y install gcc gcc-c++   ##redis基于c语言开发的 
[root@redis-cluster opt]# cd redis-5.0.5
[root@redis-cluster redis-5.0.5]# make
[root@redis-cluster redis-5.0.5]# make install

修改配置文件

#说明:资源有限,这里我在一台机器上做redis集群。具体配置我会在下面说清楚,当然如果资源有限也可以使用多台机器配置。集群最少6个节点,三主三从。后面我也会做集群的扩容!!

 1)创建目录,为下面实验铺垫

##每个redis文件代表一个服务,如下
[root@redis-cluster ~]# mkdir /myredis
[root@redis-cluster ~]# cd /myredis/
[root@redis-cluster myredis]# mkdir redis700{0..7}
[root@redis-cluster myredis]# ls   #每个文件夹代表一个redis
redis7000  redis7001  redis7002  redis7003  redis7004  redis7005  redis7006  redis7007

2)改每一个服务的配置文件

这里下载配置文件 ~~> 点我点我

##配置文件改的地方较多,所以暖男我把配置文件已上传至资源,点击上方链接替换原有的redis配置文件,修改部分参数即可使用,下面是我的演示
[root@redis-cluster ~]# ls    #上传的位置
anaconda-ks.cfg  redis.conf  ##切记!!!配置文件里面的bind ip 要改为本机的ip
[root@redis-cluster myredis]# sed 's/7000/7000/g' /root/redis.conf > ./redis7000/redis.conf
[root@redis-cluster myredis]# sed 's/7000/7001/g' /root/redis.conf > ./redis7001/redis.conf
[root@redis-cluster myredis]# sed 's/7000/7002/g' /root/redis.conf > ./redis7002/redis.conf
[root@redis-cluster myredis]# sed 's/7000/7003/g' /root/redis.conf > ./redis7003/redis.conf
[root@redis-cluster myredis]# sed 's/7000/7004/g' /root/redis.conf > ./redis7004/redis.conf
[root@redis-cluster myredis]# sed 's/7000/7005/g' /root/redis.conf > ./redis7005/redis.conf
[root@redis-cluster myredis]# sed 's/7000/7006/g' /root/redis.conf > ./redis7006/redis.conf
[root@redis-cluster myredis]# sed 's/7000/7007/g' /root/redis.conf > ./redis7007/redis.conf
#致此所有服务的配置文件已改完成!

3)启动对应的服务

##这里我先启动6个,三主三从,另外两个节点后续演示扩容
[root@redis-cluster myredis]# /usr/local/bin/redis-server /myredis/redis7000/redis.conf 
[root@redis-cluster myredis]# /usr/local/bin/redis-server /myredis/redis7001/redis.conf 
[root@redis-cluster myredis]# /usr/local/bin/redis-server /myredis/redis7002/redis.conf 
[root@redis-cluster myredis]# /usr/local/bin/redis-server /myredis/redis7003/redis.conf 
[root@redis-cluster myredis]# /usr/local/bin/redis-server /myredis/redis7004/redis.conf 
[root@redis-cluster myredis]# /usr/local/bin/redis-server /myredis/redis7005/redis.conf
[root@redis-cluster myredis]# ps -ef | grep redis   #这样为成功
root      13929      1  0 17:09 ?        00:00:00 /usr/local/bin/redis-server 192.168.191.128:7000 [cluster]
root      13934      1  0 17:09 ?        00:00:00 /usr/local/bin/redis-server 192.168.191.128:7001 [cluster]
root      13939      1  0 17:09 ?        00:00:00 /usr/local/bin/redis-server 192.168.191.128:7002 [cluster]
root      13944      1  0 17:09 ?        00:00:00 /usr/local/bin/redis-server 192.168.191.128:7003 [cluster]
root      13949      1  0 17:09 ?        00:00:00 /usr/local/bin/redis-server 192.168.191.128:7004 [cluster]
root      13954      1  0 17:09 ?        00:00:00 /usr/local/bin/redis-server 192.168.191.128:7005 [cluster]
root      13960   9418  0 17:09 pts/1    00:00:00 grep --color=auto redis

创建集群

1)初始化创建集群

[root@redis-cluster myredis]# /usr/local/bin/redis-cli --cluster create 192.168.191.128:7000 192.168.191.128:7001 192.168.191.128:7002 192.168.191.128:7003 192.168.191.128:7004 192.168.191.128:7005 --cluster-replicas 1  #表示创建时一已从,前三个ip的节点为主

2)登录集群

##-c表示以集群的方式进入,如果不加-c则表示单独进入一个节点,其它节点则不会同步
[root@redis-cluster myredis]# /usr/local/bin/redis-cli -h 192.168.191.128 -p 7000 -c
192.168.191.128:7000> set hya 666
-> Redirected to slot [15500] located at 192.168.191.128:7002
OK
192.168.191.128:7002> get hya    #自动重定向到从
"666"

##通过其它端口登录,可以获取值说明同步没有问题
[root@redis-cluster ~]# /usr/local/bin/redis-cli -h 192.168.191.128 -p 7003 -c
192.168.191.128:7003> get hya
-> Redirected to slot [15500] located at 192.168.191.128:7002
"666"

横向扩容集群

添加新的主与从节点

1)启动剩下的两个节点

[root@redis-cluster myredis]# /usr/local/bin/redis-server /myredis/redis7006/redis.conf 
[root@redis-cluster myredis]# /usr/local/bin/redis-server /myredis/redis7007/redis.conf 

2)新的master节点

[root@redis-cluster myredis]# /usr/local/bin/redis-cli --cluster help  ##这个命令需要记住对我们有帮助
[root@redis-cluster myredis]#  /usr/local/bin/redis-cli --cluster add-node 192.168.191.128:7006 192.168.191.128:7000    #第一个ip是新加入master节点的ip和端口 第二个ip可以是任意redis集群中的ip和端口

3)新的slave节点

###首先先查看下刚才加入的新master的实例id需要登入查看
[root@redis-cluster myredis]# /usr/local/bin/redis-cli -h 192.168.191.128 -p 7000 -c
192.168.191.128:7000> cluster nodes
d2396ff87b8ae8f6fd88aa105ecfae3edf25c858 192.168.191.128:7002@17002 master - 0 1608110881835 3 connected 10923-16383
3cd76e0ac52ca0a3a4fed03f6c2023d916146a60 192.168.191.128:7001@17001 master - 0 1608110881000 2 connected 5461-10922
beef4dd0710ee82ca1eb6f9f701640781e895f09 192.168.191.128:7004@17004 slave d2396ff87b8ae8f6fd88aa105ecfae3edf25c858 0 1608110880810 5 connected
f354bb4a41b3b2db5827af9b6941a9b41d4ccc95 192.168.191.128:7003@17003 slave 3cd76e0ac52ca0a3a4fed03f6c2023d916146a60 0 1608110882859 4 connected
e63caca48244e7989998d4bf58a8d43123e010c5 192.168.191.128:7005@17005 slave c17f970634951e7e42ba414cdc35ad761d3445ce 0 1608110883879 6 connected
f26ab0759142029495a02997ecdd638efde96c81 192.168.191.128:7006@17006 master - 0 1608110879000 0 connected
c17f970634951e7e42ba414cdc35ad761d3445ce 192.168.191.128:7000@17000 myself,master - 0 1608110882000 1 connected 0-5460
##复制新master的实例id准备为它加入slave
[root@redis-cluster myredis]# /usr/local/bin/redis-cli --cluster add-node 192.168.191.128:7007 192.168.191.128:7000 --cluster-slave --cluster-master-id f26ab0759142029495a02997ecdd638efde96c81

新扩容节点分配槽位

1)分配卡槽

[root@redis-cluster myredis]# /usr/local/bin/redis-cli --cluster reshard 192.168.191.128:7000

[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 500   ##这里我给它分配500个槽位
What is the receiving node ID? f26ab0759142029495a02997ecdd638efde96c81  #接入点的实例id
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1: all     #all代表从其它主上抽取部分卡槽给新的节点,当然也可以自己手动分配

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

Do you want to proceed with the proposed reshard plan (yes/no)? yes   #输入yes即可

2)查看是否成功

[root@redis-cluster myredis]# /usr/local/bin/redis-cli -h 192.168.191.128 -p 7000 -c
192.168.191.128:7000> cluster nodes
d2396ff87b8ae8f6fd88aa105ecfae3edf25c858 192.168.191.128:7002@17002 master - 0 1608111516000 3 connected 11089-16383
3cd76e0ac52ca0a3a4fed03f6c2023d916146a60 192.168.191.128:7001@17001 master - 0 1608111515800 2 connected 5628-10922
beef4dd0710ee82ca1eb6f9f701640781e895f09 192.168.191.128:7004@17004 slave d2396ff87b8ae8f6fd88aa105ecfae3edf25c858 0 1608111515000 5 connected
367eb8b3ef633a225b94fbca60e6d74cdd1e9ec8 192.168.191.128:7007@17007 slave f26ab0759142029495a02997ecdd638efde96c81 0 1608111516820 8 connected
f354bb4a41b3b2db5827af9b6941a9b41d4ccc95 192.168.191.128:7003@17003 slave 3cd76e0ac52ca0a3a4fed03f6c2023d916146a60 0 1608111514781 4 connected
e63caca48244e7989998d4bf58a8d43123e010c5 192.168.191.128:7005@17005 slave c17f970634951e7e42ba414cdc35ad761d3445ce 0 1608111517838 6 connected
f26ab0759142029495a02997ecdd638efde96c81 192.168.191.128:7006@17006 master - 0 1608111517000 8 connected 0-165 5461-5627 10923-11088
c17f970634951e7e42ba414cdc35ad761d3445ce 192.168.191.128:7000@17000 myself,master - 0 1608111514000 1 connected 166-5460
###分配成功!

集群的缩容

将剔除master节点的所有槽位移到redis其他集群master节点上

1)剔除卡槽(把下图的卡槽分配到其它主节点上)

##解释 第一个实例id是剔除卡槽的id  第二个是将要分配的主节点的id  cluster-slots后跟卡槽
命令执行后 按yes 即可
[root@redis-cluster ~]# /usr/local/bin/redis-cli --cluster reshard --cluster-from f26ab0759142029495a02997ecdd638efde96c81 --cluster-to c17f970634951e7e42ba414cdc35ad761d3445ce --cluster-slots 165 192.168.191.128:7000

[root@redis-cluster ~]# /usr/local/bin/redis-cli --cluster reshard --cluster-from f26ab0759142029495a02997ecdd638efde96c81 --cluster-to 3cd76e0ac52ca0a3a4fed03f6c2023d916146a60 --cluster-slots 5627 192.168.191.128:7000

[root@redis-cluster ~]# /usr/local/bin/redis-cli --cluster reshard --cluster-from f26ab0759142029495a02997ecdd638efde96c81 --cluster-to d2396ff87b8ae8f6fd88aa105ecfae3edf25c858 --cluster-slots 11088 192.168.191.128:7000

192.168.191.128:7000> cluster nodes   ##此时已经7006端口的卡槽已被分配完
beef4dd0710ee82ca1eb6f9f701640781e895f09 192.168.191.128:7004@17004 slave d2396ff87b8ae8f6fd88aa105ecfae3edf25c858 0 1608171167184 5 connected
367eb8b3ef633a225b94fbca60e6d74cdd1e9ec8 192.168.191.128:7007@17007 slave 3cd76e0ac52ca0a3a4fed03f6c2023d916146a60 0 1608171170214 10 connected
e63caca48244e7989998d4bf58a8d43123e010c5 192.168.191.128:7005@17005 slave c17f970634951e7e42ba414cdc35ad761d3445ce 0 1608171168000 9 connected
d2396ff87b8ae8f6fd88aa105ecfae3edf25c858 192.168.191.128:7002@17002 master - 0 1608171167000 3 connected 11089-16383
3cd76e0ac52ca0a3a4fed03f6c2023d916146a60 192.168.191.128:7001@17001 master - 0 1608171168000 10 connected 165 5461-11088
f354bb4a41b3b2db5827af9b6941a9b41d4ccc95 192.168.191.128:7003@17003 slave 3cd76e0ac52ca0a3a4fed03f6c2023d916146a60 0 1608171168194 10 connected
f26ab0759142029495a02997ecdd638efde96c81 192.168.191.128:7006@17006 master - 0 1608171168000 8 connected
c17f970634951e7e42ba414cdc35ad761d3445ce 192.168.191.128:7000@17000 myself,master - 0 1608171165000 9 connected 0-164 166-5460

 2)删除这两个节点

[root@redis-cluster ~]# /usr/local/bin/redis-cli --cluster del-node 192.168.191.128:7000 f26ab0759142029495a02997ecdd638efde96c81
>>> Removing node f26ab0759142029495a02997ecdd638efde96c81 from cluster 192.168.191.128:7000
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
[root@redis-cluster ~]# /usr/local/bin/redis-cli --cluster del-node 192.168.191.128:7000 367eb8b3ef633a225b94fbca60e6d74cdd1e9ec8
>>> Removing node 367eb8b3ef633a225b94fbca60e6d74cdd1e9ec8 from cluster 192.168.191.128:7000
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.

 测试是否成功

192.168.191.128:7000> cluster nodes   ##已没有这两个节点
beef4dd0710ee82ca1eb6f9f701640781e895f09 192.168.191.128:7004@17004 slave d2396ff87b8ae8f6fd88aa105ecfae3edf25c858 0 1608171364000 5 connected
e63caca48244e7989998d4bf58a8d43123e010c5 192.168.191.128:7005@17005 slave c17f970634951e7e42ba414cdc35ad761d3445ce 0 1608171362000 9 connected
d2396ff87b8ae8f6fd88aa105ecfae3edf25c858 192.168.191.128:7002@17002 master - 0 1608171364112 3 connected 11089-16383
3cd76e0ac52ca0a3a4fed03f6c2023d916146a60 192.168.191.128:7001@17001 master - 0 1608171362099 10 connected 165 5461-11088
f354bb4a41b3b2db5827af9b6941a9b41d4ccc95 192.168.191.128:7003@17003 slave 3cd76e0ac52ca0a3a4fed03f6c2023d916146a60 0 1608171363106 10 connected
c17f970634951e7e42ba414cdc35ad761d3445ce 192.168.191.128:7000@17000 myself,master - 0 1608171363000 9 connected 0-164 166-5460

总结

          其实这种集群大部分一线公司都在使用,这类型的集群至少能古保证99.99%的高可用,相比于主从、哨兵来说比较完善!所以建议大家对此有所了解下!也并不算太难。有时间我会更出数据的迁移以及减容。搬好小板凳,等着我更新吧!此外还要多向排名靠前的大佬们学习!跟着大佬的脚步走受益匪浅。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖胖不胖、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值