信步漫谈之Redis—集群方案(Linux下搭建Cluster集群)

一、环境与说明

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 进程)
image

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 服务器进程,我写了一个批量重启脚本如下
image

四、安装 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)

6)验证是否安装成功(命令:ruby -v)
image

五、安装 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)

5)验证是否安装成功(命令:gem -v)
image

六、安装 Ruby-Redis 插件

1)将 redis-3.3.0.gem 上传到 /opt/ruby 目录下

2)执行安装(命令:gem install -l redis-3.3.0.gem)
image

七、启动 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 => "你的密码")
原文地址:https://www.cnblogs.com/alfredinchange/p/11937315.html