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

    数据库管理,概念可以查看【微服务集群】

    主从

    概念
    一个主机压力太大,增加几个就是集群,集群需要保证数据同步,数据同步通过配置文件实现,数据同步是以主从的模式存在,数据只能由主到从的单向流动,所以只能在主机写入,从机只读,也叫读写分离,还有个优点就是在只有一个redis的时候,如果出了问题,会导致相关程序也废了,所以redis集群很重要

    • 复制多个配置文件
    • 修改每个配置文件
    # 修改启动的端口,主机 3679不用改
    port 6380
    # 修改各自的日志文件
    logFile "6380.log"
    # 持久化文件 
    dbfilename "dump6380.rbd"
    # 进程文件pidFile
    pidFile /var/run/redis6380.pid
    
    • 往从机的配置文件里搜索replicaof,默认是注释掉的,把注释去了改成
    # 旧版redis是  slaveof 127.0.0.1 6379
    replicaof 127.0.0.1 6379
    
    # 主机有密码的话
    masterauth  "主机密码"
    
    • 全部配置好后,启动就行
    • 一旦使用数据库集群,就需要使用多数据库连接

    哨兵

    • 主从配置了之后,从机是不能写的,只能读,只要主机有写的权限,但是主机如果关机了,从机也还是能读到主机关机前的数据,但是从机还是没有权限去写,哨兵就是去自动选择新主机的工具人
    • 哨兵也是独立的服务,需要配置文件的,开启某一个从机的哨兵,对所有redis服务进行监听,只要哨兵发现某一个断开了并且是主机的话,会立刻选出一个还活着的从机当老大,然后把跟随原老大的从机也拉过来
    • 但是哨兵也又可能会死机,为了防止哨兵也死机,会开启很多的哨兵相互监听,非常的复杂

    image.png

    • 配置文件,自己新建
    # sentinel.conf
    
    # 不写也是默认26379的
    port 26379
    # 1代表,有1个哨兵认为master死了时,执行认老大的操作,如果是哨兵集群,可以写把1改成2以上,平时一个哨兵就是写1
    sentinel monitor【name】192.168.1.10 6379 1  
    
    • 启动哨兵
    redis-sentinel  sentinel.conf
    

    哨兵是可以用Java去实现的,自行百度

    redis集群

    • 先配置6个redis进行集群
    port 7000
    bind 172.21.0.16
    #作为守护进程运行
    daemonize yes
    pidfile 7000.pid
    cluster-enabled yes
    # 下面这个固定这么写就行
    cluster-config-file node.conf
    #连接集群的超时时间
    cluster-node-timeout 15000
    appendonly yes
    
    # 如果是从机,也一样,因为集群没有主从之分
    
    • 然后全部启动后
    • 安装ruby环境,因为redis-trib.rb是ruby开发的
    yum install ruby //安装ruby
    yum install rubygems  //安装rubygems,最新版本会自动安装
    
    # 我们安装完 Ruby 和 Rubygems 后,还需要继续安装Redis的Ruby接口程序。
    gem install redis
    
    • 把6个程序关联起来,在这之前,他们都用不了,不信自己试试
    # 先随便进入一个redis文件夹里,因为redis-trib.rb放在里面
    # 这个--replicas 1 参数是指主从机的比例,如果是2,就是2个主节点,4个从节点
    ruby redis-trib.rb  create --replicas 1 
    192.168.127.130:7000 192.168.127.130:7001 192.168.127.130:7002 
    192.168.127.130:7003 192.168.127.130:7004 192.168.127.130:7005 
    
    • 如果是不同的机器,只需要在某一台上执行上面的命令就行
    • 可以发现自动分配了3个主机3个从机,每一个都可以连接进行增删改查,但是实际上都是把操作提交给了redis-trib.rb,让他进行控制
    • 原理是:Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点

    image.png

    • 集群扩容
    # 向集群里加入主节点,第二个参数随便填集群里的任意主机就行
    redis-trib.rb add-node 127.0.0.1:9006 192.168.81.100:9000
    
    # 向集群里加入从节点,第二个参数随便填集群里的任意主机就行
    # 先查看新加入的主节点的id,随便连接一台集群机器
    cluster nodes
    # 复制刚才加进来的主机的最前面的一串uuid就行
    redis-trib.rb add-node 127.0.0.1:9007 192.168.81.100:9000 --cluster-slave --cluster-master-id 【uuid】
    
    # 槽迁移
    redis-trib.rb reshard 127.0.0.1:9000
    # How many slots do you want to move (from 1 to 16384)? 因为是除以4所以是4096
    4096
    # What is the receiving node ID? 把这个4096分配给谁
    【新加的主机uuid】
    # Source node #1: 分配方式,选择all全部,就是把已经有槽点的主机各自平分出一部分给新主机
    all
    # 然后数据开始自动移动,等待就行
    
    • 集群收缩
    # 操作就是把集群扩容倒着执行
    # 迁移槽,从192.168.81.101:9000迁移到集群中别的节点上
    # 先查看目前有多少槽,可以分成多份,也可以全部移动,最后面connected就是所拥有的槽区域,槽区域的大减小就是下面要填入的值
    cluster nodes
    redis-trib.rb reshard --from cf74b2d9570665b74525802462c74cf2e072ef99 --to 27266dcfd098dfe2a42361d6ab59edf8fb9f5413 --slots 【槽的大小】 127.0.0.1:9000    
    
    # 先移除从节点,记得先关闭服务
    redis-trib.rb del-node 127.0.0.1:9007 【uuid】
    # 先移除主节点,记得先关闭服务
    redis-trib.rb del-node 127.0.0.1:9006 【uuid】
    

    image.png

    注意

    • redis的分库是原生支持的功能
    • 数据的迁移是自动化的
    • 插入值会被存在哪个分库里也是自动化的
  • 相关阅读:
    ping和traceroute原理分析异同为什么不能ping通却能traceroute (转载) 规格严格
    JDBC hang on Statement 规格严格
    邮件服务返回代码含义 规格严格
    后台分析(转载) 规格严格
    Java Socket(转载) 规格严格
    编程好习惯 规格严格
    统计图表生成 规格严格
    几篇不错的博客 规格严格
    我见过的一个让我瞠目结舌的电脑高手!
    Ubuntu 下Ape转Mp3[88250原创]
  • 原文地址:https://www.cnblogs.com/pengdt/p/13062396.html
Copyright © 2011-2022 走看看