Redis主从复制
概念
持久化侧重解决的是Redis数据的单机备份问题(从内存到硬盘的备份);而主从复制则侧重解决数据的多机热备。此外,主从复制还可以实现负载均衡和故障恢复。
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave);数据的复制是,只能由主节点到从节点。 默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。
作用
数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。
使用
- 由于需要启动多个Redis实例,我们先把多个实例使用的配置文件做好修改。
- 需要修改的配置信息有:
- 先拷贝多份配置文件,用不同的名字命名
- 守护进程启动 daemonize yes
- Pid 文件名字
- 指定一个端口
- Log日志文件名
- Dump.rdb文件名
- 等等
- 通过刚改好的多个配置文件启动多个redis服务程序
- Redis-server /path/to/***.conf
配置步骤
- 在/etc/redis路径下,将6379.conf文件拷贝两份,分别叫做6380.conf与6381.conf
- 修改6380.conf与6381.conf文件的以下内容
bash
port 6380 6381
pidfile "/var/run/redis_6380.pid" "/var/run/redis_6381.pid"
logfile "/var/log/redis_6380.log" "/var/log/redis_6381.log"
dbfilename "dump6380.rdb" "dump6381.rdb"
appendfilename "appendonly6380.aof" "appendonly6381.aof"
- 分别启动三个配置文件(启动三台服务器)
bash
sudo redis-server /etc/redis/6379.conf
sudo redis-server /etc/redis/6380.conf
sudo redis-server /etc/redis/6381.conf
- 分别进入到对应的客户端
bash
redis-cli -p 6379
redis-cli -p 6380
redis-cli -p 6381
- 查看每台机器的状态信息
bash
在对应的客户端下执行info replication,会看到每台机器上来的时候,都是以主机的身份展示的
- 配置主从复制信息
bash
在从机中执行salveof 127.0.0.1 6379
当从机挂掉之后,主机不会记录从机的信息,如果后面从机又上来了,那么会以一个独立主机的身份上线;如果是主机挂掉了,从机会记录主机的身份信息,包括:ip、port、状态;然后从机会一直等着主机上线,如果主机一直不上线,那么此时有新的写操作就不会得到执行,所以传统主从复制是有缺陷的;但是如果主机上线了,那么主从复制信息会恢复。
注意
- 从机对主机数据的同步,是全量的还是增量的?
- 配置了主从复制之后,主机上已有的数据会更新到从机上(全量)
- 主机新增的数据也会更新到从机上(增量)
- 作为主机的程序结束,从机的角色不会变化(角色还是slave)。
- 主机重新启动,从机可以继续与主机保持连接(从机原地待命)。
- 从机的程序重启后,角色变成了master,从机每次与master断开连接后,都需要重新连接,除非把slaveof 配置到配置文件里。
- 只要重新连接master,一次完全同步(全量复制)将被自动执行。
常用模式
一主多从(常见)
中央集权,所有的从服务器都要从主服务器哪里更新数据,对主服务器压力较大
击鼓传花
只依赖前面的节点
反客为主
命令:
bash
Slaveof no one
自己变主机