主从复制
这部分相关操作不需要记忆!!! 后续⼯作中如果⽤到了能查到即可.
重点理解流程和原理.
单点问题:某个服务器程序,只有一个节点(只搞一个物理服务器,来部署这个服务器程序)
- 可用性问题,如果这个机器挂了,服务就中断了
- 性能/支持的并发量有限
在分布式系统中,希望使用多个服务器来部署 redis,存在以下几种 redis 的部署方式:
- 主从模式
- 主从+哨兵模式
- 集群模式
Redis 主从模式中,从节点上的数据不允许修改,只允许读取,所以不存在“我修改了从节点的数据,是否把从节点的数据往主节点上同步”的问题。
某个从节点挂了影响不大,但如果主节点挂了呢?
这就有一定影响了,此时只剩下从节点,只能读数据了,如果需要写数据就没得写了。主从模式主要是针对“读操作”进行 并发量&可用性 的提高,实际业务场景读操作往往比写操作更频繁;而对于“写操作”无论是可用性还是并发量都非常依赖主节点,而主节点又不能搞多个,因为如果你对主节点a和主节点b同时写了那该听谁的呢?
在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到其他服务器,满⾜故障恢复和负载均衡等需求。Redis 也是如此,它为我们提供了复制的功能,实现了相同数据的多个 Redis 副本。复制功能是⾼可⽤ Redis 的基础,哨兵和集群都是在复制的基础上构建的。本章内容如下:
介绍复制的使⽤⽅式:如何建⽴或断开复制、安全性、只读等。
说明复制可⽀持的拓扑结构,以及每个拓扑结构的适⽤场景。
分析复制的原理,包括:建⽴复制、全量复制、部分复制、⼼跳检测等。
如果同学⽐较少,那么⼀个⽼师既可以进⾏授课, 也可以进⾏答疑;但是随着学⽣多了,⼀个⽼师也就应付不过来了. 就需要配⼏个助教⽼师,助教⽼师从授课⽼师这⾥获取知识,协助授课⽼师答疑.
配置
配置 Redis 主从结构,首先需要启动多个 Redis 服务器。正常来说每个 Redis 服务器程序应该在一个单独的主机,这样才是分布式。但是大多数人应该手里只有一个云服务器,我们可以在一个云服务器主机上运行多个 redis-server 进程。此处需要保证多个 redis-server 的端口。
如何指定 redis-server 的端口呢?
- 可以在启动程序的时候,通过命令行指定端口号。
--port
选项 - 也可以在配置文件设置端口。【推荐】
这里从 35节 如何启动多个redis-server 开始看
建立复制
参与复制的 Redis 实例划分为主节点(master)和从节点(slave)。每个从节点只能有⼀个主节点,⽽⼀个主节点可以同时具有多个从节点。复制的数据流是单向的,只能由主节点到从节点。配置复制的⽅式有以下三种(都是关于 slaveof 命令的):
- 在配置⽂件中加⼊ slaveof {masterHost} {masterPort} 随 Redis 启动⽣效。【推荐】
这部分看 36节 主从复制-配置主从复制(1)
-
在 redis-server 启动命令时加⼊ --slaveof {masterHost} {masterPort} ⽣效。
-
直接使⽤ redis 命令:slaveof {masterHost} {masterPort} ⽣效。
接下来,我们将 redis.conf 配置⽂件复制⼀份 redis-slave.conf(如果你想有多个从节点就复制多份,命名时区分一下每个从节点,比如 slave1.conf、slave2.conf 之类的
进入这些配置文件将端口号修改为 6379 之后的,比如 6380 之类的,并且修改其 daemonize 为 yes。
# By default Redis does not run as a daemon. Use 'yes' if you need it.
# Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
daemonize yes
接下来,默认启动的 redis 作为主 Redis,重新通过命令⾏启动⼀个 Redis 实例作为从 Redis:
# ubuntu
redis-server /etc/redis/redis-slave.conf --port 6380 --slaveof 127.0.0.1 6379
# centos
redis-server /etc/redis-slave.conf --port 6380 --slaveof 127.0.0.1 6379
注意: 修改配置主要是修改从机的配置. 主机配置不变.
通过 netstat -nlpt 确保两个 Redis 均已正确启动。
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:6380 0.0.0.0:* LISTEN
通过 redis-cli 可以连接主 Redis 实例,通过 redis-cli -p 6380 连接从 Redis。并且观察复制关系。
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> get hello
"world"
127.0.0.1:6380> get hello
"world"
从运⾏结果中看到复制已经⼯作了,针对主节点 6379 的任何修改都可以同步到从节点 6380 中,复制过程如图所⽰。
Redis 主从节点复制过程
可以通过 info replication 命令查看复制相关状态。
- 主节点 6379 复制状态信息
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=100,lag=0
master_r