redis 7年前

从零学习redis(4)--- 多机部署之主从复制

作者头像 刘宇帅
2357 0

Redis 作为高效的缓存数据库,单机也能够表现出很好的性能。但是随着数据的增加、并发的增加,单机模式的 Redis 会受到单机性能、容量、稳定性的限制,即使 Redis 提供了稳定的持久化方案,但是单机服务器始终是部署在单个机器上,如果运行机器本身的服务器出现问题我们很难在短时间恢复服务。所以 Redis 提供了三种多机模式:

  1. 主从复制模式
  2. 哨兵模式
  3. 集群模式

主从复制模式

主从复制,让一台服务器去复制另外一台服务器,我们称被复制的服务器为主服务器,而对主服务器进行复制的服务器为从服务器。Redis 允许一台主服务器配置多个从服务器。主服务器可以进行读写操作,从服务器只能进行读操作,当主服务器发生写操作时会自动将写命令同步给从服务器以保证从服务器与主服务器的数据一致性。 主从复制作用:

  1. 数据冗余,主从复制实现了数据热备份,是持久化之外的一种数据冗余,能够更有效的实现数据恢复(如果主节点挂掉可以使用从来替换)
  2. 负载均衡:一主多从的情况下,主节点写,从节点度,分担服务器负载。
  3. 为高可用提供基础,主从复制是哨兵模式和集群模式的基础。

如何开启关闭主从复制

Redis 启动主从复制有3中方式:

  1. Redis配置文件:在从服务器的配置文件中加入slaveof mastip masterport即可
  2. redis-server启动命令指定:--saveof masterip masterport
  3. 客户端命令:通过客户端连接到服务器执行命令slaveof masterip masterport

从服务要断开主从复制只需要执行命令slaveof no one即可,断开之后从服务器支持暂停从主服务器拉数据,原来数据不会删除。

主从复制展示

我们这里同样适用docker来做演示
第一步启动两个redis,myredis和myredis1

docker run --name myredis -d -p 6379:6379 -v /Users/liushuai/Documents/dockerProject/redis/redis.conf:/etc/redis/redis.conf redis /etc/redis/redis.conf
docker run --name myredis1 -d -p 6380:6379 -v /Users/liushuai/Documents/dockerProject/redis/redis.conf:/etc/redis/redis.conf redis /etc/redis/redis.conf

第二步登录myredis,添加一个值

> $ redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> set hello world
OK

然后我们使用docker inspect containerId命令查看两台机器的IP,我这里是 myredis:172.17.0.2 myredis1:172.17.0.2 第三步登录myredis1,设置myredis为其主节点:

> $ redis-cli -h 127.0.0.1 -p 6380
127.0.0.1:6380> slaveof 127.17.0.2 6379
OK

我们可以看到myredis1有如下日志即表明主从复制已经开始:

1:S 24 Oct 10:14:24.315 * Before turning into a slave, using my master parameters to synthesize a cached master: I may be able to synchronize with the new master with just a partial transfer.
1:S 24 Oct 10:14:24.316 * SLAVE OF 172.17.0.2:6379 enabled (user request from 'id=1384 addr=172.17.0.1:34840 fd=9 name= age=1526 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=slaveof')
1:S 24 Oct 10:14:24.883 * Connecting to MASTER 172.17.0.2:6379
1:S 24 Oct 10:14:24.883 * MASTER <-> SLAVE sync started
1:S 24 Oct 10:14:24.883 * Non blocking connect for SYNC fired the event.
1:S 24 Oct 10:14:24.883 * Master replied to PING, replication can continue...
1:S 24 Oct 10:14:24.885 * Trying a partial resynchronization (request 2fa52eb27e3bf5ab5ee61f05458d600a870bb00c:152).
1:S 24 Oct 10:14:24.886 * Full resync from master: b9fae659260b39c9c3ad8ec56fd3f6f7c34fde2a:151
1:S 24 Oct 10:14:24.886 * Discarding previously cached master state.
1:S 24 Oct 10:14:24.985 * MASTER <-> SLAVE sync: receiving 177 bytes from master
1:S 24 Oct 10:14:24.985 * MASTER <-> SLAVE sync: Flushing old data
1:S 24 Oct 10:14:24.987 * MASTER <-> SLAVE sync: Loading DB in memory
1:S 24 Oct 10:14:24.987 * MASTER <-> SLAVE sync: Finished with success
1:S 24 Oct 10:14:24.987 * Background append only file rewriting started by pid 27
1:S 24 Oct 10:14:25.020 * AOF rewrite child asks to stop sending diffs.
27:C 24 Oct 10:14:25.020 * Parent agreed to stop sending diffs. Finalizing AOF...
27:C 24 Oct 10:14:25.020 * Concatenating 0.00 MB of AOF diff received from parent.
27:C 24 Oct 10:14:25.021 * SYNC append only file rewrite performed
27:C 24 Oct 10:14:25.021 * AOF rewrite: 0 MB of memory used by copy-on-write
1:S 24 Oct 10:14:25.087 * Background AOF rewrite terminated with success
1:S 24 Oct 10:14:25.087 * Residual parent diff successfully flushed to the rewritten AOF (0.00 MB)
1:S 24 Oct 10:14:25.087 * Background AOF rewrite finished successfully

检查myredis1服务器上的值

127.0.0.1:6380> keys *
1) "hello"
127.0.0.1:6380> get hello
"world"

完成了复制~

作者头像

刘宇帅

非著名程序员,全栈开发工程师,长期专注系统开发与架构设计。

提示

功能待开通!


暂无评论~

相关文章

从零学习redis(8)--- 过期及过期策略

redis 的 string 类型是支持过期设置的,默认是永不过期的。 Redis 设置过期 redis 中设置设置 key 过期有3中方式 第一种在设置值的时候指定过期时间 Set 命令格式 SET key value [EX seconds] [PX milliseconds] [NX|XX] EX second :设置键的过期时间为 second 秒。 SET key value EX second 效果等同于 SETEX key second value 。 PX millisecond :设置键的过期时间为 millisecond 毫秒。 3. SET key value PX m

从零学习redis(6)--- 多机部署之集群模式

Redis 作为高效的缓存数据库,单机也能够表现出很好的性能。但是随着数据的增加、并发的增加,单机模式的 Redis 会受到单机性能、容量、稳定性的限制,即使 Redis 提供了稳定的持久化方案,但是单机服务器始终是部署在单个机器上,如果运行机器本身的服务器出现问题我们很难在短时间恢复服务。所以 Redis 提供了三种多机模式: 主从复制模式 哨兵模式 集群模式 redis集群模式 哨兵模式解决了主节点挂掉的问题,但是没有解决从节点挂掉的问题,而 redis 集群模式可以有效的解决这个问题。redis集群中的数据是和槽(slot)挂钩的,一共定义了16384个槽,所有的数据使用一致性哈希分

从零学习redis(5)--- 多机部署之哨兵模式

Redis 作为高效的缓存数据库,单机也能够表现出很好的性能。但是随着数据的增加、并发的增加,单机模式的 Redis 会受到单机性能、容量、稳定性的限制,即使 Redis 提供了稳定的持久化方案,但是单机服务器始终是部署在单个机器上,如果运行机器本身的服务器出现问题我们很难在短时间恢复服务。所以 Redis 提供了三种多机模式: 主从复制模式 哨兵模式 集群模式 哨兵模式 主从复制模式解决了数据备份和单机可能存在的性能问题,但是也引入了新的问题,一主多从,在使用过程中,如果主服务器挂掉那么整个 Redis 服务的写就挂掉了,如果一个从服务器挂掉那么调用方就无法正确的读数据了,只能通过修改调

从零学习redis(15)--- 源码阅读之内存分配

redis 中内存管理没有直接使用 C 语言提供的方法而是做了一个可管理已分配内存大小及添加了自己分配策略的实现,下面从 SDS 开始去了解 redis 的内存管理实现及策略。 SDS 内存管理函数定义如下: src/sdsalloc.h #include "zmalloc.h" #define s_malloc zmalloc #define s_realloc zrealloc #define s_free zfree s_malloc 内存申请、s_realloc 内存重新分配、s_free 内存释放,这里定义分别是 zmalloc.h 里三个函数的别名,而 zmalloc zrea

从零学习redis(12)--- 大量导入数据

有时候我们需要在短时间内往 redis 里插入大量的数据,我们如果单条单条的出入会浪费很多时间和服务器资源,我们可以使用管道来实现快速的插入。 netcat 我们把需要插入 redis 的数据创建为如下的一个命令集文件 set key1 val1 set key2 val2 ... set key3 val3 我们使用如下命令执行数据导入 &gt; $ cat /tmp/test|nc localhost 6379 +OK +OK +OK pipe mode 使用 netcat 并不是一个可靠地方式,因为用netcat进行大规模插入时不能检查错误。从Redis 2.6开始redis-cli支