zoukankan      html  css  js  c++  java
  • Redis集群(一)

    redis是单线程,但是一般的作为缓存使用的话,redis足够了,因为它的读写速度太快了。

    官方的一个简单测试:

          测试完成了50个并发执行100000个请求。

          设置和获取的值是一个256字节字符串。

          结果:读的速度是110000次/s,写的速度是81000次/s 

     在这么快的读写速度下,对于一般程序来说足够用了,但是对于访问量特别大的网站来说还是稍有不足。那么如何提升redis的性能呢?搭建集群就是最好的选择。

    一、概述

        Redis3.0版本之后支持Cluster.(这就意味着你的Redis要安装3.0以后的版本)

    1.1、redis cluster的现状

       目前redis支持的cluster特性:

      1):节点自动发现

      2):slave->master 选举,集群容错

      3):Hot resharding:在线分片

      4):进群管理:cluster xxx

      5):基于配置(nodes-port.conf)的集群管理

      6):ASK 转向/MOVED 转向机制.

    架构细节:

      (1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.

      (2)节点的fail是通过集群中超过半数的节点检测失效时才生效.

      (3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可

      (4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value

    1.2、FailOver设计实现

         Failover,通俗地说,一个master有N(N>=1)个slave,当master挂掉以后,能选出一个slave晋升成Master继续提供服务。
         Failover由失败判定和Leader选举两部分组成,Redis Cluster采用去中心化(Gossip)的设计,每个节点通过发送Ping(包括Gossip信息)/Pong心跳的方式来探测对方节点的存活,如果心跳超时则标记对方节点的状态为PFail,这个意思是说该节点认为对方节点可能失败了,有可能是网络闪断或者分区等其他原因导致通讯失败。

        例如节点A给节点B发Ping/Pong心跳超时,则A将B标记为PFAIL,强调一点,仅是在A看来B节点失败。要完全判定B失败,则需要一种协商的方式,需要集群中一半以上的Master节点认为B处于PFail状态,才会正式将节点B标记为Fail。
        那么问题来了,Master之间如何交换意见呢,或者说节点A如何知道其他Master也将B标记为PFfail了,并且能统计出是否有一半以上的Master认为B为PFail呢?前面提到Gossip,Gossip的主要作用就是信息交换,在A给C发Ping的时候,A将已知节点随机挑选三个节点添加到Ping包中发给C。
    既然是随机,经过多次Gossip以后,A会将处于PFail的B告诉给C。在节点C上,B节点有一个失败报告的链表,A告诉C,B可能失败,将A节点添加到B节点的失败报告链表中。经过集群中所有节点之间多次Gossip,一旦B的失败报告数量超过Master数量的一半以上,就立即标记B为Fail并广播给整个集群。 那这样还会有一个问题,假设一天之内失败报告的数量超过Master的一半以上,同时报告的时间间隔又比较大,那么就会产生误判。所以得给失败报告加上一个有效期,在一定的时间窗口内,失败报告的数量超过Master的一半以上以后标记为Fail,这样才能避免误判。
    至此就把失败判定说完了,剩下还有Leader选举。
    Redis Cluster采用类似Raft的算法,有一点不同的是并不是slave之间进行投票,而是在所有Master中间进行投票。这样做的好处就是即使一主一从也能完成选举,Redis Cluster这样做也是有道理。slave不提供任务服务,如果允许挂N个节点,就得部署(2N
    +1)个slave,这是资源的极大浪费。

    二,Redis集群部署

    1,安装Redis

    方网站:https://redis.io/download

    #Redis安装
    wget http://download.redis.io/releases/redis-3.2.8.tar.gz
    tar xzf redis-3.2.8.tar.gz
    cd redis-3.2.8/src
    make MANIFESTO=jemalloc && make PREFIX=/usr/local/redis-3.0.8 install
    ln -s /usr/local/redis-3.0.8 /usr/local/redis
    echo ' PATH=/usr/local/redis/bin/:$PATH' >> /etc/profile
    source /etc/profile
    
    #设置内核参数
    sysctl vm.overcommit_memory=1
    sed -i "s#daemonize no#daemonize yes#g" /data/redis/conf/redis.conf
    #Redis启动测试
    mkdir /data/redis/conf -p
    cp /redis-3.2.8/redis.conf /data/redis/conf/
    redis-server -f /data/redis/conf/redis.conf 
    #关闭
    redsi-cli shutdown
    killall redis-server

    2.配置主从复制集群

    A.服务器准备:

    服务器ip:10.0.0.51      端口6379
    服务器ip:10.0.0.51      端口6380
    服务器ip:10.0.0.51      端口6381
    
    
    服务器ip:10.0.0.70      端口6382
    服务器ip:10.0.0.70      端口6383
    服务器ip:10.0.0.70      端口6384

    注意两台服务器跑多实例,且安装的Redis版本要相同

    B.修改配置文件

    两台主机均修改以下配置文件
    port  6379                                        //先默认端口,等会再改       
    bind 本机ip                                     //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群
    daemonize    yes                               //redis后台运行
    pidfile  /var/run/redis_6379.pid          //pidfile文件对应
    cluster-enabled  yes                           //开启集群  把注释#去掉
    cluster-config-file  nodes_6379.conf   //集群的配置文件  
    cluster-node-timeout  15000                //请求超时  默认15秒,可自行设置
    appendonly  yes   

    C.创建redis节点

    配置服务器10.0.0.51多实例

    #复制配置文件
    cp /data/redis-3.2.8/redis.conf /data/redis/conf/6379.conf
    cp /data/redis-3.2.8/redis.conf /data/redis/conf/6380.conf
    cp /data/redis-3.2.8/redis.conf /data/redis/conf/6381.conf
    
    #修改配置文件端口
    sed -i "s/6379/6379/g"  /data/redis/conf/6379.conf
    sed -i "s/6379/6380/g"  /data/redis/conf/6380.conf
    sed -i "s/6379/6381/g"  /data/redis/conf/6381.conf
    
    #启动Redis
    redis-server /data/redis/conf/6379.conf
    redis-server /data/redis/conf/6380.conf
    redis-server /data/redis/conf/6381.conf

     #查看服务

          ps -ef | grep redis   #查看是否启动成功

         netstat -tnlp | grep redis #可以看到redis监听端口

    配置服务器10.0.0.70多实例

    #复制配置文件
    cp /data/redis-3.2.8/redis.conf /data/redis/conf/6382.conf
    cp /data/redis-3.2.8/redis.conf /data/redis/conf/6383.conf
    cp /data/redis-3.2.8/redis.conf /data/redis/conf/6384.conf
    
    #修改配置文件端口
    sed -i "s/6379/6382/g"  /data/redis/conf/6382.conf
    sed -i "s/6379/6383/g"  /data/redis/conf/6383.conf
    sed -i "s/6379/6384/g"  /data/redis/conf/6384.conf
    
    #启动Redis
    redis-server /data/redis/conf/6382.conf
    redis-server /data/redis/conf/6383.conf
    redis-server /data/redis/conf/6384.conf

     #查看服务

          ps -ef | grep redis   #查看是否启动成功

         netstat -tnlp | grep redis #可以看到redis监听端口

    D.创建集群

      前面已经准备好了搭建集群的redis节点,接下来我们要把这些节点都串连起来搭建集群。官方提供了一个工具:redis-trib.rb(/usr/local/redis-3.2.1/src/redis-trib.rb) 看后缀就知道这鸟东西不能直接执行,它是用ruby写的一个程序,所以我们还得安装ruby.

    两台服务器均安装Ruby,rubygems
    yum -y install gcc openssl-devel libyaml-devel libffi-devel readline-devel   autoconf 
    yum -y install ruby rubygems zlib-devel gdbm-devel ncurses-devel gcc-c++ automake 
     
    #再用 gem 这个命令来安装 redis接口    gem是ruby的一个工具包.
    #换源
    gem source -l  
    gem source --remove http://rubygems.org/ 
    gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/ 
    gem source -l
    gem install redis 

    如果执行gem install redis报下面错误

       gem install redis
       ERROR:  Error installing redis:
       redis requires Ruby version >= 2.2.2.
    #原因rvm版本过低

    解决方案:

    gpg2 --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3
    curl -L get.rvm.io | bash -s stable
    source /usr/local/rvm/scripts/rvm
    rvm install 2.3.3
    rvm use 2.3.3
    rvm use 2.3.3 --default
    rvm remove 2.0.0
    #查看现在版本为2.3.3则对
    ruby –version
    gem install redis

     E.启动集群

    就是靠上面这些操作 完成redis集群搭建的.

     首先确认所有的节点都启动,确认两台服务器的防火墙关闭状态,否则会出现没有路由到达的错误

    #测试
    在10.0.0.51服务器上执行下面语句测试连通性

    /data/redis-3.2.8/src/redis-cli -h 10.0.0.51 -p 6379
    /data/redis-3.2.8/src/redis-cli -h 10.0.0.70 -p 6383
    /data/redis-3.2.8/src/redis-cli -h 10.0.0.70 -p 6384

    在10.0.0.70服务器上执行下面语句测试连通性

    redis-cli -h 10.0.0.51 -p 6379
    redis-cli -h 10.0.0.51 -p 6380
    redis-cli -h 10.0.0.70 -p 6384

    如果上面的测试没有问题,则可进行下步操作

    ##在其中一台服务器执行下面命令即可
    /data/redis-3.2.8/src/redis-trib.rb create --replicas 1 10.0.0.51:6379 10.0.0.51:6380 10.0.0.51:6381
    10.0.0.70:6382 10.0.0.70:6383 10.0.0.70:6384

    >>> Creating cluster

    >>> Performing hash slots allocation on 6 nodes...

    Using 3 masters:

    10.0.0.51:6379

    10.0.0.70:6382

    10.0.0.51:6380

    Adding replica 10.0.0.70:6383 to 10.0.0.51:6379

    Adding replica 10.0.0.51:6381 to 10.0.0.70:6382

    Adding replica 10.0.0.70:6384 to 10.0.0.51:6380

    M: d0b49faff3332cdf7389948593d4fb59caca1613 10.0.0.51:6379

       slots:0-5460 (5461 slots) master

    M: 8c8a578c750b820ce074026e59d4df059eeefd9b 10.0.0.51:6380

       slots:10923-16383 (5461 slots) master

    S: 731a69f9df773823be182e27e5001b95766b5528 10.0.0.51:6381

       replicates b73a3a4528920064cba668aa9452f32387292ab6

    M: b73a3a4528920064cba668aa9452f32387292ab6 10.0.0.70:6382

       slots:5461-10922 (5462 slots) master

    S: 139c02ceb5a2afe9eb0e350ed3170bceb3aa4c4b 10.0.0.70:6383

       replicates d0b49faff3332cdf7389948593d4fb59caca1613

    S: af498152476cd4732c47292aff44a57bcd57bb63 10.0.0.70:6384

       replicates 8c8a578c750b820ce074026e59d4df059eeefd9b

    Can I set the above configuration? (type 'yes' to accept): yes     #输入yes即可

     如果出现下面的错误:

    则解决方案为:

    1.删掉conf文件下的aof和rdb结尾的文件。

    2.同时将新Node的集群配置文件删除,即:删除你redis.conf里面cluster-config-file所在的文件;

    3.对新添加节点的数据库进行清除

    redis-cli -h 10.0.0.51  -p 6379
    登录后执行flushdb
    redis-cli -h 10.0.0.51  -p 6381
    登录后执行flushdb
    redis-cli -h 10.0.0.51  -p 6382
    登录后执行flushdb

    当Redis集群配好以后,下面展示下效果

     

  • 相关阅读:
    在SQLite中使用索引优化查询速度
    SQLite支持的SQL数据操作
    left (outer) join , right (outer) join, full (outer) join, (inner) join, cross join 区别
    深入理解Android内存管理原理(六)
    Merge Sorted Array
    Sort Colors
    Construct Binary Tree from Preorder and Inorder Traversal
    Binary Tree Postorder Traversal
    Symmetric Tree
    Rotate Image
  • 原文地址:https://www.cnblogs.com/dadonggg/p/8067198.html
Copyright © 2011-2022 走看看