目录

  • Redis 主从复制
  • 作用
  • 怎么玩?
  • 步骤
  • 修改配置文件
  • 启动
  • 读写
  • 扩展情况
  • 如果主机断了会怎样?
  • 薪火相传
  • 反客为主
  • **复制原理**
  • 哨兵模式
  • 作用
  • 怎么玩?
  • 优点
  • 缺点
  • 配置文件解释


Redis 主从复制

也就是我们所说的主从复制,主机数据更新后根据配置和策略,
自动同步到备机的 master/slaver 机制。

数据的复制是单向的,只能由主节点到从节点。并且,默认情况下,Master 以写为主,Slave 以读为主。并且默认的每台 Redis 服务器都是主节点。

一个主节点可以有多个从节点(甚至没用),但是一个从节点只能由一个主节点。

作用

  1. 数据冗余
  1. 实现了数据的热备份,是持久化之外的一种数据冗余方式
  1. 故障恢复
  1. 当其中一个节点主线了问题,可以由从节点提供服务。实现快速的故障恢复。
  1. 负载均衡
  1. 在主从复制的基础上,配合读写分离,由主节点提供写服务,从节点提供读服务。从节点可以实现分担主服务器的压力
  1. 高可用(集群):
  1. 主从复制还是哨兵和集群能够实施的基础,因此说主从复制时 Redis 高可用的基础

怎么玩?

只配置从库,不用配置主库。(这里的例子配置一主二从)。

步骤

修改配置文件

我们把配置文件 redis.conf 复制为三份,分别为 redis6379.conf,redis6380.conf,redis6381.conf,因为要配置一主二从,需要启动三个服务端。

[root@wzx myconf]# ls 
redis6379.conf  redis6380.conf redis6381.conf

修改三个配置文件的配置信息

  • 端口
  • pid 名字
  • log 文件名字
  • dump.rdb 名字。

修改端口

...
# If port 0 is specified Redis will not listen on a TCP socket.
port 6379 # 修改端口号
# TCP listen() backlog.
....

修改 pid 名字

...
pidfile "/var/run/redis_6379.pid"	# 修改文件 pid 的名字
...

修改 log 文件名字

logfile "log6379.log"		# 修改日志文件名字

修改 rdb 持久化文件名字

dbfilename "dump6379.rdb"	# 修改 rdb 文件

这里只显示了 redis6379.conf 的文件,另外的两个配置文件 redis6380.conf,redis6381.conf 也要修改上述对应配置,以防止三个服务的冲突。

修改完毕,启动 3 个服务器,可以通过进程信息查看

[root@wzx myconf]# redis-server redis6379.conf
[root@wzx myconf]# redis-server redis6380.conf
[root@wzx myconf]# redis-server redis6381.conf
[root@wzx ~]# ps -ef | grep redis
root       1919      1  0 20:44 ?        00:00:00 redis-server 192.168.200.132:6379
root       1924      1  0 20:44 ?        00:00:00 redis-server 192.168.200.132:6380
root       1929      1  0 20:44 ?        00:00:00 redis-server 192.168.200.132:6381

启动

默认情况下,每台Redis服务器都是主节点; 我们一般情况下只用配置从机就好了!这里就规定,6379 号端口的是老大,6380 和 6381 是老二,也就是二从。

通过命令 info replication 可以查看当前老大(6379)信息

192.168.200.132:6379> info replication # 查看当前库的信息
# Replication
role:master	# 角色 master
connected_slaves:0	# 没有从机
master_replid:47a0dc6b8d971dbc43858c7aa95dc53f98112083
master_replid2:f2dfe6a7d217a90999e9a63914ef90e3037f15df
master_repl_offset:630
second_repl_offset:631
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:630

在两台从机上,使用命令 slaveof host port 来认 6379 端口为老大。

6380 服务端

192.168.200.132:6380> slaveof 192.168.200.132 6379
OK

6381 服务端

192.168.200.132:6381> slaveof 192.168.200.132 6379
OK

再次查看信息(这里举例 6380 的信息)

192.168.200.132:6380> info replication
# Replication
role:slave	# 当前角色是从机
master_host:192.168.200.132	# 可以的看到主机的信息
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:882
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:47a0dc6b8d971dbc43858c7aa95dc53f98112083
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:882
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:631
repl_backlog_histlen:252

再看看老大(6379)

192.168.200.132:6379> info replication
# Replication
role:master	# 角色
connected_slaves:2	# 有两台从机连接
slave0:ip=192.168.200.132,port=6380,state=online,offset=980,lag=1	# 从机信息
slave1:ip=192.168.200.132,port=6381,state=online,offset=980,lag=0	# 从机信息
master_replid:47a0dc6b8d971dbc43858c7aa95dc53f98112083
master_replid2:f2dfe6a7d217a90999e9a63914ef90e3037f15df
master_repl_offset:980
second_repl_offset:631
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:980

真实的从主配置应该在配置文件中配置,这样的话是永久的,我们这里使用的是命令,暂时的!

读写

主机可以读写

192.168.200.132:6379> set key1 value1
OK
192.168.200.132:6379> keys *
1) "key1"

从机只能读,不能写

192.168.200.132:6380> set key2 value2		# 从机无法写入
(error) READONLY You can't write against a read only replica.
192.168.200.132:6380> get key1				# 可以读取到主机的数据
"value1"

扩展情况

如果主机断了会怎样?

192.168.200.132:6380> set key2 value2		# 主机即使断了,还是不能写
(error) READONLY You can't write against a read only replica.
192.168.200.132:6380> get key1				# 主机即使断了,从机依旧能读
"value1"

所以,主机断开连接,从机依旧连接到主机的,但是没有写操作,这个时候,主机如果回来了,从机依旧可以直接获取到主机写的信息!如果是使用命令行,来配置的主从,这个时候如果重启了,就会变回主机!只要变为从机,立马就会从主机中获取值!(这是在没配置哨兵模式的情况下

薪火相传

上一个 Slave 可以是下一个 slave 的 Master,Slave同样可以接收其他
slaves 的连接和同步请求,那么该 slave 作为了链条中下一个的master,
可以有效减轻master的写压力。

总结就是,一个从机,可以作为另一个从机的主机,来分担原理 master 的复制压力。中途变更转向:会清除之前的数据,重新建立拷贝最新的

反客为主

如果主机断开了连接,我们可以使用 slaveof no one 让自己变成主机!其他的节点就可以手动连接到最新的这个主节点(手动)!如果这个时候老大修复了,那就重新连接!

复制原理

  1. Slave 启动成功,连接到 master 后会发送一个 sync 同步命令
  2. Master 接到命令,fork 出存盘进程,并且收集所有接收到的用于修改数据集命令,在后台进程执行,完毕之后,master 将传送整个数据文件到 slave,并完成一次完全同步。

什么是全量复制

而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。

什么是增量复制

Master 继续将新的所有收集到的修改命令依次传给slave,完成同步

注意:只要是重新连接master,完全同步(全量复制)将被自动执行! 我们的主机数据一定可以在从机中看到!

哨兵模式

反客为主的自动版,如果每次主机都断开了,不可能都手动来一直配置,所以Redis从2.8开始正式提供了Sentinel(哨兵) 架构来解决这个问题。能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库。

哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独
立运行。其原理是 哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。

作用

通过发送命令,让 Redis 服务器返回监控其运行状态,包括主服务器和从服务器。
当哨兵监测到master宕机,会自动根据 quorum 的数量进行投票,对于先获得的响应票数的 slaveof,将 slaveof 切换成 master,然后通过发布订阅模式通知其他的从(slaveof)服务器,修改配置文件,让它们切换主机。

为了预防哨兵也会掉线,也可以分配多个哨兵,也就是哨兵集群、多哨兵模式。

怎么玩?

步骤

  1. 在配置文件所在的目录 /myconf (我这里的配置文件都放在 myconf 下)下新建 sentinel.conf 文件,文件名字必须是 sentinel.conf
  2. 配置 sentinel.conf 文件的内容
# sentinel monitor 被监控的名称 host port 1
sentinel monitor monitor1 192.168.200.132 6379 1
  1. 启动哨兵
[root@wzx myconf]# redis-sentinel sentinel.conf		# 这里指定的配置文件可以按照自己定义的指定其他路径
2052:X 13 Aug 2020 21:27:27.422 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
2052:X 13 Aug 2020 21:27:27.422 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=2052, just started
2052:X 13 Aug 2020 21:27:27.422 # Warning: no config file specified, using the default config. In order to specify a config file use redis-sentinel /path/to/sentinel.conf
2052:X 13 Aug 2020 21:27:27.423 * Increased maximum number of open files to 10032 (it was originally set to 1024).
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 5.0.4 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in sentinel mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379
 |    `-._   `._    /     _.-'    |     PID: 2052
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

2052:X 13 Aug 2020 21:27:27.424 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
2052:X 13 Aug 2020 21:27:27.424 # Sentinel started without a config file. Exiting...

如果Master 节点断开了,这个时候就会从从机中随机选择一个服务器! (这里面有一个投票算法!)

可以查看哨兵日志,如果主机掉线,在回归的时候,只能归并到新的主机下,这就是哨兵模式。

优点

1 、哨兵集群,基于主从复制模式,所有的主从配置优点,它全有

2 、 主从可以切换,故障可以转移,系统的可用性就会更好

3 、哨兵模式就是主从模式的升级,手动到自动,更加健壮!

缺点

1 、Redis 不好啊在线扩容的,集群容量一旦到达上限,在线扩容就十分麻烦!

2 、实现哨兵模式的配置其实是很麻烦的,里面有很多选择!

配置文件解释

下面概述一下 sentinel.conf 文件的部分配置

# sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel monitor mymaster 192.168.200.132 6379 1

上述的命令可以配置哨兵 sentinel 监控的 redis 主节点的 ip port

  • master-name 可以自己命名的主节点名字 只能由字母A-z、数字0-9 、这三个字符".-_"组成。
  • quorum 数字1,表示主机挂掉后 slaveof 投票看让谁接替成为主机,得票数为 1 的成为主机
# sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster MySUPER--secret-0123passw0rd
  • 当在Redis实例中开启了requirepass foobared 授权密码 这样所有连接Redis实例的客户端都要提供设置哨兵 sentinel 连接主从的密码注意必须为主从设置一样的验证密码
# sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds mymaster 30000
  • 指定多少毫秒之后主节点没有应答哨兵sentinel ,此时哨兵主观上认为主节点下线,这里默认 30 秒
# sentinel parallel-syncs <master-name> <numslaves>
sentinel parallel-syncs mymaster 1
  • 这个配置项指定了在发生 failover(故障)主备切换时最多可以有多少个 slaveof 同时对新的 master进行同步,
  • 这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意味着越多的 slaveof 因为replication 而不可用。
  • 可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。