Linux安装Redis-Cluster集群

小柒博客 Redis1 72.5K7字数 5186阅读17分17秒阅读模式

一、Redis集群实现方案

关于redis的集群化方案 目前有三种

1)Twitter开发的twemproxy

2)豌豆荚开发的codis

3)redis官方的redis-cluster

简介:twemproxy架构简单,就是用proxy对后端redis server进行代理,但是由于代理层的消耗性能很低,而且通常涉及多个key的操作都是不支持的,而且本身不支持动态扩容和透明的数据迁移,而且也失去维护Twitter内部已经不使用了。

redis-cluster是三个里性能最强大的,因为他使用去中心化的思想,使用hash slot方式 1634hash slot覆盖到所有节点上,对于存储的每个key值使用CRC16(KEY)&16348=slot,得到他对应的hash slot 并在访问key时就去找他的hash slot在哪一个节点上,然后由当前访问节点从实际被分配了这个hash slot的节点去取数据,节点之间使用轻量协议通信,减少带宽占用、性能很高、自动实现负载均衡与高可用,自动实现failover、并且支持动态扩展,官方已经玩到可以1000个节点,实现的复杂度低 总之个人比较喜欢这个架构因为他的去中心化思想免去了proxy的消耗是全新的思路,

但是它也有一些不足例如官方没有提供图形化管理工具,运维体验差、全手工数据迁移、并且自己对自己本身的redis命令支持也不完全等,但是这些问题我觉得不能掩盖他关键的新思想所带来的的优势,随着官方的推进这些问题应该都能在一定时间内得到解决,那么这时候去中心化思想带来的高性能就会表现出他巨大的优势。

codis使用的也是proxy思路,但是做的比较好,是这两种之间的一个中间级,而且支持redis命令是最多的,有图形化GUI管理和监控工具,运维友好。

二、Redis集群基本介绍

Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施installation。

Redis 集群不支持那些需要同时处理多个键的 Redis 命令, 因为执行这些命令需要在多个 Redis 节点之间移动数据, 并且在高负载的情况下, 这些命令将降低Redis集群的性能, 并导致不可预测的行为。

Redis 集群通过分区partition来提供一定程度的可用性availability: 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。

Redis集群提供了以下两个好处:

将数据自动切分split到多个节点的能力。

当集群中的一部分节点失效或者无法进行通讯时, 仍然可以继续处理命令请求的能力。

三、Redis集群集群原理

所有的Redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。

节点的fail是通过集群中超过半数的节点检测失效时才生效。

客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。

Redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value

Redis集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点

Redis-cluster投票:容错

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

什么时候整个集群不可用(cluster_state:fail)?

如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完整时进入fail状态.

Redis-3.0.0.rc1加入cluster-require-full-coverage参数,默认关闭,打开集群兼容部分失败.

如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态.

四、Redis-cluster集群搭建

环境准备:CentOS 7.4

1、安装wget和gcc

[root@localhost ~]# yum -y install wget gcc gcc-c++

2、下载Redis安装包

[root@localhost ~]# wget -c http://mirrors.yangxingzhen.com/redis/redis-3.0.7.tar.gz

Linux安装Redis-Cluster集群

3、解压和创建存放目录

[root@localhost ~]# tar zxf redis-3.0.7.tar.gz

[root@localhost ~]# cd redis-3.0.7

[root@localhost redis-3.0.7]# make

[root@localhost redis-3.0.7]# mkdir -p /usr/local/redis-cluster

4、拷贝redis目录

[root@localhost redis-3.0.7]# cd ~

[root@localhost ~]# cp -a redis-3.0.7 /usr/local/redis-cluster/redis_7000

[root@localhost ~]# cp -a redis-3.0.7 /usr/local/redis-cluster/redis_7001

[root@localhost ~]# cp -a redis-3.0.7 /usr/local/redis-cluster/redis_7002

[root@localhost ~]# cp -a redis-3.0.7 /usr/local/redis-cluster/redis_7003

[root@localhost ~]# cp -a redis-3.0.7 /usr/local/redis-cluster/redis_7004

[root@localhost ~]# cp -a redis-3.0.7 /usr/local/redis-cluster/redis_7005

5、将六个节点的redis.conf配置文件进行修改(这里采用的是脚本修改)

[root@localhost ~]# vim auto_modify_port.sh

#!/bin/bash
#2018-4-27 14:49:49

for i in `seq 7000 7005`
do
    cd /usr/local/redis-cluster/redis_$i
    sed -i "/port/s/6379/$i/" /usr/local/redis-cluster/redis_$i/redis.conf
    sed -i '/appendonly/s/no/yes/' /usr/local/redis-cluster/redis_$i/redis.conf
    sed -i '/daemonize/s/no/yes/' /usr/local/redis-cluster/redis_$i/redis.conf
    cat >>/usr/local/redis-cluster/redis_$i/redis.conf <<-EOF
        cluster-enabled yes
        cluster-config-file nodes.conf
        cluster-node-timeout 5000
    EOF
done

PS:端口号如果是同一台主机的话,必须不同。不同主机可以相同。

PS:我这里是使用一台主机,所以我将六个节点的端口号修改为7000-7005

6、编写集群启动脚本

[root@localhost ~]# vim auto_redis_start.sh

#!/bin/bash
#2018-4-27 15:00:40

for i in `seq 7000 7005`
do
    cd /usr/local/redis-cluster/redis_$i/src
    ./redis-server ../redis.conf
done

7、编写集群停止脚本

[root@localhost ~]# vim auto_redis_shutdown.sh

#!/bin/bash
#2018-4-27 15:01:54

for i in `seq 7000 7005`
do
    cd /usr/local/redis-cluster/redis_$i/src
    ./redis-cli -p $i shutdown
done

8、安装ruby的环境,这里推荐使用yum安装

[root@localhost ~]# yum -y install ruby rubygems

9、拷贝源码包的redis-trib.rb文件

[root@localhost ~]# cp redis-3.0.7/src/redis-trib.rb ~

启动redis集群

[root@localhost ~]# sh auto_redis_start.sh

[root@localhost ~]# netstat -lntup

10、执行redis的创建集群命令创建集群

[root@localhost ~]# ./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

出现报错,由于ruby版本较低导致

11、升级ruby版本

[root@localhost ~]# curl -L get.rvm.io | bash -s stable

由于没有密钥导致,按照提示输入

[root@localhost ~]# gpg2 --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3

[root@localhost ~]# curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -

再执行一次即可

[root@localhost ~]# curl -L get.rvm.io | bash -s stable

执行source /etc/profile.d/rvm.sh即可

12、安装ruby

查看Ruby可用版本

[root@localhost ~]# rvm list known

这里查询到2.4.1是最新的,那就安装最新的吧

[root@localhost ~]# rvm install 2.4.1

至此,我们升级了Ruby的版本

13、安装gem redis接口

[root@localhost ~]# gem install redis

14、继续执行redis的创建集群命令创建集群

[root@localhost ~]# ./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

可以看到16384个slot都已经创建完成,并且建立了3个master和对应的replica

15、验证集群状态

[root@localhost ~]# /usr/local/redis-cluster/redis_7000/src/redis-cli -c -p 7000

127.0.0.1:7000> cluster info

127.0.0.1:7000> cluster nodes

16、测试 Redis 集群比较简单的办法就是使用 redis-rb-cluster 或者 redis-cli , 接下来我们将使用 redis-cli 为例来进行演示:

17、添加主节点

集群创建成功后可以向集群中添加节点,下面是添加一个master主节点。

首先,准备一个干净的redis节点。按上面集群版修改redis配置文件。开启该redis节点。

18、查看Redis进程

[root@localhost ~]# ps -ef | grep redis |grep -v grep

[root@localhost ~]# ./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7001

19、查看集群状态,是否把7006添加进来

20、添加从节点

集群创建成功后可以向集群中添加节点,下面是添加一个slave从节点。
添加7007从结点,将7007作为7006的从结点。

首先,准备一个干净的redis节点。按上面集群版修改redis配置文件。开启该redis节点。

21、查看Redis进程

命令格式为:

./redis-trib.rb add-node --slave --master-id 主节点id 添加节点的ip和端口 集群中已存在节点ip和端口

若文章图片、下载链接等信息出错,请在评论区留言反馈,博主将第一时间更新!如本文“对您有用”,欢迎随意打赏,谢谢!

继续阅读
Wechat
微信扫一扫,加我!
weinxin
微信公众号
微信扫一扫,关注我!
weinxin
Redis最后更新:2024-1-24
小柒博客
  • 本文由 小柒博客 发表于 2018年5月17日16:53:43
  • 声明:本站所有文章,如无特殊说明或标注,本站文章均为原创。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。转载请务必保留本文链接:https://www.yangxingzhen.com/1169.html
    • 运维老司机
      运维老司机 6

      亲测,写的不错,感谢博主 :razz:

    匿名

    发表评论

    匿名网友
    :?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

    拖动滑块以完成验证