Linux下Redis集群搭建

redis集群搭建
简介
redis-cluster架构设计html

 

image

架构细节:
全部的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
节点的fail是经过集群中超过半数的节点检测失效时才生效.
客户端与redis节点直连,不须要中间proxy层.客户端不须要链接集群全部节点,链接集群中任何一个可用节点便可
redis-cluster把全部的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->key
Redis集群预分好16384个桶,当须要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod 16384的值,决定将一个key放到哪一个桶中。node

环境准备
Redis集群中要求奇数节点,因此至少要有三个节点,而且每一个节点至少有一备份节点,因此至少须要6个redis服务实例。linux

这里演示的是我搭的生产环境redis集群,3台服务器,每台起3个服务,共9个节点redis

 

按照单台Redis服务方式 分别在三台服务器上安装Redisruby

安装ruby环境(由于集群运行须要一个ruby脚本)bash

yum install ruby服务器

开始集群搭建
1.准备目录结构
三台机器同样,创建以下目录结构:架构

$ mkdir -p /usr/local/redis/redis-cluster/{7000,7001,7002}

分别进入每一个端口目录建立配置文件:app

redis完整配置在上一篇搭建单个redis中有curl

cd  /usr/local/redis/redis-cluster/7000 && touch redis.conf
port 7000   # 端口7000,7001,7002,与目录对应
bind 172.28.37.29 #默认ip为127.0.0.1,须要改成其余节点机器可访问的ip,不然建立集群时没法访问对应的端口,没法建立集群
daemonize yes   #redis后台运行
cluster-enabled yes  #开启集群
cluster-config-file nodes_7000.conf  #集群的配置,配置文件首次启动自动生成 7000,7001,7002  
cluster-node-timeout 8000   #请求超时,默认15秒,可自行设置
appendonly yes  #开启aof持久化模式,每次写操做请求都追加到appendonly.aof文件中
appendfsync always  #每次有写操做的时候都同步
logfile "/data/redis/logs/redis.log" #redis服务日志
pidfile /var/run/redis_7000.pid  #pidfile文件对应7000,7001,7002

注意,上述有些配置项要对应服务和目录,三个目录按照上述配置好后,启动服务

3.启动/关闭集群服务
能够在每一个服务器上写一个启动脚本start-redis.sh:

for((i=0;i<3;i++)); 
do /usr/local/bin/redis-server /usr/local/redis/redis-cluster/700$i/redis.conf; 
done

关闭服务相似: 

for((i=0;i<=2;i++));
do /usr/local/bin/redis-cli -c -h IP−p700i shutdown; 
done


$IP分别为三台服务器IP。

启动服务时有坑。。凡是改配置文件十有八九都会报错  因此先备份一下原配置文件以后再作更改。

这时只是启动了9个单独的redis服务,它们还不是一个集群,下面就说明建立集群

4.建立集群
注意:在任意一台上运行 不要在每台机器上都运行,一台就够了

Redis 官方提供了 redis-trib.rb 这个工具,就在解压目录的 src 目录中

在其中一台执行:

$ cd /root/redis-4.0.10/src
$ ./redis-trib.rb create --replicas 1 172.28.37.29:7000 172.28.37.29:7001 172.28.37.29:7002 172.28.37.30:7000 172.28.37.30:7001 172.28.37.30:7002 172.18.38.219:7000 172.18.38.219:7001 172.18.38.219:7002

 在执行上面命令时有可能会报一下错误:

执行如下命令安装redis库:

gem install redis

在安装redis库时也有可能报错:

ERROR:  Error installing redis:
     redis requires Ruby version >= 2.2.2.

这是由于yum库中ruby的版本支持到 2.0.0,可gem 安装redis须要最低是2.2.2,采用rvm来更新ruby:

//具体RVM安装命令地址:http://rvm.io/
  [root@linux ~]# gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
  [root@linux ~]# curl -sSL https://get.rvm.io | bash -s stable
  [root@linux ~]# find / -name rvm -print

会出现如下目录

               /usr/local/rvm
     /usr/local/rvm/src/rvm
     /usr/local/rvm/src/rvm/bin/rvm
     /usr/local/rvm/src/rvm/lib/rvm
     /usr/local/rvm/src/rvm/scripts/rvm
     /usr/local/rvm/bin/rvm
     /usr/local/rvm/lib/rvm
     /usr/local/rvm/scripts/rvm

[root@linux ~]# source /usr/local/rvm/scripts/rvm

查看rvm库中已知的ruby版本:

[root@linux ~]# rvm list known

    MRI Rubies
    [ruby-]1.8.6[-p420]
    [ruby-]1.8.7[-head] # security released on head
    [ruby-]1.9.1[-p431]
    [ruby-]1.9.2[-p330]
    [ruby-]1.9.3[-p551]
    [ruby-]2.0.0[-p648]
    [ruby-]2.1[.10]
    [ruby-]2.2[.7]
    [ruby-]2.3[.4]
    [ruby-]2.4[.1]
    ruby-head
    ….

安装一个ruby版本:

[root@linux ~]# rvm install 2.4.1

使用一个ruby版本:

  [root@linux ~]# rvm use 2.4.1

设置默认版本:(设置ruby2.4.1为默认的ruby,由于可能安装有其余版本)

  [root@linux ~]# rvm use 2.4.1 --default

卸载一个已知版本(若有其余版本):

  [root@linux ~]# rvm remove 2.3.4

查看ruby版本:

  [root@linux ~]# ruby --version

      ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]

安装redis:

  [root@linux ~]# gem install redis

    Fetching: redis-4.0.1.gem (100%)
    Successfully installed redis-4.0.1
    Parsing documentation for redis-4.0.1
    Installing ri documentation for redis-4.0.1
    Done installing documentation for redis after 3 seconds
    1 gem installed

在执行完一大堆得排雷操做以后终于能够建立集群了

仍是刚才命令

$ cd /root/redis-4.0.10/src
$ ./redis-trib.rb create --replicas 1 172.28.37.29:7000 172.28.37.29:7001 172.28.37.29:7002 172.28.37.30:7000 172.28.37.30:7001 172.28.37.30:7002 172.18.38.219:7000 172.18.38.219:7001 172.18.38.219:7002

敲完这个命令后会提示是否按照默认的推荐方式配置集群主从,通常选yes就好了

image

截图中看出,推荐了4个masters,5个从节点

>>> Creating cluster
>>> Performing hash slots allocation on 9 nodes...
Using 4 masters:
172.28.37.29:7000
172.28.37.30:7000
172.18.38.219:7000
172.28.37.29:7001
Adding replica 172.18.38.219:7001 to 172.28.37.29:7000
Adding replica 172.28.37.29:7002 to 172.28.37.30:7000
Adding replica 172.28.37.30:7002 to 172.18.38.219:7000
Adding replica 172.18.38.219:7002 to 172.28.37.29:7001
Adding replica 172.28.37.30:7001 to 172.28.37.29:7000

下面这个显示了集群和slot分配结果

image

5.集群验证
参数 -C 可链接到集群,由于 redis.conf 将 bind 改成了ip地址,因此 -h 参数不能够省略,-p 参数为端口号

[root@172-28-37-29 src]# redis-cli -c -p 7000 -h 172.28.37.29
172.28.37.29:7000> set name zhoujie
-> Redirected to slot [5798] located at 172.28.37.30:7000
OK
172.28.37.30:7000> get name
"zhoujie"
172.28.37.30:7000>

能够看到在29的7000上设置了name,重定向到了30的7000节点。到此为止集群搭建成功!

友情提示:
当出现集群没法启动时,删除集群配置文件,再次从新启动每个redis服务,而后从新构件集群环境。

内容引用地址:https://yq.aliyun.com/articles/613281