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

    当并发量大于单机 Redis 的并发量时,或者数据量大于单机内存的容量,就可以采用加机器分布式集群的方式来解决。

    在 Redis 中,集群是 3.0 以后加入的,3.0——5.0 之间需要采用了 ruby 脚本实现集群,而 5.0 之后就内置了。

    一、数据分布

    假设全量的数据非常大,500G,单机已经无法满足,我们就需要进行分区,分到若干个子集中去

    分区方式有主要有两种:顺序分区和哈希分区

    顺序分区

    原理:例如,100个数据分到3个节点上
    	1--33第一个节点
        34--66第二个节点
        67--100第三个节点
        
    特点:
    	数据分散度易倾斜,键值义务相关,可以按顺序访问,支持批量操作
    	数据分散度易倾斜,就是说,例如:当注册的1--100个用户在这个库访问比较高,而注册101--200之间的用户访问另一个比较低
    

    哈希分区

    原理:hash分区,节点取余,假设3台机器,hash(key)%3,给到不同的节点上
    	通过 hash 算法算一下 key 并取余,等于几就给到那个节点上。
    
    特点:
    	数据分散度高,键值分布于业务无关,无法按照顺序访问,支持批量操作
    

    哈希分区又分为节点取余分区

    一致性哈希分区:每个节点负责一部分数据,对 key 进行 hash,得到的结果在节点1和节点2之间,那么就给节点2

    虚拟槽分区:因为 Redis 使用的是虚拟槽分区,所以就具体看看虚拟槽分区

    三、虚拟槽分区

    虚拟槽分区是属于哈希分区中的一种

    在 Redis 中一共有 16384 (0--16383) 个虚拟槽。

    原理:

    • 假设我们有三个 Redis 主机做了集群,就会把这 16384 个槽平均分配到每个节点(主机节点)上。
    • 当客户端创建一个( set name xiaoyang )数据发送给任意节点,那么 key (也就是name)会根据哈希算法 CRC16(key)%16383 就会得到一个值,这个值就会在 0--16383这个范围,这个值在那个节点的范围内,那么这个数据就会保存在那个节点上。
    • 因为节点之间是共享的,所以该节点知道那个节点负责那些槽。
    • 取值的时候也是,当( get name )获取数据的时候,会先对 key 进行 CRC16 计算并取余,通过计算后的值去对应的节点获取数据

    四、Redis Cluster架构搭建

    首先,Redis Cluster 有这样几个名词:

    节点:

    就是指集群中的Redis主机
    

    meet:

    例如有这样三个节点,节点A、节点B、节点C:
    A meet 一下 C,C 回复一下 A
    A meet 一下 B,B 回复一下 A
    这样 B 和 C 就也能互相感知
    那么 A B C 之间就能互相交互数据,所有节点共享消息。
    

    指派槽:

    在Redis中总共有16384个指派槽,它会被平均分配到每个节点上
    

    5.0以后集群搭建

    Redis Cluster 在5.0之后取消了 ruby 脚本的支持,但是还要手动命令行添加集群,集群合到了 redis-cli 里面,可以直接使用 redis-cli 的参数 --cluster 来代替。

    1、写入配置 7000--70005 六个文件

    # redis-7000.conf
    port 7000
    daemonize yes
    dir "/root/redis/data/"
    logfile "7000.log"
    dbfilename "dump-7000.rdb"
    
    # masterauth  123456					# 集群搭建时,主的密码
    cluster-enabled yes						# 开启 cluster
    cluster-node-timeout 15000 				# 故障转移,超时时间 15s
    cluster-config-file nodes-7000.conf		# 给 cluster 节点增加一个配置文件
    cluster-require-full-coverage yes 		# yes 只要有一个节点故障,整个集群就不对外提供服务了
    
    # 快速生成其他配置
    sed 's/7000/7001/g' redis-7000.conf > redis-7001.conf
    sed 's/7000/7002/g' redis-7000.conf > redis-7002.conf
    sed 's/7000/7003/g' redis-7000.conf > redis-7003.conf
    sed 's/7000/7004/g' redis-7000.conf > redis-7004.conf
    sed 's/7000/7005/g' redis-7000.conf > redis-7005.conf
    

    2、启动

    redis-server redis-7000.conf
    redis-server redis-7001.conf
    redis-server redis-7002.conf
    redis-server redis-7003.conf
    redis-server redis-7004.conf
    redis-server redis-7005.conf
    

    3、创建集群主从节点

    格式:
    redis-cli --cluster create --cluster-replicas 1 节点1ip:端口 节点2ip:端口 节点3ip:端口 节点4ip:端口 节点5ip:端口 节点6ip:端口
               
    redis-cli --cluster create --cluster-replicas 1 127.0.0.1:7000 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
            
    # 参数 --cluster-replicas
    如果是1 ,那就是需要给每个主节点配置一个从节点,由于 Redis 集群最少需要三个主节点,所以配置 replicas 就需要6个节点,如果是2,那么就还需要多加3个节点
    

    4、操作

    存放数据需要连接如下:-c 表示集群模式
    redis-cli -c -p 7000	# 不这样连接,存放数据的时候,key算的值不在该节点中不可以存放
    127.0.0.1:7000> set name xiaoyang	# 可以成功,
    
    
    127.0.0.1:7000> CLUSTER NODES  	# 集群节点信息
    127.0.0.1:7000> CLUSTER SLOTS	# 查看槽的信息
    

    创建集群主节点:所有节点都是主节点

    格式:
    redis-cli --cluster create 节点1ip:端口 节点2ip:端口 节点3ip:端口
    

    五、集群扩容

    集群扩容需要迁移槽和数据来实现扩容

    启动两个节点:

    redis-server redis-7006.conf 
    redis-server redis-7007.conf 
    

    状态:

    redis-cli -p 7006 cluster nodes	# 现在他们的状态都是他们自己,没有加入集群
    

    加入集群

    #1.直接meet一下
    redis-cli -p 7000 cluster meet 127.0.0.1 7006
    redis-cli -p 7000 cluster meet 127.0.0.1 7007
    # 或者连接到 7000 上去 meet 一下 7006 和 7007
    127.0.0.1:7000> cluster meet 127.0.0.1 7006
    
        
        
    #2.还需要把 7007 做为 7006 的从
    # 进入7007节点配置
    127.0.0.1:7007> cluster replicate 7006的id
    # 或者
    redis-cli -p 7007 cluster replicate 7006的id
    
    
    
    #3.迁移槽和数据
    执行——>: redis-cli --cluster reshard 127.0.0.1:7000 
    希望迁移多少个槽:4096
    希望那个id是接收的:7006的id
    传入source id(意思就是你希望从节点1上迁移多少个,节点2迁移多少个...) :all (all代表平均迁移)
    

    六、集群缩容

    集群缩容,先把需要缩容节点上的槽和数据迁移到其他的节点上

    redis-cli --cluster reshard --cluster-from 7006的id --cluster-to 7000的id --cluster-slots 1366 127.0.0.1:7000
    yes
    
    redis-cli --cluster reshard --cluster-from 7006的id --cluster-to 7001的id --cluster-slots 1366 127.0.0.1:7001
    yes
    
    redis-cli --cluster reshard --cluster-from 7006的id --cluster-to 7002的id --cluster-slots 1365 127.0.0.1:7002
    yes
    
    # 删除集群节点,关闭节点,注意:先下从,再下主,因为先下主会触发故障转移
    redis-cli --cluster del-node 127.0.0.1:7000 要下线的7007id  
    redis-cli --cluster del-node 127.0.0.1:7000 要下线的7006id 
    

    七、python连接

    # pip install redis-py-cluster
    
    from rediscluster import RedisCluster
    startup_nodes = [{"host":"192.168.88.131", "port": "7000"},{"host":"192.168.88.131", "port": "7001"},{"host":"192.168.88.131", "port": "7002"}]
    
    rc = RedisCluster(startup_nodes=startup_nodes)
    
    rc.set("name", "xiaoyang")
    print(rc.get("name"))
    
    学习之旅
  • 相关阅读:
    基础设计模式-04 复杂对象创建的建造器模式
    String,StringBuffer和StringBuilder
    js常用删除
    基础设计模式-03 从过滤器(Filter)校验链学习职责链模式
    基础设计模式-02 UML图
    注册全局方法,全局过滤器和全局组件
    py-faster-rcnn
    mac下编译cpu only caffe并用xCode建caffe工程
    OpenCV学习笔记(一)
    caffe生成voc格式lmdb
  • 原文地址:https://www.cnblogs.com/XiaoYang-sir/p/15069694.html
Copyright © 2011-2022 走看看