潍坊市建设局网站,企业标志logo设计免费,discuz wordpress主题,网页设计模板html代码案例文章目录 前言一、主从复制1.概述2.作用3.模拟实践搭建场景模拟实践 二、哨兵模式1.概述2.配置使用3.优缺点4.sentinel.conf完整配置 总结 前言
从主从复制到哨兵模式。 一、主从复制
1.概述 主从复制#xff0c;是指将一台 Redis 服务器的数据#xff0c;复制到其他的 Red… 文章目录 前言一、主从复制1.概述2.作用3.模拟实践搭建场景模拟实践 二、哨兵模式1.概述2.配置使用3.优缺点4.sentinel.conf完整配置 总结 前言
从主从复制到哨兵模式。 一、主从复制
1.概述 主从复制是指将一台 Redis 服务器的数据复制到其他的 Redis 服务器。 前者称为主节点master / leader后者称为从节点slave/follower。数据的复制是单向的只能由主节点到从节点。Master 以写为主Slave 以读为主。一个主节点可以有多个从节点或没有从节点但一个从节点只能有一个主节点。默认情况下每台 Redis 服务器都是主节点。
2.作用 数据冗余 主从复制实现了数据的热备份是持久化之外的一种数据冗余方式。 故障恢复 当主节点出现问题时可以由从节点提供服务实现快速的故障恢复。这也是一种服务的冗余。 负载均衡 在主从复制的基础上配合读写分离可以由主节点提供写服务由从节点提供读服务分担服务器负载。 尤其是在写少读多的场景下通过多个从节点分担读负载可以大大提高 Redis 服务器的并发量。 高可用 主从复制是哨兵和集群能够实施的基础因此说主从复制是 Redis 高可用的基础。 一般来说要将 Redis 运用于工程项目中只使用一台 Redis 是万万不能的原因如下
结构上单个 Redis 服务器会发生单点故障并且一台服务器需要处理所有的请求负载压力较大。容量上单个 Redis 服务器内存容量有限一般来说单台 Redis 最大使用内存不应该超过 20G。 应用 电商网站上的商品一般都是一次上传无数次浏览的说专业点也就是多读少写。 对于这种场景我们可以使用如下这种架构 3.模拟实践
搭建场景 进入redis.conf所在文件夹复制三个redis.conf文件 cp redis.conf redis6379.conf
cp redis.conf redis6380.conf
cp redis.conf redis6381.conf修改复制的文件 修改 redis6379.conf内的以下属性
daemonize yes
pidfile /var/run/redis_6379.pid
logfile 6379.log
dbfilename dump6379.rdb修改 redis6380.conf内的以下属性
daemonize yes
port 6380
pidfile /var/run/redis_6380.pid
logfile 6380.log
dbfilename dump6380.rdb修改 redis6381.conf内的以下属性
daemonize yes
port 6381
pidfile /var/run/redis_6381.pid
logfile 6381.log
dbfilename dump6381.rdb启动三个redis服务器 redis-server /usr/local/redis6379.conf
redis-server /usr/local/redis6380.conf
redis-server /usr/local/redis6381.conf查看 ps -ef|grep redis说明已启动成功。 开三个窗口分别客户端连接三个服务 redis-cli -p 端口号 -a 密码 //没有密码不需要 -a 选项 redis-cli -p 6379 -a 123456
redis-cli -p 6380 -a 123456
redis-cli -p 6381 -a 123456模拟实践 主要命令 info replication # 查看当前库信息
slaveof 主库IP 主库端口 # 指定主库配从库不配主库查看三个库的信息 三个库的前两个信息都一样目前都是主机且都没有从机默认三个都是主机 配置一个主机master两个从机slave slaveof host port # 找谁当老大 在6380和6381窗口输入以下命令
slaveof 127.0.0.1 6379查看6379、6380、6381信息 主机赋值从机取值实现读写分离 在主机6379窗口赋值两个从机都能获取到但是从机不能赋值会报错。主机中的所有信息和数据都会自动被从机保存 主机断开 这时从机依然是从机且正常工作。 主机再次恢复 主机恢复后再赋值从机依然能够读取到这样可以保证高可用。 从机断开 从机断开后主机赋了新值从机启动后无法获取到新值原因是从机启动后又默认为主机了。
如果想从机断开再启动还为从机就不要用命令行配置主机从机只是临时配置可以采取配置文件redis.conf直接指定永久的 只要谋位的从机由主机变回从机立马会从主机中获值。 谋朝篡位 主机断开后从机如果想要当主机可以使用 slaveof no one 进行“谋朝篡位”从而变成主机。 但此时其他节点还是很“忠心”依然认定之前的主机为主机这样变成的主机是没有从机的是个“孤家寡人”。 主机如果恢复可以“平息叛乱”之前的从机依旧认定它为主机但是变成主机的那个从机不再认定原主机了。
如图可看出从机已经变成主机 主机恢复可以看出只有一个从机了6781 从机复制主机信息数据的原理 改朝换代 前面的操作在实际场景中并不适用因为我们希望的是主机断开后有从机作为主机依旧实现主从复制。 所以在从机“谋朝篡位”后还需要让剩余的从机“认主”让他们都“归顺”于新的主机但是这种需要自己在主机消失后手动配置修改从机认定的主机。 这样原来的主机恢复后就变成了“孤家寡人”。 有没有好的方法让主机消失后其中一个从机自动变成主机继续实现主从复制避免故障呢下面就要开始讲诉哨兵模式了。
二、哨兵模式
1.概述
主从切换技术的操作是当主机宕机后需要手动把一台从机切换为主机。这就需要人工干预费事费力还会造成一段时间内服务不可用。这不是一种推荐的方式更多时候我们优先考虑哨兵模式。Redis 从 2.8 开始正式提供了 Sentinel哨兵 架构来解决这个问题。它是“谋朝篡位”的自动版能够后台监控主机是否故障如果故障了根据投票数自动将从机转换为主机。哨兵模式是一种特殊的模式首先 Redis 提供了哨兵的命令哨兵是一个独立的进程它会独立运行。其原理是哨兵通过发送命令等待 Redis 服务器响应从而监控运行的多个 Redis 实例。 这里的哨兵有两个作用
通过发送命令让 Redis 服务器返回监控其运行状态包括主机和从机。当哨兵监测到 master 宕机会自动将 slave 切换成 master然后通过发布订阅模式通知其他的从机修改配置文件让它们切换主机。然而一个哨兵进程对 Redis 服务器进行监控可能会出现问题为此我们可以使用多个哨兵进行监控。
各个哨兵之间还会进行监控这样就形成了多哨兵模式 假设主机宕机哨兵 1 先检测到这个结果系统并不会马上进行 failover故障转移 过程仅仅是哨兵 1 主观的认为主机不可用这个现象称为主观下线。
当后面的哨兵也检测到主机不可用并且数量达到一定值时哨兵之间就会进行一次投票投票的结果由一个哨兵发起进行 failover 操作。
切换成功后就会通过发布订阅模式让各个哨兵把自己监控的从机实现切换主机这个过程称为客观下线。
2.配置使用
这里演示一个哨兵监测一个主机。 在 redis 目录下新建 myconfig 目录并创建文件 sentinel.conf 具体看自己我是在/usr/local目录下创建的myconfig并在myconfig内创建 sentinel.conf 文件名必须为 sentinel.conf mkdir myconfig
cd myconfig/
vim sentinel.conf编写sentiel.conf sentinel monitor myredis 127.0.0.1 6379 1
# sentinel monitor 被监控的名称 host port 1末尾的 1 代表选票达到多少时选举成功 启动 在myconfig上一级文件输入以下命令
redis-sentinel myconfig/sentinel.conf主机断开 主机断开后哨兵进程会监测到然后发起选举调用选举算法最后选举 6380 为新的主机6381 也认定其为主机。 主机恢复 之前断开的主机恢复后哨兵进程也会检测到但此时并不会将其再设为主机而是设为新的主机的从机。
3.优缺点
优点
哨兵集群模式是基于主从模式的所有主从的优点哨兵模式同样具有。主从可以切换故障可以转移系统可用性更好。哨兵模式是主从模式的升级系统更健壮可用性更高。
缺点
Redis较难支持在线扩容在集群容量达到上限时在线扩容会变得很复杂。实现哨兵模式的配置也不简单甚至可以说有些繁琐。
4.sentinel.conf完整配置
# 哨兵 sentinel 实例运行的端口 默认 26379
port 26379
# 哨兵 sentinel 的工作目录
dir /tmp
# 哨兵 sentinel 监控的 redis 主节点的 ip port
# master-name 可以自己命名的主节点名字只能由字母 A-z、数字 0-9、.-_这三个字符组成。
# quorum 配置多少个 sentinel 哨兵统一认为 master 主节点失联那么这时客观上认为主节点失联了
# sentinel monitor master-name ip redis-port quorum
sentinel monitor mymaster 127.0.0.1 6379 2
# 当在 Redis 实例中开启了 requirepass foobared 授权密码 这样所有连接 Redis 实例的客户端都要提供密码
# 设置哨兵 sentinel 连接主从的密码注意必须为主从设置一样的验证密码
# sentinel auth-pass master-name password
sentinel auth-pass mymaster MySUPER--secret-0123passw0rd
# 指定多少毫秒之后主节点没有应答哨兵 sentinel此时哨兵主观上认为主节点下线默认 30 秒
# sentinel down-after-milliseconds master-name milliseconds
sentinel down-after-milliseconds mymaster 30000
# 这个配置项指定了在发生 failover 主备切换时最多可以有多少个 slave 同时对新的 master 进行同步
# 这个数字越小完成 failover 所需的时间就越长
# 但是如果这个数字越大就意味着越多的 slave 因为 replication 而不可用
# 可以通过将这个值设为 1 来保证每次只有一个 slave 处于不能处理命令请求的状态
# sentinel parallel-syncs master-name numslaves
sentinel parallel-syncs mymaster 1
# 故障转移的超时时间 failover-timeout 可以用在以下这些方面
# 1. 同一个 sentinel 对同一个 master 两次 failover 之间的间隔时间
# 2. 当一个 slave 从一个错误的 master 那里同步数据开始计算时间。直到 slave 被纠正为向正确的 master 那里同步数据时。
# 3. 当想要取消一个正在进行的 failover 所需要的时间。
# 4. 当进行 failover 时配置所有 slaves 指向新的 master 所需的最大时间。
# 不过即使过了这个超时slaves 依然会被正确配置为指向 master但是就不按 parallel-syncs 所配置的规则来了
# 默认三分钟
# sentinel failover-timeout master-name milliseconds
sentinel failover-timeout mymaster 180000
# SCRIPTS EXECUTION
# 配置当某一事件发生时所需要执行的脚本可以通过脚本来通知管理员例如当系统运行不正常时发邮件通知相关人员。
# 对于脚本的运行结果有以下规则
# 若脚本执行后返回 1那么该脚本稍后将会被再次执行重复次数目前默认为 10
# 若脚本执行后返回 2或者比 2 更高的一个返回值脚本将不会重复执行。
# 如果脚本在执行过程中由于收到系统中断信号被终止了则同返回值为 1 时的行为相同。
# 一个脚本的最大执行时间为 60s如果超过这个时间脚本将会被一个 SIGKILL 信号终止之后重新执行。
# 通知型脚本:当 sentinel 有任何警告级别的事件发生时比如说 redis 实例的主观失效和客观失效等将会去调用这个脚本
# 这时这个脚本应该通过邮件SMS 等方式去通知系统管理员关于系统不正常运行的信息。
# 调用该脚本时将传给脚本两个参数一个是事件的类型一个是事件的描述。
# 如果 sentinel.conf 配置文件中配置了这个脚本路径那么必须保证这个脚本存在于这个路径并且是可执行的否则 sentinel 无法正常启动成功。
# 通知脚本
# sentinel notification-script master-name script-path
sentinel notification-script mymaster /var/redis/notify.sh
# 客户端重新配置主节点参数脚本
# 当一个 master 由于 failover 而发生改变时这个脚本将会被调用通知相关的客户端关于 master 地址已经发生改变的信息。
# 以下参数将会在调用脚本时传给脚本:
# master-name role state from-ip from-port to-ip to-port
# 目前 state 总是 “failover”role 是 “leader” 或者 “observer” 中的一个。
# 参数 from-ipfrom-portto-ipto-port是用来和旧的 master 和新的 master (即旧的 slave)通信的
# 这个脚本应该是通用的能被多次调用不是针对性的。
# sentinel client-reconfig-script master-name script-path
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh总结
以上就是哨兵模式的详细讲解。