zoukankan      html  css  js  c++  java
  • 创建redis集群

    为什么要使用redis集群
    单机redis为了提高网站响应速度,总是把热点数据保存在缓存中而不是直接从后端数
    据库中读取。一般大型网站缓存有28定律 80%访问量集中在20%的业务上
    1,单机redis故障时,redis就不能使用
    2,大型网站应用,热点数据量往往巨大,使用一台 Redis 实例无满足需求,这时就需
    要使用 多台 Redis (集群)作为缓存数据库。才能在用户请求时快速的进行响应。
    redis集群设计架构
    架构细节:
    (1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和
    带宽.
    (2)节点的fail是通过集群中超过半数的节点检测失效时才生效.
    (3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集
    群中任何一个可用节点即可
    (4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<-
    >slot<->value
    通俗的说,redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是
    说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集
    群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只
    需要连接集群中的任意一个节点,就可以获取到其他节点的数据。
    redis集群实现
    集群规划
    两台redis服务器 每一台服务器上放置3个节点,一共6个节点(3master3slave  即三主三从)
    192.168.182.20 : (7001 7002 7003) 192.168.182.21: (7004 7005 7006)
    1,创建单机redis(参考上节课)
    克隆redis1为redis2(启动使用root登录)
    1)修改ip地址(只需要改IP,因为本身克隆机)
    vim /etc/sysconfig/network­scripts/ifcfg­eth0
    2)删除网卡和mac地址的对应文件
    rm ­rf /etc/udev/rules.d/70­persistent­net.rules
    3) 修改主机名称
    vim /etc/sysconfig/network
    HOSTNAME=redis2
    4) 修改hosts
    vim /etc/hosts
    192.168.182.21 redis2
    5) 重启
    reboot
    2,单机创建节点
    1)在单机 /usr/redis目录下创建 cluster 目录;
    mkdir cluster
    2)在 cluster 下创建节点目录(为了方便创建和端口号一样的目录)
    mkdir cluster/7001
    mkdir cluster/7002
    mkdir cluster/7003
    3)复制redis.conf配置到节点目录下
    cp bin/redis.conf cluster/7001/
    4)修改配置redis.conf:
    vim cluster/7001/redis.conf
    /关键字 //例如 /port 在文件中查找port
    port 7001 //端口7001,7002,7003 92行
    bind 本机ip //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群 69行
    daemonize yes //redis后台运行 136行
    pidfile /var/run/redis_7001.pid //pidfile文件对应7001,7002,7003 158行
    cluster-enabled yes //开启集群 把注释#去掉 814行
    cluster-config-file nodes_7001.conf //集群的配置 配置文件首次启动自动生成 7001,7002,7003 822行
    cluster-node-timeout 15000 //请求超时 默认15秒,可自行设置828行
    appendonly yes //aof日志开启 有需要就开启,它会每次写操作都记录一条日志 672行
    5)复制7001下redis.conf 到7002和7003
    cp cluster/7001/redis.conf cluster/7002
    cp cluster/7001/redis.conf cluster/7003
    6) 修改7002和7003下的配置文件
    vim cluster/7002/redis.conf
    使用全局替换,把7001替换为7002
    底行模式下 :%s/7001/7002/g
    vim cluster/7003/redis.conf
    底行模式下 :%s/7001/7003/g
    3,如果多台主机都分别执行第2步操作
    登录redis2上
    进入redis目录
    cd /usr/redis
    执行远程cp命令
    scp -r 192.168.182.20:/usr/redis/cluster .
    把 192.168.182.20上的cluster目录拷贝到,当前目录下
    输入yes 等待输入密码:tiger
    修改目录名称:
    mv cluster/7001 cluster/7004
    mv cluster/7002 cluster/7005
    mv cluster/7003 cluster/7006
    修改配置:
    vim cluster/7004/redis.conf底行模式下 :%s/7001/7004/g
    69行,修改IP
    vim cluster/7005/redis.conf
    底行模式下 :%s/7002/7005/g
    69行,修改IP
    vim cluster/7006/redis.conf
    底行模式下 :%s/7003/7006/g
    69行,修改IP
    4,启动及检查
    启动:
    redis1:
    ./bin/redis-server cluster/7001/redis.conf
    ./bin/redis-server cluster/7002/redis.conf
    ./bin/redis-server cluster/7003/redis.conf
    redis2:
    ./bin/redis-server cluster/7004/redis.conf
    ./bin/redis-server cluster/7005/redis.conf
    ./bin/redis-server cluster/7006/redis.conf
    检查:
    ps -ef | grep redis
    netstat -tnlp | grep redis
    5,使用官方提供工具创建集群(只需要启动机器上安装)
    ( 使用命令前需要安装 ruby )
    redis-trib.rb 该命令是ruby程序写的,所以要下载安装ruby
    yum -y install ruby ruby-devel rubygems rpm-build
    //下面注释掉的废弃,不可用
    /* ruby官网下载 https://www.ruby-lang.org/en/news/2018/03/28/ruby-2-
    3-7-released/
    tar -xzvf ruby-2.3.7.tar.gz
    进入 ruby-2.3.7目录
    mkdir /usr/local/ruby-2.3.7
    ./configure --prefix=/usr/local/ruby-2.3.7
    make && make install(编译安装时间较长)
    */yum install -y centos-release-scl-rh (SCL:Software Collections SCL 的设
    计初衷就是在不影响原有配置的前提下,让新旧软件能一起运行。 用户提供一种
    以方便、安全地安装和使用应用程序和运行时环境的多个(而且可能是更新的)版
    本的方式,同时避免把系统搞乱。)
    yum install rh-ruby23 -y
    scl enable rh-ruby23 bash
    ruby -v
    gem install redis ././gem Gem是一个管理Ruby库和程序的标准包,它通过
    Ruby Gem 源来查找、安装、升级和卸载软件包,非常的便捷。
    使用redis提供命令创建集群
    在解压目录的redis-4.0.1/src下执行:redis-trib.rb
    ./redis-trib.rb create --replicas 1 ip1:7000 ip1:7001 ip1:7002 ip2:7003
    ip2:7004 ip2:7005
    中间确认:Can I set the above configuration? (type 'yes' to accept): yes
    [OK] All 16384 slots covered // 成功!!
    链接测试
    ./redis-cli -h ip1 -c -p 7001 设置值,在任意其他节点取值,可以成功,
    说明集群成功
    -c解释:连接集群结点时使用,此选项可防止moved和ask异常。
     
    每次set get都跳第一个原因:
    Redis 集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种
    叫做哈希槽 (hash slot)的方式来分配的。redis cluster 默认分配了 16384
    个slot,当我们set一个key 时,会用CRC16算法来取模得到所属的slot,然后将
    这个key 分到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16384。所
    以我们在测试的时候看到set 和 get 的时候,直接跳转到了7000端口的节点。
     
      如果集群重新配置,需要删除各个单机上redis根目录下.aof .rdb .conf文
    件,然后重启各个节点
    集群的使用:
    1, cluster info 显示集群信息
    cluster_state: ok状态表示集群可以正常接受查询请求。fail 状态表示,至少有一个哈希槽没有被绑定(说明有哈希槽没有被绑定到任意一个节点) 。.
    cluster_slots_assigned: 已分配到集群节点的哈希槽数量(不是没有被绑定的数量)。
    cluster_slots_ok: 哈希槽状态不是FAIL 和 PFAIL 的数量.
    cluster_slots_pfail: 哈希槽状态是 PFAIL的数量。只要哈希槽状态没有被升级到FAIL状态,这些哈希槽仍然可以被正常处理。PFAIL状态表示我们当前不能和节点进行交互,但这种状态只是临时的错误状态。
    cluster_slots_fail: 哈希槽状态是FAIL的数量。如果值不是0,那么集群节点将无法提供查询服务,除非cluster-require-full-coverage被设置为no .
    cluster_known_nodes: 集群中节点数量,包括处于握手状态还没有成为集群正式成员的节点.
    cluster_size: 至少包含一个哈希槽且能够提供服务的master节点数量.
    cluster_current_epoch: 集群本地Current Epoch变量的值。这个值在节点故障转移过程时有用,它总是递增和唯一的。
    cluster_my_epoch: 当前正在使用的节点的Config Epoch值. 这个是关联在本节点的版本值.
    cluster_stats_messages_sent: 通过node-to-node二进制总线发送的消息数量.
    cluster_stats_messages_received: 通过node-to-node二进制总线接收的消息数量.
    2,主节点异常,从节点自动顶替主节点
    cluster nodes 节点信息的使用
    ps -ef|grep redis
    kill -9 主节点进程ID
    再次查看
    cluster nodes
     
    参考帖子:
    http://www.redis.net.cn/
     
  • 相关阅读:
    css选择器以及块级元素、行内元素
    拒绝服务(DOS/DDOS/DRDOS)
    分布式拒绝服务攻击(DDoS)原理及防范
    不可不知 DDoS的攻击原理与防御方法(2)
    重写与隐藏
    VMWare虚拟机centos7安装redis
    APP微信支付Java后台的实现(springmvc)
    hbm2java和hbm2ddl工具
    Hibernate主键生成策略
    Oracle常用数据类型
  • 原文地址:https://www.cnblogs.com/duguangming/p/11140686.html
Copyright © 2011-2022 走看看