Redis配置文件、持久化、发布订阅、集群搭建


学习视频链接,示以尊重:https://space.bilibili.com/95256449/video


一、Redis配置文件

Redis的配置文件是 redis.conf 文件。

1.1 单位
# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes

配置文件 unit 单位,对大小写不敏感。

1.2 包含
# include /path/to/local.conf
# include /path/to/other.conf

引入外部配置文件,一起构成 redis 的配置文件。

1.3 网络
bind 127.0.0.1 # 绑定的ip
protected-mode yes # 保护模式 
port 6379 # 端口设置
1.4 通用 GENERAL
daemonize yes # 以守护进程的方式运行,默认是 no,需要自己开启为yes! 
pidfile /var/run/redis_6379.pid # 如果以后台的方式运行,就需要指定一个 pid 文件!

# 日志 
# Specify the server verbosity level. 
# This can be one of:
# debug (a lot of information, useful for development/testing)
# verbose (many rarely useful info, but not a mess like the debug level) 
# notice (moderately verbose, what you want in production probably) 生产环境 
# warning (only very important / critical messages are logged) 
loglevel notice 
logfile "" # 日志的文件位置名 
databases 16 # 数据库的数量,默认是 16 个数据库 
always-show-logo yes # 是否总是显示LOGO
1.5 快照

持久化,在规定的时间内,执行了多少次操作,则会持久化到文件 .rdb或者. aof 。redis 是内存数据库,如果没有持久化,那么在断电后,数据就会丢失!

# 如果900s内,至少有一个1个key进行了修改,则进行持久化操作 
save 900 1 
# 如果300s内,至少10个key进行了修改,则进行持久化操作 
save 300 10 
# 如果60s内,至少10000个key进行了修改,则进行持久化操作 
save 60 10000 

stop-writes-on-bgsave-error yes # 持久化如果出错,是否还需要继续工作
rdbcompression yes # 是否压缩 rdb 文件,需要消耗一些cpu资源!
rdbchecksum yes # 保存rdb文件的时候,进行错误的检查校验
dir ./ # rdb文件保存的目录,默认是当前目录下
1.6 SECURITY 安全

可以在这里设置redis的密码,默认是没有密码。

127.0.0.1:6379> ping PONG 
127.0.0.1:6379> config get requirepass # 获取redis的密码
1) "requirepass" 
2) "" 
127.0.0.1:6379> config set requirepass "123456"
OK 
127.0.0.1:6379> config get requirepass
(error) NOAUTH Authentication required. 
127.0.0.1:6379> ping 
(error) NOAUTH Authentication required. 
127.0.0.1:6379> auth 123456 # 使用密码进行登录! 
OK 
127.0.0.1:6379> config get requirepass 
1) "requirepass" 
2) "123456"
1.7 限制 CLIENTS
maxclients 10000 # 设置能连接上redis的最大客户端的数量 
maxmemory <bytes> # redis 配置最大的内存容量
maxmemory-policy noeviction # 内存到达上限之后的处理策略 

处理策略有如下几种:

  • volatile-lru:只对设置了过期时间的key进行LRU(默认值)
  • allkeys-lru :删除lru算法的key
  • volatile-random:随机删除即将过期key
  • allkeys-random:随机删除
  • volatile-ttl :删除即将过期的
  • noeviction :永不过期,返回错误
1.8 APPEND ONLY 模式 aof配置
appendonly no # 默认是不开启aof模式的,默认是使用rdb方式持久化的,因为在大部分所有的情况下,rdb完全够用 
appendfilename "appendonly.aof" # 持久化的文件的名字

# appendfsync always  # 每次修改都会 sync。消耗性能
appendfsync everysec # 每秒执行一次 sync,可能会丢失这 1s 的数据
# appendfsync no # 不执行 sync,这个时候操作系统自己同步数据,速度最快

二、Redis持久化(面试重点)

Redis 是内存数据库,如果不将内存中的数据库状态保存到磁盘,那么一旦服务器进程退出,服务器中的数据库状态也会消失。所以 Redis 提供了持久化功能

2.1 RDB(Redis DataBase)

在指定的时间间隔内将内存中的数据集快照写入磁盘,它恢复时是将快照文件直接读到内存里。

Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的。 这就确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那 RDB 方式要比 AOF 方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。默认的就是 RDB,一般情况下不需要修改这个配置!

rdb保存的文件是dump.rdb ,都是在配置文件中的“快照”模块进行配置的。(有时候在生产环境会将 dump.rdb 进行备份)

触发机制:

  • save的规则满足的情况下,会自动触发rdb规则
  • 执行 flushall 命令,也会触发rdb规则
  • 退出redis,也会产生 rdb 文件
  • 备份就自动生成一个 dump.rdb

恢复rdb文件:

1、只需要将rdb文件放在 redis 启动目录就可以,redis启动的时候会自动检查 dump.rdb 文件,并且恢复其中的数据!

2、查看需要存在的位置

127.0.0.1:6379> config get dir
1) "dir" 
2) "/usr/local/bin" # 如果在这个目录下存在 dump.rdb 文件,启动就会自动恢复其中的数据

优点:

  • 适合大规模的数据恢复
  • 对数据的完整性要不高

缺点:

  • 需要一定的时间间隔进行操作,如果redis意外宕机了,这个最后一次修改数据就没有了
  • fork 进程的时候,会占用一定的内存空间
2.2 AOF(Append Only File)

以日志的形式来记录每个写操作,将Redis执行过的所有指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。

简单讲:将所有的命令都记录到history文件中,恢复的时候就把这个文件重新执行一次

**Aof 保存的是 appendonly.aof 文件。**同样可以在配置文件中进行配置。

Aof 默认是不开启的,需要手动进行配置:将 appendonly 改为 yes 即可开启 aof。之后重启 redis ,就可以生效了。

如果这个 aof 文件有错误,这时候 redis 是启动不起来的,需要修复这个aof文件。redis 给我们提供了一个工具:

redis-check-aof --fix appendonly.aof

aof 默认就是文件的无限追加,文件会越来越大。如果 aof 文件大于 64m,fork一个新的进程来将我们的文件进行重写

优点:

  • 每一次修改都同步,文件的完整会更加好
  • 每秒同步一次,可能会丢失一秒的数据
  • 从不同步,效率最高的

缺点:

  • 相对于数据文件来说,aof远远大于 rdb,修复的速度也比 rdb慢
  • Aof 运行效率也要比 rdb 慢,所以redis默认的配置就是rdb持久化
2.3 扩展

1、RDB 持久化方式能够在指定的时间间隔内对你的数据进行快照存储

2、AOF 持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以Redis 协议追加保存每次写的操作到文件末尾,Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大。

3、只做缓存,如果你只希望你的数据在服务器运行的时候存在,也可以不使用任何持久化

4、同时开启两种持久化方式

  • 在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF 文件保存的数据集要比RDB文件保存的数据集要完整。
  • RDB 的数据不实时,同时使用两者时服务器重启也只会找AOF文件,那要不要只使用AOF呢?建议不要,因为RDB更适合用于备份数据库(AOF在不断变化不好备份),快速重启,而且不会有 AOF可能潜在的Bug,留着作为一个万一的手段。

5、性能建议

  • 因为RDB文件只用作后备用途,建议只在Slave上持久化RDB文件,而且只要15分钟备份一次就够了,只保留 save 900 1 这条规则。
  • 如果Enable AOF ,好处是在最恶劣情况下也只会丢失不超过两秒数据,启动脚本较简单只load自 己的AOF文件就可以了,代价一是带来了持续的IO,二是AOF rewrite 的最后将 rewrite 过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的。只要硬盘许可,应该尽量减少AOF rewrite 的频率,AOF重写的基础大小默认值64M太小,可以设到5G以上,默认超过原大小100%大小重写可以改到适当的数值。
  • 如果不Enable AOF ,仅靠 Master-Slave Replication 实现高可用性也可以,能省掉一大笔IO,也减少了rewrite时带来的系统波动。代价是如果Master/Slave 同时宕机,会丢失十几分钟的数据, 启动脚本也要比较两个 Master/Slave 中的 RDB 文件,载入较新的那个,微博就是这种架构。

三、Redis发布订阅

Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。例如:微信、 微博、关注系统!其中,Redis 客户端可以订阅任意数量的频道。

测试:

# 订阅者订阅频道xingyu,一直在等待读取信息,当发送者在此频道发送消息后,订阅者就接受到了发送的消息
127.0.0.1:6379> SUBSCRIBE xingyu
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "xingyu"
3) (integer) 1
1) "message"
2) "xingyu"
3) "woaini"

# 发送者在频道xingyu发送消息
127.0.0.1:6379> PUBLISH xingyu woaini
(integer) 1

原理:

Redis 通过 PUBLISH 、SUBSCRIBE 和 PSUBSCRIBE 等命令实现发布和订阅功能。

通过 SUBSCRIBE 命令订阅某频道后,redis-server 里维护了一个字典,字典的键就是一个个频道,而字典的值则是一个链表链表中保存了所有订阅这个 channel 的客户端。SUBSCRIBE 命令的关键, 就是将客户端添加到给定 channel 的订阅链表中。

通过 PUBLISH 命令向订阅者发送消息,redis-server 会使用给定的频道作为键,在它所维护的 channel 字典中查找记录了订阅这个频道的所有客户端的链表,遍历这个链表,将消息发布给所有订阅者

Pub/Sub 从字面上理解就是发布(Publish)与订阅(Subscribe),在Redis中,可以设定对某一个 key 值进行消息发布及消息订阅,当一个key值上进行了消息发布后,所有订阅它的客户端都会收到相应的消息。这一功能最明显的用法就是用作实时消息系统,比如普通的即时聊天,群聊等功能。

使用场景:

  • 实时消息系统
  • 实时聊天(频道当做聊天室,将信息回显给所有人即可!)
  • 订阅,关注系统

稍微复杂的场景会使用消息中间件 MQ 。


四、Redis集群环境搭建

127.0.0.1:6379> info replication #查看当前库的信息
# Replication
role:master # 角色
connected_slaves:0 # 从机数量(当前为0)
master_replid:4c633828bfed95b9b6655da1db03519fcdc63a94
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

复制3个配置文件,然后修改对应的信息:

  • 端口
  • pid 名字
  • log文件名字
  • dump.rdb 名字

修改完毕之后,启动3个redis服务器,可以通过进程信息查看

[root@iZ2ze436suxwekgjxx28iaZ bin]# ps -ef|grep redis
root     20057     1  0 15:47 ?        00:00:00 redis-server 127.0.0.1:6379
root     20065     1  0 15:48 ?        00:00:00 redis-server 127.0.0.1:6380
root     20071     1  0 15:48 ?        00:00:00 redis-server 127.0.0.1:6381
root     20078 19933  0 15:48 pts/0    00:00:00 grep --color=auto redis

五、Redis主从复制

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点 (master/leader),后者称为从节点(slave/follower);数据的复制是单向的,只能由主节点到从节点。 Master以写为主,Slave 以读为主。

默认情况下,每台Redis服务器都是主节点; 且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点

主从复制的作用主要包括:

  • 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
  • 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务 的冗余。
  • 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务 (即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写 少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
  • 高可用(集群)基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。

一般来说,要将Redis运用于工程项目中,只使用一台Redis是万万不能的(宕机),原因如下:

  • 从结构上,单个Redis服务器会发生单点故障,并且一台服务器需要处理所有的请求负载,压力较大
  • 从容量上,单个Redis服务器内存容量有限,就算一台Redis服务器内存容量为256G,也不能将所有内存用作Redis存储内存,一般来说,单台Redis最大使用内存不应该超过20G。 电商网站上的商品,一般都是一次上传,无数次浏览的,专业地讲就是"多读少写"。

**主从复制,读写分离:**可以减缓服务器的压力,因为 80% 的情况下都是在进行读操作,在架构中经常使用。只要在公司中,主从复制就是必须要使用的,因为在真实的项目中不可能单机使用Redis。

5.1 一主二从

默认情况下,每台Redis服务器都是主节点; 一般情况下只用配置从机就可以。

127.0.0.1:6380> SLAVEOF 127.0.0.1 6379 # 将127.0.0.1:6379作为主机
OK
127.0.0.1:6380> info replication
# Replication
role:slave # 角色为 slave
master_host:127.0.0.1 # 主机IP
master_port:6379 # 主机端口号
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:14
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:4f5212dbcb5b21132badeee4642dd3b9c5ca335c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14

对应的主机信息:

127.0.0.1:6379> info replication
# Replication
role:master # 角色为 master
connected_slaves:2 # 从机数量为 2
slave0:ip=127.0.0.1,port=6381,state=online,offset=14,lag=1 # 从机一
slave1:ip=127.0.0.1,port=6380,state=online,offset=14,lag=1 # 从机二
master_replid:8f286a2b1366e930d4c6e6968b567b974c42a8b1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14

注意 :真实的从主配置应该在配置文件中配置,这样的话是永久的,这里使用的是命令,是暂时的。

# 在从机的配置文件中进行配置,这样的话,该redis一旦启动就会作为从机
replicaof <masterip> <masterport>
5.2 细节

1、主机可以写,从机不能写只能读。主机中的所有信息和数据,都会自动被从机保存。

2、主机断开连接,从机依旧连接到主机的,但是没有写操作。这个时候,主机如果回来了,从机依旧可以直接获取到主机写的信息。

3、如果是使用命令行,来配置的主从,这个时候如果重启了,就会变回主机。只要变为从机,立马就会从主机中获取值。

4、复制原理:

Slave 启动成功连接到 master 后会发送一个 sync 同步命令,Master 接到命令,启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,并完成一次完全同步。

  • 全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
  • 增量复制:Master 继续将新的所有收集到的修改命令依次传给slave,完成同步

只要是重新连接master,一次完全同步(全量复制)将被自动执行,数据一定可以在从机中获取到。

5、如果主机断开了连接,可以使用 SLAVEOF no one 命令让自己变成主机。其他的节点就可以手动连接到最新的这个主节点(手动)。如果这个时候老大修复了,那就重新连接


猜你喜欢

转载自blog.csdn.net/qq_40585800/article/details/106948201