Skip to content
SRE运维进阶之路SRE运维进阶之路
github icon

    redis5.0.4集群搭建

    author iconClaycalendar icon2021年5月11日category icon
    • Redis
    timer icon大约 5 分钟

    此页内容
    • redis5.0新特性
    • 集群安装
    • 相关操作

    # redis5.0.4集群搭建

    # redis5.0新特性

    Redis 5主要专注于几个重要功能。相比之下Redis 4非常非常专注于操作类型,Redis 5的变化大多是面向用户的。即在现有的基础上增加新的数据类型和操作类型。以下是此版本的主要功能:

    1. 新的Stream数据类型。[1]
    2. 新的Redis模块API:Timers and Cluster API。
    3. RDB现在存储LFU和LRU信息。
    4. 集群管理器从Ruby(redis-trib.rb)移植到C代码。可以在redis-cli中。查看redis-cli —cluster help了解更多信息。
    5. 新sorted set命令:ZPOPMIN / MAX和阻塞变量。
    6. 主动碎片整理V2。
    7. 增强HyperLogLog实现。
    8. 更好的内存统计报告。
    9. 许多带有子命令的命令现在都有一个HELP子命令。
    10. 客户经常连接和断开连接时性能更好。
    11. 错误修复和改进。
    12. Jemalloc升级到5.1版

    Redis 4.0大多是5.0的严格子集,应用程序从4.0升级到5.0通常不会碰见问题

    # 集群安装

    # 下载

    mkdir -pv /usr/local/software
    cd /usr/local/software
    wget http://download.redis.io/releases/redis-5.0.4.tar.gz
    
    1
    2
    3

    # 解压编译

    tar -xvf redis-5.0.4.tar.gz -C /usr/local/
    cd /usr/local/redis-5.0.4/
    make -j 4 && make install
    
    1
    2
    3

    # 修改相关内核参数

    提前做好下面的准备操作,否则redis日志里会有相应报错

    打开/etc/sysctl.conf配置文件,追加一下参数

    net.core.somaxconn = 10240
    vm.overcommit_memory = 1
    
    1
    2

    刷新内参参数,使其生效

    sysctl -p
    
    1
    # echo never > /sys/kernel/mm/transparent_hugepage/enabled
    # vim /etc/rc.local
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
    
    1
    2
    3
    # tail -10 /etc/security/limits.conf 
    #@faculty        soft    nproc           20
    #@faculty        hard    nproc           50
    #ftp             hard    nproc           0
    #@student        -       maxlogins       4
    
    # End of file
    * hard nofile 65535
    * soft nofile 65535
    * soft nproc 65535
    * hard nproc 65535
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    # 修改配置文件

    将配置文件修改为

    # egrep -v "^#|^$" /usr/local/redis-5.0.4/redis.conf 
    bind 0.0.0.0  #安全起见,尽量用本机ip地址
    protected-mode yes
    port 6379
    tcp-backlog 511
    timeout 0
    tcp-keepalive 0
    daemonize yes
    supervised no
    pidfile /var/run/redis_6379.pid
    loglevel notice
    logfile "/usr/local/redis-5.0.4/log/redis.log"
    databases 16 
    always-show-logo yes
    save 900 1
    save 300 10
    save 60 10000
    stop-writes-on-bgsave-error yes
    rdbcompression yes
    rdbchecksum yes
    dbfilename dump.rdb
    dir /usr/local/redis-5.0.4/data
    replica-serve-stale-data yes
    replica-read-only yes
    repl-diskless-sync no
    repl-diskless-sync-delay 5
    repl-disable-tcp-nodelay no
    replica-priority 100
    lazyfree-lazy-eviction no
    lazyfree-lazy-expire no
    lazyfree-lazy-server-del no
    replica-lazy-flush no
    appendonly no
    appendfilename "appendonly.aof"
    appendfsync everysec
    no-appendfsync-on-rewrite no
    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb
    aof-load-truncated yes
    aof-use-rdb-preamble yes
    lua-time-limit 5000
    cluster-enabled yes
    cluster-config-file nodes-6379.conf
    slowlog-log-slower-than 10000
    slowlog-max-len 128
    latency-monitor-threshold 0
    notify-keyspace-events Ex
    hash-max-ziplist-entries 512
    hash-max-ziplist-value 64
    list-max-ziplist-size -2
    list-compress-depth 0
    set-max-intset-entries 512
    zset-max-ziplist-entries 128
    zset-max-ziplist-value 64
    hll-sparse-max-bytes 3000
    stream-node-max-bytes 4096
    stream-node-max-entries 100
    activerehashing yes
    client-output-buffer-limit normal 0 0 0
    client-output-buffer-limit replica 256mb 64mb 60
    client-output-buffer-limit pubsub 32mb 8mb 60
    hz 10
    dynamic-hz yes
    aof-rewrite-incremental-fsync yes
    rdb-save-incremental-fsync yes
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65

    线上最好开启密码认证

    databases 最好改一下

    # 开启防火墙

    # cat /etc/sysconfig/iptables
    *filter
    :INPUT ACCEPT [0:0]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    -A INPUT -p icmp -j ACCEPT
    -A INPUT -i lo -j ACCEPT
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 16379 -j ACCEPT
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 10050 -j ACCEPT
    -A INPUT -j REJECT --reject-with icmp-host-prohibited
    -A FORWARD -j REJECT --reject-with icmp-host-prohibited
    COMMIT
    
    # systemctl restart iptables
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17

    以上步骤均在6台主机上执行

    # 初始化redis集群

    redis-cli --cluster create 192.168.165.23:6379 192.168.165.24:6379 192.168.165.25:6379 192.168.165.26:6379 192.168.165.27:6379 192.168.165.28:6379 --cluster-replicas 1
    
    1

    查看redis集群状态

    # redis-cli 
    127.0.0.1:6379> 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:1263
    cluster_stats_messages_pong_sent:1190
    cluster_stats_messages_sent:2453
    cluster_stats_messages_ping_received:1185
    cluster_stats_messages_pong_received:1263
    cluster_stats_messages_meet_received:5
    cluster_stats_messages_received:2453
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19

    # 相关操作

    # 检查集群

    redis-cli --cluster check 192.168.165.23:6379
    
    1

    查看集群key、slot、slave分布信息

    redis-cli --cluster info 192.168.165.23:6379
    
    1

    # 在线迁移槽

    • 方式1
    redis-cli --cluster reshard 192.168.165.23:6379
    
    1

    选择一个目标节点的id

    源选择all

    • 方式2

    将所有master上的slot重新分配到一个master上

    redis-cli --cluster reshard --cluster-from 3a32aec6092e6a22a45c64fa8281e3893e1175a2 --cluster-to f760e5d366738b28df034512faf1f5ac4466b09e --cluster-slots 5461 --cluster-yes 192.168.165.24:6379
    redis-cli --cluster reshard --cluster-from 9fa3ee8869d2d21258e0f2d2b705b787d0342d74 --cluster-to f760e5d366738b28df034512faf1f5ac4466b09e --cluster-slots 5462 --cluster-yes 192.168.165.24:6379
    
    1
    2

    # 平衡各节点槽数量

    redis-cli --cluster rebalance --cluster-threshold 192.168.165.24:6379
    
    1

    # 删除集群节点

    redis-cli --cluster del-node 192.168.165.24:6379 f760e5d366738b28df034512faf1f5ac4466b09e
    
    1

    这里必须是没有槽的节点,所以必须先移除槽,否则报错 被删除的node重启后,依然记得集群中的其它节点,这是需要执行cluster forget nodeid来忘记其它节点

    # 添加集群节点

    redis-cli --cluster add-node 192.168.165.30:6379 192.168.165.31:6379
    
    1

    # 将集群外部redis实例中的数据导入到集群中去

    在redis5中 redis-cli已经集成集群操作的命令, 根本不用把分片迁移到一个节点再操作

    1. 把单实例的密码清除

    把Redis单实例及集群所有节点的密码清理掉,通过如下方式:

    redis-cli -h [ip] -p [port] -a [pwd]
    config set requirepass ""
    
    1
    2
    1. 执行集群导入命令【redis-cli -- cluster import】
    redis-cli -h 192.168.165.23 -p 6379 --cluster import 192.168.165.23:6379 --cluster-from 192.168.1.46:6379 --cluster-copy --cluster-replace
    
    1

    Cluster-from后面跟外部redis的ip和port 如果只使用cluster-copy,则要导入集群中的key不能在,否则如下: 如果集群中已有同样的key,如果需要替换,可以cluster-copy和cluster-replace联用,这样集群中的key就会被替换为外部的

    1. 设置回原来的密码
    config set requirepass 原密码
    
    1
    • 注意,如果不清楚密码会报如下错误: ERR Target instance replied with error: NOAUTH Authentication required.

    # 清空集群数据

    redis中数据存储比较多,需要进行清理。我们首先用命令查看集群的主从情况。

    redis-cli --cluster check 192.168.165.23:6379
    
    1

    连接到每个master 节点上进行数据删除

    连接到数据库中,执行如下命令

    flushall
    
    1

    参考链接:

    https://yangxx.net/?p=3453open in new window

    https://www.jianshu.com/p/7a28d3c92dceopen in new window

    https://blog.csdn.net/luoww1/article/details/88425263open in new window

    https://www.cnblogs.com/kevingrace/p/9844310.htmlopen in new window

    edit icon编辑此页open in new window
    上次编辑于: 2021/5/11 03:54:51
    贡献者: clay-wangzhi
    备案号:冀ICP备2021007336号
    Copyright © 2023 Clay