一、环境与说明
Linux 系统:Suse11(SLES-11-SP3-DVD-x86_64-GM-DVD1)
Redis 安装包:redis-4.0.11.tar.gz
下载地址:http://download.redis.io/releases/
Ruby 运行环境:ruby-2.5.1.tar.gz
下载地址:https://cache.ruby-lang.org/pub/ruby/
Ruby 包管理工具(RubyGems,用于安装 gem):rubygems-2.7.6.tgz
下载地址:https://rubygems.org/rubygems/rubygems-2.7.6.tgz
Ruby-Redis 插件安装包:redis-3.3.0.gem
下载地址:https://rubygems.org/gems/redis/versions
二、Cluster集群说明
Redis 的集群方案有三种:主从复制,哨兵模式和集群。在 redis3.0 及之后的版本中加入 Cluster 集群方式,实现了 Redis 的分布式存储,也就是说每台redis节点上存储不同的内容。
Redis-Cluster采用无中心结构,它的特点如下:
1)所有的 redis 节点彼此互联(PING-PONG 机制),内部使用二进制协议优化传输速度和带宽。
2)节点的 fail(宕机)是通过集群中超过半数的节点检测失效时才生效。
3)客户端与 redis 节点直连,不需要中间代理层。客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
Redis-Cluster工作方式:
在redis的每一个节点上,都有这么两个东西,一个是插槽(slot),它的的取值范围是:0-16383。还有一个就是 cluster,可以理解为是一个集群管理的插件。当我们的存取的 key 到达的时候,redis 会根据 crc16 的算法得出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。
为了保证高可用,redis-cluster 集群引入了主从模式,一个主节点对应一个或者多个从节点,当主节点宕机的时候,就会启用从节点。当其它主节点 ping 一个主节点A时,如果半数以上的主节点与 A 通信超时,那么认为主节点 A 宕机了。如果主节点 A 和它的从节点 A1 都宕机了,那么该集群就无法再提供服务了。
三、安装配置 Redis
1)安装搭建好 Redis 环境(安装在 /opt/redis/redis-4.0.11 目录,搭建方式参考我的另一篇博客:信步漫谈之Redis—Linux下环境搭建)
2)创建集群目录 /opt/redis/cluster,在目录下创建 6 个端口的资源存储目录:7000、7001、7002、7003、7004、7005(因资源有限在同一台机子上开启多个不同端口的 redis 进程)
3)拷贝 redis 配置文件 redis.conf 到各个资源存储目录下,修改配置信息项如下
bind 192.168.106.171 protected-mode no port 7000 daemonize yes pidfile /var/run/redis_7000.pid dir /opt/redis/cluster/7000/ appendonly yes cluster-enabled yes cluster-config-file nodes-7000.conf cluster-node-timeout 5000
4)启动 6 台 redis 服务器进程,我写了一个批量重启脚本如下
四、安装 Ruby 运行环境
1)将 ruby-2.5.1.tar.gz 上传到 /opt/ruby/ 目录下
2)解压 ruby-2.5.1.tar.gz(命令:tar -zxvf ruby-2.5.1.tar.gz)
3)进入 ruby-2.5.1 目录
4)配置 ruby(命令:./configure --prefix=/usr/local/ruby)
5)编译 ruby(命令:make && make install)
五、安装 RubyGems
1)将 rubygems-2.7.6.tgz 上传到 /opt/ruby/ 目录下
2)解压 rubygems-2.7.6.tgz(命令:tar -zxvf rubygems-2.7.6.tgz)
3)进入 rubygems-2.7.6 目录
4)配置 rubygems(命令:ruby setup.rb)
六、安装 Ruby-Redis 插件
1)将 redis-3.3.0.gem 上传到 /opt/ruby 目录下
2)执行安装(命令:gem install -l redis-3.3.0.gem)
七、启动 Redis Cluster 集群
1)进入 /opt/redis/redis-4.0.11/src 目录
2)构建 cluster 集群(命令:./redis-trib.rb create --replicas 1 192.168.106.171:7000 192.168.106.171:7001 192.168.106.171:7002 192.168.106.171:7003 192.168.106.171:7004 192.168.106.171:7005)
[root@localhost src]# ./redis-trib.rb create --replicas 1 192.168.106.171:7000 192.168.106.171:7001 192.168.106.171:7002 192.168.106.171:7003 192.168.106.171:7004 192.168.106.171:7005 >>> Creating cluster /usr/local/ruby/lib/ruby/gems/2.5.0/gems/redis-3.3.0/lib/redis/client.rb:459: warning: constant ::Fixnum is deprecated >>> Performing hash slots allocation on 6 nodes... Using 3 masters: 192.168.106.171:7000 192.168.106.171:7001 192.168.106.171:7002 Adding replica 192.168.106.171:7004 to 192.168.106.171:7000 Adding replica 192.168.106.171:7005 to 192.168.106.171:7001 Adding replica 192.168.106.171:7003 to 192.168.106.171:7002 >>> Trying to optimize slaves allocation for anti-affinity [WARNING] Some slaves are in the same host as their master M: d2519b649b36a46db6f9352e741362f941f39168 192.168.106.171:7000 slots:0-5460 (5461 slots) master M: c8e5923d05b620b6ec7499f53342561ea67f85d2 192.168.106.171:7001 slots:5461-10922 (5462 slots) master M: 0c5e3add0f9e909c3fbfb800d84494a82ec203d4 192.168.106.171:7002 slots:10923-16383 (5461 slots) master S: 4c551c2edaeda5da5e3003f10ce5a29fdf32bf39 192.168.106.171:7003 replicates c8e5923d05b620b6ec7499f53342561ea67f85d2 S: 8e5c3125c06c5b800dea7e1fec23854b1c7a12d3 192.168.106.171:7004 replicates 0c5e3add0f9e909c3fbfb800d84494a82ec203d4 S: a2a2127c137ff85708fb8bd5edff5b61ef0830eb 192.168.106.171:7005 replicates d2519b649b36a46db6f9352e741362f941f39168 Can I set the above configuration? (type 'yes' to accept): yes >>> Nodes configuration updated >>> Assign a different config epoch to each node >>> Sending CLUSTER MEET messages to join the cluster Waiting for the cluster to join... >>> Performing Cluster Check (using node 192.168.106.171:7000) M: d2519b649b36a46db6f9352e741362f941f39168 192.168.106.171:7000 slots:0-5460 (5461 slots) master 1 additional replica(s) S: 4c551c2edaeda5da5e3003f10ce5a29fdf32bf39 192.168.106.171:7003 slots: (0 slots) slave replicates c8e5923d05b620b6ec7499f53342561ea67f85d2 M: c8e5923d05b620b6ec7499f53342561ea67f85d2 192.168.106.171:7001 slots:5461-10922 (5462 slots) master 1 additional replica(s) S: 8e5c3125c06c5b800dea7e1fec23854b1c7a12d3 192.168.106.171:7004 slots: (0 slots) slave replicates 0c5e3add0f9e909c3fbfb800d84494a82ec203d4 S: a2a2127c137ff85708fb8bd5edff5b61ef0830eb 192.168.106.171:7005 slots: (0 slots) slave replicates d2519b649b36a46db6f9352e741362f941f39168 M: 0c5e3add0f9e909c3fbfb800d84494a82ec203d4 192.168.106.171:7002 slots:10923-16383 (5461 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
八、集群配置密码
修改 redis.conf 的配置项如下
masterauth 你的密码 requirepass 你的密码
注意:在添加集群密码后,通过 redis-trib.rb 创建集群,会提示“[ERR] Sorry, can’t connect to node *.*.*.*:7001”,原因是通过 redis-trib.rb 脚本连接 Redis 时,并未设定密码。可通过修改 redis-trib.rb 脚本的方式解决。
编辑 redis-trib.rb 脚本,找到这一行:
@r = Redis.new(:host => @info[:host], :port => @info[:port], :timeout => 60)
修改为:
@r = Redis.new(:host => @info[:host], :port => @info[:port], :timeout => 60, :password => "你的密码")