Redis 学习笔记(十四)主从复制

Posted Adorable_Rocy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis 学习笔记(十四)主从复制相关的知识,希望对你有一定的参考价值。

前言:单运行机制往往是不行的,当所有的读写压力全部打在一台服务器上面,自然扛不住,所以可以有从机负责读取的分担,但是从机无法写入数据!


1.主从复制

1.概念

  • 是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower);数据的复制是单向的,只能由主节点到从节点。Master以写为主,Slave以读为主
  • 默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点

2.作用

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

3.原因

如果只使用一台服务器,并且如果宕机了,服务就没有可以兜底的方案,整个过程就变得十分僵硬了

  • 从结构上,单个Redis服务器会发生单独故障,并且一台服务器需要处理所有的请求负载,压力较大
  • 从容量上,单个Redis服务器内存容量有限,就算一台Redis服务器内存容量有256G,也不能将所有内存用作Redis存储内存,一般来说,单台Redis最大使用内存不应该超过20G
2.环境配置

2.1 查看信息

127.0.0.1:6379> info replication # 查看当前库的信息
# Replication
role:master  # 角色 master
connected_slaves:0  # 没有从机
master_failover_state:no-failover
master_replid:05d835578601437d0d2bf340cada2f2a4a409d2c
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

2.2 一主两从配置文件配置

[root@localhost /] cd /usr/local/bin
[root@localhost bin] ls
redis-benchmark  redis-check-rdb  redis-sentinel  xconfig
dump.rdb  redis-check-aof  redis-cli        redis-server
[root@localhost bin] cd fatcats/
[root@localhost fatcats] cp redis.conf redis-79.conf
[root@localhost fatcats] cp redis.conf redis-80.conf
[root@localhost fatcats] cp redis.conf redis-81.conf
  • 修改端口
  • 修改pid名字
  • 修改日志名字
  • 修改rdb名字

2.3 开启主从复制

127.0.0.1:6379> SLAVEOF host 127.0.0.1

补充:使用命令的方式所成为的从机,都是暂时性的!!真正归属需要修改配置文件!!

2.4 或者可以选择在配置文件中配置

在这里插入图片描述
补充:如果客户端有密码,可以在下面配置客户端密码


在这里插入图片描述

3.测试连接
  • A:6379(正常操作)【master】
127.0.0.1:6379> set k1 v11
OK
  • B:6380(读取操作)【slaveof】
127.0.0.1:6380> get k1 
"v11"
127.0.0.1:6380> keys *
1) "k1"
127.0.0.1:6380> set k2 v2		#	从机无法执行写的操作
(error) READONLY You can't write against a read only replica.

补充:默认是设置的仅读权限

在这里插入图片描述

  • A:6379(宕机)【master】
127.0.0.1:6379> shutdown
not connected> exit
  • B:6380(查看信息)【slaveof】
    在这里插入图片描述
    补充:在未配置哨兵模式之前,都是需要手动更改服务器主从的

  • A:6379(重连)【master】

127.0.0.1:6379> set k2 v2
OK
  • B:6380(读取信息)【slaveof】
127.0.0.1:6380> get k2
"v2"

总结:主节点断开连接,从节点依旧连接到主节点上,但是这时是没有写操作的。如果主节点重新连接,从节点仍然可以获取到主节点的信息

B:6380(宕机)【slaveof】

127.0.0.1:6380> shutdown
not connected> 

A:6379(写数据)【master】

127.0.0.1:6379> set k3 v3
OK

B:6380(重连)【slaveof】

127.0.0.1:6380> get k3			# 获取宕机后主机设置的值
(nil)
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:b18099b0ac5bbf0e4575ef91e52002a9648677d6
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

补充:因为是使用的命令配置的主从,所以在宕机一次重启后,便变回单机模式了,不再归属主机(6379)

重新归属到主机(6379)中

127.0.0.1:6380> SLAVEOF 127.0.0.1 6379
OK
127.0.0.1:6380> get k3		# 获取值
"v3"
4.主从复制原理
  • slave 服务启动,slave 会建立和 master 的连接,发送 sync 命令
  • master 启动一个后台进程将数据库快照保存到 RDB 文件中

补充:此时如果生成 RDB 文件过程中存在写数据操作会导致 RDB 文件和当前主 redis 数据不一致,所以此时 master 主进程会开始收集写命令并将这些命令放到一个缓冲区里

  • master 就发送 RDB 文件给 slave
  • slave 将文件保存到磁盘上,然后加载到内存恢复
  • master 把缓冲区的命令转发给 slave

注意:后续 master 收到的写命令都会通过开始建立的连接发送给 slave

5.手动配置主从(手动版哨兵模式)

1.让主机(6379)宕机

127.0.0.1:6379> shutdown
not connected> 
# 6379端口的redis以关闭
[root@localhost fatcats]# ps -ef|grep redis
root     108386      1  0 21:08 ?        00:00:10 redis-server *:6381
root     108765  95634  0 21:15 pts/3    00:00:00 redis-cli -p 6381
root     111312      1  0 22:05 ?        00:00:03 redis-server *:6380
root     111318  96156  0 22:05 pts/0    00:00:00 redis-cli -p 6380
root     112396  91314  0 22:27 pts/1    00:00:00 grep --color=auto redis

2. 让从机(6380)变回主机

127.0.0.1:6380> SLAVEOF no one		# 变回主机
OK
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6381,state=online,offset=2685,lag=1
master_failover_state:no-failover
master_replid:18f9b183d38900aacfd94ce6f048cbfd724b2ea1
master_replid2:5f2d8e7929d4bf1816f118e37e341dc26f642b53
master_repl_offset:2685
second_repl_offset:2672
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1356
repl_backlog_histlen:1330

补充:断开节点不会删除数据,只是不会再增长数据了(主机)【6379】

3.测试

3.1 主机(6380)设置一个值

127.0.0.1:6380> set name zhangsan
OK
127.0.0.1:6380>

3.2 从机(6381)获取值

127.0.0.1:6381> get name 
"zhangsan"
127.0.0.1:6381>

完成配置!

以上是关于Redis 学习笔记(十四)主从复制的主要内容,如果未能解决你的问题,请参考以下文章

Redis学习笔记9:主从复制

Redis学习笔记9:主从复制

Redis学习笔记9:主从复制

Redis学习笔记—主从复制

尚硅谷Redis学习笔记-- Redis主从复制

Redis学习笔记16----redis集群(主从复制)