Redis

Redis 是一款开源的内存数据结构存储系统,常用于数据库、缓存和消息队列。本文介绍了Redis的配置,包括网络服务、一般设置、安全、资源限制等,并详细讲解了持久化(RDB和AOF)、主从复制以及Sentinel哨兵系统的配置方法。此外,还提及了Redis的集群配置和数据分布策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Redis

官方网址:https://redis.io/

Redis(Remote Dictionary Server)是一款开源的基于内存的数据结构存储服务,可以作为数据库DataBase、缓存Cache和消息队列Message Queue使用,并且是基于Key--Value存储的分布式系统

Redis的是通过单进程处理N个请求,工作方式是C/S架构


Redis的程序配置

Redis的程序包在epel源中提供,程序包名即为redis

主配置文件:/etc/redis.conf 服务名:redis.service 数据存储文件:/var/lib/redis

服务启动后,默认是监听在本机的TCP协议:6379端口

 

客户端工具命令:/usr/bin/redis-cli

可直接进入交互式状态,通过键入“HELP @GROUP”(大小写不敏感,GROUP代表支持的数据结构)来查看相关数据库结构下的指令用法

也可连接远程服务器:redis-cli -h REMOTE_HOST -a PASSWORD -p PORT

 

当需要启动Redis服务时,主配置文件/etc/redis.conf常用的配置段和常用选项配置如下:

1.NETWORK (网络服务相关配置段)

bind 0.0.0.0                     指定监听本机的所有可用的地址,从而实现被远程连接

protected-mode yes   启用保护模式(生效情况:没有启用bind以及没有使用requirepass认证,此时远程Client则不可以连接),以防redis被不明客户端连接进行误操作

port 6379                         默认监听端口,可修改

2.GENERAL (一般性配置段)

daemonize no               默认是不作为守护进程运行(CentOS 7 中的systemd作为总线来管理这些服务,但是在CentOS 6中是依靠脚本运行,仍然需要开启)

databases 16                 设定redis服务器能够支持的数据库个数,默认16个(编号从0开始)

3.SECURITY (安全相关配置)

requirepass PASSWORD   (默认关闭)需要开启,设定指定密码,从而客户端连接时需要输入此认证密码,客户端连接时可以直接加“-a PASSWORD”选项,或者是进入交互式状态后,输入“AUTH PASSWORD”进行认证

4.LIMITS (资源限制,因为redis是将数据放在内存中,若数据太多超过内存大小,则会使用交换分区,导致性能急剧下降)

maxclients 10000                         最大并发链接数,默认10000个

maxmemory VALUE                    指定本地主机可使用的最大内存大小,单位是bytes,默认没有设定

maxmemory-policy noeviction 当内存超出指定最大值时,采取的淘汰策略,默认是不淘汰(redis作为存储数据服务使用此策略)

其中淘汰策略还有如下:

volatile/allkeys-lru/random        (基于lru算法或者random算法只淘汰设置了过期时间的Key/淘汰所有Key)、volatile-ttl(只淘汰最接近过期时间的Key)

maxmemory-sample 5                   随机找出满足设定的淘汰策略的Key进行比较,从而淘汰其中的某个,默认的比较个数为5



 

Redis的持久化

当Redis作为数据库使用时,需要数据的持久存储,Redis则有如下两种启用持久化的方法:

1.RDB(也称为:SNAPSHOTTING快照)

二进制文件格式存储,按事先定制的策略,周期性地将数据从内存同步至磁盘实现完全备份,快照文件默认:/var/lib/redis/dump.rdb

客户端可使用SAVE或BGSAVE命令来手动启动快照保存机制:

SAVE:同步,即在主线程中保存快照,此时会阻塞所有客户端请求

BGSAVE:异步,backgroud后台操作

需要的配置在主配置文件/etc/redis.conf中的 SNAPSHOTTING 段,配置如下:

save 900 1

save 300 10

save 60 10000

以上为默认设置,表示:三个策略满足其中任意一个均会触发SNAPSHOTTING操作;900s内至少有一个key有变化,300s内至少有10个key有变化,60s内至少有1W个key发生变化(也可根据实际情况定义更多的策略)

dbfilename dump.rdb   默认的快照文件名

dir /var/lib/redis              默认的存放路径(实际生产中则会单独的存放在另外的磁盘中,保证数据的安全)

rdbchecksum yes         通过校验码检测数据是否发生错误

rdbcompression yes     采用压缩,降低快照文件大小,提高I/O性能

stop-writes-on-bgsave-error yes 当快照出现问题时,禁止新的写入操作请求

2.AOF(Append Only File)

将每次执行过的语句存放在文件中,利用fsync实现数据及时从内存同步到磁盘中,当redis服务器重启后,可通过重新调用文件执行存储的语句内容来实现重建数据库

需要的配置在主配置文件/etc/redis.conf中的 APPEND ONLY MODE 段,配置如下:

appendonly no    默认是不启用AOF

appendfilename "appendonly.aof"  默认的存放文件名,开启的情况下,路径在 /var/lib/redis 目录下

appendfsync        no:redis不执行主动同步操作,而是全凭内核进行同步

                                 everysec:每秒一次同步(默认使用)

                                always:每语句每次立即同步

auto-aof-rewrite-percentage 100 默认当变化量超过原有数据达到100%,则进行一次数据的重覆盖到磁盘存储文件中

auto-aof-rewrite-min-size 64mb   默认当AOF的文件大小达到64M时,执行重写机制

(注意以上两条选项同时满足时,才会生效,相当于重新创建新文件替换旧文件)

客户端也可使用 BGREWRITEAOF 指令:实现AOF文件重写,不会读取正在使用AOF文件,而是通过将内存中的数据以命令的方式保存至临时文件中,完成之后替换原来的AOF文件;

需要注意的是,以上两种持久化一般情况下是不会同时开启的,若是两者都开启,则有以下两个特点:

1.BGSAVE和BGREWRITEAOF不会同时进行

2.Redis服务器启动时用持久化的数据文件恢复数据,会优先使用AOF



Redis的主从复制(master/slave)

主从复制是将“读”操作进行分散调度,对于“写”操作,仍然是master独立提供

配置方法:

方法一:配置文件中设置

1.在slave节点上的配置文件/etc/redis.conf中的 REPLICATION 段中设置如下选项:

slaveof MASTER_IP MASTER_PORT   指定主节点IP地址和监听端口

masterauth MASTER_PASSWORD       若是主节点master需要认证,这里指定主节点认证密码

slave-read-only yes                                    设定只读功能(必须)

slave-priority 100                                        复制集群中,主节点故障时,sentinel应用场景中的主节点选举时使用的优先级;数字越小优先级越高,但0表示不参与选举;

2.slave节点还需将监听地址改为本机所有“bind 0.0.0.0”,从而可以对外通信

(注意:当从节点一直连接不上主节点时,则会自动关闭自己从节点的身份)

方法二:在命令行中设置

在slave节点上,进入redis-cli交互状态:

SLAVEOF MASTER_IP MASTER_PORT

CONFIG SET masterauth MASTER_PASSWORD

CONFIG REWRITE

注意在slave节点上也应该设置密码认证,并且最好与master密码认证一样,这样可以在后续master宕机后,某个slave升级为新master后,其余的slave仍然可以连接新master


在客户端工具redis-cli交互式状态中,有运维经常需要使用的指令如下:

INFO 可查看当前redis各种统计数据,和服务器端的工作状态

KEYS * 查看已有的Key

CLIENT LIST 查看已连接的客户端列表

CONFIG SET 设置配置参数

GET 查看配置参数

REWRITE 将命令行设置的参数重写到配置文件中,从而实现永久生效

RESETSTAT 重新置零以储存状态信息



sentinel作为内建功能,监控着Redis的主从复制集群,当master宕机后,可自动实现某个slave提升为新master

但是为避免主观判断性,一般情况下需要奇数个独立的sentinel节点(实际生产中也可在主从节点上进行sentinel节点配置)监控master节点,当出现半数以上判断master宕机,则此时会开始选举某个slave作为新master,并且是基于slave设置的优先级来决定

所有的sentinel节点上配置相同

在配置文件 /etc/redis-sentinel.conf 设置如下:

port 26379

bind 0.0.0.0    (必须启用,否则会受保护,需要启用另外的连接redis-sentinel的密码)

sentinel monitor NAME MASTER_IP MASTER_PORT <quorum>     自定集群名NAME和指定master的IP地址和端口,<quorum>表示sentinel集群的quorum机制,即至少有quorum个sentinel节点同时判定主节点故障时,才认为其真的故障

sentinel auth-pass NAME MASTER_PASSWORD           指定集群的master认证密码

sentinel down-after-milliseconds NAME TIME                 监控到指定集群的master节点异常状态持续多久方才将标记为“故障”,TIME的单位默认为毫秒

sentinel parallel-syncs NAME <numslaves>                      指在提升新master过程中,能够被sentinel并行配置的从节点的数量

sentinel failover-timeout NAME TIME sentinel                  必须在此指定的时长内完成故障转移、提升新master操作,否则,将视为提升新master操作失败,默认单位为毫秒

 

实际生产中,客户端访问Redis的主从复制集群时,还需要另外的语句路由器才能真正做到实现读写分离



数据分为源数据Key和数据Value,两者分开存放,通常意义上的分布就是指数据Value的分布,Key作为路由使用

有中心节点(leader)专门存放Key,然后Value分散在各节点存放,客户端访问leader来获取Value

无中心节点,每个节点只存放部分Value,但是每个节点都存放Key,通过内部协调协议同步,客户端可访问任何节点来获取任何Value

 

Redis Cluster就是属于无中心节点的集群架构模式,cluster属于redis的内建属性,可直接使用

(注意此时集群内节点间不应该启用主从复制)

 

Redis Cluster是两级路由,便于扩缩容

一级路由是通过将每个Key进行hash计算后对16384进行取模,取出的值得范围属于 0--16383(每个数字代表一个数据分片shard),从而进行对应分片存放

二级路由是手工在集群中的节点上分配 0--16383 个数据分片

 

Redis Cluster的配置过程:

1.各节点相关配置在/etc/redis.conf中的 CLUSTER 段进行配置:

cluster-enable yes                              启用集群设置

cluster-config-file FILE_NAME        集群节点集群信息配置文件,每个节点都有一个,由redis自动生成和更新,配置时避免名称冲突,存放的路径是在 /var/lib/redis 目录下,并且需要注意此文件要对redis用户有 r、w权限

cluster-node-timeout TIME               集群节点互连超时的阈值,单位毫秒

cluster-slave-validity-factor TIME   进行故障转移时,salve会申请成为master;有时slave会和master失联很久导致数据较旧,这样的slave不应该成为master,这个配置用来判断slave是否和master失联时间过长

 

2.各节点上述配置设置好后启动redis,开始分配slots(分片编号)

redis-cli -c -h Node_IP -p 7000 cluster addslots {0..5000} (不进入redis_cli交互状态进行分配)

注意实际情况,在各节点上单独执行此命令,并且需要根据实际的节点数来均衡的分配slots(上述{0..5000}是样例)

3.在其中一个节点上设定一下与其他节点的集群关系

使用redis-cli进入交互状态,执行如下指令:

CLUSTER MEET Node_IP Node_PORT (不包括自身节点,其余节点的IP地址和监听端口号)

上述配置结束,实现集群



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值