Linux下Redis集群搭建

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

 

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放到哪个桶中。

环境准备
Redis集群中要求奇数节点,所以至少要有三个节点,并且每个节点至少有一备份节点,所以至少需要6个redis服务实例。

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

 

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

安装ruby环境(因为集群运行需要一个ruby脚本)

yum install ruby

开始集群搭建
1.准备目录结构
三台机器一样,建立如下目录结构:

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值