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

    redis集群是由多个主从节点群组成的分布式集群。这种集群没有中心节点,可水平扩展,官方文档描述可以扩展到上万个节点。对比哨兵模式,redis集群性能和高可用性更优。

    集群搭建:redis集群需要至少三个master节点,这和redis集群选举机制有关,至少三个主节点才能保证有主节点挂掉的情况下选举成功。

    使用一台机器,搭建六个redis节点,分别为三主三从。redis安装目录为:/usr/local/redis,版本:5.0.10。

    暂时关闭防火墙,如果是云服务器,将安全组规则配置好,避免之后通过java代码访问出现网络端口访问不通的情况。

    # 关闭防火墙
    systemctl stop firewalld
    # 禁止开机自启
    systemctl disable firewalld

    创建对应的目录,/usr/local/redis/cluster,在cluster下创建六个文件夹

    mkdir 6001 6002 6003 6004 6005 6006

    将redis-conf复制到6001目录中,修改配置文件

    # 后台启动
    daemonize yes port
    6001 # 进程号写入文件 pidfile /var/run/redis_6001.pid # 数据目录放在此处 dir /usr/local/redis/cluster/6001/ # 启动集群模式 cluster-enabled yes # 集群节点信息文件,和端口号对应 cluster-config-file nodes-6001.conf # 判定主节点故障的延迟时间 cluster-node-timeout 10000 # 注释此处配置,绑定的是机器的网卡ip,这个配置一般不需要 # bind 127.0.0.1 # 关闭保护模式 protected-mode no # 开启aof持久化 appendonly yes # 设置redis访问密码 requirepass redis # 设置集群节点间访问密码 masterauth redis

    将配置文件copy到其他目录中,且将端口号修改。

    分别启动六个redis实例:

    /usr/local/redis/src/redis-server /usr/local/redis/cluster/6001/redis.conf

    检查实例是否全部启动成功:

    ps -ef | grep redis

    创建集群:

    # 参数1表示为每一个主节点创建一个从节点
    # 本次使用的是一台机器,如果使用多台机器,需要打开redis端口和集群通信端口:16379。此处为了演示,已经将防火墙关闭,而且云服务器开放了10000以上的端口。此处创建集群使用的是127.0.0.1,因为只在本机测试,实际场景需要使用内网地址
    /usr/local/redis/src/redis-cli -a redis --cluster create --cluster-replicas 1 127.0.0.1:6001 127.0.0.1:6002 127.0.0.1:6003 127.0.0.1:6004 127.0.0.1:6005 127.0.0.1:6006

    进入客户端:-a:输入密码,-c:表示集群,-h:ip地址,-p:端口号

    src/redis-cli -a redis -c -h 127.0.0.1 -p 6001

    查看集群信息: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:24016
    cluster_stats_messages_pong_sent:26634
    cluster_stats_messages_sent:50650
    cluster_stats_messages_ping_received:26629
    cluster_stats_messages_pong_received:24016
    cluster_stats_messages_meet_received:5
    cluster_stats_messages_received:50650

     查看集群节点信息:cluster nodes

    f79ab7d60c639c2d42c28bef3e819f87a7c8ddf9 127.0.0.1:6005@16005 slave d30c8c643ea1c2c83394fc951de9e42552cf6851 0 1605615078130 5 connected
    d34eab948960606fe90f523b4c24ba21b27056d0 127.0.0.1:6004@16004 slave 5511c0a55a8a89a9d1647c8b814d5a7745cada4f 0 1605615079131 4 connected
    6e5def114ff132e266dceaf954c688a476d2b4e9 127.0.0.1:6001@16001 myself,master - 0 1605615078000 1 connected 0-5460
    c4eaf6f932db6e62ace8dbe1693b988cc18ee74c 127.0.0.1:6006@16006 slave 6e5def114ff132e266dceaf954c688a476d2b4e9 0 1605615079000 6 connected
    d30c8c643ea1c2c83394fc951de9e42552cf6851 127.0.0.1:6003@16003 master - 0 1605615077128 3 connected 10923-16383
    5511c0a55a8a89a9d1647c8b814d5a7745cada4f 127.0.0.1:6002@16002 master - 0 1605615080133 2 connected 5461-10922

    可以看到集群搭建成功,三主三从6001-6004,6002-6005,6003-6006

    节点信息说明:6e5def114ff132e266dceaf954c688a476d2b4e9(节点id) 127.0.0.1:6001@16001 myself,master(表示主/从节点) - 0 1605615078000 1 connected 0-5460(主节点的槽位数)

    槽位数说明:redis集群将所有数据划分为16384个槽位,每个节点负责一部分槽位。槽位计算是根据key进行hash,然后对16384取模得到。

    设置一个key-value:

    127.0.0.1:6001> set name1 redis
    -> Redirected to slot [12933] located at 127.0.0.1:6003
    OK
    127.0.0.1:6003>

    重定向:从上面看到,当前客户端是6001,name1应该分配到6003,所以客户端携带指令进行了一次跳转。同时会更新本地的槽位映射表缓存。

    关闭集群,每次关闭一个实例:

    /usr/local/redis/src/redis-cli -a redis -c -h 127.0.0.1 -p 600* shutdown

    如果现在关闭了6002,集群会自动将6005设置为master节点,6002再次启动,会作为6005的从节点注册到集群中。

    集群选举:slave发现master失效了,就会竞争成为新的master。会广播一个信息,其他的节点收到信息之后会由master做出响应,slave收到超过半数的节点响应之后就会变成新的master。这个选举机制也解释了为什么集群至少需要三个节点。

    如果集群没有选举过半机智会有集群脑裂问题,就是产生了多个主节点,集群恢复了之后,会将一个主节点变为从节点,因为主从同步的机制,此时会产生数据丢失,使用下面配置可以规避

    min-slaves-to-write 1

    上面配置表示的是,主节点必须有一个从节点写入成功。这个配置会影响一定的可用性,如果从节点少于一个,主节点也就不能正常提供服务了,所以要考虑具体场景。

    配置集群不完整仍能提供服务,比如一个主节点及从节点全部宕机,其他的节点负责的槽位依然可用

    cluster-require-full-coverage

    集群支持批量命令:只会根据大括号内的值进行hash和槽位计算

    mset {user:1}:name redis {user:1}:password redis

    集群扩容:再增加主从:6007-6008,先按照上面的方式配置和启动实例

    /usr/local/redis/src/redis-cli -a redis --cluster add-node 127.0.0.1:6007 127.0.0.1:6008

    查看集群节点信息,新增加的都是主节点,没有任何数据,且没有任何的槽位分配。

    进行槽位划分:

    /usr/local/redis/src/redis-cli -a redis --cluster reshard 127.0.0.1:6001

    会输出一些信息,让我们填入如何进行划分

    # 要划分多少
    How many slots do you want to move (from 1 to 16384)?
    # 输入6007的节点id,表示要分到6007
    What is the receiving node ID?
    # 从哪些节点进行抽取,可以指定单个、多个或者所有(all)
    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
    # 输入yes,开始划分
    Do you want to proceed with the proposed reshard plan (yes/no)?

    再次查看集群节点信息,可以看到6007已经有分配的槽位了,6008是主节点且没有槽位分配,集群刚加入都是主节点,我们将6008指定为6007的从节点:

    /usr/local/redis/src/redis-cli -a redis -c -h 127.0.0.1 -p 6008
    127.0.0.1:8008> cluster replicate 1c5dd4318312a6f6e113dd21b9e54854f1bafc52

    cluster replicate 后面跟着是6007的节点id,这样就将6008指定为6007的从节点了,查看集群信息可以得到验证。

    删除从节点:

    /usr/local/redis/src/redis-cli -a redis --cluster del-node 127.0.0.1:6008 e66c270a0e35c8b7912dad2290ef00020232cb04

    删除主节点要将槽位和数据迁移,使用的还是cluster reshard命令,和之前分配槽位是一样的操作,迁移完成后使用cluster del-node进行删除。

    以上是redis集群的一些基础操作。

  • 相关阅读:
    Android:UI界面设计基础知识总结(一)
    Test:河北金力集团企业网集成
    Java中的异常处理try catch(第八周课堂示例总结)
    Java第七周课堂示例总结
    初入JavaWeb(半成品)
    Redis详解(4)--redis底层数据结构
    Go语言流程控制05--defer延时执行
    java==IO练习,文件切割合拼工具开发代码
    【洛谷 P3772】[CTSC2017]游戏(矩阵乘法+线段树)
    【LOJ #2865】「IOI2018」狼人(Kruscal重构树+扫描线)
  • 原文地址:https://www.cnblogs.com/dlcode/p/13952445.html
Copyright © 2011-2022 走看看