Redis集群搭建

主从的搭建差不多说完了,本文我们来看看集群如何搭建。

Redis集群架构如下图:

Redis集群运行原理如下:

1.所有的Redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽 2.节点的fail是通过集群中超过半数的节点检测失效时才生效 3.客户端与Redis节点直连,不需要中间proxy层,客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可 4.Redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster (簇)负责维护node<->slot<->value。Redis集群中内置了16384个哈希槽,当需要在Redis集群中放置一个key-value时,Redis先对key使用crc16算法算出一个结果,然后把结果对 16384 求余数,这样每个key都会对应一个编号在 0-16383 之间的哈希槽,Redis 会根据节点数量大致均等的将哈希槽映射到不同的节点

怎么样投票

投票过程是集群中所有master参与,如果半数以上master节点与master节点通信超过cluster-node-timeout设置的时间,认为当前master节点挂掉。

怎么样判定节点不可用

1.如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完整时进入fail状态。 2.如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态,当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误。

ruby环境

Redis集群管理工具redis-trib.rb依赖ruby环境,首先需要安装ruby环境:

安装ruby:

yum install ruby
yum install rubygems

但是这种安装方式装好的ruby版本可能不适用,如果安装失败,可以参考这篇文章解决(https://blog.csdn.net/fengye_yulu/article/details/77628094)

集群搭建

首先我们对集群做一个简单规划,假设我的集群中一共有三个节点,每个节点一个主机一个从机,这样我一共需要6个Redis实例。首先创建redis-cluster文件夹,在该文件夹下分别创建7001、7002、7003、7004、7005、7006文件夹,用来存放我的Redis配置文件,如下:

将Redis也在redis-cluster目录下安装一份,然后将redis.conf文件向7001-7006这6个文件夹中分别拷贝一份,拷贝完成后,分别修改如下参数:

port 7001
#bind 127.0.0.1
cluster-enabled yes
cluster-config-XX  XXX7001.conf
protected no
daemonize yes

这是7001目录下的配置,其他的文件夹将7001改为对应的数字即可。修改完成后,进入到redis安装目录中,分别启动各个redis,使用刚刚修改过的配置文件,如下:

启动成功后,我们可以查看redis进程,如下:

这个表示各个节点都启动成功了。接下来我们就可以进行集群的创建了,首先将redis/src目录下的redis-trib.rb文件拷贝到redis-cluster目录下,然后在redis-cluster目录下执行如下命令:

./redis-trib.rb create --replicas 1 192.168.248.128:7001 192.168.248.128:7002 192.168.248.128:7003 192.168.248.128:7004 192.168.248.128:7005 192.168.248.128:7006

注意,replicas后面的1表示每个主机都带有1个从机,执行过程如下:

注意创建过程的日志,每个redis都获得了一个编号,同时日志也说明了哪些实例做主机,哪些实例做从机,每个从机的主机是谁,每个主机所分配到的hash槽范围等等。

查询集群信息

集群创建成功后,我们可以登录到Redis控制台查看集群信息,注意登录时要添加-c参数,表示以集群方式连接,如下:

添加主节点

首先我们准备一个端口为7007的主节点并启动,准备方式和前面步骤一样,启动成功后,通过如下命令添加主节点:

./redis-trib.rb add-node  127.0.0.1:7007 127.0.0.1:7001

主节点添加之后,我们可以通过cluster nodes命令查看主节点是否添加成功,此时我们发现新添加的节点没有分配到slot,如下:

没有分配到slot将不能存储数据,此时我们需要手动分配slot,分配命令如下:

./redis-trib.rb reshard 127.0.0.1:7001

后面的地址为任意一个节点地址,在分配的过程中,我们一共要输入如下几个参数:

1.一共要划分多少个hash槽出来?就是我们总共要给新添加的节点分多少hash槽,这个参数依实际情况而定,如下:

2.这些划分出来的槽要给谁,这里输入7007节点的编号,如下:

3.要让谁出血?因为hash槽目前已经全部分配完毕,要重新从已经分好的节点中拿出来一部分给7007,必然要让另外三个节点把吃进去的吐出来,这里我们可以输入多个节点的编号,每次输完一个点击回车,输完所有的输入done表示输入完成,这样就让这几个节点让出部分slot,如果要让所有具有slot的节点都参与到此次slot重新分配的活动中,那么这里直接输入all即可,如下:

OK,主要就是这几个参数,输完之后进入到slot重新分配环节,分配完成后,通过cluster nodes命令,我们可以发现7007已经具有slot了,如下:

OK,刚刚我们是添加主节点,我们也可以添加从节点,比如我要把7008作为7007的从节点,添加方式如下:

./redis-trib.rb add-node --slave --master-id 79bbb30bba66b4997b9360dd09849c67d2d02bb9  192.168.31.135:7008 192.168.31.135:7007

其中79bbb30bba66b4997b9360dd09849c67d2d02bb9是7007的编号。

删除节点

删除节点也比较简单,如下:

./redis-trib.rb del-node 127.0.0.1:7005 4b45eb75c8b428fbd77ab979b85080146a9bc017

注意4b45eb75c8b428fbd77ab979b85080146a9bc017是要删除节点的编号。 再注意:删除已经占有hash槽的结点会失败,报错如下:

[ERR] Node 127.0.0.1:7005 is not empty! Reshard data away and try again.

需要将该结点占用的hash槽分配出去(分配方式与上文一致,不赘述)。

好了,redis集群搭建我们先说这么多,有问题欢迎留言讨论。

原文发布于微信公众号 - 牧码小子(gh_d1ca11234a30)

原文发表时间:2018-06-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JAVA高级架构开发

浅谈Nginx服务器的内部核心架构设计!

Nginx---Ngine X,是一款免费的、自由的、开源的、高性能HTTP服务器和反向代理服务器;也是一个IMAP、POP3、SMTP代理服务器;Nginx以...

3320
来自专栏小程序之家

如何实现小程序登录鉴权

为了方便用户使用小程序时,使用微信账号授权快速登录软件,微信小程序提供了相关的授权接口。小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快...

1.7K5
来自专栏会跳舞的机器人

Nginx+Tomcat实现负载均衡

在103和117上分别部署相同的Tomcat程序,修改index.jsp页面,把内容改为各自的IP地址。

1243
来自专栏北京马哥教育

给小白的 Nginx 30分钟入门指南

运维行业正在变革,推荐阅读:30万年薪Linux运维工程师成长魔法 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服...

4347
来自专栏Ken的杂谈

单点登录(SSO)的设计与实现

SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。https://baike....

3513
来自专栏开源优测

Linux下常用的监控工具和命令

如果性能测试的目标服务器是linux系统,在如何使用linux自带的命令来实现性能测试过程的监控分析呢?

1422
来自专栏散尽浮华

Centos下MooseFS(MFS)分布式存储共享环境部署记录

分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连,分布式文...

7395
来自专栏韩伟的专栏

集群开源软件赏:ZooKeeper

本篇是开源软件最后一篇,接下来的一周将推送语言相关或项目管理相关内容。敬请期待。以下正文: 所谓集群系统,是指由多个进程和服务器合作组成完成一定功能的系统。之所...

4137
来自专栏微信公众号:Java团长

Java程序员必备的Intellij插件

地址:https://plugins.jetbrains.com/plugin/7495--ignore

951
来自专栏Java后端技术栈

浅谈Nginx服务器的内部核心架构设计!

Nginx---Ngine X,是一款免费的、自由的、开源的、高性能HTTP服务器和反向代理服务器;也是一个IMAP、POP3、SMTP代理服务器;Nginx以...

1532

扫码关注云+社区

领取腾讯云代金券