• redis集群搭建


    为啥要配置redis集群:

    1.提高效率

    2.备份替换。

    redis穿透:

    redis中会有一种文体就是key放进去,但是value没放进去或者替换成功空,这样的话每次都是直接查的数据库。

    缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。

    解决方案:

    1. 对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合则丢弃。还有最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。
    2. 也可以采用一个更为简单粗暴的方法,如果一个查询返回的数据为空(不管是数 据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。

    redis的雪崩

    如果缓存集中在一段时间内失效,发生大量的缓存穿透,所有的查询都落在数据库上,造成了缓存雪崩。

    这个没有完美解决办法,但可以分析用户行为,尽量让失效时间点均匀分布。大多数系统设计者考虑用加锁或者队列的方式保证缓存的单线程(进程)写,从而避免失效时大量的并发请求落到底层存储系统上。

    解决方案:

    1. 在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
    2. 可以通过缓存reload机制,预先去更新缓存,再即将发生大并发访问前手动触发加载缓存
    3. 不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀
    4. 做二级缓存,或者双缓存策略。A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期。

    redis集群服务器至少需要六台

    三主三从

    ruby环境

        redis集群管理工具redis-trib.rb依赖ruby环境,首先需要安装ruby环境:

        安装ruby

          yum install ruby=

          yum install rubygems

        安装ruby和redis的接口程序

        gem install redis

    执行这行命令可能会报错解决方法:

    提示:

    gem install redis ERROR: Error installing redis: redis requires Ruby version >= 2.2.2.

    解决方法:

    1.更新执行命令:

    yum -y update nss

    2.安装curl

    yum install curl -y

    3.执行

    gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB

    4.执行

    curl -L get.rvm.io | bash -s stable

    5.find / -name rvm -print

    6.source /usr/local/rvm/scripts/rvm

    7.rvm list known

    8.rvm install 2.4.4

    9.rvm use 2.4.4

    10.rvm use 2.4.4 --default

    11.ruby --version

    12.gem install redis

      

      集群结点规划  

        这里在同一台服务器用不同的端口表示不同的redis服务器,如下:

        主节点:192.168.106.132:7001 192.168.106.132:7002 192.168.106.132:7003

        从节点:192.168.106.132:7004 192.168.106.132:7005 192.168.106.132:7006

               在/usr/local下创建redis-cluster目录,其下创建7001、7002。。7006目录,如下:

        

        

        

        将redis安装目录bin下的文件拷贝到每个700X目录内,同时将redis源码目录src下的redis-trib.rb拷贝到redis-cluster目录下。

        修改每个700X目录下的redis.conf配置文件:

        port XXXX

        cluster-enabled yes

      启动每个节点redis服务   

      分别进入7001、7002、...7006目录,执行:

      ./redis-server ./redis.conf

      查看进程

      

     

      

      执行创建集群命令

        在/usr/local/redis-cluster/

        执行redis-trib.rb,此脚本是ruby脚本,它依赖ruby环境。

        ./redis-trib.rb create --replicas 1 192.168.127.131:7001 192.168.127.131:7002 192.168.127.131:7003 192.168.127.131:7004 192.168.127.131:7005  192.168.127.131:7006

        

        说明:

        redis集群至少需要3个主节点,每个主节点有一个从节点总共6个节点

        replicas指定为1表示每个主节点有一个从节点

    注意:

    如果执行时报如下错误:

    [ERR] Node XXXXXX is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0

    解决方法是删除生成的配置文件nodes.conf,如果不行则说明现在创建的结点包括了旧集群的结点信息,需要删除redis的持久化文件后再重启redis,比如:appendonly.aof、dump.rdb    

    创建集群输出如下

    >>> Creating cluster

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

    Using 3 masters:

    192.168.106.132:7001

    192.168.106.132:7002

    192.168.106.132:7003

    Adding replica 192.168.106.132:7004 to 192.168.106.132:7001

    Adding replica 192.168.106.132:7005 to 192.168.106.132:7002

    Adding replica 192.168.106.132:7006 to 192.168.106.132:7003

    M: 6c388e0cd04990b23e2e65b285b5f9c1bc996538 192.168.106.132:7001

    slots:0-5460 (5461 slots) master

    M: 01e9cd67978b1cad73a40e9a70000a236744cb17 192.168.106.132:7002

    slots:5461-10922 (5462 slots) master

    M: 72a649017fdd5d4045f9d58df8b231c2d69e6c32 192.168.106.132:7003

    slots:10923-16383 (5461 slots) master

    S: b90aa487cf48270df43e79af98807bb5ffabbe34 192.168.106.132:7004

    replicates 6c388e0cd04990b23e2e65b285b5f9c1bc996538

    S: f873f54c61dbb613df58fa4b9ff8bc3dd48e2388 192.168.106.132:7005

    replicates 01e9cd67978b1cad73a40e9a70000a236744cb17

    S: daa813e169580417f4410fac86a3d4ab9abda804 192.168.106.132:7006

    replicates 72a649017fdd5d4045f9d58df8b231c2d69e6c32

    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.132:7001)

    M: 6c388e0cd04990b23e2e65b285b5f9c1bc996538 192.168.106.132:7001

    slots:0-5460 (5461 slots) master

    1 additional replica(s)

    S: b90aa487cf48270df43e79af98807bb5ffabbe34 192.168.106.132:7004

    slots: (0 slots) slave

    replicates 6c388e0cd04990b23e2e65b285b5f9c1bc996538

    M: 72a649017fdd5d4045f9d58df8b231c2d69e6c32 192.168.106.132:7003

    slots:10923-16383 (5461 slots) master

    1 additional replica(s)

    M: 01e9cd67978b1cad73a40e9a70000a236744cb17 192.168.106.132:7002

    slots:5461-10922 (5462 slots) master

    1 additional replica(s)

    S: daa813e169580417f4410fac86a3d4ab9abda804 192.168.106.132:7006

    slots: (0 slots) slave

    replicates 72a649017fdd5d4045f9d58df8b231c2d69e6c32

    S: f873f54c61dbb613df58fa4b9ff8bc3dd48e2388 192.168.106.132:7005

    slots: (0 slots) slave

    replicates 01e9cd67978b1cad73a40e9a70000a236744cb17

    [OK] All nodes agree about slots configuration.

    >>> Check for open slots...

    >>> Check slots coverage...

    [OK] All 16384 slots covered.

        

      查询集群信息

        集群创建成功登陆任意redis结点查询集群中的节点情况

        

    集群创建完毕

  • 相关阅读:
    java 单例模式-饿懒汉模式
    Java注解
    Java集合
    Java数据类型
    java实现多线程三种方法
    Java并发 线程池
    spring ioc(反转控制)
    事件驱动的Java框架
    js 标签属性与导航
    input 标签和a标签实现超链接的区别
  • 原文地址:https://www.cnblogs.com/ycq-qiang/p/11150825.html
Copyright © 2020-2023  润新知