Redis 学习笔记(三):主从复制、主从配置和性能测试

目录:

主从复制

master-slave 主从配置

备份与恢复

性能测试

管道技术

一 主从复制

Redis的主从复制功能非常强大,一个master可以拥有多个slave,而一个slave又可以拥有多个slave,如此下去,形成了强大的多级服务器集群架构。


主库只负责写数据,每次有数据更新都将更新的数据同步到它所有的从库,而从库只负责读数据。这样一来,就有了两个好处:

读写分离,不仅提高服务器的负载能力,并且可以根据读请求的规模自由增加或者减少从库的数量;

数据被复制成了了好几份,就算有一台机器出现故障,也可以使用其他机器的数据快速恢复。

需要注意的是:在Redis主从模式中,一台主库可以拥有多个从库,但是一个从库只能隶属于一个主库。

复制功能不会阻塞主服务器: 即使有一个或多个从服务器正在进行初次同步, 主服务器也可以继续处理命令请求。复制功能也不会阻塞从服务器。

复制过程

  1. 初始化:当一个从数据库启动时,会向主数据库发送SYNC命令,主数据库收到命令后,会开始在后台保存快照(执行 BGSAVE 命令保存RDB),并将保存快照期间接收到的命令缓存起来。当快照完成后,Redis会将快照文件和缓存的命令发给从数据库,从数据库收到数据后,会载入快照文件并执行缓存的命令。
  2. 同步阶段:复制初始化之结束后,主数据库每收到写命令时就会将命令同步给从数据库,从而保证主从数据库数据一致


需要注意:

当主从连接断开后,会重新进行复制初始化过程。但是主从服务器的数据库状态不一致的部分只有断线后主服务器执行那一部分修改数据库的命令,所以这时SYNC命令就非常浪费。Redis 2.8版本支持当从数据库再次连接到主数据库时,主数据库只需要将断线期间执行的命令发给从数据库,使用命令 PSYNC 用于断线后重连。

复制同步在整个主从同步过程,直到主从关系终止为止。在复制过程中,即使关闭了RDB方式的持久化,依旧会执行快照操作。

乐观复制

Redis 容忍在一定时间内主从数据库的内容是不同的,但是两者的数据最终会保持一致。

具体来说,Redis主从数据库之间的复制数据的过程本身是异步的,这意味着,主数据库执行完客户端的写请求后会立即将命令在主数据库的执行结果返回给客户端,而不会等待从数据库收到该命令后再返回给客户端。这一特性保证了复制后主从数据库的性能不会受到影响,但也会在一段时间内一个主从数据库数据不一致。

主数据库无法得知命令最终同步给了几个从数据库,不过Redis提供了两个配置选项来限制只有至少同步给指定数量的数据库时,主数据库才是可写的:

min-slaves-to-write 3

min-slave2-max-lag 10

第一个参数表示只有当3个或3个以上的从数据库连接到主库时,主数据库才是可写的,否则返回错误。

第二个参数表示允许从数据库失去连接的最长时间,该选项默认是关闭的,在分布式系统中,打开并合理配置该选项可以降低主从架构因为网络分区导致的数据不一致问题。

持久化方式 RDB 和 AOF

RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot),是在某个时间点上的数据集。

特点:

  • 1)RDB 文件内容非常紧凑,非常适合用于进行备份,可以随时将数据集还原到不同的版本;
  • 2)RDB 恢复数据集的速度也要比 AOF 恢复的速度要快。
  • 3)在服务器发生故障时,可能会丢失一段时间内的数据;
  • 4)如果数据集比较大,fork 会很耗时,影响服务性能。

AOF(append-only file)持久化记录服务器执行的所有写操作命令,新命令会被追加到文件的末尾。

特点:

  • 1)数据集完整性较好;
  • 2)只进行追加操作,写入速度比较快;
  • 3)AOF 文件变大时会进行重写操作,包含恢复当前数据集所需的最小命令集合;
  • 4)AOF 文件容易进行分析。

Redis 支持同时使用 AOF 持久化和 RDB 持久化。 在这种情况下,当 Redis 重启时,它会优先使用 AOF 文件来还原数据集, 因为 AOF 文件保存的数据集通常比 RDB 文件所保存的数据集更完整。

关于 redis 持久化的更详细的内容可以参考这篇文章https://my.oschina.net/davehe/blog/174662#comment-list


二 主从配置

1.下载安装

下载之后,复制两份压缩文件,分别命名为 **_6380 和 **_6381,分别表示两个 slave。分别解压三个文件。

Windows下解压之后可以直接配置运行;linux下还需要对每个解压文件编译,具体可以参考这里。

windows下的三个文件

linux下的三个文件

2. 修改slave的redis配置文件(Windows下是redis.window.conf,linux下是redis.conf)

主要是设置 port 和 slaveof 这两个参数。其他参数按需要设置。

slave1 的配置修改:

port 6380 #slave1 端口

slaveof 127.0.0.1 6379 #master IP地址和端口

slave2 的配置修改:

port 6381 #slave2 端口

slaveof 127.0.0.1 6379 #master IP地址和端口

3.启动 master、slave1 和 slave2

master

slave1 

slave2


master 日志如下:

4.客户端连接、测试

master 设置字符串

slave 读取字符串

一般来说,slave 只能读,不能写

slave-read-only 参数可以设置从数据库为读写,不过不建议这么做,因为从库中修改的数据不会被同步到任何其他数据库。

相同的道理,配置多台从库也使用相同的方法,都在从库的配置文件中加上slaveof参数即可。

5.切换主库

SLAVEOF 新主库地址 新主库端口

来修改当前数据库的主库,如果当前数据库已经是其他库的从库, 则当前数据库会停止和原来的数据库的同步而和新的数据库同步。

SLAVEOF NO ONE

来停止接受来自其他数据库的同步而升级成为主库。

三 备份与恢复

相关命令:

命令

描述

SAVE

备份:在redis目录中创建备份文件

CONFIG GET dir

路径:数据库存放

CONFIG GET dbfilename

数据库名

BGSAV

后台备份

恢复数据

如果需要恢复数据,只需将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可。获取 redis 目录可以使用CONFIG 命令。


四 性能测试

redis 性能测试工具是自带的 redis-benchmark,基本命令如下:

redis-benchmark[option][option value]

常见可选参数如


启动一个终端,切换到 redis 解压或安装目录,运行 redis-benchmark (服务端需要保持运行)


五 管道

Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。这意味着通常情况下一个请求会遵循以下步骤:

  1. 客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应。服务端处理命令,并将结果返回给客户端。
  2. Redis 管道技术可以在服务端未响应时,客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响应。

管道最显著的优势:提高了 redis 服务的性能。


参考:

http://www.runoob.com/redis/redis-pipelining.html

http://blog.csdn.net/u014386474/article/details/51838190