目录
一、概述 4
1.1 目的 4
1.2 适用对象 4
1.3 文档内容 4
二、下载Redis及安装Redis 4
2.1 下载Redis 4
2.2 安装Redis 4
2.2.1 解压和编译 4
2.2.2 创建工作目录 5
三、 配置Redis 5
3.1 设置后台运行 5
3.2 设置工作目录 6
3.3 设置监听地址 6
3.4 设置pid存放路径 6
3.5 设置主从复制 7
3.6 修改脚本文件 7
四、使用Redis 8
4.1 启动Redis 8
4.2 停止Redis 8
4.3 使用redis-cli 8
4.4 查看主从及测试 9
五、配置Redis哨兵 10
5.1 哨兵配置 11
5.2 哨兵启动和停止 12
5.3 主从延迟 12
5.4 SpringBoot使用哨兵模式 13
六、Redis集群(RedisCluster) 14
七、 Redis日志分片 14
7.1 创建脚本 14
7.2 加上crontab 15
八、Redis配置解析 15
为引导团队对Redis工具的使用,将此工具高速、标准地接入到线上发卡系统,提高团队生产力,特制订此操作指南。本指南依据Redis官方文档(https://redis.io/documentation),可对详细过程进行理解和参考。除此之外,还对操作目录进行了规范,避免了多台机器目录不一致的问题。
本文档适用于信用卡线上发卡开发人员,以开发人员的角度来进行操作,开发环境为开发测试网络,操作系统为Linux主机,目录为/app/xsfk/,本问以redis-5.0.7为例,其他版本基本操作一致。
本指南包括了Redis的下载、安装、配置、使用。
如果本机已存在redis安装目录,则无需下载。
不存在请下载,下载地址为:
$ curl -O 20.200.13.212/download/redis-5.0.7.tar.gz
设定包位置为/app/xsfk/redis-5.0.7.tar.gz, 解压tar包:
$ tar -zxvf redis-5.0.7.tar.gz
$ cd redis-5.0.7
$ make
$ sudo make install (此步骤需要root添加sudo)
如果没有报错,则安装成功。
$ mkdir -p /app/xsfk/redis //作为redis工作目录
$ cp -R /app/xsfk/redis-5.0.7/utils /app/xsfk/redis
$ cp /app/xsfk/redis-5.0.7/redis.conf /app/xsfk
/redis
注意:设置完工作目录,则源代码目录/app/xsfk/
redis-5.0.7则没有作用了,可以进行删除操作。
本节编辑并配置redis.conf文件。
Redis默认前台运行,所以需要修改:
将daemonize no 改为 daemonize yes,如下图所示:
Redis默认为当前路径,需要设置为在2.2.2中的目录,如下图所示:
Redis默认只监听本机,导致外部访问不了本机,所以需要修改,将bind绑定为0.0.0.0,如下图所示:
Redis pid文件默认在/var/run/redis.pid,当我们以xsfk用户运行redis的时候,会因权限问题无法写入pid到这个文件,所以需要修改,将pid文件放置在我们的工作目录,如下图所示:
在本项目中Redis一共有两台,正常的redis本应该为三台,为一主两从,我们暂时没有那么多台机器,所以为一主一从,默认137为主服务器,138为从服务器,所以仅仅需要修改138即可,如下图所示:
打开在本项目中utils文件夹,编辑redis_init_script脚本文件,修改如下图所示:
请注意CONF和PIDFILE修改为2.2.2和3.4节所配置的。
在工作目录/app/xsfk/redis下进行如下操作:
$ utils/redis_init_script start
注意:如果redis_init_script没有执行权限,请加入执行:
chmod a+x redis_init_script
在工作目录/app/xsfk/redis下进行如下操作:
$ utils/redis_init_script stop
注意:如果进行重启操作,请分别执行上述两条指令。
禁止使用 kill -9停止Redis,不但不会做持久化操作,还会造成缓冲区等资源不能优雅关闭。极端情况下造成AOF和复制丢失数据的情况。
在工作目录/app/xsfk/redis下进行如下操作:
$ redis-cli //连接本地redis服务端
127.0.0.1:6379>ping
PONG //如果为pong则本机测试成功。
$ redis-cli -h 20.201.22.137 -p 6379
20.201.22.137:6379>ping
PONG //如果为pong则连其他机器成功。
如果分别运行redis客户端:
在137(主服务器上),如下图所示:
我们主要看上图的 role 和 connected_slaves,slave0,发现137的角色是master,有一个连接的slave,且slave0的ip是138。
然后我们再看138的信息:
发现138的角色是slave,并标识了它的master的ip和port,以及连接master的状态为up。
最后我们测试一下:
在137上面写一个语句,看138是否能查询得到:
进入137,执行redis-cli
127.0.0.1:6379> set name liushiqiang
如下图:
然后切换至138,执行redis-cli
127.0.0.1:6379> get name
能得出字符串的值,这样达到了主从复制和读写分离的效果。
哨兵模式(Redis Sentinel)是一个高可用方案,用来抵抗节点故障,当故障发生时可以自动进行从主切换,程序可以不用重启,无需人工操作。
编辑sentinel.conf
1.#绑定地址
bind 0.0.0.0
daemonize yes
pidfile /app/xsfk/redis/redis_sentinel.pid
logfile /app/xsfk/redis/log/redis_sentinel.log
dir /app/xsfk/redis/
Sentinel monitor mymaster 20.201.22.137 6379 2
此ip为master IP地址,6379是端口号,2是quorum,也就是投票的哨兵个数。一般一主两从的结构,则这个数为2。
创建utils/sentinel_init_script文件,复制utils/
redis_init_script脚本内容,修改为如下所示:
端口修改为:
SENTINELPORT=26379
EXEC=/usr/local/bin/redis-sentinel
CLIEXEC=/usr/local/bin/redis-cli
PIDFILE=/app/xsfk/redis/redis_sentinel.pid
CONF=/app/xsfk/redis/sentinel.conf
然后再修改下面使用到的端口:
$CLIEXEC -p $SENTINELPORT shutdown
还包括一些提示信息,例如:
echo “Redis sentinel stopped”
Redis 主从采用异步复制,意味着当主节点挂掉时,从节点可能没有收到全部的同步消息,这部分未同步的消息就丢失了。如果主从延迟特别大,那么丢失的数据就可能会特别多。Sentinel 无法保证消息完全不丢失,但是也尽可能保证消息少丢失。它在redis.conf里面有两个选项可以限制主从延迟过大。
min-slaves-to-write 1
min-slaves-max-lag 10
第一个参数表示主节点必须至少有一个从节点在进行正常复制,否则就停止对外写服务,丧失可用性。
第二个参数用于区分何为正常复制,何为异常复制,它的单位是秒,表示如果 10s 没有收到从节点的反馈,就意味着从节点同步不正常,要么网络断开了,要么一直没有给反馈,也就是此时为异常复制。
以application.properties为例:
# config redis
spring.redis.database=0
spring.redis.sentinel.master=mymaster
spring.redis.sentinel.nodes=ip1:26379,ip2:26379,ip3:26379
spring.redis.pool.max-idle=8
spring.redis.pool.max-active=10
spring.redis.pool.max-wait=3
spring.redis.pool.min-idle=0
Redis默认是不保存日志的,但是我们设置保存日志,周期为30天,超过30天的自动删除,创建一个脚本,脚本内容如下:
/app/xmgl/redis/log/*.log {
daily
rotate 30
dateext
missingok
create 644 xmgl xmgl
compress
delaycompress
dateyesterday
copytruncate
}
将脚本加上执行权限:
$ chmod a+x redisForLogSlice
将脚本加上执行权限:
$ crontab -l //查看当前的任务
$ crontab -e //编辑任务
5 0 * * * /usr/sbin/logrotate -f /app/xsfk/redis/utils/redisForLogSlice -s /app/xsfk/redis/logrotate.status
1.# redis进程是否以守护进程的方式运行,yes为是,no为否
daemonize no
2.# 指定redis进程的PID文件存放位置
pidfile /var/run/redis.pid (默认放置路径)
3.# redis进程的端口号
port 6379
4.# 绑定的主机地址
bind 127.0.0.1
5.# 客户端闲置多长时间后关闭连接,默认此参数为0即关闭此功能
timeout 300
6.#redis日志级别,可用的级别有debug.verbose.notice.warning
loglevel verbose
6.# log文件输出位置,如果进程以守护进程的方式运行,此处又将输出文件设置为stdout的话,就会将日志信息输出到/dev/null里面去了
logfile stdout
7.# 设置数据库的数量,默认为0可以使用select
databases 16
8.# 指定在多少时间内刷新次数达到多少的时候会将数据同步到数据文件
save
9.# 指定存储至本地数据库时是否压缩文件,默认为yes即启用存储
rdbcompression yes
10.# 指定本地数据库文件名
dbfilename dump.db
11.# 指定本地数据问就按存放位置
dir ./
12.# 指定当本机为slave服务时,设置master服务的IP地址及端口,在redis启动的时候他会自动跟master进行数据同步
slaveof
13.# 当master设置了密码保护时,slave服务连接master的密码
masterauth
14.# 设置redis连接密码,如果配置了连接密码,客户端在连接redis是需要通过AUTH
requirepass footbared
15.# 设置同一时间最大客户连接数,默认无限制。redis可以同时连接的客户端数为redis程序可以打开的最大文件描述符,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回 max number of clients reached 错误信息
maxclients 128
16.# 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key。当此方法处理后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区
maxmemory
17.# 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no。
appendonly no
18.# 指定跟新日志文件名默认为appendonly.aof
appendfilename appendonly.aof
19.# 指定更新日志的条件,有三个可选参数 - no:表示等操作系统进行数据缓存同步到磁盘(快),always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全), everysec:表示每秒同步一次(折衷,默认值);
appendfsync everysec
Redis集群请查看另外一篇文章。