zoukankan      html  css  js  c++  java
  • redis-cluster配置

    一、redis使用中遇到的瓶颈

      我们日常在对于redis的使用中,经常会遇到一些问题

      1、高可用问题,如何保证redis的持续高可用性。

      2、容量问题,单实例redis内存无法无限扩充,达到32G后就进入了64位世界,性能下降。

      3、并发性能问题,redis号称单实例10万并发,但也是有尽头的。

    二、redis-cluster的优势  

      1、官方推荐,毋庸置疑。

      2、去中心化,集群最大可增加1000个节点,性能随节点增加而线性扩展。

      3、管理方便,后续可自行增加或摘除节点,移动分槽等等。

      4、简单,易上手。

    三、redis-cluster名词介绍

      1、master  主节点、

      2、slave   从节点

      3、slot    槽,一共有16384数据分槽,分布在集群的所有主节点中。

    四、redis-cluster简介

    redis-cluster

    图中描述的是六个redis实例构成的集群

    6379端口为客户端通讯端口

    16379端口为集群总线端口

    集群内部划分为16384(0-16383)个数据分槽,分布在三个主redis中。

    从redis中没有分槽,不会参与集群投票,也不会帮忙加快读取数据,仅仅作为主机的备份。

    三个主节点中平均分布着16384数据分槽的三分之一,每个节点中不会存有有重复数据,仅仅有自己的从机帮忙冗余。

    问题:在什么情况下考虑使用Redis Cluster

    答:Redis ClusterRedis的分布式解决方案,在Redis 3.0版本正式推出的,有效解决了Redis分布式方面的需求。当遇到单机内存、并发、流量等瓶颈时,可以采用Cluster架构达到负载均衡的目的。

    五、Redis数据分区

    Redis Cluster采用虚拟槽分区,所有的键根据哈希函数映射到0 ~ 16383,计算公式:slot = CRC16(key)&16383。每一个节点负责维护一部分槽以及槽所映射的键值数据。

    下图展现一个五个节点构成的集群,每个节点平均大约负责3276个槽,以及通过计算公式映射到对应节点的对应槽的过程。

     

    Redis虚拟槽分区的特性:

    解耦数据和节点之间的关系,简化了节点扩容和收缩难度。
    节点自身维护槽的映射关系,不需要客户端或者代理服务维护槽分区元数据。
    支持节点、槽、键之间的映射查询,用于数据路由、在线伸缩等场景。

    六、搭建Redis Cluster

    (一)准备6个redis数据库实例,准备6个配置文件redis-{7000....7005}配置文件

    -rw-r--r-- 1 root root 151 Jan  2 19:26 redis-7000.conf
    -rw-r--r-- 1 root root 151 Jan  2 19:27 redis-7001.conf
    -rw-r--r-- 1 root root 151 Jan  2 19:27 redis-7002.conf
    -rw-r--r-- 1 root root 151 Jan  2 19:27 redis-7003.conf
    -rw-r--r-- 1 root root 151 Jan  2 19:27 redis-7004.conf
    -rw-r--r-- 1 root root 151 Jan  2 19:27 redis-7005.conf

    redis-7000.conf配置如下

    port 7000
    daemonize yes
    dir "/opt/redis/data"
    logfile "7000.log"
    dbfilename "dump-7000.rdb"
    cluster-enabled yes   #开启集群模式
    cluster-config-file nodes-7000.conf  #集群内部的配置文件
    cluster-require-full-coverage no  #redis cluster需要16384个slot都正常的时候才能对外提供服务,换句话说,只要任何一个slot异常那么整个cluster不对外提供服务。 因此生产环境一般为no

    redis支持多实例的功能,我们在单机演示集群搭建,需要6个实例,三个是主节点,三个是从节点,数量为6个节点才能保证高可用的集群。

    每个节点仅仅是端口运行的不同!

    [root@yugo /opt/redis/config 17:12:30]#ls
    redis-7000.conf  redis-7002.conf  redis-7004.conf
    redis-7001.conf  redis-7003.conf  redis-7005.conf

    #确保每个配置文件中的端口修改!!

    (二)启动6个数据库实例

    [root@localhost s15rediscluster]# redis-server redis-7000.conf 
    [root@localhost s15rediscluster]# redis-server redis-7001.conf 
    [root@localhost s15rediscluster]# redis-server redis-7002.conf 
    [root@localhost s15rediscluster]# redis-server redis-7003.conf 
    [root@localhost s15rediscluster]# redis-server redis-7004.conf 
    [root@localhost s15rediscluster]# redis-server redis-7005.conf 

    检查日志文件

    cat 7000.log

    检查redis服务的端口、进程

    netstat -tunlp|grep redis
    
    
    ps -ef|grep redis

    此时集群还不可用,可以通过登录redis查看

    redis-cli -p 7000
    set hello world
    
    (error)CLUSTERDOWN The cluster is down

    (三)配置ruby语言环境,脚本一键启动redis-cluster 

    1、下载ruby语言的源码包,编译安装

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

    2、解压缩

    tar -xvf ruby-2.3.1.tar.gz
    
    cd ruby-2.3.1
    
    ./configure --prefix=/opt/ruby/
    
    make && make install

    3、配置ruby的环境变量

    echo $PATH
        
    vim /etc/profile
    #写入最底行
    PATH=$PATH:/opt/ruby/bin/
    #读取文件
    source /etc/profile 

    4、下载安装ruby操作redis的模块包

    wget http://rubygems.org/downloads/redis-3.3.0.gem
    
    gem install -l redis-3.3.0.gem
    
    #查看gem有哪些包
    gem list -- check redis gem

    5、安装redis-trib.rb命令

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

    6、一键开启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
    
    #集群自动分配主从关系  7000、7001、7002为 7003、7004、7005 主动关系

    7、查看集群状态

    redis-cli -p 7000 cluster info  
    
    redis-cli -p 7000 cluster nodes  #等同于查看nodes-7000.conf文件节点信息
    
    集群主节点状态
    redis-cli -p 7000 cluster nodes | grep master
    集群从节点状态
    redis-cli -p 7000 cluster nodes | grep slave

    安装完毕后,检查集群状态

    [root@yugo /opt/redis/src 18:42:14]#redis-cli -p 7000 cluster info
    cluster_state:ok
    cluster_slots_assigned:16384
    cluster_slots_ok:16384
    cluster_slots_pfail:0
    cluster_slots_fail:0
    cluster_known_nodes:6
    cluster_size:3
    cluster_current_epoch:6
    cluster_my_epoch:1
    cluster_stats_messages_ping_sent:10468
    cluster_stats_messages_pong_sent:10558
    cluster_stats_messages_sent:21026
    cluster_stats_messages_ping_received:10553
    cluster_stats_messages_pong_received:10468
    cluster_stats_messages_meet_received:5
    cluster_stats_messages_received:21026

    8、测试写入集群数据,登录集群必须使用redis-cli -c -p 7000必须加上-c参数

    127.0.0.1:7000> set name chao     
    -> Redirected to slot [5798] located at 127.0.0.1:7001       
    OK
    127.0.0.1:7001> exit
    [root@yugo /opt/redis/src 18:46:07]#redis-cli -c -p 7000
    127.0.0.1:7000> ping
    PONG
    127.0.0.1:7000> keys *
    (empty list or set)
    127.0.0.1:7000> get name
    -> Redirected to slot [5798] located at 127.0.0.1:7001
    "chao"

    集群ok

  • 相关阅读:
    时间复杂度 空间复杂度
    qt 打开串口 UI卡死
    python 网络编程
    Java 理解泛型的基本含义
    Java LinkedList 和 ArrayList
    Java renameTo()重新命名此抽象路径名表示的文件
    Java separatorChar 如何在Java里面添加
    Java 遍历文件夹里面的全部文件、指定文件
    Java File文件操作 创建文件目录,删除文件目录
    Java toString()方法的神奇之处
  • 原文地址:https://www.cnblogs.com/fengchong/p/10218706.html
Copyright © 2011-2022 走看看