Redis cluster之主从复制,高可用,多master集群搭建_redis cluster集群多个master怎么关联

CSDN博客 · · 337 次点击 · · 开始浏览    
  1. 简介
      redis cluster: 自动做master+slave复制和读写分离,master+slave高可用和主备切换,支持多个master的hash slot支持数据分布式存储。
  2. 环境准备
     redis cluster集群,要求至少3个master,去组成一个高可用,健壮的分布式的集群,每个master都建议至少给一个slave,
     3个master,3个slave。正式环境下,建议都是说在6台机器上去搭建。3台机器的话要保证,每个master都跟自己的slave
    不在同一台机器上,如果master和slave都在同一台机器的话,出了问题会一起死掉。
     我们这里的三台机器如下:
     eshop-cache01(192.168.191.101), 
     eshop-cache02(192.168.191.102),
     eshop-cache03(192.168.191.103),
  3. 在三台服务器上建立如下文件夹
     
  4. 创建6个配置文件,因为我们是3个master,3个slave,所以我们需要不同的实例端口
     配置文件分别为:7001.conf,7002.conf,7003.conf,7004.conf,7005.conf,7006.conf
     端口:7001,7002,7003,7004,7005,7006
     文件分配:
            eshop-cache01(192.168.191.101)---->7001.conf,7002.conf
            eshop-cache02(192.168.191.102)---->7003.conf,7004.conf
            eshop-cache03(192.168.191.103)---->7005.conf,7006.conf
     提前将工作目录建好:
         eshop-cache01(192.168.191.101)
            mkdir -p /var/redis/7001
            mkdir -p /var/redis/7002
          eshop-cache02(192.168.191.102)
            mkdir -p /var/redis/7003
            mkdir -p /var/redis/7004
          eshop-cache03(192.168.191.103)
            mkdir -p /var/redis/7005
            mkdir -p /var/redis/7006   
  5. 修改redis.conf配置文件名为7001.conf,并且修改文件内容,如下
     
    1. #端口为5000
    2. port 7001
    3. #如果配置yes则开启集群功能,此redis实例作为集群的一个节点,否则,它是一个普通的单一的redis实例
    4. cluster-enabled yes
    5. #虽然此配置的名字叫"集群配置文件",但是此配置文件不能人工编辑,它是集群节点自动维护的文件,主要用于记录集群中有哪些节点
    6. #他们的状态以及一些持久化参数等,方便在重启时恢复这些状态。通常是在收到请求之后这个文件就会被更新。
    7. #集群搭建成功后会自动生成,在工作目录下
    8. cluster-config-file /etc/redis-cluster/node-7001.conf
    9. #节点宕机发现时间,可以理解为主节点宕机后从节点升级为主节点时间
    10. cluster-node-timeout 15000
    11. #守护进程模式
    12. daemonize yes
    13. #pid file所在目录
    14. pidfile "/var/run/redis_7001.pid"
    15. #指定工作目录,rdb,aof持久化文件将会放在该目录下,不同实例一定要配置不同的工作目录
    16. dir "/var/redis/7001"
    17. #指明日志文件名
    18. logfile "/var/log/redis/7001.log"
    19. #设置绑定IP地址
    20. bind 192.168.191.101 127.0.0.1
    21. #开启AOF模式
    22. appendonly yes

    将文件上传到/etc/redis目录下。
     

  6. 继续创建7002.conf,7003.conf,7004.conf,7005.conf,7006.conf,并重新修改
    port 、dir、cluster-config-file ,pidfile,logfile,bind等6个属性,根据不同的服务器地址修改,
    最后将这些文件按照分配分发到不同机器的/etc/redis目录下。
     eshop-cache01(192.168.191.101)---->7001.conf,7002.conf
     eshop-cache02(192.168.191.102)---->7003.conf,7004.conf
     eshop-cache03(192.168.191.103)---->7005.conf,7006.conf
       
     
     
  7. 准备环境的启动脚本,在/etc/init.d下,将/usr/local/module/redis-5.0.5/utils目录下redis_init_script拷贝到/etc/init.d下,分别
     名称为redis_7001, redis_7002, redis_7003, redis_7004, redis_7005, redis_7006
     eshop-cache01(192.168.191.101)---->redis_7001, redis_7002
     eshop-cache02(192.168.191.102)---->redis_7003, redis_7004
     eshop-cache03(192.168.191.103)----> redis_7005, redis_7006
     修改内容:将REDISPORT修改为指定的7001,7002,7003,7004,7005,7006即可
     
     
     
      
  8. 在/etc/init.d下,分别通过redis_7001, redis_7002, redis_7003, redis_7004, redis_7005, redis_7006启动redis
     例如:
          

     
     
  9. 安装ruby
     构建 redis集群需要使用到ruby 并且版本ruby版本必须大于2.0 但是针对redis版本低于5.0的版本,对于高于5.0的版本在构建中
     不需 要安装ruby,就能进行redis集群的构建。需要的话命令如下:
      yum install -y ruby
      yum install -y rubygems
      gem install redis
      cp /usr/local/module/redis-5.0.5/src/redis-trib.rb /usr/local/bin
  10. 用redis-cli创建整个redis集群(redis5以前的版本集群是依靠ruby脚本redis-trib.rb实现),进入/etc/init.d目录下
     命令:redis-cli --cluster create --cluster-replicas 1 192.168.191.101:7001 192.168.191.101:7002 192.168.191.102:7003 192.168.191.102:7004 192.168.191.103:7005 192.168.191.103:7006
     --replicas: 每个master有几个slave
     6台机器,3个master,3个slave,集群会尽量自己让master和slave不在一台机器上
     
      
  11. 目前的集群状态
     读写分离:每个master都有一个slave
     高可用:master宕机,slave自动被切换过去
     多master:横向扩容支持更大数据量
  12. 使用redis-cli --cluster check 192.168.191.101:7001检查集群状态slots详细分配
     
     上图可以发现显示了每个节点所分配的slots(哈希槽),这里总共6个节点,其中3个是从节点,所以3个主节点分别
     映射了0-5460、5461-10922、10933-16383 solts。
  13. 测试效果
     ⑴实验多master写入 -> 海量数据的分布式存储
             a:连接7001,插入数据
                    
                   原因:
                       在redis cluster写入数据的时候,其实是你可以将请求发送到任意一个master上去执行,但是,每个
                   master都会计算这个key对应的CRC16值,然后对16384个hashslot取模,找到key对应的hash slot,找
                   到hash slot对应的master,如果对应的master就在自己本地的话,set mykey1 v1,mykey1这个key对应
                   的hashslot就在自己本地,那么自己就处理掉了,但是如果计算出来的hashslot在其他master上,那么就
                   会给客户端返回一个moved error,告诉你,你得到哪个master上去执行这条写入的命令。
                   什么叫做多master的写入?就是每条数据只能存在于一个master上,不同的master负责存储不同的数据,
                   分布式的数据存储。100w条数据,5个master,每个master就负责存储20w条数据,分布式数据存储.
                 所以我们到103服务器执行一下(获取也是一样):
                   
    ⑵实验不同master各自的slave读取 -> 读写分离
            在这个redis cluster中,如果你要在slave读取数据,那么需要带上readonly指令,get mykey1,比如102服务器的7004
        就是101服务器7001的slave,我们获取一下:
            
             或者使用 redis-cli -h 192.168.191.102 -p 7004 -c启动,就会自动进行各种底层的重定向的操作
            
           redis cluster的架构下,实际上本身master就是可以任意扩展的,你如果要支撑更大的读吞吐量,或者写吞吐量,
           或者数据量,都可以直接对master进行横向扩展就可以了,也可以实现支撑更高的读吞吐的效果,所以说扩容
           master,跟之前扩容slave,效果是一样的。
    ⑶实验自动故障切换 -> 高可用性
         比如把master1,101服务器的7001,杀掉,看看它对应的102:7004能不能自动切换成master,可以自动切换
          
         检测集群状态:
          
337 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传