Redis 主从复制,哨兵,集群——(1)主从复制篇-CSDN博客

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

目录

1. Redis 主从复制是什么

2. Redis 主动复制能干嘛

2.1 读写分离

2.2 容灾恢复

2.3 数据备份

2.4 水平扩展支撑高并发

3. Redis 主从复制配置项

3.1 配从库不配主库

3.2 权限密码配置

3.3 基本操作命令

4. 案例演示

4.1 案例说明

4.2 文件配置

4.3 开放安全组 6379 端口号

4.4 先启动主 Redis 服务器

4.5 后启动从 Redis 服务器

4.6 验证 info replication 命令

4.7 slaveof 命令解析

4.8 slaveof no one 命令解析

5. 主从服务器的一些重要细节

6. 主从复制的缺点


1. Redis 主从复制是什么

从官网上可以总结出一句话"主从复制master 以写为主slave 以读为主当 master 数据发生变化之后自动将新的数据异步同步到其他 salve 数据库"。

2. Redis 主动复制能干嘛

2.1 读写分离

了解过 Redis 的同学应该大致都清楚Redis 是基于内存的单线程的那么它就一定会有一个上线如果我们的用户业务需求量过于庞大一台 Redis 很有可能是支持不过来的所以我们就需要多配备几台 Redis 服务器像 MySQL 一样进行分库分表读写分离设置集群主 Redis 服务器用于写读数据从 Redis 服务器只用于读数据减轻了主 Redis 服务器读数据的访问压力。

2.2 容灾恢复

众所周知Redis 是基于内存存储的数据库如果我们的业务只设置一台 Redis 服务器一旦Redis 服务器发生故障宕机了短时间内又无法马上恢复正常那么所有的数据访问都会直接打到 MySQLMySQL肯定是承受不了巨大的访问量的也会接连宕机造成其他业务接连崩溃对我们的业务造成巨大的损失这是绝对不允许出现的。所以我们设置多台 Redis 服务器就可以保证其中某台 Redis 服务器宕机之后业务不会受到很大的影响保证业务的正常运行。

2.3 数据备份

从服务器的数据是从主服务器读取过来的就算主服务器挂了从服务器中的数据也和主服务器中的数据基本一致不会对业务造成很大影响。所以不管是大企业或是小企业一般都会配备至少两到三台 Redis 服务器 一台服务器挂了我还有替补不至于服务崩溃。

2.4 水平扩展支撑高并发

我们设置多台服务器之后大量用户的访问需求就可以均匀分布在多台服务器上极大的提高了业务的并发能力。

3. Redis 主从复制配置项

3.1 配从库不配主库

很好理解就是你想让谁当从库就对谁进行配置想让谁当主库不做配置即可。

3.2 权限密码配置

一般来说我们的 Redis 数据库都会设置密码如果设置了密码那么在从数据库的配置文件中就需要配置 masterauth 配置项配置主数据库的密码。如果不进行配置那么从库在访问主库数据的时候就会被拒绝访问。

3.3 基本操作命令

info replication可以查看复制节点的主从关系配置信息

replicaof配置主机的IP和端口要写入到 redis.conf 配置文件内此项不是命令

slaveof修改另一台以及作为自己的主机配置主机IP和端口在服务器运行期间加入到 redis.conf 配置文件中

slaveof no one自己独立不与其他服务器产生关联自己就是主机

4. 案例演示

下面是动手自己建立一个 Redis 主从服务器有条件的同学可以跟着我一起做或者看一遍也可以实际面试的时候一般也不会让你动手做但其中的命令还是要记住的哦。

4.1 案例说明

这里我给大家简单演示一下主从复制如何做我使用两台 Redis 服务器一个是我本地电脑 vmweare 虚拟机上的 Redis 服务器另一个是我阿里云服务器上的 Redis 服务器我将阿里云服务器上的 Redis 作为主数据库服务器我本地电脑虚拟机上的 Redis 数据库作为从数据库服务器。

注意点一我们再启动 Redis 服务器之前要先把各项配置配置完毕之后再启动在这里的话我就是在从服务器的配置文件中做配置即可

注意点二建议先启动主服务器然后再启动从服务器

4.2 文件配置

如下图使用 vim 指令对从数据库服务器做一下修改添加上主Redis数据库服务器的IP和端口并配置上 masterauth 密码masterauth 就是我们主数据库服务器的密码有了密码从服务器才有权限进行访问不配置密码会被拒绝访问。

121.41.67.181 是我的云服务器IP地址6379 就是 Redis 服务器的端口。

4.3 开放云服务器安全组 6379 端口号

因为我之前就已经配置过了所以就不重复演示了界面如下就表示开放 6379 端口成功

4.4 先启动主 Redis 服务器

上述一切都准备就绪之后就可以开始启动了服务器了先在电脑上打开 FinalShell 远程连接工具连接上阿里云服务器由于我的云服务器一起都是处于运行状态Redis 也是一直处于运行状态就不重新启动了如下图

命令也没什么难度就是一个查看运行状态和打开客户端命令界面

// 查看 Redis 运行状态 Active 为 active 表示正在运行
[root@iZbp14kue6pz0ps43izpczZ ~]# systemctl status redis
● redis.service - LSB: starts Redis
   Loaded: loaded (/etc/rc.d/init.d/redis; bad; vendor preset: disabled)
   Active: active (exited) since 二 2023-10-17 15:47:48 CST; 19min ago
     Docs: man:systemd-sysv-generator(8)
  Process: 1101 ExecStop=/etc/rc.d/init.d/redis stop (code=exited, status=0/SUCCESS)
  Process: 1474 ExecStart=/etc/rc.d/init.d/redis start (code=exited, status=0/SUCCESS)

10月 17 15:47:48 iZbp14kue6pz0ps43izpczZ systemd[1]: Starting LSB: starts Redis...
10月 17 15:47:48 iZbp14kue6pz0ps43izpczZ redis[1474]: Starting redis server...
10月 17 15:47:48 iZbp14kue6pz0ps43izpczZ sudo[1491]:     root : TTY=unknown ; PWD=/ ; USER=redis ; COMMAND=/www/server/redis/src/redis-server /www/server/redis/redis.conf
10月 17 15:47:48 iZbp14kue6pz0ps43izpczZ systemd[1]: Started LSB: starts Redis.
10月 17 15:47:48 iZbp14kue6pz0ps43izpczZ redis[1474]: Starting redis success!
[root@iZbp14kue6pz0ps43izpczZ ~]# 
[root@iZbp14kue6pz0ps43izpczZ ~]# 

// redis-cli 打开客户端命令界面 -a 加上密码  -p 表示指定的端口
[root@iZbp14kue6pz0ps43izpczZ ~]# redis-cli -a 123456 -p 6379

// 此处警告不需要关心只是告诉我们直接把命令显示在界面不安全
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.

// 如下就已经说明正常打开了 Redis 的客户端命令界面
127.0.0.1:6379> 

4.5 后启动从 Redis 服务器

以下为打开 vmweare 虚拟机中后我所做的一些操作如下图下面有命令

方便各位阅读我将命令都复制到下面来了各位同学可以简单看一下我做了注释也不难理解到了这一步虚拟机的 Redis 服务器和连接环境说明已经没有大问题了。

// 关闭虚拟机防火墙以便后续可以被外界访问
[zhangsir@localhost ~]$ systemctl stop firewalld

// 查看虚拟机防火墙状态Active 为 dead 表示现在处于关闭状态
[zhangsir@localhost ~]$ systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Tue 2023-10-17 11:26:08 CST; 10s ago
     Docs: man:firewalld(1)
  Process: 6547 ExecStart=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS (code=exited, status=0/SUCCESS)
 Main PID: 6547 (code=exited, status=0/SUCCESS)
[zhangsir@localhost ~]$ 

// 通过 redis6.conf 配置文件启动 redis
[zhangsir@localhost ~]$ redis-server /myredis/redis6.conf
[zhangsir@localhost ~]$ 

// 启动后查看启动状态Active 为 active 表示已经启动成功
[zhangsir@localhost ~]$ systemctl status redis
● redis.service - redis-server
   Loaded: loaded (/etc/systemd/system/redis.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2023-10-17 11:13:56 CST; 13min ago
  Process: 7014 ExecStart=/usr/local/bin/redis-server /usr/local/src/redis-6.2.6/redis.conf (code=exited, status=0/SUCCESS)
 Main PID: 7082 (redis-server)
    Tasks: 5
   CGroup: /system.slice/redis.service
           └─7082 /usr/local/bin/redis-server 0.0.0.0:6379
[zhangsir@localhost ~]$ 
[zhangsir@localhost ~]$ 

// 测试与云服务器的连接是否成功这里可以看到连接一切正常
[zhangsir@localhost ~]$ ping 121.41.67.181
PING 121.41.67.181 (121.41.67.181) 56(84) bytes of data.
64 bytes from 121.41.67.181: icmp_seq=1 ttl=128 time=26.8 ms
64 bytes from 121.41.67.181: icmp_seq=2 ttl=128 time=23.2 ms
64 bytes from 121.41.67.181: icmp_seq=3 ttl=128 time=21.0 ms
64 bytes from 121.41.67.181: icmp_seq=4 ttl=128 time=21.1 ms
64 bytes from 121.41.67.181: icmp_seq=5 ttl=128 time=22.6 ms
64 bytes from 121.41.67.181: icmp_seq=6 ttl=128 time=24.0 ms
64 bytes from 121.41.67.181: icmp_seq=7 ttl=128 time=29.4 ms
64 bytes from 121.41.67.181: icmp_seq=8 ttl=128 time=24.7 ms
64 bytes from 121.41.67.181: icmp_seq=9 ttl=128 time=22.4 ms
64 bytes from 121.41.67.181: icmp_seq=10 ttl=128 time=23.1 ms

4.6 验证 info replication 命令

主从服务器都运行就绪之后我们打开从服务器的客户端命令界面输入 info replication 命令即可查看主从关系配置信息

// 通过 redis-cli 命令即可打开客户端界面-a 指定密码-p指定端口
[root@localhost ~]# redis-cli -a 123456 -p 6379
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> info replication

// 这里可以看到它输出了很多信息我们姑且不看那么多只看前三行
// role:slave 表示当前节点是从节点
// master_host:121.41.67.181 表示主服务器的 IP地址
// master_port:6379 表示主服务器的端口号
# Replication
role:slave
master_host:121.41.67.181
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:1
slave_read_repl_offset:1
slave_repl_offset:1
master_sync_total_bytes:-1
master_sync_read_bytes:0
master_sync_left_bytes:-1
master_sync_perc:-0.00
master_sync_last_io_seconds_ago:0
master_link_down_since_seconds:-1
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:4fb057dae9e8d87e21976a97681fec1738d41367
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> 

4.7 slaveof 命令解析

由于没有第三个服务器我这里就不做额外的演示了但我给大家解释一下它的作用。

slaveof它的作用是更改另一台服务器作为自己的主服务器。但有两个前提要求第一当前从服务器配置文件内必须有要更改的主服务器的密码第二要把配置文件内执勤的从服务器IP和端口注释掉。

举个最简单的例子现在我的A服务器是主服务器B服务器是从服务器B服务器想要通过 slaveof 更改原来的A主服务器变成C主服务器就需要把自身配置文件内关于A服务器的IP地址和端口号注释或删除并且C服务器的密码必须和A服务器的密码保持一致或者把密码更改为C服务器的密码否则C服务器会拒绝访问。而且还有一点要注意slaveof 命令是一次性的命令也就是说如果我们删除了配置文件中关于主服务器的IP和端口号那么下次在重启B服务器的时候B服务器就会变成一个独立的 master 自立为王不再是其他主数据库服务器的小弟。

4.8 slaveof no one 命令解析

slaveof no one 命令可以让当前节点脱离主服务器变成独立的服务器如下我在刚才的虚拟机从服务器的中执行 slaveof no one 命令在执行 info replication 命令查看可以发现刚才作为从服务器的的数据库现在自己变成了 master。

// 执行 slaveof no one 命令
127.0.0.1:6379> slaveof no one
OK

127.0.0.1:6379> info replication
# Replication
role:master     // master 表示自己就是主服务器
connected_slaves:0
master_failover_state:no-failover
master_replid:1d611a4e5bebd42d9b084ac13e3f1cc14b033bb1
master_replid2:4fb057dae9e8d87e21976a97681fec1738d41367
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> 

5. 主从服务器的一些重要细节

1从服务器首次启动之后会向主服务器发送一个 sync 同步命令请求在首次连接 master 时会一次性完全同步 master 上的数据slave 从服务器上的数据就会被主服务器上的数据覆盖清除。

2主服务器会受到同步请求会保存快照生成一个RDB快照文件(即RDB持久化主从复制时会发生RDB)同时将所有接收到的修改数据的命令缓存起来一起生成RDB文件然后 master 会将RDB文件发送给 slave 从服务器slave 在接收到RDB文件之后会存盘并加载到内存从而完成数据的同步化。

3从服务器在同步主服务器上存储的所有数据之后主服务器写入一个数据从服务器跟一个

4就算从服务器宕机了我们再次重启从服务器之后从服务器上的数据仍然能与主服务器上的数据保持同步原理是依据偏移量 offset主从服务器都会有一个 offset保存在 backlog 包中在从机重新启动之后mster 会把已经复制的 offset 赋值给 slave 让从机同步数据但只能同步已经复制过的 offset 类似于断点续传

5只有主服务器拥有读和写的权限从服务器只有读的权限而不能写数据

6主从服务器之间每隔 10s 会发送一次ping心跳包来确保其他从服务器是否还在正常运行

7如果主服务器宕机了从服务器不会自动晋升为主服务器而是会一直等待主服务器恢复正常

6. 主从复制的缺点

1复制延时信号衰减。在高并发的场景下一主二从是不太够用的而只有主服务器具有写操作再同步到其他从服务器所以从机变得更多就会导致复制会发生延时信号衰减

2master 主机挂了会很麻烦。因为主机挂了之后从既不会上位而是会一直等待这样就会导致我们的业务面临中断为此我们就需要用到哨兵时刻监控 master 的健康状态如果 master 出现了故障就马上选取一个新的 master 继续对外服务保证业务安全运行。

redis哨兵我单独开了一篇文章有兴趣的小伙伴可以跳转观看哦

Redis 主从复制哨兵集群——2哨兵篇-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_70325779/article/details/133889996?spm=1001.2014.3001.5502

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: redis

“Redis 主从复制,哨兵,集群——(1)主从复制篇-CSDN博客” 的相关文章