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的分库是原生支持的功能
  • 数据的迁移是自动化的
  • 插入值会被存在哪个分库里也是自动化的
原文地址:https://www.cnblogs.com/pengdt/p/13062396.html