zoukankan      html  css  js  c++  java
  • 信步漫谈之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 => "你的密码")
  • 相关阅读:
    Java并发(5)- ReentrantLock与AQS
    Java并发(4)- synchronized与CAS
    Windows cmd 查看文件MD5 SHA1 SHA256
    进程、线程、协程概念理解
    Python学习--Python运算符
    Python学习--Python变量类型
    MySQL性能优化
    Docket学习--Docker入门
    Python学习--Python基础语法
    Python学习--Python 环境搭建
  • 原文地址:https://www.cnblogs.com/alfredinchange/p/11937315.html
Copyright © 2011-2022 走看看