主从复制概述

Redis主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower);数据的复制是单向的,只能由主节点到从节点。Master以写为主,Slave以读为主。

默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。

主从复制的作用

1、数据冗余:主从复制实现了数据的热备份,是持久化的一种数据冗余方式
2、故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余
3、负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量
4、高可用基石:除了上述作用外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础

一般来说,要将Redis运用于工程项目中,只是用一台Redis是万万不能的,原因如下:
1、从结构上,单个Redis服务器会发生单点故障,并且一台服务器需要处理所有的请求负载,压力较大;
2、从容量上,单个Redis服务器内存容量优先,就算一台Redis服务器内存容量为256G,也不能将所有内存用作Redis存储内存,一般来说,单台Redis最大使用内存不应该超过20G。

搭建一个Redis集群

默认情况下,每台Redis服务器都是主节点,所以我们只需要搭建从节点就可以了:

[root@zdata bin]# ls
dump.rdb  redis-benchmark  redis-check-aof  redis-check-rdb  redis-cli  redis.conf  redis-sentinel  redis-server
[root@zdata bin]# ./redis-cli -p 6379
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
master_replid:c1198a5e708d19c26d9192fde2d78da895be2b1d
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6379>

搭建伪一主二从(机器不够,将redis安装在同一个机器上):一主(6379)二从(6380、6381) 

1. 在6379上将redis.conf复制3份,分别重命名为redis6379.conf,redis6380.conf,redis6381.conf:

[root@zdata bin]# cp redis.conf redis6379.conf
[root@zdata bin]# cp redis.conf redis6380.conf
[root@zdata bin]# cp redis.conf redis6381.conf
[root@zdata bin]# ls
dump.rdb  redis6379.conf  redis6380.conf  redis6381.conf  redis-benchmark  redis-check-aof  redis-check-rdb  redis-cli  redis.conf  redis-sentinel  redis-server
[root@zdata bin]#

2. 分别编辑redis6379.conf,redis6380.conf,redis6381.conff配置文件,以6379为例, 修改以下配置:

port:6379进程占用的端口号
pid(port id):/var/run/redis_6379.pid	记录了进程的id,文件带有锁,可以防止程序的多次启动
logfile:log6379.log 明确日志文件位置
dbfilename:dump6379.rdb 持久化文件位置
appendfilename:appendonly6379.aof 持久化文件位置
如果设置了密码,需要在从机上添加masterauth 主机密码,否则从机连接不上主机

3. 分别启动3个redis服务

[root@zdata bin]# ./redis-server redis6379.conf
[root@zdata bin]# ./redis-server redis6380.conf
[root@zdata bin]# ./redis-server redis6381.conf
[root@zdata bin]#

 查看启动的redis进程:

docker中redis主从复制_缓存

4. 配置主从复制

我们开始配置主从复制,只需要配置从节点:

修改配置文件方式(永久有效):

docker中redis主从复制_数据库_02

docker中redis主从复制_Redis_03

5. 开启防火墙端口:

[root@zdata ~]# firewall-cmd --list-ports
3306/tcp
[root@zdata ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: active (running) since Sun 2022-10-23 16:38:10 CST; 1 day 23h ago
     Docs: man:firewalld(1)
 Main PID: 17389 (firewalld)
    Tasks: 2 (limit: 23712)
   Memory: 25.8M
   CGroup: /system.slice/firewalld.service
           └─17389 /usr/libexec/platform-python -s /usr/sbin/firewalld --nofork --nopid

Oct 23 16:38:10 zdata systemd[1]: Starting firewalld - dynamic firewall daemon...
Oct 23 16:38:10 zdata systemd[1]: Started firewalld - dynamic firewall daemon.
Oct 23 16:38:10 zdata firewalld[17389]: WARNING: AllowZoneDrifting is enabled. This is considered an insecure configuration option. It will be removed in a future release. Please consider>

[root@zdata ~]# firewall-cmd --zone=public --add-port=6379/tcp --permanent
success
[root@zdata ~]# firewall-cmd --zone=public --add-port=6380/tcp --permanent
success
[root@zdata ~]# firewall-cmd --zone=public --add-port=6381/tcp --permanent
success
[root@zdata ~]# systemctl restart firewalld.service
[root@zdata ~]# firewall-cmd --list-ports
3306/tcp 6379/tcp 6380/tcp 6381/tcp
[root@zdata ~]#

 注意:如果是云服务器需要手动设置安全组策略,开放对外端口。

6. 修改如下配置

docker中redis主从复制_缓存_04

7. 重启服务 

 注意:主节点服务建议务必设置密码,否则可能遭受攻击。设置方式如下:

docker中redis主从复制_缓存_05