redis-搭建,水平扩展,水平伸缩

  • 目录

     

    redis搭建(所有命令以及操作针对于redis>5.0)

    水平扩展集群节点

    重新分片

    水平伸缩


  • redis搭建(所有命令以及操作针对于redis>5.0)

    • 基于docker搭建redis集群模式
      • docker run --net host --name dmp-redis 
        -v /etc/localtime:/etc/localtime:ro -v /home/dmp/redis/slave01/data:/data 
        --log-driver=none 
        -p 对外端口:内部端口-p 对外集群通讯端口(对外端口+10000):集群通讯端口(内部端口+10000) 
        redis:5.0 redis-server 
        --port 工作端口
        --requirepass "密码" 
        --masterauth "集群密码" 
        --cluster-announce-ip 集群通讯ip 
        --cluster-announce-port 8579 
        --cluster-announce-bus-port 18579 
        --cluster-node-timeout 10000    //连接超时时间 
        --appendonly yes     //开启appendomle备份,默认备份文件为appendonly.aof
        --protected-mode no     //关闭守护进程,否则会出现其他节点找不到此节点
        --cluster-enabled yes     //开启集群模式
        --slave-read-only yes     //当当前节点为slave时,此节点为只读节点

        创建集群

      • redis-cli --cluster create ip1:port1 ip2:port2 ip3:port3 --cluster-replicas 1 -a 密码
        

        添加节点,在创建集群之前

      • cluster meet ip:port

        指定slave

      • 在节点之下执行redis命令:cluster slaveOf master

    • 本地搭建

      • 首先在每个节点创建redis.conf文件,内容为配置文件

      • 然后在每个节点redis/src目录下执行./redos-server redis.conf

      • 创建集群分配slot:redis-cli -a 密码 --cluster create ip:port ...

      • 检查集群状态:redis-cli --cluster check ip:port 

      • 查看slot分配信息:redis-cli --cluster info ip:port 

  • 水平扩展集群节点

    • 将redis目录文件拷贝到新的主机上(docker直接pull相同版本)
    • 启动redis实例,并检查是否成功-> ps -ef | grep redis 查看端口
    • 查看集群的帮助命令->  ./redis-cli --cluster help
      • create :创建集群->  host1:port1.......host2:port2
      • call:可以执行redis命令
      • add-node:将节点添加到集群里,第一个参数为新节点的ip:port 第二个参数为集群中的任一节点ip:port
      • reshard:重新分片
      • check:检查集群状态
    • 使用add-node命令新增一个主节点->  ./redis-cli -a '' --cluster add-node ip:port(新增节点) ip:port(集群中任一节点)
    • 进入任一节点查看cluster nodes是否添加成功
  • 重新分片

    • 使用redis-cli命令为新节点(ip6:port6)分配slot槽点,找到集群中任一节点,对其进行重新分片 -> ./redis-cli --cluster reshard ip1:port1
    • How many slots do you want to move (from 1 to 16384)? 4000
      (ps:需要多少个槽移动到新的节点上,自己设置,比如4000个hash槽)
      What is the receiving node ID? 44b0bd6cf056af7dbbfa0dd9497def1cfc21eb6d
      (ps:把这4000个hash槽移动到哪个节点上去,需要指定节点id)
      Please enter all the source node IDs.
      Type 'all' to use all the nodes as source nodes for the hash slots.
      Type 'done' once you entered all the source nodes IDs.
      Source node 1:all
      (ps:输入all为从所有主节点中分别抽取相应的槽数指定到新节点中,抽取的总槽数为4000个;或者输入原节点ID然后输入done,意思将输入的节点ID,抽取的总槽数为4000个)
      Do you want to proceed with the proposed reshard plan (yes/no)? yes
      (ps:输入yes确认开始执行分片任务)

      查看最新的集群状态

    • 添加从节点
      • 同样执行上述添加节点命令
      • 进入新节点,执行cluster replicate +主节点ID 指定该节点为主节点ID的从节点
  • 水平伸缩

    • 从节点:直接删除从节点,使用del-node命令移除从节点,指定ip和端口:./redis-cli -a 密码 --cluster del-node ip:port
    • 主节点:需要注意不可直接删除节点,因为分配了slot会造成数据丢失,所以需要将slot迁移到其他master节点上,在执行删除命令
    • 槽点迁移:./redis-cli --cluster reshard ip:port
    • How many slots do you want to move (from 1 to 16384)? 4000
      (ps:需要多少个槽移动到新的节点上,自己设置,比如4000个hash槽)
      What is the receiving node ID? e7f80ba80749904838b6d779a0646e7f22313624
      (ps:把这4000个hash槽移动到哪个节点上去,需要指定节点id)
      Please enter all the source node IDs.
      Type 'all' to use all the nodes as source nodes for the hash slots.//从所有节点均匀抽取4000个slot进行分配
      Type 'done' once you entered all the source nodes IDs.//从指定节点抽取4000个slot进行分配
      Source node 1:44b0bd6cf056af7dbbfa0dd9497def1cfc21eb6d
      Source node 1:done
      (ps:输入all为从所有主节点中分别抽取相应的槽数指定到新节点中,抽取的总槽数为4000个;或者输入原节点ID然后输入done,意思将输入的节点ID,抽取的总槽数为4000个)
      Do you want to proceed with the proposed reshard plan (yes/no)? yes
      (ps:输入yes确认开始执行分片任务)

      迁移之后需要检查是否有剩余slot:cluster nodes

    • 很有成就的任务已经完事了,并且查询的时候依然可以从指定slot返回相关数据集
    • 但是当你查看挂载的数据文件目录,以及内存占用情况就会发现,当前新增节点数据目录下并没有数据源,而是redis作为一个无中心数据库而言,数据并没有像添加slave那样,理所当然的继承了父类的所有属性并且获取了所有财产(数据)
    • 这样虽然redis依然可以外部访问并且提供服务,但是仔细观察就会发现,当你的slot已经被成功的分配到了N太服务器上,如果你没有将数据迁移的话N=1,相当于并没有优化,实际而言可能还会变慢
    • 解决重分配slot没有数据
      • 在所有节点下执行BGREWRITEAOF:异步执行一个 AOF(AppendOnly File)文件重写操作。重写会创建一个当前AOF文件的体积优化版本
      • 在所有节点下执行BGSAVE:开启子进程去备份RDB文件,父进程依然可以提供服务,可以通过下面的命令查看进度
      • LASTSAVE:客户端执行 BGSAVE 命令时,可以通过每N秒发送一个 LASTSAVE 命令来查看BGSAVE 命令执行的结果,执行成功返回时间戳,如果设置了自动dump.rdb文件备份,也可使用此命令查看上次备份时间点
      • 数据备份完成后,记得重启所有redis节点
    • 执行del-node移除节点
    •  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值