• cluster模式04


    Redis Cluster 分布式集群

    参考网站

    agmc1e.md.jpg

    1.什么是Redis Cluster

    1.Redis集群是一个可以在'多个Redis节点'之间进行'网络互联,数据共享'
    2.Redis集群不支持那些需要'同时处理多个键'的Redis命令,因为执行这些命令需要在'多个Redis节点之间'移动数据,并且在高负载的情况下,这些命令将降低Redis集群的性能,并导致不可预测的行为。(#使用ack协议可以实现)
    3.Redis集群通过'分区'(partition)来提供一定程度的可用性(availability):即使集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求。(#sentinel)
    4.Redis集群有'将数据自动切分'(split)到多个节点的能力。(#存储)
    5.所有的节点都是一主一从(也可以是一主多从),其中'从不提供服务',仅作为备用
    
    
    sentinel模式基本可以满足一般生产的需求,具备高可用性。但是当数据量过大到一台服务器存放不下的情况时,主从模式或sentinel模式就不能满足需求了,这个时候需要对存储的数据进行分片,将数据存储到多个Redis实例中。'cluster模式的出现就是为了解决单机Redis容量有限的问题',将Redis的数据根据一定的规则分配到多台机器。
    
    'cluster可以说是sentinel和主从模式的结合体',通过cluster可以实现主从和master重选功能,所以如果配置两个副本三个分片的话,就需要六个Redis实例。因为Redis的数据是根据一定规则分配到cluster的不同机器的,当数据量过大时,'可以新增机器进行扩容。'
    
    使用集群,只需要将redis配置文件中的'cluster-enable配置打开'即可。每个集群中至少需要三个主数据库才能正常运行,新增节点非常方便(#支持在线增加、删除节点)
    
    集群中的每个节点都是'平等'的关系,都是对等的,每个节点都'保存'各自的数据和整个集群的状态。每个节点都和其他'所有节点连接',而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。
    
    Redis 集群没有并使用传统的'一致性哈希'来'分配数据',而是采用另外一种叫做'哈希槽 '(hash slot)的方式来分配的
    
    Redis 集群会把数据存在一个 master 节点,然后在这个 master 和其对应的salve 之间进行数据同步。当读取数据时,也根据一致性哈希算法到对应的 master 节点获取数据。只有当一个master 挂掉之后,才会'启动一个对应的 salve 节点,充当 master 。'
    
    必须要'3个或以上的主节点',否则在创建集群时会失败,并且当存活的主节点数小于总节点数的一半时,整个集群就无法提供服务了。
    

    2.Redis Cluster的特点

    #高性能:
    1.在多分片节点中,将'16384'个槽位,均匀分布到多个'分片节点'中
    2.存数据时,将key做crc16(key),然后和16384进行'取模',得出'槽位值'(0-16384之间)
    3.根据计算得出的槽位值,找到相对应的'分片节点的主节点','存储'到相应槽位上(ask协议)
    4.如果客户端当时连接的节点不是将来要存储的分片节点,分片集群会将客户端连接切换至真正存储节点进行数据存储
    5.客户端与redis节点'直连',不需要中间proxy层(不做读写分离的时候).'客户端'不需要连接集群所有节点,连接'集群中任何一个可用节点'即可进行读写
    6.Redis Cluster解决了redis'资源利用率'的问题
    
    #高可用
    7.在搭建集群时,会为每一个分片的'主节点',对应一个'从节点',实现slaveof功能,同时当主节点down,实现类似于sentinel的自动failover的功能。
    

    3.槽的概念

    1.在集群中,会把所有节点分为'16384'个槽位(#即空间)
    2.槽位的序号是 0 - 16383,序号不重要,'数量'才重要
    3.每一个槽位分配到数据的'概率'是一样
    

    4.redis故障转移

    1.在集群里面,'节点会对其他节点'进行下线检测。
    2.当一个主节点下线时,集群里面的'其他主节点负责对下线主节点'进行故障转移。
    3.换句话说,集群的'节点'集成了'下线检测和故障转移'等类似 Sentinel 的功能。
    

    redis集群搭建

    1.环境准备

    节点 IP 端口
    节点1 172.16.1.51 6379,6380
    节点2 172.16.1.52 6379,6380
    节点3 172.16.1.53 6379,6380

    2.搭建redis

    #删除以前的redis数据
    [root@db01 ~]# rm -rf /service/redis/*
    
    #创建多实例目录
    [root@db01 ~]# mkdir /service/redis/{6379,6380}
    [root@db02 ~]# mkdir /service/redis/{6379,6380}
    [root@db03 ~]# mkdir /service/redis/{6379,6380}
    
    #配置所有redis
    [root@db01 ~]# vim /service/redis/6379/redis.conf
    bind 172.16.1.51 127.0.0.1
    port 6379
    daemonize yes
    pidfile /service/redis/6379/redis.pid
    loglevel notice
    logfile /service/redis/6379/redis.log
    dbfilename dump.rdb
    dir /service/redis/6379
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    
    [root@db01 ~]# vim /service/redis/6380/redis.conf
    bind 172.16.1.51 127.0.0.1
    port 6380
    daemonize yes
    pidfile /service/redis/6380/redis.pid
    loglevel notice
    logfile /service/redis/6380/redis.log
    dbfilename dump.rdb
    dir /service/redis/6380
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    
    

    3.启动所有redis

    [root@db01 ~]# redis-server /service/redis/6379/redis.conf 
    [root@db01 ~]# redis-server /service/redis/6380/redis.conf
    
    [root@db02 ~]# redis-server /service/redis/6379/redis.conf 
    [root@db02 ~]# redis-server /service/redis/6380/redis.conf
    
    [root@db03 ~]# redis-server /service/redis/6379/redis.conf 
    [root@db03 ~]# redis-server /service/redis/6380/redis.conf
    

    4.关联所有redis节点(1.使用ruby 2.使用命令)

    1)登录所有节点

    [root@db01 ~]# redis-cli -h 172.16.1.51 -p 6379
    [root@db01 ~]# redis-cli -h 172.16.1.51 -p 6380
    [root@db02 ~]# redis-cli -h 172.16.1.52 -p 6379
    [root@db02 ~]# redis-cli -h 172.16.1.52 -p 6380
    [root@db03 ~]# redis-cli -h 172.16.1.53 -p 6379
    [root@db03 ~]# redis-cli -h 172.16.1.53 -p 6380
    

    2)查看集群节点

    #查看集群节点,每一各节点只能看到自己
    172.16.1.51:6379> CLUSTER NODES
    28faba09f4c0ec8cdb90d92e09636796427b7143 :6379 myself,master - 0 0 0 connected
    
    该节点id	端口	myself(关联源)	主库或者从库 槽位
    

    3)关联所有节点(使用ruby安装不需要使用该命令关联)

    172.16.1.51:6379> CLUSTER MEET 172.16.1.51 6380
    OK
    172.16.1.51:6379> CLUSTER MEET 172.16.1.52 6379
    OK
    172.16.1.51:6379> CLUSTER MEET 172.16.1.52 6380
    OK
    172.16.1.51:6379> CLUSTER MEET 172.16.1.53 6379
    OK
    172.16.1.51:6379> CLUSTER MEET 172.16.1.53 6380
    OK
    
    #查看集群状态,所有节点
    172.16.1.51:6379> CLUSTER NODES
    aee9f4e6e09a452fd44bca7639be442b5138f141 172.16.1.52:6380 master - 0 1596687131655 4 connected
    777412c8d6554e3390e1083bf1f55002be08cf62 172.16.1.51:6380 master - 0 1596687131352 2 connected
    ef18ab5bab6d8bc06917a0cf2dc9bffa8b431087 172.16.1.52:6379 master - 0 1596687132362 3 connected
    f2747c92813ea06b25c3e9c8d5232b46b3cf9d3d 172.16.1.53:6379 master - 0 1596687131856 0 connected
    25f735f08ac62b2f758c1e2c21e178cc46279087 172.16.1.53:6380 master - 0 1596687131251 5 connected
    28faba09f4c0ec8cdb90d92e09636796427b7143 172.16.1.51:6379 myself,master - 0 0 1 connected
    
    当前节点的id 	当前实例ip+端口	主从状态  [主库id]	0    时间戳   序号	连接状态
    #不能删除关联,只能取消节点
    

    5.分配槽位

    #查看集群状态
    172.16.1.51:6379> CLUSTER INFO
    cluster_state:fail				#失败
    cluster_slots_assigned:0		#集群槽位	
    cluster_slots_ok:0				#可用槽位
    cluster_slots_pfail:0
    cluster_slots_fail:0
    cluster_known_nodes:6			#节点数
    cluster_size:0					#集群数据大小
    cluster_current_epoch:5
    cluster_my_epoch:1
    cluster_stats_messages_sent:1168
    cluster_stats_messages_received:1168
    
    #槽位规划,一共16383个槽位
    db01:     5462 个槽位  (0-5461)
    db02:     5462 个槽位  (5462-10922)
    db03:	  5461 个槽位  (10923-16383)
    
    #分配槽位(命令行执行),不能多,不能少,一共16384个槽位
    [root@db01 ~]# redis-cli -p 6379 -h 172.16.1.51 CLUSTER ADDSLOTS {0..5461}
    OK
    [root@db02 ~]# redis-cli -p 6379 -h 172.16.1.52 CLUSTER ADDSLOTS {5462..10922}
    OK
    [root@db02 ~]# redis-cli -p 6379 -h 172.16.1.53 CLUSTER ADDSLOTS {10923..16383}
    
    删除槽位
    [root@db02 ~]# redis-cli -p 6379 cluster delslots {0..16383}
    
    #槽位分配错误,需要删除node.conf,后重启Redis,再重新使用CLUSTER MEET关联,再分配槽位(该节点记录当前集群的节点信息)
    [root@db04 ~]# vim /service/redis/6379/nodes.conf
    
    #没有槽位(数据)的实例不参与主从切换,要重新分配槽位才能以主库的身份加入集群,从而达到扩容的目的
    #删除槽位就会删除数据,可以直接使用命令redis-trib.rb分配槽位
    #槽位没有顺序,数据的存储只与槽位的数量有关
    #槽位分配之后,使用redis-cli -c -a 123 -p 6379连接Redis,插入数据
    #cluster模式下,主库的存在是为了扩容,从库(副本)的作用是只是为了成为主库
    #分布式配置Redis cluster模式交叉配置主从是为了增加主机的容错率
    

    6.查看槽位分配

    172.16.1.52:6380> CLUSTER NODES
    98426a9d82a79dd8ba036dab1463cb8b5523982f 172.16.1.54:6380 master - 0 1596713561103 3 connected
    a5cf44b0c71e627620b711432c1eae11055213f1 172.16.1.53:6379 master - 0 1596713562614 5 connected 5462-10922
    8be7332c63673348dddad9f74a7d8eb755bd80be 172.16.1.54:6379 master - 0 1596713562108 4 connected 10923-16383
    a61b28d8b590196cbef8fca3d7cfe69569983733 172.16.1.53:6380 master - 0 1596713563117 2 connected
    b5ac2f2b8bc626362abf83e745e5351f5f94984d 172.16.1.52:6379 master - 0 1596713561606 1 connected 0-5461
    f9f5d2d335ce56b6d787b99200049c7e04c8ec21 172.16.1.52:6380 myself,master - 0 0 0 connected
    
    #集群中主库从库应该有相同的配置
    #一个主库可以有多个从库,一个从库只能有一个主库(因为他有可能成为主库,槽位不能混乱)
    #合理的做了副本之后,一台实例down,不影响集群状态,down-->up ,该主机上的实例将自动以从库的身份加入集群
    #集群中增加节点,自动以主库身份加入,可以使用CLUSTER REPLICATE命令,把主库变为从库
    #不能取消关联,但是可以删除节点
    	无法删除登录节点
    	不能删除自己的master节点,可以删除其它的master节点,可以删除其它的slave节点
    #将节点配置信息保存到硬盘
    CLUSTER SAVECONFIG              
    
    

    批量插入数据

    [root@db02 ~]# vim kv.sh
    #!/bin/bash
    for i in {1..1000};do
            redis-cli -c -a 123 -p 6379 -h 172.16.1.52 set k${i} v${i}
    done
    
    执行
    [root@db02 ~]# sh kv.sh 
    
    查看每台Redis数据的数量
    127.0.0.1:6379> DBSIZE
    (integer) 342
    
    

    7.添加副本节点(配置主从)

    1)查看节点

    172.16.1.51:6379> CLUSTER NODES
    5a7f0cf95e1850b5b5ae81d873c4c76fd366d604 172.16.1.51:6380 master - 0 1596763193422 4 connected
    5eb9e5356534ff4acda736d13f0dc9fc3d40049b 172.16.1.52:6379 master - 0 1596763192412 5 connected 5462-10922
    50878ef6a4d8141c8dbca3e2bf7c84ed48a73ee2 172.16.1.53:6380 master - 0 1596763192512 3 connected
    acc3a4d0e6e43fc74630c1f0714865fdcbdaf677 172.16.1.53:6379 master - 0 1596763191908 0 connected 10923-16383
    2325be6f1f9c1c9f57d5a033fc05e0d798ea823a 172.16.1.51:6379 myself,master - 0 0 1 connected 0-5461
    381b54584572e8013becdae2eeaff48bf6eb5450 172.16.1.52:6380 master - 0 1596763193925 2 connected
    

    agmc1e.md.jpg

    2)配置主从

    #db01的6380做db02的6379的从库
    172.16.1.51:6380> CLUSTER REPLICATE 5eb9e5356534ff4acda736d13f0dc9fc3d40049b
    OK
    
    #db02的6380做db03的6379的从库
    172.16.1.52:6380> CLUSTER REPLICATE acc3a4d0e6e43fc74630c1f0714865fdcbdaf677
    OK
    
    #db03的6380做db01的6379的从库
    172.16.1.53:6380> CLUSTER REPLICATE 2325be6f1f9c1c9f57d5a033fc05e0d798ea823a
    OK
    

    3)再次查看节点信息

    172.16.1.51:6379> CLUSTER NODES
    5a7f0cf95e1850b5b5ae81d873c4c76fd366d604 172.16.1.51:6380 slave 5eb9e5356534ff4acda736d13f0dc9fc3d40049b 0 1596763362696 5 connected
    5eb9e5356534ff4acda736d13f0dc9fc3d40049b 172.16.1.52:6379 master - 0 1596763363202 5 connected 5462-10922
    50878ef6a4d8141c8dbca3e2bf7c84ed48a73ee2 172.16.1.53:6380 slave 2325be6f1f9c1c9f57d5a033fc05e0d798ea823a 0 1596763362192 3 connected
    acc3a4d0e6e43fc74630c1f0714865fdcbdaf677 172.16.1.53:6379 master - 0 1596763363203 0 connected 10923-16383
    2325be6f1f9c1c9f57d5a033fc05e0d798ea823a 172.16.1.51:6379 myself,master - 0 0 1 connected 0-5461
    381b54584572e8013becdae2eeaff48bf6eb5450 172.16.1.52:6380 slave acc3a4d0e6e43fc74630c1f0714865fdcbdaf677 0 1596763364211 2 connected
    
    master后面是 - 
    slave后面是主库的id
    #主库的作用是扩容,从库的作用是增加集群的容错率
    

    8.故障演示

    #停掉一台节点
    [root@db03 ~]# reboot
    
    #到另一台机器查看集群状态,发现集群是正常的
    172.16.1.51: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_sent:327031
    cluster_stats_messages_received:326973
    
    #查看节点信息,副本被提升为主库
    172.16.1.51:6379> CLUSTER NODES
    5a7f0cf95e1850b5b5ae81d873c4c76fd366d604 172.16.1.51:6380 slave 5eb9e5356534ff4acda736d13f0dc9fc3d40049b 0 1596763771309 5 connected
    5eb9e5356534ff4acda736d13f0dc9fc3d40049b 172.16.1.52:6379 master - 0 1596763771310 5 connected 5462-10922
    50878ef6a4d8141c8dbca3e2bf7c84ed48a73ee2 172.16.1.53:6380 slave,'fail' 2325be6f1f9c1c9f57d5a033fc05e0d798ea823a 1596763736458 1596763734245 3 disconnected
    acc3a4d0e6e43fc74630c1f0714865fdcbdaf677 172.16.1.53:6379 master,'fail' - 1596763736458 1596763735246 0 disconnected
    2325be6f1f9c1c9f57d5a033fc05e0d798ea823a 172.16.1.51:6379 myself,master - 0 0 1 connected 0-5461
    381b54584572e8013becdae2eeaff48bf6eb5450 172.16.1.52:6380 master - 0 1596763772319 6 connected 10923-16383
    

    9.节点恢复

    #修复机器
    [root@db03 ~]# redis-server /service/redis/6379/redis.conf 
    [root@db03 ~]# redis-server /service/redis/6380/redis.conf
    
    #再次查看节点信息
    172.16.1.51:6379> CLUSTER NODES
    5a7f0cf95e1850b5b5ae81d873c4c76fd366d604 172.16.1.51:6380 slave 5eb9e5356534ff4acda736d13f0dc9fc3d40049b 0 1596764061287 5 connected
    5eb9e5356534ff4acda736d13f0dc9fc3d40049b 172.16.1.52:6379 master - 0 1596764060781 5 connected 5462-10922
    50878ef6a4d8141c8dbca3e2bf7c84ed48a73ee2 172.16.1.53:6380 'slave '2325be6f1f9c1c9f57d5a033fc05e0d798ea823a 0 1596764059770 3 connected
    acc3a4d0e6e43fc74630c1f0714865fdcbdaf677 172.16.1.53:6379 'slave' 381b54584572e8013becdae2eeaff48bf6eb5450 0 1596764062094 6 connected
    2325be6f1f9c1c9f57d5a033fc05e0d798ea823a 172.16.1.51:6379 myself,master - 0 0 1 connected 0-5461
    381b54584572e8013becdae2eeaff48bf6eb5450 172.16.1.52:6380 master - 0 1596764061789 6 connected 10923-16383
    
    #原主节点修复后变为从节点
    
  • 相关阅读:
    jQuery wrap wrapAll wrapInner使用
    jQuery replaceWith replaceAll end的用法
    spring mvc在Controller中获取ApplicationContext
    jQuery的$(window).load与、(document).ready和window.onload的关系
    java上传图片剪切工具类
    二进制查找树转换为双向链表
    关于O(logN)的正确理解
    数据结构-概述(1)
    iOS_4_表情排列
    Unity 3D游戏开发引擎:最火的插件推荐
  • 原文地址:https://www.cnblogs.com/syy1757528181/p/13462227.html
Copyright © 2020-2023  润新知