从零学习redis(4)--- 多机部署之主从复制
redis 刘宇帅 6年前 阅读量: 1297
Redis 作为高效的缓存数据库,单机也能够表现出很好的性能。但是随着数据的增加、并发的增加,单机模式的 Redis 会受到单机性能、容量、稳定性的限制,即使 Redis 提供了稳定的持久化方案,但是单机服务器始终是部署在单个机器上,如果运行机器本身的服务器出现问题我们很难在短时间恢复服务。所以 Redis 提供了三种多机模式:
- 主从复制模式
- 哨兵模式
- 集群模式
主从复制模式
主从复制,让一台服务器去复制另外一台服务器,我们称被复制的服务器为主服务器,而对主服务器进行复制的服务器为从服务器。Redis 允许一台主服务器配置多个从服务器。主服务器可以进行读写操作,从服务器只能进行读操作,当主服务器发生写操作时会自动将写命令同步给从服务器以保证从服务器与主服务器的数据一致性。 主从复制作用:
- 数据冗余,主从复制实现了数据热备份,是持久化之外的一种数据冗余,能够更有效的实现数据恢复(如果主节点挂掉可以使用从来替换)
- 负载均衡:一主多从的情况下,主节点写,从节点度,分担服务器负载。
- 为高可用提供基础,主从复制是哨兵模式和集群模式的基础。
如何开启关闭主从复制
Redis 启动主从复制有3中方式:
- Redis配置文件:在从服务器的配置文件中加入slaveof mastip masterport即可
- redis-server启动命令指定:--saveof masterip masterport
- 客户端命令:通过客户端连接到服务器执行命令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"
完成了复制~