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
  • 相关阅读:
    (BFS 二叉树) leetcode 515. Find Largest Value in Each Tree Row
    (二叉树 BFS) leetcode513. Find Bottom Left Tree Value
    (二叉树 BFS DFS) leetcode 104. Maximum Depth of Binary Tree
    (二叉树 BFS DFS) leetcode 111. Minimum Depth of Binary Tree
    (BFS) leetcode 690. Employee Importance
    (BFS/DFS) leetcode 200. Number of Islands
    (最长回文子串 线性DP) 51nod 1088 最长回文子串
    (链表 importance) leetcode 2. Add Two Numbers
    (链表 set) leetcode 817. Linked List Components
    (链表 双指针) leetcode 142. Linked List Cycle II
  • 原文地址:https://www.cnblogs.com/xufengnian/p/11925643.html
Copyright © 2011-2022 走看看