使用背景
redis是现在分布式应用刚需的一个缓存数据库,具有超强的并发能力,高吞吐量。但是在部署时同样需要考虑redis的高可用,通常redis高可用可以通过主从复制和哨兵机制来做保证。下面介绍一下复制方式的使用,在另一篇里会分析主从复制的细节
建立从节点的方式
- 在redis.conf文件中配置
slaveof <master_ip> <master_port>
- 在
redis-server
启动命令后加上--slaveof <master_ip> <master_port>
如果是本机启动两个实例也可省略master_ip直接写--port
- 从节点上直接执行
slaveof <master_ip> <master_port>
命令
建立后可使用info replication
命令查看本机的复制配置
可以看到role是slave,并且还有master的相关信息
字段解释如下:
# Replication
role:slave //节点角色
master_host:localhost //主节点的IP
master_port:6379 //主节点的端口
master_link_status:up //与主节点的连接状态
master_last_io_seconds_ago:0 //主节点最后与从节点的通信时间间隔,单位秒
master_sync_in_progress:0 //从节点是否正在全量同步主节点的RDB文件
slave_repl_offset:407 //复制偏移量
slave_priority:100 //从节点的优先级
slave_read_only:1 //从节点是否只读
connected_slaves:0 //连接从节点的个数
master_repl_offset:0 //当前从节点作为其他从节点的主节点时的复制偏移量
//以下四种信息为通用的配置
repl_backlog_active:0 //复制缓冲区的状态
repl_backlog_size:1048576 //复制缓冲区的大小
repl_backlog_first_byte_offset:0//复制缓冲区起始偏移量,标识当前缓冲区可用的范围
repl_backlog_histlen:0 //标识复制缓冲区已存在的有效数据长度
127.0.0.1:9999> KEYS * //由于主节点的键空间为空,所以从节点的键空间也为空。
实现效果
slave在启动的时候就会连接master,把数据同步过来,再在master上执行命令写入数据时,就会看到slave上同样有数据。但是slave模式下本身是只读的不可以写入,如果写入会报下面的错误
127.0.0.1:9999> SET key value
(error) READONLY You can't write against a read only slave.
部署方式
在slave的info replication信息中可以看到slave上同样有connection_slaves
属性,说明slave也可以作为另一个机器的master去拷贝,也就是说我们的部署结构可以是这样
-
一主一从
image.png -
一主多从
image.png -
树型结构
image.png
在数据量大时,slave的个数如果太多,master上拷贝的开销会很大,所以master上连接太多的slave是不好的,所以可以使用树形的方式减轻master的分发压力,但是这种方式对于孙子节点上的实例来说,要走两跳网络拷贝,所以数据更新很可能有延迟,所以这种方式比较适合AP系统,即弱一致性
断开从节点模式
- 在从节点上直接执行
slaveof no one
,自动断开与主节点的连接,本机节点升为master
防止主节点在不安全的情况执行写命令
min-slaves-to-write 3 //从节点数量少于3个,主节点拒绝执行写命令
min-slaves-max-lag 10 //3个从节点的延迟(lag)值,大于或等于10,主节点拒绝执行写命令
这样就保证了在从节点完备的情况执行写命令,不会因为从节点大面积宕机导致redis出现单机读写
网友评论