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

    一、redis-cluster

    1.介绍

    高性能
    1)在多分片节点中,将16384个槽位,均匀分布到多个分片节点中
    2)存数据时,将key做crc16(key),然后和16384进行取模,得出槽位值(0-16383之间)
    3)根据计算得出的槽位值,找到相对应的分片节点的主节点,存储到相应槽位上
    4)如果客户端当时连接的节点不是将来要存储的分片节点,分片集群会将客户端连接切换至真正存储节点进行数据存储
    高可用
    在搭建集群时,会为每一个分片的主节点,对应一个从节点,实现slaveof的功能,同时当主节点down,实现类似于sentinel的自动failover的功能。

    1)redis会有多组分片构成(3组)
    2)redis cluster 使用固定个数的slot存储数据(一共16384slot)
    3)每组分片分得1/3 slot个数(0-5500 5501-11000 11001-16383)
    4)基于CRC16(key) % 16384 ====》值 (槽位号)。

    2.规划搭建过程

    准备
    6个redis实例,一般会放到3台硬件服务器
    注:在企业规划中,一个分片的两个分到不同的物理机,防止硬件主机宕机造成的整个分片数据丢失。
    端口号:7000-7005

    集群节点准备
    mkdir -p /data/700{0,3}
    mkdir -p /data/700{1,4}
    mkdir -p /data/700{2,5}
    cat > /data/7000/redis.conf <<EOF
    port 7000
    daemonize yes
    bind 0.0.0.0
    requirepass 123456
    pidfile /data/7000/redis.pid
    loglevel notice
    logfile "/data/7000/redis.log"
    dbfilename dump.rdb
    dir /data/7000
    protected-mode yes
    #配置yes开启redis-cluster
    cluster-enabled yes
    #这个配置很重要,cluster开启必须重命名指定cluster-config-file,不能与别的节点相同,否则会启动失败,最好按主机+端口命名
    cluster-config-file nodes-7000.conf
    #配置节点之间超时时间
    cluster-node-timeout 5000
    appendonly yes
    EOF
    
    cat >> /data/7001/redis.conf <<EOF
    port 7001
    daemonize yes
    bind 0.0.0.0
    requirepass 123456
    pidfile /data/7001/redis.pid
    loglevel notice
    logfile "/data/7001/redis.log"
    dbfilename dump.rdb
    dir /data/7001
    protected-mode yes
    cluster-enabled yes
    cluster-config-file nodes-7001.conf
    cluster-node-timeout 5000
    appendonly yes
    EOF
    
    cat >> /data/7002/redis.conf <<EOF
    port 7002
    daemonize yes
    bind 0.0.0.0
    requirepass 123456
    pidfile /data/7002/redis.pid
    loglevel notice
    logfile "/data/7002/redis.log"
    dbfilename dump.rdb
    dir /data/7002
    protected-mode yes
    cluster-enabled yes
    cluster-config-file nodes-7002.conf
    cluster-node-timeout 5000
    appendonly yes
    EOF
    
    
    cat >>  /data/7003/redis.conf <<EOF
    port 7003
    daemonize yes
    bind 0.0.0.0
    requirepass 123456
    pidfile /data/7003/redis.pid
    loglevel notice
    logfile "/data/7003/redis.log"
    dbfilename dump.rdb
    dir /data/7003
    protected-mode yes
    cluster-enabled yes
    cluster-config-file nodes-7003.conf
    cluster-node-timeout 5000
    appendonly yes
    EOF
    
    
    cat >> /data/7004/redis.conf <<EOF
    port 7004
    daemonize yes
    bind 0.0.0.0
    requirepass 123456
    pidfile /data/7004/redis.pid
    loglevel notice
    logfile "/data/7004/redis.log"
    dbfilename dump.rdb
    dir /data/7004
    protected-mode yes
    cluster-enabled yes
    cluster-config-file nodes-7004.conf
    cluster-node-timeout 5000
    appendonly yes
    EOF
    
    cat >> /data/7005/redis.conf <<EOF
    port 7005
    daemonize yes
    bind 0.0.0.0
    requirepass 123456
    pidfile /data/7005/redis.pid
    loglevel notice
    logfile "/data/7005/redis.log"
    dbfilename dump.rdb
    dir /data/7005
    protected-mode yes
    cluster-enabled yes
    cluster-config-file nodes-7005.conf
    cluster-node-timeout 5000
    appendonly yes
    EOF
    
    启动节点
    redis-server /data/7000/redis.conf 
    redis-server /data/7001/redis.conf 
    redis-server /data/7002/redis.conf 
    redis-server /data/7003/redis.conf 
    redis-server /data/7004/redis.conf 
    redis-server /data/7005/redis.conf 
    [root@db01 ~]# ps -ef |grep redis
    root       8854      1  0 03:56 ?        00:00:00 redis-server *:7000 [cluster]     
    root       8858      1  0 03:56 ?        00:00:00 redis-server *:7001 [cluster]     
    root       8860      1  0 03:56 ?        00:00:00 redis-server *:7002 [cluster]     
    root       8864      1  0 03:56 ?        00:00:00 redis-server *:7003 [cluster]     
    root       8866      1  0 03:56 ?        00:00:00 redis-server *:7004 [cluster]     
    root       8874      1  0 03:56 ?        00:00:00 redis-server *:7005 [cluster]  
    
    创建集群管理
    redis-cli --cluster create --cluster-replicas 1 10.0.0.250:7000 10.0.0.251:7001 10.0.0.252:7002 10.0.0.250:7003 10.0.0.251:7004 10.0.0.252:7005 -a 123456
    然后输入yes
    
    -a 123456表示输入密码
    --cluster-replicas 1 表示每个创建的主服务器都有一个从服务器
    
    创建完成之后,redis再进行连接时,加上一个-c参数就表示是连接集群操作了
    redis-cli -h 10.0.0.250 -c -a 123456 -p 7000
    连接进去后设置key-value时会自动切换
    View Code

    3.集群相应命令

    查看节点状态
    cluster nodes
    cluster info(查看集群信息)
    增加新节点
    mkdir -p /data/7006
    mkdir -p /data/7007
    cat > /data/7006/redis.conf <<EOF
    port 7006
    daemonize yes
    bind 0.0.0.0
    requirepass 123456
    pidfile /data/7006/redis.pid
    loglevel notice
    logfile "/data/7006/redis.log"
    dbfilename dump.rdb
    dir /data/7006
    protected-mode yes
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    appendonly yes
    EOF
    
    cat >  /data/7007/redis.conf <<EOF
    port 7007
    daemonize yes
    bind 0.0.0.0
    requirepass 123456
    pidfile /data/7007/redis.pid
    loglevel notice
    logfile "/data/7007/redis.log"
    dbfilename dump.rdb
    dir /data/7007
    protected-mode yes
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    appendonly yes
    EOF
    
    redis-server /data/7006/redis.conf 
    redis-server /data/7007/redis.conf 
    
    添加新主节点
    redis-cli --cluster add-node 10.0.0.253:7006 10.0.0.250:7000 -a 123456
    重新分片
    redis-cli --cluster reshard 10.0.0.250:7000 -a 123456
    然后根据提示,输入要接收的槽数(看集群节点个数来分)4096
    然后输入节点id号
    然后输入all表示从各个节点进行接收
    
    添加新从节点
    redis-cli --cluster add-node 10.0.0.253:7007 10.0.0.250:7000 -a 123456 --cluster-slave --cluster-master-id 3d0aa317b7a44cb25d92e2884cdb9e694eff8772
    
    删除节点
    从节点可以直接删除,主节点不能直接删除,删除之后,该节点会被shutdown。
    View Code

    4.节点相关命令

    redis-cli --cluster help
    Cluster Manager Commands:
      create         host1:port1 ... hostN:portN   #创建集群
                     --cluster-replicas <arg>      #从节点个数
      check          host:port                     #检查集群
                     --cluster-search-multiple-owners #检查是否有槽同时被分配给了多个节点
      info           host:port                     #查看集群状态
      fix            host:port                     #修复集群
                     --cluster-search-multiple-owners #修复槽的重复分配问题
      reshard        host:port                     #指定集群的任意一节点进行迁移slot,重新分slots
                     --cluster-from <arg>          #需要从哪些源节点上迁移slot,可从多个源节点完成迁移,以逗号隔开,传递的是节点的node id,还可以直接传递--from all,这样源节点就是集群的所有节点,不传递该参数的话,则会在迁移过程中提示用户输入
                     --cluster-to <arg>            #slot需要迁移的目的节点的node id,目的节点只能填写一个,不传递该参数的话,则会在迁移过程中提示用户输入
                     --cluster-slots <arg>         #需要迁移的slot数量,不传递该参数的话,则会在迁移过程中提示用户输入。
                     --cluster-yes                 #指定迁移时的确认输入
                     --cluster-timeout <arg>       #设置migrate命令的超时时间
                     --cluster-pipeline <arg>      #定义cluster getkeysinslot命令一次取出的key数量,不传的话使用默认值为10
                     --cluster-replace             #是否直接replace到目标节点
      rebalance      host:port                                      #指定集群的任意一节点进行平衡集群节点slot数量 
                     --cluster-weight <node1=w1...nodeN=wN>         #指定集群节点的权重
                     --cluster-use-empty-masters                    #设置可以让没有分配slot的主节点参与,默认不允许
                     --cluster-timeout <arg>                        #设置migrate命令的超时时间
                     --cluster-simulate                             #模拟rebalance操作,不会真正执行迁移操作
                     --cluster-pipeline <arg>                       #定义cluster getkeysinslot命令一次取出的key数量,默认值为10
                     --cluster-threshold <arg>                      #迁移的slot阈值超过threshold,执行rebalance操作
                     --cluster-replace                              #是否直接replace到目标节点
      add-node       new_host:new_port existing_host:existing_port  #添加节点,把新节点加入到指定的集群,默认添加主节点
                     --cluster-slave                                #新节点作为从节点,默认随机一个主节点
                     --cluster-master-id <arg>                      #给新节点指定主节点
      del-node       host:port node_id                              #删除给定的一个节点,成功后关闭该节点服务
      call           host:port command arg arg .. arg               #在集群的所有节点执行相关命令
      set-timeout    host:port milliseconds                         #设置cluster-node-timeout
      import         host:port                                      #将外部redis数据导入集群
                     --cluster-from <arg>                           #将指定实例的数据导入到集群
                     --cluster-copy                                 #migrate时指定copy
                     --cluster-replace                              #migrate时指定replace
      help 
    View Code
  • 相关阅读:
    【7.19 graphshortestpath graphallshortestpaths函数】matlab 求最短路径函数总结
    【7.18 灾情巡视路线代码】
    【7.18总结】KM算法
    【7.17总结】 匈牙利算法(二分图最大匹配)
    动态规划 多段图最短路 有向图
    matlab 单元最短路 Dijkstra算法 无向图
    hdu 3536【并查集】
    博弈随笔
    AtCoder Regular Contest 094 D Worst Case【思维题】
    CODE FESTIVAL 2017 qual B C 3 Steps(补题)
  • 原文地址:https://www.cnblogs.com/xufengnian/p/11925643.html
Copyright © 2011-2022 走看看