zoukankan      html  css  js  c++  java
  • Redis集群搭建

    Redis集群搭建

    什么是Redis集群

    Redis集群是一个分布式、容错的Redis实现,它由多个Redis节点组成,在多个Redis节点之间进行数据共享。集群可以使用的功能是普通单机Redis所能使用的功能的一个子集,他提供了复制和故障转移功能。

    Redis集群中不存在中心节点和代理节点,而且不支持那些需要同时处理多个键的Redis命令。

    Redis集群的设计目标是达到线性可扩展性。

    Redis集群为了保证数据的一致性,而牺牲一部分容错性。

    Redis集群通过分区来提供一定程度的可用性,当集群中有部分节点失效或无法提供服务时,集群也可以继续完成相关的命令请求。

    Redis集群实现了单机Redis中所有处理单个数据库键的命令,它不支持多数据库功能。它默认使用0号数据库,并且不能使用SELECT命令。

    使用集群的好处:

    1. 可以实现将数据自动切分到多个节点
    2. 当集群中有部分节点失效或者无法提供服务的时候,它依然可以继续完成相关的命令请求
    3. Redis集群的使用可以解决高并发、大数据量的问题

    集群中的节点和槽

    节点

    一个Redis集群通常由多个节点(Node)组成。在没有搭建Redis集群之前,每个节点都是相互独立的,彼此之间没有关系,每个节点都只包含在自己的集群中,只有将多个节点连接在一起,才能组建一个可以工作的集群。

    #连接各个独立的节点
    #将这条命令发送个某个节点,就可让该节点与ip和port所指定的节点进行握手。当握手成功时,就表示该节点已经进入集群中 
    CLUSTER MEET <ip> <port>
    

    在开启集群模式的时候,服务器会创建一个 clusterState类型的结构来保存当前节点视角下的集群状态。

    在集群模式中,每个节点都会使用cluster.h/clusterNode结构来保存自己的当前状态。

    Redis集群为了能够存出大量的数据信息,采用分片的方式将大量方式保存在数据库中,这个数据库被划分为16384个槽(Slot)。槽是虚拟槽,槽是有一定的范围,在Redis中的范围是0~16383,每个槽映射一个大数据子集,一般比节点数大

    集群搭建

    image-20201010150317289

    集群搭建步骤

    Redis自带的集群搭建

    三主三从集群

    • 主节点:7000、7001、7002
    • 主从关系:7003-->7000(7003是7000的从节点)、7004-->7001、7005-->7002

    配置开启节点

    • port${port}:指定端口。
    • decmonize yes:以守护进程的方式启动。
    • dir "/home/redis/data":数据目录。
    • dfilename "dump-${port} .rdb": 指定RDB文件。
    • logfle "redis-cluster-${port}.log":指定日志文件。
    • cluster-enabled yes:开启集群模式,表示该节点是一个cluster节点。
    • cluster-config- file nodes-$ {port}.conf: 为cluster 节点指定配置文件。
    • cluster-enabled yes:开启集群模式,表示该节点是一个 cluster 节点。
    • cluster-node- timeout 15000:表示故障转移的时间或节点超时的时间,15s。
    • I cluster-config-file "nides.conf": 集群节点的配置。
    • lster-require fl-ovcrage yes:是否需要集群的所有节点都提供服务,才会认为这个集群是否是正常运行。

    准备6个配置文件(7000->7005)

    配置文件redis-cluster-7000.conf

    port 7000
    daemonize yes
    dir "/home/redis/data"
    logfile "cluster-7000.log"
    dbfilename "dump-7000.rdb"
    cluster-enabled yes
    cluster-config-file nodes-7000.conf
    cluster-require-full-coverage no
    

    配置文件redis-cluster-7001.conf

    port 7001
    daemonize yes
    dir "/home/redis/data"
    logfile "cluster-7001.log"
    dbfilename "dump-7001.rdb"
    cluster-enabled yes
    cluster-config-file nodes-7001.conf
    cluster-require-full-coverage no
    

    配置文件redis-cluster-7002.conf

    port 7002
    daemonize yes
    dir "/home/redis/data"
    logfile "cluster-7002.log"
    dbfilename "dump-7002.rdb"
    cluster-enabled yes
    cluster-config-file nodes-7002.conf
    cluster-require-full-coverage no
    

    其它的三个配置文件也是这样配置。

    启动节点

    redis-server redis-cluster-7000.conf
    redis-server redis-cluster-7001.conf
    redis-server redis-cluster-7002.conf
    redis-server redis-cluster-7003.conf
    redis-server redis-cluster-7004.conf
    redis-server redis-cluster-7005.conf
    
    #查看集群信息
    redis-cli -p 7000 cluster info
    

    Redis集群中的节点的责任:

    • 保存客户端发送过来的键值对数据
    • 记录集群的状态,以及某个键到其所对应的节点映射
    • 自动发现其他节点,监控其他节点,当某个节点出现故障时进行故障转移

    搭建集群

    #分别建立7000与7002、7003、7004、7005节点的握手关系
    redis-cli -p 7000 cluster meet 127.0.0.1 7002
    redis-cli -p 7000 cluster meet 127.0.0.1 7003
    redis-cli -p 7000 cluster meet 127.0.0.1 7004
    redis-cli -p 7000 cluster meet 127.0.0.1 7005
    
    #查看节点之间的关系
    redis-cli -p 7005 cluster nodes
    

    创建脚本文件,来为指定节点指派槽

    vim addsloat.sh
    start=$1
    end=$2
    port=$3
    for slot in 'seq ${satrt} ${end}'
    do
    echo "slot:${slot}"
    redis-cli -p ${port} cluster addslots ${slot}
    done
    
    #为7000节点指派0~5461范围内的槽
    sh addsloat.sh 0 5461 7000
    
    #查看集群和节点信息
    cluster info
    
    #为7001节点指派5462~10922范围内的槽
    sh addsloat.sh 5462 10922 7001
    
    #为7002节点指派10923~16383范围内的槽
    sh addsloat.sh 10923 16383 7002
    

    主从分配

    #查看节点信息
    redis-cli -p 7000 cluster nodes
    #分配主从关系
    redis-cli -p 7003 cluster replicate node-id	#node-id是节点信息里面的节点id
    redis-cli -p 7004 cluster replicate node-id	#node-id是节点信息里面的节点id
    redis-cli -p 7005 cluster replicate node-id	#node-id是节点信息里面的节点id
    
    #查看主从关系
    redis-cli -p 7003 replicate
    
  • 相关阅读:
    v-cloak
    MVVM
    初识ajax
    装瓶学习法
    回调函数(call back)
    如何让学习变得纯粹?
    异步
    grep用法
    Shell中的&&与||的区别
    shell中使用>/dev/null 2>&1 丢弃信息
  • 原文地址:https://www.cnblogs.com/striver20/p/13796342.html
Copyright © 2011-2022 走看看