zoukankan      html  css  js  c++  java
  • 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
    
    #原主节点修复后变为从节点
    
  • 相关阅读:
    当Django模型迁移时,报No migrations to apply 问题时
    django--各个文件的含义
    django--创建项目
    1013. Battle Over Cities (25)
    1011. World Cup Betting (20)
    1009. Product of Polynomials (25)
    1007. Maximum Subsequence Sum (25)
    1006. Sign In and Sign Out (25)
    1008. Elevator (20)
    1004. Counting Leaves (30)
  • 原文地址:https://www.cnblogs.com/syy1757528181/p/13462227.html
Copyright © 2011-2022 走看看