主从复制概述
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进程:
4. 配置主从复制
我们开始配置主从复制,只需要配置从节点:
修改配置文件方式(永久有效):
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. 修改如下配置
7. 重启服务
注意:主节点服务建议务必设置密码,否则可能遭受攻击。设置方式如下: