redis 高可用方案总结(下)

sanlanlan 2020-12-31 标签: redis 浏览:1879 评论:0

上一篇介绍了集群的相关知识,这篇主要是实践搭建集群


三.搭建cluster 集群的2种方式

集群:
集群的作用,可以归纳为两点:

1、数据分区:数据分区(或称数据分片)是集群最核心的功能。
    集群将数据分散到多个节点,一方面突破了Redis单机内存大小的限制,存储容量大大增加;另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力。

    Redis单机内存大小受限问题,在介绍持久化和主从复制时都有提及;例如,如果单机内存太大,bgsave和bgrewriteaof的fork操作可能导致主进程阻塞,主从环境下主机切换时可能导致从节点长时间无法提供服务,全量复制阶段主节点的复制缓冲区可能溢出……。

2、高可用:集群支持主从复制和主节点的自动故障转移(与哨兵类似);当任一节点发生故障时,集群仍然可以对外提供服务。


cluster 搭建集群的2中方式:
1. 执行Redis命令搭建集群

集群的搭建可以分为四步:
(1)启动节点:将节点以集群模式启动,此时节点是独立的,并没有建立联系;
(2)节点握手:让独立的节点连成一个网络;
(3)分配槽:将16384个槽分配给主节点;
(4)指定主从关系:为从节点指定主节点。

    实际上,前三步完成后集群便可以对外提供服务;但指定从节点后,集群才能够提供真正高可用的服务。


(1)启动节点
    使用redis-server命令, 配置conf 配置文件,如:redis-6390.conf

        port 6390
        cluster-enabled yes
        cluster-config-file "nodes-6390.conf"
        daemonize yes
        logfile "log-6390.log"
        dbfilename "dump-6390.rdb"
        cluster-require-full-coverage no


    监听端口:port 6390
    开启Cluster:cluster-enabled yes
    集群配置文件:cluster-config-file nodes-6390.conf。
    后台运行:daemonize yes
    输出日志:logfile "log-6390.log"
    DB日志:dbfilename "dump-6390.rdb"
    槽是否全覆盖:cluster-require-full-coverage no。默认是yes,只要有结点宕机导致16384个槽没全被覆盖,整个集群就全部停止服务,所以一定要改为no

(2)节点握手

    127.0.0.1:6390> CLUSTER MEET 127.0.0.1 6391

    127.0.0.1:6390> CLUSTER nodes
    40d15fb0dbad2cdb4e5464395389d6404eada89e 127.0.0.1:6391@16391 master - 0 1567850742221 1 connected
    a3772b8d85b25fc9e35c92b511c0baa2756cb233 127.0.0.1:6390@16390 myself,master - 0 1567850739000 2 connected

(3)分配slots

    slots 属性是一个二进制数组,这个数组长度是16384/8=2048字节,共包含16384个二进制位。


    ➜  clusrer ./redis-cli -p 6390 cluster addslots {0..5461}
    OK
    ➜  clusrer ./redis-cli -p 6391 cluster addslots {5462..10000}
    OK
    ➜  clusrer ./redis-cli -p 6392 cluster addslots {10001..13000}
    OK
    ➜  clusrer ./redis-cli -p 6393 cluster addslots {13001..16383}
    OK    

(4)指定主从关系
    //后面是主节点 id
    ➜  clusrer ./redis-cli -p 6395 cluster replicate a3772b8d85b25fc9e35c92b511c0baa2756cb233
    OK
    ➜  clusrer ./redis-cli -p 6395 cluster replicate a3772b8d85b25fc9e35c92b511c0baa2756cb233
    ➜  clusrer ./redis-cli -p 6396 cluster replicate 40d15fb0dbad2cdb4e5464395389d6404eada89e
    OK
    ➜  clusrer ./redis-cli -p 6397 cluster replicate c6e7a2718ea438c0d82bbf49e9f815673c76fefa
    OK
    ➜  clusrer ./redis-cli -p 6398 cluster replicate 0bb36cba5bc565af51e6932d373285ef6e453fa4
    OK    

    查看结果:127.0.0.1:6391> CLUSTER nodes

2.redis-trib管理器
Redis作者是个Ruby爱好者,他写了个redis-trib管理器,可以使用Ruby脚本搭建集群。
集群中应该至少有三个节点,每个节点有一备份节点。需要6台服务器。
创建单独目录redis-cluster,来搭建。把 在redis源码文件夹下的src目录下,redis-trib.rb 文件copy 过来    

(1)执行ruby脚本需要安装ruby环境
    yum install ruby
    yum install rubygems

(2)安装redis需要依赖的gem包
    下载 redis-3.2.4.gem    
    在 /usr/local/redis-cluster/下,执行
    gem install redis-3.2.4.gem

(3)配置各自的config 文件
        使用redis-server命令, 配置conf 配置文件,如:redis-6390.conf
    #redis-6390.conf
        port 6390
        cluster-enabled yes
        cluster-config-file "nodes-6390.conf"
        daemonize yes
        logfile "log-6390.log"
        dbfilename "dump-6390.rdb"
        cluster-require-full-coverage no


    监听端口:port 6390
    开启Cluster:cluster-enabled yes
    集群配置文件:cluster-config-file nodes-6390.conf。
    后台运行:daemonize yes
    输出日志:logfile "log-6390.log"
    DB日志:dbfilename "dump-6390.rdb"
    槽是否全覆盖:cluster-require-full-coverage no。默认是yes,只要有结点宕机导致16384个槽没全被覆盖,整个集群就全部停止服务,所以一定要改为no

(4)使用redis-trib.rb创建集群
    ./redis-trib.rb create --replicas 1 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  127.0.0.1:7006
    其中:--replicas=1表示每个主节点有1个从节点;后面的多个{ip:port}表示节点地址,前面的做主节点,后面的做从节点。使用redis-trib.rb搭建集群时,要求节点不能包含任何槽和数据。
 (5)redis-cli -c -p 7001 查看集群情况
 (6)集群重启
    ps -ef | grep redis | awk '{print $2}' | xargs kill //关闭集群全部进程,然后执行重启

(7)redis-trib.rb  提供很多命令:
add-node:添加集群节点    
del-node:删除集群节点    
./redis-trib.rb check 127.0.0.1:7001 查看所有的主从节点信息



参考资料:
《Redis 设计与实现》
https://redis.io/topics/cluster-spec
https://redis.io/topics/cluster-tutorial

本文相关标签: redis

发表评论: