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

    一、redis集群基本介绍

    Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施installation。

    Redis 集群不支持那些需要同时处理多个键的 Redis 命令, 因为执行这些命令需要在多个 Redis 节点之间移动数据, 并且在高负载的情况下, 这些命令将降低Redis集群的性能, 并导致不可预测的行为。

    Redis 集群通过分区partition来提供一定程度的可用性availability: 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。

    将数据自动切分(split)到多个节点的能力。

    当集群中的一部分节点失效或者无法进行通讯时,仍然可以继续处理命令请求的能力。

    二、redis集群数据共享

    Redis集群使用数据分片(sharding)而非一致性哈希(consistency hashing)来实现:一个Redis集群包含16384个哈希槽(hash slot),数据库中的每个键都属于这16384个哈希槽的其中一个,集群使用公CRC16(key)%16384来计算键key属于哪个槽,其中CRC16(key)语句用于计算键key的CRC16校验和。

    节点A负责处理0号至5500号哈希槽。

    节点B负责处理5501号至11000号哈希槽。

    节点C负责处理11001号至16384号哈希槽。

    三、redis cluster

    四、集群安装部署

    6个redis实例,一般会放到3台硬件服务器
    注:在企业规划中,一个分片的两个分到不同的物理机,防止硬件主机宕机造成整个分片数据丢失。

    4.1 安装基础软件

    # 安装redis,带有redis-trib.rb命令
    wget http://download.redis.io/releases/redis-3.2.12.tar.gz
    tar xf redis-3.2.12.tar.gz -C /usr/local/
    ln -s /usr/local/redis-3.2.12/ /usr/local/redis
    cd /usr/local/redis/
    make
    PATH=/usr/local/redis/src:$PATH
    source /etc/profile
    
    # 安装ruby软件支持
    yum install ruby rubygems -y
    gem sources -l
    
    # 修改为国内源
    gem sources -a http://mirrors.aliyun.com/rubygems/
    gem sources --remove https://rubygems.org/
    gem sources -l
    
    # 安装redis集群软件,可以指定版本,否则为最新版本
    gem install redis -v 3.3.3

    4.2 创建各节点配置文件

    mkdir -p /data/700{0..5}
    vim /data/7000/redis.conf
    port 7000
    daemonize yes
    pidfile /data/7000/redis.pid
    loglevel notice
    logfile /data/7000/redis.log
    dbfilename dump.rdb
    dir /data/7000
    protected-mode no
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    appendonly yes
    
    vim /data/7001/redis.conf
    port 7001
    daemonize yes
    pidfile /data/7001/redis.pid
    loglevel notice
    logfile /data/7001/redis.log
    dbfilename dump.rdb
    dir /data/7001
    protected-mode no
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    appendonly yes
    
    vim /data/7002/redis.conf
    port 7002
    daemonize yes
    pidfile /data/7002/redis.pid
    loglevel notice
    logfile /data/7002/redis.log
    dbfilename dump.rdb
    dir /data/7002
    protected-mode no
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    appendonly yes
    
    vim /data/7003/redis.conf
    port 7003
    daemonize yes
    pidfile /data/7003/redis.pid
    loglevel notice
    logfile /data/7003/redis.log
    dbfilename dump.rdb
    dir /data/7003
    protected-mode no
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    appendonly yes
    
    vim /data/7004/redis.conf
    port 7004
    daemonize yes
    pidfile /data/7004/redis.pid
    loglevel notice
    logfile /data/7004/redis.log
    dbfilename dump.rdb
    dir /data/7004
    protected-mode no
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    appendonly yes
    
    vim /data/7005/redis.conf
    port 7005
    daemonize yes
    pidfile /data/7005/redis.pid
    loglevel notice
    logfile /data/7005/redis.log
    dbfilename dump.rdb
    dir /data/7005
    protected-mode no
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    appendonly yes

    4.3 启动节点服务

    redis-server /data/7000/redis.conf
    redis-server /data/7001/redis.conf
    redis-server /data/7002/redis.conf
    redis-server /data/7003/redis.conf
    redis-server /data/7004/redis.conf
    redis-server /data/7005/redis.conf

    4.4 将节点加入集群

      会自动将前3个节点认为是master节点,后三个作为对应的从节点。主节点和从节点应该分布到不同的物理节点。

    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
    >>> Creating cluster
    >>> Performing hash slots allocation on 6 nodes...
    Using 3 masters:
    127.0.0.1:7000
    127.0.0.1:7001
    127.0.0.1:7002
    Adding replica 127.0.0.1:7003 to 127.0.0.1:7000
    Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
    Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
    M: c4983be04f95d9c9c848ba692cd42cb9201ff4b5 127.0.0.1:7000
       slots:0-5460 (5461 slots) master
    M: 4223ef9cb913d796bb96187f7a737bc232a68d93 127.0.0.1:7001
       slots:5461-10922 (5462 slots) master
    M: 4bb6c9008c10530a13379b738eaee8611ac96738 127.0.0.1:7002
       slots:10923-16383 (5461 slots) master
    S: 5d112be8cd376d039a4ab2c66141d2fc25c50486 127.0.0.1:7003
       replicates c4983be04f95d9c9c848ba692cd42cb9201ff4b5
    S: 9c758f060663f92e60e4c5c2389e33279e72cb7b 127.0.0.1:7004
       replicates 4223ef9cb913d796bb96187f7a737bc232a68d93
    S: 78540a81d3d6d9bb6f73f848b7e5fb6b1d3bc5d2 127.0.0.1:7005
       replicates 4bb6c9008c10530a13379b738eaee8611ac96738
    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 127.0.0.1:7000)
    M: c4983be04f95d9c9c848ba692cd42cb9201ff4b5 127.0.0.1:7000
       slots:0-5460 (5461 slots) master
       1 additional replica(s)
    M: 4223ef9cb913d796bb96187f7a737bc232a68d93 127.0.0.1:7001
       slots:5461-10922 (5462 slots) master
       1 additional replica(s)
    M: 4bb6c9008c10530a13379b738eaee8611ac96738 127.0.0.1:7002
       slots:10923-16383 (5461 slots) master
       1 additional replica(s)
    S: 5d112be8cd376d039a4ab2c66141d2fc25c50486 127.0.0.1:7003
       slots: (0 slots) slave
       replicates c4983be04f95d9c9c848ba692cd42cb9201ff4b5
    S: 9c758f060663f92e60e4c5c2389e33279e72cb7b 127.0.0.1:7004
       slots: (0 slots) slave
       replicates 4223ef9cb913d796bb96187f7a737bc232a68d93
    S: 78540a81d3d6d9bb6f73f848b7e5fb6b1d3bc5d2 127.0.0.1:7005
       slots: (0 slots) slave
       replicates 4bb6c9008c10530a13379b738eaee8611ac96738
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.
    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

    4.5 集群状态查看

    redis-cli -p 7000 cluster nodes| grep master
    redis-cli -p 7000 cluster nodes| grep slave

    五、集群管理

    5.1 新增节点,创建两个节点的目录及配置文件

    mkdir /data/700{6,7}
    vim /data/7006/redis.conf
    port 7006
    daemonize yes
    pidfile /data/7006/redis.pid
    loglevel notice
    logfile /data/7006/redis.log
    dbfilename dump.rdb
    dir /data/7006
    protected-mode no
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    appendonly yes
    
    vim /data/7007/redis.conf
    port 7007
    daemonize yes
    pidfile /data/7007/redis.pid
    loglevel notice
    logfile /data/7007/redis.log
    dbfilename dump.rdb
    dir /data/7007
    protected-mode no
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    appendonly yes

    5.2 启动新增两节点的服务

    redis-server /data/7006/redis.conf
    redis-server /data/7007/redis.conf

    5.3 添加主节点,把7006添加到7000节点所在的主集群中

    # redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000
    # redis-cli -p 7000 cluster nodes | grep master
    c4983be04f95d9c9c848ba692cd42cb9201ff4b5 127.0.0.1:7000 myself,master - 0 0 1 connected 0-5460
    10b8ae75c548e46dbabbc5667c0b749813f855e5 127.0.0.1:7006 master - 0 1559015085602 0 connected                     # 添加到集群之后,并没有分配slot槽位,需要我们手动来平均分配
    4223ef9cb913d796bb96187f7a737bc232a68d93 127.0.0.1:7001 master - 0 1559015085602 2 connected 5461-10922          # 平均分配计算:16384/4=4096
    4bb6c9008c10530a13379b738eaee8611ac96738 127.0.0.1:7002 master - 0 1559015084101 3 connected 10923-16383

    5.4 转移slot(重新分片)

    redis-trib.rb reshard 127.0.0.1:7000
    >>> Performing Cluster Check (using node 127.0.0.1:7000)
    M: c4983be04f95d9c9c848ba692cd42cb9201ff4b5 127.0.0.1:7000
       slots:0-5460 (5461 slots) master
       1 additional replica(s)
    M: 10b8ae75c548e46dbabbc5667c0b749813f855e5 127.0.0.1:7006
       slots: (0 slots) master
       0 additional replica(s)
    M: 4223ef9cb913d796bb96187f7a737bc232a68d93 127.0.0.1:7001
       slots:5461-10922 (5462 slots) master
       1 additional replica(s)
    M: 4bb6c9008c10530a13379b738eaee8611ac96738 127.0.0.1:7002
       slots:10923-16383 (5461 slots) master
       1 additional replica(s)
    S: 5d112be8cd376d039a4ab2c66141d2fc25c50486 127.0.0.1:7003
       slots: (0 slots) slave
       replicates c4983be04f95d9c9c848ba692cd42cb9201ff4b5
    S: 9c758f060663f92e60e4c5c2389e33279e72cb7b 127.0.0.1:7004
       slots: (0 slots) slave
       replicates 4223ef9cb913d796bb96187f7a737bc232a68d93
    S: 78540a81d3d6d9bb6f73f848b7e5fb6b1d3bc5d2 127.0.0.1:7005
       slots: (0 slots) slave
       replicates 4bb6c9008c10530a13379b738eaee8611ac96738
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.
    How many slots do you want to move (from 1 to 16384)? 4096                     # 要移动槽位的大小:4096
    What is the receiving node ID? 10b8ae75c548e46dbabbc5667c0b749813f855e5        # 接收节点的ID:7006的ID
    Please enter all the source node IDs.
      Type 'all' to use all the nodes as source nodes for the hash slots.          # 键入all以将所有节点用作散列槽的源节点。
      Type 'done' once you entered all the source nodes IDs.                       # 输入所有源节点ID后,键入done。
    Source node #1:all                                                             # 输入all所有节点分配槽位
    ……
    Do you want to proceed with the proposed reshard plan (yes/no)? yes            # 是否继续,选择yes

    5.5 添加从节点

    # 查询7006的ID
    redis-cli -p 7000 cluster nodes | grep master
    # 给7006添加7007的slave节点 redis
    -trib.rb add-node --slave --master-id 10b8ae75c548e46dbabbc5667c0b749813f855e5 127.0.0.1:7007 127.0.0.1:7000

    5.6 删除master槽位

    redis-trib.rb reshard 127.0.0.1:7000
    >>> Performing Cluster Check (using node 127.0.0.1:7000)
    M: c4983be04f95d9c9c848ba692cd42cb9201ff4b5 127.0.0.1:7000
       slots:2731-5460 (2730 slots) master
       1 additional replica(s)
    M: 10b8ae75c548e46dbabbc5667c0b749813f855e5 127.0.0.1:7006
       slots:0-2730,5461-8191,10923-13652 (8192 slots) master
       1 additional replica(s)
    M: 4223ef9cb913d796bb96187f7a737bc232a68d93 127.0.0.1:7001
       slots:8192-10922 (2731 slots) master
       1 additional replica(s)
    S: f1792f755d1b50e8e66073e5c03b1776b7cb36a7 127.0.0.1:7007
       slots: (0 slots) slave
       replicates 10b8ae75c548e46dbabbc5667c0b749813f855e5
    M: 4bb6c9008c10530a13379b738eaee8611ac96738 127.0.0.1:7002
       slots:13653-16383 (2731 slots) master
       1 additional replica(s)
    S: 5d112be8cd376d039a4ab2c66141d2fc25c50486 127.0.0.1:7003
       slots: (0 slots) slave
       replicates c4983be04f95d9c9c848ba692cd42cb9201ff4b5
    S: 9c758f060663f92e60e4c5c2389e33279e72cb7b 127.0.0.1:7004
       slots: (0 slots) slave
       replicates 4223ef9cb913d796bb96187f7a737bc232a68d93
    S: 78540a81d3d6d9bb6f73f848b7e5fb6b1d3bc5d2 127.0.0.1:7005
       slots: (0 slots) slave
       replicates 4bb6c9008c10530a13379b738eaee8611ac96738
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.
    How many slots do you want to move (from 1 to 16384)? 8192      # 输入要删除master的slot的大小。
    What is the receiving node ID? c4983be04f95d9c9c848ba692cd42cb9201ff4b5     # 要把槽位移动到的节点ID
    Please enter all the source node IDs.
      Type 'all' to use all the nodes as source nodes for the hash slots.
      Type 'done' once you entered all the source nodes IDs.
    Source node #1:10b8ae75c548e46dbabbc5667c0b749813f855e5    # 要删除节点的ID
    Source node #2:done    # 如果只有一个的话,后面填写done
    redis-trib.rb reshard 127.0.0.1:7000

    5.7 删除master和slave节点

    redis-cli -p 7000 cluster nodes
    redis-trib.rb del-node 127.0.0.1:7006 10b8ae75c548e46dbabbc5667c0b749813f855e5
    redis-trib.rb del-node 127.0.0.1:7007 f1792f755d1b50e8e66073e5c03b1776b7cb36a7
  • 相关阅读:
    c博客作业05--指针
    C博客作业04--数组
    C博客作业03--函数
    C博客作业02--循环结构
    C博客作业01--分支、顺序结构
    我的第一篇博客
    DS博客作业05--查找
    DS博客作业04--图
    DS博客作业03--树
    DS博客作业02--栈和队列
  • 原文地址:https://www.cnblogs.com/cyleon/p/10936389.html
Copyright © 2011-2022 走看看