• 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集群配好以后,下面展示下效果

     

  • 相关阅读:
    循环语句
    JAVA-数据类型、变量、常量
    JAVA——程序流程控制——循环语句——for循环(打印三角形)
    循环语句
    JAVA基础学习1
    新手上路
    mysql内置函数之事务
    mysql内置功能
    mysql内置函数之视图
    pymysql模块
  • 原文地址:https://www.cnblogs.com/dadonggg/p/8067198.html
Copyright © 2020-2023  润新知