@[toc]
# Redis 3种集群方式,别傻傻分不清!
redis集群有三种方式:主从复制,哨兵,集群(master-cluster)
为了方便本文在Window下进行演示,在一台机器上多开实例模拟集群模式,配置和Linux上配置并无多大差异,纯粹是为了方面操作。
redis主从配置需要注意的几点
首先不管哪一种的方式,版本必须一致。
存储数据方式需要一致
1 redis 主从模式配置
前言
主从关系,简单说是以主库为准,从库内容异步复制主数据库,从而达成主从内容基本一致的情况。
前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点。
数据库分为两类,Master数据库和Slave数据库。
redis 主从模式配置
解压redis 安装包 然后复制两份或者多份(这里以windows为例,linux基本一致 ,我这里没有多个服务器,所以在一台机器上模拟多实例代替多机器主从)
一个是6380 这个是主节点,6381这是从节点
首先更改配置文件 (redis.windows.conf )
要做的事情是改端口 一个是6380 这个是主节点,6381这是从节点
- 指定新的PID文件路径 (windows下没有)
pidfile /var/run/redis/redis_6380.pid
- 指定新的端口号 (必须改)
port 6380
- 指定新的日志文件路径
logfile /var/log/redis/redis_6380.log
- 指定新的转储文件路径
dbfilename dump_6380.rdb
日志和数据库文件可以配置也可以不配置
配置主从配置 (redis.windows.conf )
从节点 6389 配置如下
slaveof 127.0.0.1 6380
主节点ip 和 端口
masterauth admin
主节点有密码就配置,没有就不配置
保存启动 测试
其他配置参数:
*slaveof *masterauth slave-serve-stale-data yes 主节点出问题时,是否使用本机数据提供服务 slave-read-only yes 从节点是 只读的 *repl-diskless-sync no 快照先存于磁盘,再发送给从节点 no, Disk-backed, Diskless 新的从节点或某较长时间未能与主节点进行同步的从节点重新与主节点通信,需要做“full synchronization".复制代码
复制启动前延迟一个时间段;
repl-diskless-sync-delay 5 repl-ping-slave-period 10 *repl-timeout 60 repl-disable-tcp-nodelay no repl-backlog-size 1mb复制代码
默认优先级
slave-priority 100
复制集群中,主节点故障时,sentinel应用场景中的主节点选举时使用的优先级;数字越小优先级越高,但0表示不参与选举;
min-slaves-to-write 3:主节点仅允许其能够通信的从节点数量大于等于此处的值时接受写操作; min-slaves-max-lag 10:从节点延迟时长超出此处指定的时长时,主节点会拒绝写入操作;复制代码
2 redis 哨兵模式(一主一从两哨兵)
前言
有了主从模式,主库如果发生故障,从库可以转为主库,这时候我们需要对redis进行监控,此时就需要用到redis中的哨兵机制。
哨兵是建立在主从模式基础之上
哨兵模式是redis 2.x
版本提供的,3.x
版本的时候一般我们使用 redis集群 cluster
大概配置步骤如下图
redis 哨兵模式
哨兵模式
这里我们使用一个主节点(主)和一个子节点(从)
从节点使用哨兵模式进行监控主节点,如果主挂了,从库自动升级为主节点,等待主库恢复了,主库会自动变为从库。
但此时,如果升级为主库的从节点挂了,此时变为从库的主节点不会变为主库,出现这种问题,我们一般采用的是主从都进行哨兵模式配置,互相监控对方,从而达到高可用。
哨兵是用来监控主从数据库的,当master挂掉后选择一个salve当做master。
配置哨兵
redis 主 port6380 Sentinel(哨兵端口)26380
由于windows版本的redis没有 Sentinel.conf
文件 所以在redis的文件中创建一个
主服务6380
哨兵监听 从节点6381
# 当前Sentinel服务运行的端口port 26380#mastersentinel monitor master 127.0.0.1 6381 1sentinel down-after-milliseconds master 5000sentinel failover-timeout master 180000sentinel parallel-syncs master 1复制代码
从节点6381
哨兵监听 主服务6380
# 当前Sentinel服务运行的端口port 26381# Sentinel去监视一个名为mymaster的主redis实例,# 这个主实例的IP地址为本机地址127.0.0.1,端口号为6379,# 而将这个主实例判断为失效至少需要2个 Sentinel进程的同意,# 只要同意Sentinel的数量不达标,自动failover就不会执行 # 这个一定设置为 no 或者这里不设置 需要在哨兵中关闭保护模式。# protected-mode no# 指定了Sentinel认为Redis实例已经失效所需的毫秒数。# 当 实例超过该时间没有返回PING,或者直接返回错误,那么Sentinel将这个实例标记为主观下线。# 只有一个 Sentinel进程将实例标记为主观下线并不一定会引起实例的自动故障迁移:只有在足够数量的Sentinel都将一个实例标记为主观下线之后,实例才会被标记为客观下线,这时自动故障迁移才会执行sentinel monitor mymaster 127.0.0.1 6380 1# 指定了在执行故障转移时,最多可以有多少个从Redis实例在同步新的主实例,在从Redis实例较多的情况下这个数字越小,同步的时间越长,完成故障转移所需的时间就越长sentinel down-after-milliseconds mymaster 5000# 如果在该时间(ms)内未能完成failover操作,则认为该failover失败sentinel failover-timeout mymaster 10000 复制代码
启动redis
redis-server.exe redis.windows.conf -h 127.0.0.1 -p 6379
启动哨兵
redis-server.exe sentinel.conf --sentinel
停止6380 主节点,查看从节点6381 可以看到升为主节点了
可以从6381哨兵中看到
在启动6380 主节点 ,可以看到 6380主节点转为6380的从节点
可以在6380的哨兵中看到
一主一从两哨兵的目的是
主库挂了从升级为主库,原来主库恢复了之后成为从库
3 Redis集群版
准备
下载安装redis
redis安装成功后文件
Redis只有3.0之后的版本才有集群
redis的哨兵模式基本已经可以实现高可用,读写分离 ,但是在这种模式下每台redis服务器都存储相同的数据,很浪费内存,所以在redis3.0上加入了cluster模式,实现的redis的分布式存储,也就是说每台redis节点上存储不同的内容。
修改配置文件 redis.windows.conf
修改内容为
port 7001//修改为与当前文件夹名字一样的端口号appendonly yes //指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。yes表示:存储方式,aof,将写操作记录保存到日志中cluster-enabled yes //开启集群模式cluster-config-file nodes-7001.conf //保存节点配置,自动创建,自动更新(建议命名时加上端口号)cluster-node-timeout 15000 //集群超时时间,节点超过这个时间没反应就断定是宕机复制代码
然后把7001 redis文件,每样复制一份到7002 7003 ---- 7006 一份!
Redis集群至少需要3个master节点,所以现在总共有6个节点,就只能是1master对应1slave这种方式。
然后打开每个7001 --- 7006 的redis.windows.conf文件把端口和cluster-config-file文件一下,这里建议打开直接替换7001对应的端口(全局替换每个redis.windows.conf 文件)
然后每个节点文件下建立一个启动bat文件
startbat.bat
title redis redis-server.exe redis.windows.conf复制代码
如下图所示
然后每个点击启动即可
下载Ruby并安装
下载地址:dl.bintray.com/oneclick/ru…下载后双击安装下一步,勾全选。
下载安装Redis的Ruby驱动redis-xx.gem
根据你的redis版本进行下载
下载之后放到Ruby安装目录下
cmd打开命令框 执行命令gem install --local C:\Ruby22-x64\redis-3.2.2.gem
出现以下信息说明配置成功
安装集群脚本redis-trib
下载地址 raw.githubusercontent.com/antirez/red…
或者百度云 链接:pan.baidu.com/s/1kOZs9f7o… 提取码:vdhf
下载后放到redis集群文件根目录下
启动集群
首先
启动7001 -- 7006 所有的redis ( 或者启动所有集群节点start.bat ) 这里无论什么方式 只要启动redis了就可以。
然后
开始创建集群 打开cmd 执行构建集群脚本 redis-trib.rb
ruby redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
复制代码
replicas 1
中的1
表示占比,表示主和从的比例数据,这里是三主三从
,所以是1
说明各个集群在进行
上面启动的脚本创建集群的时候 中途会询问是否打印更多详细信息,输入yes ,然后 redis-trib 就会将这份配置应用到集群当中,让各个节点开始互相通讯。
中途会打印输出很多日志
测试
在7001 库添加一个数据测试,然后其他库进行查询 数据同步过来就说明成功。
分配策略
Redis集群数据分配策略
采用一种叫做哈希槽 (hash slot)的方式来分配数据,redis cluster 默认分配了 16384 个slot,三个节点分别承担的slot 区间是
分配策略
Redis集群数据分配策略
采用一种叫做哈希槽 (hash slot)的方式来分配数据,redis cluster 默认分配了 16384 个slot,三个节点分别承担的slot 区间是
4 Redis集群动态增加或者删除节点
redis集群动态增加或者删除节点
前言
首先新增需要添加的节点,这里添加7007 和 7008(上面已经配置了7001 - 7006端口的集群)
修改一些配置文件信息,参考集群配置。
然后启动相应的节点
添加节点到集群
127.0.0.1:7007 是新增节点
127.0.0.1:7001 是已经新增集群节点(这里可以随便写一个已知的集群节点 ip : port
)
redis-trib.rb add-node 127.0.0.1:7007 127.0.0.1:7001
添加7007到集群
查看新增节点
redis-cli -c -p 7001 cluster nodes
增加了新的节点之后,这个新的节点可以成为主节点或者是从节点。
分配哈希槽(成为主节点)
使用redis-trib程序,将集群中的某些哈希槽移动到新节点里面, 这个新节点就成为真正的主节点了
redis-trib.rb reshard 127.0.0.1:7001
系统返回信息会提示我们要移动多少哈希槽,这里移动200个
然后 需要指定把这些哈希槽转移到哪个节点上
当然是转移到新增的节点上
输入我们刚才新增的节点的ID
选择选择槽的方式
输入 all
表示从所有的主节点中随机转移,凑够200个哈希槽 然后再输入yes
,redis集群就开始分配哈希槽了。
输入 done
表示把指定主节点上的槽分配给新节点.。
打印出随机选择的槽
输入yesr进行分配
查看新增主节点
分配成功
添加从节点
添加7008到集群中去
redis-trib.rb add-node 127.0.0.1:7008 127.0.0.1:7006
查看
添加7008成为7007的从节点
登录7008客户端
执行分配节点
cluster replicate fccadebeb5b769bd084369e5cbe391979fb53b40
fccadebeb5b769bd084369e5cbe391979fb53b40
是 7007 节点 id
查看节点配置
删除节点
删除主节点
首先要把节点中的哈希槽转移到其他节点中,执行下面的命令
redis-trib.rb reshard 127.0.0.1:7007
提示我们要移动多少哈希槽 ?
输入数字即可
选择接受的槽节点ID?
找一个主节点接受哈希槽即可
选择数据源槽?
输入需要清除的节点ID即可
最后 输入 done
删除分配
查看节点信息
7007已经无哈希槽
最后使用删除节点删除
redis-trib.rb del-node 127.0.0.1:7007 ID
ID 是7007的节点ID
查看节点信息
7007已经被成功删除
删除从节点
redis-trib.rb del-node 127.0.0.1:7008 ID
ID 是7008的节点ID
查看节点
7008从节点已经没有了
关注我
长按二维码
如果你喜欢这篇文章,喜欢,在看,转发。