redis集群搭建
简介
redis-cluster架构设计html
架构细节:
全部的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就好了
截图中看出,推荐了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分配结果
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服务,而后从新构件集群环境。