• redis集群搭建


    1、集群的概念

    集群是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器。集群配置是用于提高可用性和可缩放性。当请求到来首先由负载均衡服务器处理,把请求转发到另外的一台服务器上,redis集群主要是缓解单台服务器同一时间大量请求带来的的压力,就算集群中有服务器宕机,也不影响整体对外提供服务。

    2、搭建redis集群

    1、准备6个redis节点,7000.conf,7001.conf,7002.conf,7003.conf,7004.conf,7005.conf;编辑7000.conf文件,将以下配置拷贝进去,其他配置可直接复制,后续进行修改。
    port 7000
    bind 127.0.0.1
    daemonize yes
    pidfile 7000.pid
    cluster-enabled yes
    cluster-config-file 7000_node.conf
    cluster-node-timeout 15000
    appendonly yes
    
    2、使用命令,修改其他5个配置文件的内容
    sed  's/7000/7001/g'  7000.conf > 7001.conf
    sed  's/7000/7002/g'  7000.conf > 7002.conf
    sed  's/7000/7003/g'  7000.conf > 7003.conf
    sed  's/7000/7004/g'  7000.conf > 7004.conf
    sed  's/7000/7005/g'  7000.conf > 7005.conf
    
    3、分别启动六个实例
    redis-server  7000.conf 
    redis-server  7001.conf 
    redis-server  7002.conf 
    redis-server  7003.conf 
    redis-server  7004.conf 
    redis-server  7005.conf
    
    4、启动效果如下
    root       7821      1  0 01:39 ?        00:00:00 redis-server 127.0.0.1:7000 [cluster]
    root       7826      1  0 01:39 ?        00:00:00 redis-server 127.0.0.1:7001 [cluster]
    root       7833      1  0 01:39 ?        00:00:00 redis-server 127.0.0.1:7002 [cluster]
    root       7838      1  0 01:40 ?        00:00:00 redis-server 127.0.0.1:7003 [cluster]
    root       7848      1  0 01:40 ?        00:00:00 redis-server 127.0.0.1:7004 [cluster]
    root       7853      1  1 01:40 ?        00:00:00 redis-server 127.0.0.1:7005 [cluster]
    
    
    5、安装配置ruby环境,用于一键搭建redis集群

    5.1.下载源码

    wget -c  https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz
    

    5.2.解压缩ruby

    tar -xvf ruby-2.3.1.tar.gz
    

    5.3.编译安装ruby

    ./configure --prefix=/opt/ruby/
    make && make install
    

    5.4.准备ruby的环境变量

    cp ./bin/ruby   /usr/local/bin/
    cp ./bin/gem   /usr/local/bin
    

    5.5.下载ruby的软件包管理工具

    wget http://rubygems.org/downloads/redis-3.3.0.gem
    gem install -l redis-3.3.0.gem  #安装ruby操作redis的模块
    

    5.6.查看ruby语言的包邮哪些

    gem list -- check redis gem
    

    5.7.配置环境变量,配置环境变量redis-trib.rb,用于创建redis-cluster

    cp /opt/redis-4.0.10/src/redis-trib.rb    /usr/local/bin/
    

    5.8.通过redis-trib.rb命令,一键创建redis-cluster集群功能

    redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
    
    6、以上是属于版本较老的redis配置集群的命令,好像redis5.0以上版本,不需要配置ruby环境,配置好六个配置文件,直接使用以下命令就可以创建
    redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1
    
    7、查看redis集群状态信息
    redis集群对内两两组成主从
    redis-cli -p 7003 info replication #查看主从身份信息
    redis-cli -p 7004 info replication #查看主从身份信息
    redis-cli -p 7005 info replication #查看主从身份信息
    redis-cli -p 7000 cluster info    #查看节点集群状态
    redis-cli -p 7000 -c  
    

    3、集群在哪个服务器上写数据:CRC16

    redis cluster在设计的时候,就考虑到了去中⼼化,去中间件,也就是说,集群中 的每个节点都是平等的关系,都是对等的,每个节点都保存各⾃的数据和整个集 群的状态。每个节点都和其他所有节点连接,⽽且这些连接保持活跃,这样就保 证了我们只需要连接集群中的任意⼀个节点,就可以获取到其他节点的数据

    Redis集群没有并使⽤传统的⼀致性哈希来分配数据,⽽是采⽤另外⼀种叫做哈希 槽 (hash slot)的⽅式来分配的。redis cluster 默认分配了 16384 个slot,当我们 set⼀个key 时,会⽤CRC16算法来取模得到所属的slot,然后将这个key 分到哈 希槽区间的节点上,具体算法就是:CRC16(key) % 16384。

    Redis 集群会把数据存在⼀个 master 节点,然后在这个 master 和其对应的salve 之间进⾏数据同步。当读取数据时,也根据⼀致性哈希算法到对应的 master 节 点获取数据。只有当⼀个master 挂掉之后,才会启动⼀个对应的 salve 节点,充 当 master
    需要注意的是:必须要3个或以上的主节点,否则在创建集群时会失败,并且当存 活的主节点数⼩于总节点数的⼀半时,整个集群就⽆法提供服务了

    4、与python交互

    安装包如下

    pip3 install redis-py-cluster
    

    示列代码

    from rediscluster import *
    
    if __name__ == '__main__':
      try:
          # 构建所有的节点,Redis会使⽤CRC16算法,将键和值写到某个节点上
          startup_nodes = [
              {'host': '192.168.8.104', 'port': '7000'},
              {'host': '192.168.8.104', 'port': '7003'},
              {'host': '192.168.8.104', 'port': '7001'},
          ]
          # 构建StrictRedisCluster对象
          src=StrictRedisCluster(startup_nodes=startup_nodes,decode_responses=True)
          result=src.set('name','花花')
          print(result)
          name = src.get('name')
          print(name)
      except Exception as e:
          print(e)
  • 相关阅读:
    Delphi的idhttp报508 Loop Detected错误的原因
    Delphi的idhttp报IOHandler value is not valid错误的原因
    华为S5700S-52P-LI-AC千兆网管交换机web登录界面配置
    解决win2003/2008下注册机或破解补丁程序无法运行问题
    SQL拆分(转)
    1602四线驱动
    ADC取样
    Delphi AES加密(转)
    使用Qt开发中国象棋(一):概述
    清除当前文件夹下.svn文件的方法
  • 原文地址:https://www.cnblogs.com/hjnzs/p/12849578.html
Copyright © 2020-2023  润新知