Redis主从配置
主从配置
首先正常安装并配置两个redis服务,master上需要添加如下配置:
port port
logfile logfile
其中port为master服务器的端口,logfile为master的日志输出地址及日志文件名。
然后修改想要配置为slave服务的redis的配置文件redis.conf并加入如下配置:
port port1
slaveof ip2 port2
masterauth pwd
其中port1为slave服务器的端口,ip2和port2为master服务器的ip地址和端口,pwd为master的连接密码(如果master没有设置连接密码则不需要配置)。
实例:
1、安装两个redis服务(可在不同机器上)如下图:
redis1:
redis2:
2、将redis1作为主redis服务,配置文件中需要修改如下参数:
# 设置主服务的端口
port 6379
# 设置redis连接超时(单位毫秒)
timeout 30000
# 设置redis服务日志输出地址(完整路径+文件名)
logfile /data/cachedb1/redis1.log
# 关闭主服务上的Snapshot(取消配置文件中save参数的设置)
# save 900 1
# save 300 10
# save 60 10000
# 关闭dump文件输出(取消配置文件中dump输出文件名称及目录的设置)
# dbfilename dump1.rdb
# dir /data/cachedb1/
# 关闭AOF
appendonly no
# 取消AOF输出文件名设置
#appendfilename appendonly1.aof
# 设置AOF方式为no
appendfsync no
将redis2作为从redis服务,配置文件中需要修改如下参数:
# 设置主服务的端口
port 6380
# 设置redis连接超时(单位毫秒)
timeout 30000
# 设置redis服务日志输出地址(完整路径+文件名)
logfile /data/cachedb2/redis2.log
# 设置主服务上的Snapshot时间
save 900 1
save 300 10
save 60 10000
# 设置dump文件输出文件名
# dbfilename dump2.rdb
# 设置dump文件输出文件目录
# dir /data/cachedb2/
# 设置主服务IP、端口
slaveof 127.0.0.1 6379
# 打开AOF
appendonly yes
# 设置AOF输出文件名
appendfilename appendonly2.aof
# 设置AOF方式为每秒一次
appendfsync everysec
3、启动主服务:
启动从服务:
4、验证服务是否启动正常:
验证主服务:
验证从服务:
验证主服务输出文件:
验证从服务输出文件:
附录:
容灾策略
基本的redis的容灾策略为:
1、采用master-slave方式
2、为了得到好的读写性能,master不做任何的持久化
3、slave同时开启Snapshot和AOF来进行持久化,保证数据的安全性
4、当master挂掉后,修改slave为master(或使用第三方主从自动切换工具来完成)
5、拷贝slave上的rdb文件到原master上来恢复原master数据,修改原master为slave,启动slave
6、原master恢复后再把它恢复成master,并把原slave恢复为slave
7、若master与slave都挂掉后,调用命令通过aof和snapshot进行恢复
关闭Snapshot的方法为取消redis.conf中所有“save xxx xxx”的配置。其中xxx为具体数值。
appendonly no
redis的主从自动切换功能也需要第三方的支持,可以使用keepalive工具来实现,但相对较麻烦,需要编写shell脚本。
分布式存储
目前,Redis本身并不支持集群功能,Redis自身的集群功能还在研发中,官方预计在3.0版本中才会加入此功能。因此,在分布式集群方面目前只能通过客户端工具来实现一致性哈希分布存储,即key分片存储。这里推荐使用Jedis,Jedis 是 Redis 官方首选的 Java 客户端开发包。
项目地址:https://github.com/xetorthio/jedis
架构:
/- Redis (node 1)
Client 1 ---\ /-- Redis (node 2)
Jedis --- Redis (node 3)
Client 2 --- / \-- Redis (node 4)
\- Redis (node 5)
使用Jedis进行分布式存储需要根据业务场景及数据特点对Jedis做适当包装。
场景及分析
目前主要用到Redis的地方有两个:设备上线接口和日志接收接口
设备上线接口:
特点:数据量有限且相对稳定,每条数据内容较小,读操作大于写操作,存储的数据可能需要长时间保存在redis里,数据可靠性要求较高。
鉴于以上特点要求redis具有高可用性及快速读取响应能力。
说明:
1、由Jedis完成redis的分布式存储,并进行包装对客户端提供统一接口。
2、以一个master-slave为一组的方式搭建集群。master上不做持久化以满足高响应速度的需求,只在slave端开启Snapshot和AOF来保证数据的可靠性。
3、在每个master-slave上都是用keepalive来实现自动接管,以保证redis服务的高可用性。
日志接收接口:
在redis中的存储类型:hash
特点:数据量不固定,每条数据内容较大,读写平均,存储的数据不需要长时间保存在redis里,宕机后允许丢失部分数据。
鉴于以上特点对redis要求较低,保证稳定和可扩容即可。
设计集群部署方案如下:
由Jedis完成redis的分布式存储,并进行包装对客户端提供统一接口。每个redis服务都开启Snapshot和AOF来保证数据的可靠性。
其他
推荐一些redis的监控工具如下:
监控服务
-Sentinel
Sentinel 是 Redis 自带的工具,它可以对 Redis 主从复制进行监控,并实现主挂掉之后的自动故障转移。在转移的过程中,它还可以被配置去执行一个用户自定义的脚本,在脚本中我们就能够实现报警通知等功能。
-Redis Live
Redis Live 是一个更通用的 Redis 监控方案,它的原理是定时在 Redis 上执行 MONITOR 命令,来获取当前 Redis 当前正在执行的命令,并通过统计分析,生成web页面的可视化分析报表。
-Redis Faina
Redis Faina 是由著名的图片分享应用 instagram 开发的 Redis 监控服务,其原理和 Redis Live 类似,都是对通过 MONITOR 来做的。
数据分布
弄清 Redis 中数据存储分布是一件很难的是,比如你想知道哪类型的 key 值占用内存最多。下面是一些工具,可以帮助你对 Redis 的数据集进行分析。
-Redis-sampler
Redis-sampler 是 Redis 作者开发的工具,它通过采样的方法,能够让你了解到当前 Redis 中的数据的大致类型,数据及分布状况。
-Redis-audit
Redis-audit 是一个脚本,通过它,我们可以知道每一类 key 对内存的使用量。它可以提供的数据有:某一类 key 值的访问频率如何,有多少值设置了过期时间,某一类 key 值使用内存的大小,这很方便让我们能排查哪些 key 不常用或者压根不用。
-Redis-rdb-tools
Redis-rdb-tools 跟 Redis-audit 功能类似,不同的是它是通过对 rdb 文件进行分析来取得统计数据的。