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 学习笔记(十四)主从复制的主要内容,如果未能解决你的问题,请参考以下文章