• redis集群配置和节点管理


    生产环境中的redis绝大多数是以集群形态运行的,这篇博文简要介绍分布式集群的原理、优势,然后描述配置过程。

    redis集群的原理

    redis集群的原理简要介绍如下

    1. redis中有槽位的概念,可以这样理解,redis的数据存储在16384个槽位中,分布式集群就是将这些槽位均匀分布到多个分片节点(不同的redis实例)中。
    2. 写入数据时:将key做crc16(key),然后和16384进行取模,得出槽位值(0-16383之间),找到相对应的分片节点的主节点,存储到相应槽位上。
    3. 读取数据时:只需要连接到集群中的任意一个节点,如果目标数据不在这个节点,分片集群会将客户端连接切换至真正存储节点进行数据存储。
    4. redis的高可用:在搭建集群时,会为每一个分片的主节点,对应一个从节点,实现slaveof的功能,同时当主节点down,集群会实现类似于sentinel的自动failover的功能。

    redis集群的搭建过程

    这里用6个实际来搭建集群,分为三组,每组包含一个主节点和一个从节点。搭建过程如下

    安装集群插件

    yum install ruby rubygems -y
    ##使用国内源,移除原生源
    gem sources -a http://mirrors.aliyun.com/rubygems/
    gem sources  --remove https://rubygems.org/
    ##安装redis集群插件
    gem install redis -v 3.3.3

    准备6个节点

    准备6个节点,端口号分别为6391---6396,一个个vim太麻烦,所以写了一个脚本

    [root@redis scripts]# cat create_redis_conf.sh 
    #!/bin/bash
    port=$1
    if [ ! -d /data/redis/$port ];then
            mkdir /data/redis/$port
    fi
    cat >/data/redis/${port}/redis.conf <<-EOF
    port ${port}
    daemonize yes
    pidfile /data/redis/${port}/redis.pid
    loglevel notice
    logfile "/data/redis/${port}/redis.log"
    dbfilename dump.rdb
    dir /data/redis/${port}
    protected-mode no
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    appendonly yes
    EOF

    看看生成的配置文件内容吧,需要注意的是,这里为了方便我直接把保护模式关闭了,生产环境中可能需要设置bindIP和密码,这时集群所有节点的密码要设置成一样的。

    cat /data/redis/6391/redis.conf 
    port 6391
    daemonize yes
    pidfile /data/redis/6391/redis.pid
    loglevel notice
    logfile "/data/redis/6391/redis.log"
    dbfilename dump.rdb
    dir /data/redis/6391
    protected-mode no
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    appendonly yes

    然后用脚本生成6个节点的配置文件

    sh create_redis_conf.sh  6391
    sh create_redis_conf.sh  6392
    sh create_redis_conf.sh  6393
    sh create_redis_conf.sh  6394
    sh create_redis_conf.sh  6395
    sh create_redis_conf.sh  6396

    启动节点并验证

    ##启动节点
    redis-server /data/redis/6391/redis.conf
    redis-server /data/redis/6392/redis.conf
    redis-server /data/redis/6393/redis.conf
    redis-server /data/redis/6394/redis.conf
    redis-server /data/redis/6395/redis.conf
    redis-server /data/redis/6396/redis.conf
    
    ##验证,可以看到cluster关键字
    ps -ef|grep redis
    root      46075      1  0 18:17 ?        00:00:00 redis-server *:6391 [cluster]
    root      46079      1  0 18:17 ?        00:00:00 redis-server *:6392 [cluster]
    root      46083      1  0 18:17 ?        00:00:00 redis-server *:6393 [cluster]
    root      46087      1  0 18:17 ?        00:00:00 redis-server *:6394 [cluster]
    root      46091      1  0 18:17 ?        00:00:00 redis-server *:6395 [cluster]
    root      46095      1  0 18:17 ?        00:00:00 redis-server *:6396 [cluster]

    还可以连接到主节点后,写入数据,从本身节点或相应的从节点读取,来验证各个节点的可用性。

    将节点加入集群管理

    redis-trib.rb create --replicas 1 127.0.0.1:6391 127.0.0.1:6392 127.0.0.1:6393 127.0.0.1:6394 127.0.0.1:6395 127.0.0.1:6396
    ##--replicas 1表示为每个主节点配置一个从节点
    ##执行语句后,会有互动性操作,根据提示,键入yes,然后enter确认即可

    查看集群状态

    这里有几条命令,作用如下表,每条命令中只需要指定集群中任意一个节点就行

    命令 作用说明
    redis-cli -p 6391 cluster nodes | grep master 查看集群主节点状态
    redis-cli -p 6391 cluster nodes | grep slave 查看集群从节点状态
    redis-trib.rb check 127.0.0.1:6391 打印集群中所有节点的id、槽位和主从信息
    redis-trib.rb info 127.0.0.1:6391 打印集群中所有主节点的基本信息,包含key数量、槽位信息和从节点数量

    模拟主节点掉线

    6391掉线后,6394切换为主节点;6391重启后,作为6394的从节点继续运行。

    redis集群的节点管理

    添加节点

    这里以添加一主一从两个节点为例,其中添加主节点涉及到重新分配槽位的操作,意思就是将集群所有的槽位重新分配。

    • 添加主节点
    ###准备两个新的节点
    sh create_redis_conf.sh 6397
    sh create_redis_conf.sh 6398
    redis-server /data/redis/6397/redis.conf
    redis-server /data/redis/6398/redis.conf
    
    ###添加主节点
    redis-trib.rb check 127.0.0.1:6397
    
    ###查看主节点状态,这时新加的节点槽位数为0
    redis-cli -p 6391 cluster nodes|grep master          
    67adb78e575232aebaf2c645d45a50e43d8a1df9 127.0.0.1:6397 master - 0 1554636369693 0 connected
    db83ce3e3f67714eb1db7285cc293acac1421834 127.0.0.1:6394 master - 0 1554636370196 7 connected 0-5460
    771488ef6f90180b7bcb1968329d6847055ad926 127.0.0.1:6392 master - 0 1554636369693 2 connected 5461-10922
    eb3965cc6ea8b0ff8f134a545fcefe5c102fa2d6 127.0.0.1:6393 master - 0 1554636371204 3 connected 10923-16383
    
    ###重新分配槽位,先计算一下,所有节点均匀分配的话,每个节点槽位数应该是4096
    ###重新分配槽位的操作需要交互式配置,根据提示操作即可,这里贴出需要人工输入的部分,标红的就是需要输入的内容
    redis-trib.rb reshard 127.0.0.1:6391
    How many slots do you want to move (from 1 to 16384)? 4096                  ### 移动槽位的数量
    What is the receiving node ID? 67adb78e575232aebaf2c645d45a50e43d8a1df9     ### 接受槽位的master节点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:all                                                          ### 从哪些节点移出槽位,all表示从之前所有的节点平均移出槽位到目标节点
    Do you want to proceed with the proposed reshard plan (yes/no)? yes         ### 确认槽位移动
    • 添加从节点
    redis-trib.rb add-node --slave --master-id 67adb78e575232aebaf2c645d45a50e43d8a1df9 127.0.0.1:6398 127.0.0.1:6391
    • 验证集群状态
      按照前文描述的方法验证集群的节点状态。

    删除节点

    这里以删除上面添加的两个节点为例,删除节点也需要重新分配槽位,可以将目标节点的槽位分配给某一个节点,然后删除主从两个节点即可。

    重新分配目标节点的槽位:

    redis-trib.rb reshard 127.0.0.1:6391
    How many slots do you want to move (from 1 to 16384)? 4096
    What is the receiving node ID? 771488ef6f90180b7bcb1968329d6847055ad926
    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:67adb78e575232aebaf2c645d45a50e43d8a1df9
    Source node #2:done
    Do you want to proceed with the proposed reshard plan (yes/no)? yes

    删除主从节点

    redis-trib.rb del-node 127.0.0.1:6397 67adb78e575232aebaf2c645d45a50e43d8a1df9
    redis-trib.rb del-node 127.0.0.1:6398 dfe712916c932fe54b5ca1f3d223aedc98c8ad2e

    删除后按照前文的方法,验证集群状态

  • 相关阅读:
    Java 递归算法,遍历文件夹下的所有文件。
    基于appium的移动端自动化测试,密码键盘无法识别问题
    第一个脚印
    最简单ajax,$.post()用法
    关于图片title与alt
    iframe loading 效果
    iframe 跨域的高度自适应
    练习卷动式新闻广告牌
    JS学习笔记《数值与字符串相加篇》
    解决FLASH的层级问题
  • 原文地址:https://www.cnblogs.com/Go-Spurs-Go/p/10666810.html
Copyright © 2020-2023  润新知