Redis主从架构和主从从架构搭建详细步骤

自己一步一步搭建成功,现记录下完整的搭建过程
环境:CentOS Linux release 7.4.1708 (Core)

首先提下为什么需要主从复制架构,主从复制的好处有2点:

  1. 避免redis单点故障
  2. 构建读写分离架构,满足读多写少的应用场景

1.主从架构(一主多从)

1.1 Redis主从架构拓扑图结构
Redis主从架构拓扑图

1.2 开始搭建
Redis集群不用安装多个Redis,只需复制多个配置文件,修改端口即可。所以如果要进行主从结构搭建,需先安装单机版Redis。单机版Redis安装可参照:单机版Redis安装教程

1.3 复制3份实例需要的配置文件

#进入单机版redis安装目录(/usr/local/redis)
cd /usr/local/redis

#创建6379、6380、6381目录,分别将安装目录下的redis.conf拷贝到这三个目录下。
mkdir -p /usr/local/redis/6379 && cp bin/redis.conf /usr/local/redis/6379/6379.conf
mkdir -p /usr/local/redis/6380 && cp bin/redis.conf /usr/local/redis/6380/6380.conf
mkdir -p /usr/local/redis/6381 && cp bin/redis.conf /usr/local/redis/6381/6381.conf

1.4 修改配置文件

vim /usr/local/redis/6379/6379.conf 

# Redis使用后台模式
daemonize yes

# 关闭保护模式
protected-mode no

# 注释以下内容开启远程访问
# bind 127.0.0.1

# 在vim末行模式下一次性替换端口(将6379替换成6380)
:%s/6379/6380/g 

以此类推,修改其他端口的配置。

1.5 设置主从
在Redis中设置主从有2种方式:
1.5.1.在redis.conf中设置slaveof

slaveof <masterip> <masterport>

1.5.2、 使用redis-cli客户端连接到redis服务,执行slaveof命令

slaveof <masterip> <masterport>

第二种方式在重启后将失去主从复制关系。我们这里使用第二种方式设置主从:

1.6 分别启动三个Redis实例

redis-server 6379/6379.conf
redis-server 6380/6380.conf
redis-server 6381/6381.conf

#查看redis启动情况
[root@localhost redis]# ps -ef|grep redis
root       690   681  0 11:06 ?        00:00:00 runsv redis
root       699   690  0 11:06 ?        00:00:00 svlogd -tt /var/log/gitlab/redis
gitlab-+   700   690  0 11:06 ?        00:00:09 /opt/gitlab/embedded/bin/redis-server 127.0.0.1:0
root     17221     1  0 14:18 ?        00:00:00 redis-server *:6379
root     17233     1  0 14:18 ?        00:00:00 redis-server *:6380
root     17241     1  0 14:19 ?        00:00:00 redis-server *:6381
root     17249  1825  0 14:19 pts/1    00:00:00 grep --color=auto redis

#发现三个实例已经正常启动

#使用Redis客户端连接上6380端口
redis-cli -h 192.168.24.131 -p 6380
#设置6380端口Redis为6379的从
slaveof 192.168.24.131 6379
#查看主从关系
192.168.24.131:6380> info replication
# Replication
role:slave
master_host:192.168.24.131
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:1
master_link_down_since_seconds:1536560036
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


#同样设置6381端口Redis为6379的从
#使用Redis客户端连接上6381端口
redis-cli -h 192.168.24.131 -p 6381
#执行
slaveof 192.168.24.131 6379

#连接master(6379)查看主从关系
redis-cli -h 192.168.24.131 -p 6379
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.24.131,port=6380,state=online,offset=57,lag=1
slave1:ip=192.168.24.131,port=6381,state=online,offset=57,lag=0
master_repl_offset:57
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:56
#此时发现已经有了两个slave实例

#测试,主库写入,从库读取,默认从库是不允许写入的,可通过修改配置文件更改(slave-read-only no),不建议
[root@localhost redis]# redis-cli -h 192.168.24.131 -p 6379
192.168.24.131:6379> set name macrog
OK
192.168.24.131:6379> 
[root@localhost redis]# redis-cli -h 192.168.24.131 -p 6380
192.168.24.131:6380> get name
"macrog"
192.168.24.131:6380> 
[root@localhost redis]# redis-cli -h 192.168.24.131 -p 6381
192.168.24.131:6381> get name
"macrog"
#数据正常存储并同步至从库

2.主从从架构

2.1 Redis主从从架构拓扑图结构
Redis主从从架构拓扑图

2.2 主从从架构搭建
Redis的主从架构的缺点是所有的slave节点数据的复制和同步都由master节点来处理,会造成master节点压力太大,所以我们使用主从从结构来处理

2.3 前面步骤同主从架构一致,只是在设置主从结构时,设置6380为6379的从,6381为6380的从
目前6380和6381两个实例都是以6379作为master的,我们只需将6381的master的设置为6380即可

1连接上6381的实例
redis-cli -h 192.168.24.131 -p 6381
2去除之前设置的master信息
slaveof no one
#查看主从关系info replication 发现已成功断开主从关系
#重新设置主从关系
slaveof 192.168.24.131 6380
#成功后查看三个实例的主从关系

#测试读写数据  6379写入 6381读  成功

3.主从复制的过程原理

1.当从库和主库建立MS关系后,会向主数据库发送SYNC命令

2.主库接收到SYNC命令后会开始在后台保存快照(RDB持久化过程),并将期间接收到的写命令缓存起来

3.当快照完成后,主Redis会将快照文件和所有缓存的写命令发送给从Redis

4.从Redis接收到后,会载入快照文件并且执行收到的缓存的命令

5.之后,主Redis每当接收到写命令时就会将命令发送从Redis,从而保证数据的一致

4.无磁盘复制

通过前面的复制过程我们了解到,主库接收到SYNC的命令时会执行RDB过程,即使在配置文件中禁用RDB持久化也会生成,那么如果主库所在的服务器磁盘IO性能较差,那么这个复制过程就会出现瓶颈,庆幸的是,Redis在2.8.18版本开始实现了无磁盘复制功能(不过该功能还是处于试验阶段)。

原理:Redis在与从数据库进行复制初始化时将不会将快照存储到磁盘,而是直接通过网络发送给从数据库,避免了IO性能差问题。

开启无磁盘复制:repl-diskless-sync yes

5.复制架构中出现宕机情况,如何解决

如果在主从复制架构中出现宕机的情况,需要分情况看:

1.从Redis宕机
这个相对而言比较简单,在Redis中从库重新启动后会自动加入到主从架构中,自动完成同步数据;
如果从库在断开期间,主库的变化不大,从库再次启动后,主库依然会将所有的数据做RDB操作吗?还是增量更新?(从库有做持久化的前提下)
在Redis2.8版本后就实现了,主从断线后恢复的情况下实现增量复制。

2.主Redis宕机
这个相对而言就会复杂一些,需要以下2步才能完成
i. 第一步,在从数据库中执行SLAVEOF NO ONE命令,断开主从关系并且提升为主库继续服务;
ii. 第二步,将主库重新启动后,执行SLAVEOF命令,将其设置为其他库的从库,这时数据就能更新回来;

这个手动完成恢复的过程其实是比较麻烦的并且容易出错,有没有好办法解决呢?当前有的,Redis提高的哨兵(sentinel)的功能,下一篇博客将介绍redis的哨兵模式。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值