Redis开发运维实践高可用和集群架构与实践(二)

11.1.2 环境搭建

11.1.2.1 部署架构

部署架构上采用三台机器,一个Master接受写请求,两个Slave进行数据同步,三台机器上都部署sentinel(一般为奇数个,因为需要绝大部分进行投票才能failover)。(官方示例)具体架构如下图:


注意:如果有条件可以将sentinel多部署几个在客户端所在的应用服务器上,而不是与从节点部署在一起,这样避免整机宕机后sentinel和slave都减少而导致的切换选举sentinel无法超过半数。

11.1.2.2 网络规划

redis高可用环境不需要进行心跳线的配置,每个物理节点的网卡进行双网卡主备绑定生成bond0即可。

11.1.2.3 用户规划

用户名 用户所在组 用户目录 权限 备注
redis(10086) redis (10086) /redis sudo(如需要浮动IP时赋予) --

11.1.2.4 持久化规划

如果读多写少,可以在master上只开启aof,在低峰期定时进行bgsave,在slave上彻底关闭持久化。 如果读写差不多,可以在一个slave上开启rdb(这个slave只做持久化,不进行读操作),在其余主从都关闭持久化。 注意:从节点是不会从本地恢复而直接从master节点进行恢复的,因此在重启前如果有需要备份从节点,则需要把aof和rdb文件移走。

11.1.2.5 目录规划

目录 含义
/redis/bin redis可执行文件
/redis/conf redis 和supervisord的配置文件
/redis/run redis和supervisord运行时的pid文件
/redis/log redis和supervisord的日志
/redis/script 一些管理脚本和测试脚本
/redis/data Redis持久化数据目录

11.1.2.6 部署步骤

解压下列压缩包至/tmp/redis目录,以符合上述目录结构:

部署相关组件: cd /tmp/redis/deploy ./deploy.sh

修改Master配置文件redis.conf,注释掉包含slaveof的语句。 修改Slave配置文件redis.conf,添加slaveof masterIP port,指定主从 修改三台机器的sentinel配置文件,指定主服务器的IP和端口: sentinel monitor mymaster masterIP port 2

然后使用supervisord重新启动。

11.1.2.7 配置文件

首先,一个sentinel可以配置多个master。一个master的配置如下:

port 26379
###定义目录存放
dir "/redis"
###监控mymaster(可自定义-但只能包括A-z 0-9和”._-”),注意quorum只影响ODOWN的判断,但是不影响failover,发生failover的条件必须是半数sentinel认为老Master已经ODOWN。此参数建议设置为sentinel/2+1的数值,否则可能会产生脑裂。
sentinel monitor mymaster 192.168.145.131 6379 2
###mymaster多久不响应认为SDOWN,设置为3100也就是说3次ping失败后认为SDOWN
sentinel down-after-milliseconds mymaster 3100
###如果在该时间(ms)内未能完成failover操作,则认为该failover失败
sentinel failover-timeout mymaster 15000

###在执行故障转移时, 最多可以有多少个从Redis实例在同步新的主实例, 在从Redis实例较多的情况下这个数字越小,同步的时间越长,完成故障转移所需的时间就越长
sentinel parallel-syncs mymaster 1

###reconfig的时候执行的脚本(选配)
sentinel client-reconfig-script mymaster /redis/script/failover.sh

###出现任何sentinel在warning事件时候执行的脚本(选配)
sentinel notification-script mymaster /redis/script/notify.sh

####日志位置
logfile "/redis/log/sentinel.log"

本文为《Redis开发运维实践指南》内容,该书作者为黄鹏程,已授权转载。

时间: 2024-10-21 09:07:32

Redis开发运维实践高可用和集群架构与实践(二)的相关文章

Redis开发运维实践高可用和集群架构与实践(四)

11.1.4 高可用和异常测试 11.1.4.1 测试环境介绍 sentinel的消息可以通过sentinel日志(/redis/log/sentinel.log)以及sentinel:hello订阅此频道进行查看. 11.1.4.2 手动切换测试 集群情况,2.128为主 发起主动切换: 查看sentinel日志: 在2.129上看,集群已经切换过来: 11.1.4.3 主实例宕测试 接上,此时master为2.129,找出redis实例的pid,然后kill: 此时查看sentinel日志:

Redis开发运维实践高可用和集群架构与实践(三)

11.1.3 维护操作 11.1.3.1 完整启动 supervisord -c /redis/conf/redis-supervisord.conf 会自动拉起本机的redis和sentinel 11.1.3.2 启停redis supervisorctl -c /redis/conf/redis-supervisord.conf start redis supervisorctl -c /redis/conf/redis-supervisord.conf stop redis supervi

Redis开发运维实践高可用和集群架构与实践(五)

11.1.5 其他问题 11.1.5.1 只读性 主从复制架构下,默认Slave是只读的,如果写入则会报错: 127.0.0.1:6379> set foo bar (error) READONLY You can't write against a read only slave. 注意这个行为是可以修改的,虽然这样的修改没有意义: 127.0.0.1:6379> CONFIG SET slave-read-only no OK 127.0.0.1:6379> set foo bar

Redis开发运维实践高可用和集群架构与实践(一)

11.1 主从复制-sentinel架构 11.1.1 高可用原理 11.1.1.1 发现原理 Sentinel发现分为发现从服务器和发现其他sentinel服务两类: Sentinel实例可以通过询问主实例来获得所有从实例的信息 Sentinel进程可以通过发布与订阅来自动发现正在监视相同主实例的其他Sentinel,每个 Sentinel 都订阅了被它监视的所有主服务器和从服务器的 __sentinel__:hello 频道, 查找之前未出现过的 sentinel进程. 当一个 Sentin

Redis开发运维实践开发者设计规范之典型使用场景参考

4.6 典型使用场景参考 下面是Redis适用的一些场景: 1. 取最新 N 个数据的操作 比如典型的取你网站的最新文章,通过下面方式,我们可以将最新的 5000条评论的ID放在Redis的List集合中,并将超出集合部分从数据库获取. 使用LPUSH latest.comments命令,向 list集合中插入数据 插入完成后再用 LTRIM latest.comments 0 5000 命令使其永远只保存最近5000个 ID 然后我们在客户端获取某一页评论时可以用下面的逻辑 FUNCTION

Redis开发运维实践上线部署规划之内存规划

5.1 内存.CPU规划 一定要设置最大内存maxmemory参数,否则物理内存用爆了就会大量使用Swap,写RDB文件时的速度很慢.注意这个参数指的是info中的used_memory,在一些不利于jmalloc的时候,内存碎片会很大. 多留55%内存是最安全的.重写AOF文件和RDB文件的进程(即使不做持久化,复制到Slave的时候也要写RDB)会fork出一条新进程来,采用了操作系统的Copy-On-Write策略(子进程与父进程共享Page.如果父进程的Page-每页4K有修改,父进程自

Redis开发运维实践上线部署规划之服务器部署位置

5.3 服务器部署位置 尽可能把client和server部署在同一台机器上,比如都部署在app server,或者一个网段中,减少网络延迟对于redis的影响. 如果是同一台机器,又想榨干redis性能可以考虑采用UNIX domain sockets配置方式,配置方式如下 这样的配置方式在没有大量pipeline下会有一定性能提升,具体请参见http://redis.io/topics/benchmarks: 另外,对于混合部署即redis和应用部署在同一台服务器上,那么可能会出现如下的情况

Redis开发运维实践开发者设计规范之延迟考虑

4.5 延迟考虑 1. 尽可能使用批量操作: mget.hmget而不是get和hget,对于set也是如此. lpush向一个list一次性导入多个元素,而不用lset一个个添加 LRANGE 一次取出一个范围的元素,也不用LINDEX一个个取出 2. 尽可能的把redis和APP SERVER部署在一个网段甚至一台机器. 3. 对于数据量较大的集合,不要轻易进行删除操作,这样会阻塞服务器,一般采用重命名+批量删除的策略: 排序集合: # Rename the key newkey = "gc

Redis开发运维实践上线部署规划之网卡rps设置

5.2 网卡RPS设置 RPS就是让网卡使用多核CPU的.传统方法就是网卡多队列(RSS,需要硬件和驱动支持),RPS则是在系统层实现了分发和均衡.如果对redis网络处理能力要求高或者在生产上发现cpu0的,可以在OS层面打开这个内核功能. 设置脚本: #!/bin/bash # Enable RPS (Receive Packet Steering) rfc=32768 cc=$(grep -c processor /proc/cpuinfo) rsfe=$(echo $cc*$rfc |