目录
- Redis 主从复制
- 作用
- 怎么玩?
- 步骤
- 修改配置文件
- 启动
- 读写
- 扩展情况
- 如果主机断了会怎样?
- 薪火相传
- 反客为主
- **复制原理**
- 哨兵模式
- 作用
- 怎么玩?
- 优点
- 缺点
- 配置文件解释
Redis 主从复制
也就是我们所说的主从复制,主机数据更新后根据配置和策略,
自动同步到备机的 master/slaver 机制。
数据的复制是单向的,只能由主节点到从节点。并且,默认情况下,Master 以写为主,Slave 以读为主。并且默认的每台 Redis 服务器都是主节点。
一个主节点可以有多个从节点(甚至没用),但是一个从节点只能由一个主节点。
作用
- 数据冗余
- 实现了数据的热备份,是持久化之外的一种数据冗余方式
- 故障恢复
- 当其中一个节点主线了问题,可以由从节点提供服务。实现快速的故障恢复。
- 负载均衡
- 在主从复制的基础上,配合读写分离,由主节点提供写服务,从节点提供读服务。从节点可以实现分担主服务器的压力
- 高可用(集群):
- 主从复制还是哨兵和集群能够实施的基础,因此说主从复制时 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
让自己变成主机!其他的节点就可以手动连接到最新的这个主节点(手动)!如果这个时候老大修复了,那就重新连接!
复制原理
- Slave 启动成功,连接到 master 后会发送一个 sync 同步命令
- Master 接到命令,fork 出存盘进程,并且收集所有接收到的用于修改数据集命令,在后台进程执行,完毕之后,master 将传送整个数据文件到 slave,并完成一次完全同步。
什么是全量复制:
而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
什么是增量复制:
Master 继续将新的所有收集到的修改命令依次传给slave,完成同步
注意:只要是重新连接master,完全同步(全量复制)将被自动执行! 我们的主机数据一定可以在从机中看到!
哨兵模式
反客为主的自动版,如果每次主机都断开了,不可能都手动来一直配置,所以Redis从2.8开始正式提供了Sentinel(哨兵) 架构来解决这个问题。能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库。
哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独
立运行。其原理是 哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。
作用
通过发送命令,让 Redis 服务器返回监控其运行状态,包括主服务器和从服务器。
当哨兵监测到master宕机,会自动根据 quorum 的数量进行投票,对于先获得的响应票数的 slaveof,将 slaveof 切换成 master,然后通过发布订阅模式通知其他的从(slaveof)服务器,修改配置文件,让它们切换主机。
为了预防哨兵也会掉线,也可以分配多个哨兵,也就是哨兵集群、多哨兵模式。
怎么玩?
步骤
- 在配置文件所在的目录 /myconf (我这里的配置文件都放在 myconf 下)下新建 sentinel.conf 文件,文件名字必须是 sentinel.conf
- 配置 sentinel.conf 文件的内容
# sentinel monitor 被监控的名称 host port 1
sentinel monitor monitor1 192.168.200.132 6379 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 处于不能处理命令请求的状态。