redis主从架构

redis主从架构:

单节点redis的读取并发能力是有上线的,要进一步提高redis读的并发能力,就需要搭建主从集群,实现读写分离。下图就是基础的主从架构。

共包含三个节点,一个主节点,两个从节点。

这里我们会在同一台虚拟机中开启3个redis实例,模拟主从集群,信息如下(由于我只有一台阿里云服务器,所以暂时就在同一台服务器上,使用三个不同端口来模拟三台redis)

IP

port

角色

172.18.234.198

7001

master

172.18.234.198

7002

salve

172.18.234.198

7003

salve

准备实例和配置

要在同一台虚拟机上开启3个实例,就必须准备三份不同的配置文件和目录,配置文件所在的目录也就是工作目录

redis的安装

安装redis,并配置开机自启(centos7.9)

安装依赖(下载地址Download | Redis):


安装依赖:

yum -y install gcc tcl


tar pvxf redis-7.0.5.tar.gz 

cd redis-7.0.5

make && make install

默认的安装路径:/usr/local/bin目录下

1)创建目录

我们创建三个文件夹,名字分别叫7001,7002,7003:

cd /root
mkdir 7001 7002 7003
#将redis.conf复制到7001 7002 7003下面
cd redis-7.0.5/
#修改配置文件(因为方便查看实验的log日志,所以就不修改daemonize这一栏了,默认no就行):
vim redis.conf
#监听的地址,默认时127.0.0.1,回导致只能在本地访问,修改为0.0.0.0则可以在任意IP访问。生产环境不设置为0.0.0.0
bind 0.0.0.0
#关闭redis保护机制,不关机就无法与外网连接,仅本地使用。
protected-mode no

#复制配置文件到三个文件夹(因为一台模拟三台所以需要三份配置文件来启动)
cp redis.conf /root/7001/
cp redis.conf /root/7002/
cp redis.conf /root/7003/

修改各个文件夹内的配置文件:

#使用sed语句将redis.conf内的端口port和dir保存路径更改掉
sed -i -e  's/port 6379/port 7001/g' -e 's/dir .\//dir \/root\/7001\//g' /root/7001/redis.conf
sed -i -e  's/port 6379/port 7002/g' -e 's/dir .\//dir \/root\/7002\//g' /root/7002/redis.conf
sed -i -e  's/port 6379/port 7003/g' -e 's/dir .\//dir \/root\/7003\//g' /root/7003/redis.conf

修改每个实例的声明IP和端口(这一步是为了强制分支将明确的IP和port告诉给master分支)

#需要修改的修改内容:
replica-announce-ip 172.18.234.198
replica-announce-port 7001
#将声明IP地址插入到redis.conf中(因为只在一台上做实验,所以就直接使用sed修改了)
printf '%s\n' 7001 7002 7003 | xargs -I{} -t sed -i '1a replica-announce-ip 172.18.234.198' {}/redis.conf
#插入port端口
sed -i '1a replica-announce-port 7001' /root/7001/redis.conf
sed -i '1a replica-announce-port 7002' /root/7002/redis.conf
sed -i '1a replica-announce-port 7003' /root/7003/redis.conf 

开启主从关系:

现在三个实例还没有任何关系,要配置主从可以使用replicaof或者slaveof(5.0以前的命令)。

有临时和永久两种模式:

修改配置文件(永久生效)

                在redis.conf中添加一行配置:replicaof <master ip> <master port>

使用redis-cli客户端连接到redis服务,执行replicaof(重启后失效)

replicaof <master ip> <master port>

注意:在5.0以后新增的replicaof和slaveof效果是一致的

为了方便演示,我就使用临时配置命令来修改了。

redis-cli -h 127.0.0.1 -p 7002
ping                 #用来测试是否已成功连接,成功会返回pong。#确保已经进入到数据库再输入命令,不然会报错:NOAUTH Authentication required.
SLAVEOF 172.18.234.198 7001           #指定主节点
#测试是否已经成功开启主从关系:
INFO replication            #返回下面的内容中状态,master的IP和port还有status显示up。那就说明主从已启动完成

#下面是返回值
——————————————————————————————————————————————————————————————————
# Replication
role:slave
master_host:172.18.234.198
master_port:7001
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_read_repl_offset:826
slave_repl_offset:826
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:873fd84cec3cedcef49f0b371e54397df3379b92
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:826
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:826
————————————————————————————————————————————————————————————————————



redis-cli -h 127.0.0.1 -p 7003
AUTH 123456
SLAVEOF 172.18.234.198 7001           #指定主节点


####测试是否已经实现主从配置:
##在主节点写入一个字符
127.0.0.1:7001> set num 123456
OK
127.0.0.1:7001> GET num
"123456"
#在7002端口的redis中测试能否读取到num表内容:
redis-cli -p 7002
127.0.0.1:7002> get num
"123"
#再到7003的redis中测试能否读取到num表内容:
[root@ycy ~]# redis-cli -p 7003
127.0.0.1:7003> get num
"123"

#再在7003中测试是否可以写入数据库,显示只有只读权限没有写入权限。这就实现了主从的读写分离.主节点写操作,从节点读操作
127.0.0.1:7003> set name jack
(error) READONLY You can't write against a read only replica.

redis主从数据同步原理:

只有第一次同步时候才是全量同步(slave宕机)

master分支通过replid来判断slave是不是第一次来做数据同步,offset是master用来判断slave数据是不是需要更新。 

所以最终数据同步完整的是:

 

可以从一下几个方面来优化redis主从集群:

在master中配置repl-diskless-sync yes启用无磁盘复制,避免全量同步时的磁盘IO。(一般用于网络带宽较高,但是磁盘写入较慢的时候)=====这是为了提高全量同步的性能

redis单节点上的内存占用不要太大,减少RDB导致的过多磁盘IO

适当提高repl_baklog的大小,发现slave宕机时尽快实现故障恢复,尽可能避免全量同步

限制一个master上的slave节点数量,如果实在是太多slave,则可以采用主-从-从链式结构,减少master压力。(按照下图中就是)

 

总结: 

上述是redis的slave节点宕机,当master节点宕机之后,就需要使用redis的哨兵机制。 

redis哨兵机制:

redis提供了哨兵机制来实现集群的自动故障恢复。哨兵的结构和作用如下:

 

 

搭建哨兵集群

三个sentinel实例信息如下:

 

节点

IP

port

s1

172.18.234.198

2701

s2

172.18.234.198

2702

s3

172.18.234.198

2703

 因为是在同一台服务器开启三个实例,所以需要准备三个不同的配置文件和目录,配置文件所在目录也就是工作目录:s1,s2,s3

mkdir s1 s2 s3
###可以从redis的配置文件夹里面拷贝sentinel的配置文件,也可以自己创建sentinel的配置文件
port 27001            #配置端口
sentinel announce-ip 1.2.3.4            #声明本身的IP地址
sentinel monitor mymaster 127.0.0.1 6379 2       #指定监控主节点的信息,其中master是主节点名称,自定义,任意写。后面的2代表着主观下线的判断值,即上面所说的quorum值,判断值是集群一半的数量
sentinel down-after-milliseconds mymaster 5000   #超时的时间
sentinel failover-timeout mymaster 60000            #超时的时间
dir "/tmp/s1"                #工作目录

将s1文件夹中配置的sentinel配置文件粘贴到s2和s3目录,并且将其中的端口和工作目录更改。

cp /root/s1/sentinel.conf /root/s2
cp /root/s1/sentinel.conf /root/s3
#使用sed修改端口和工作目录
sed -i -e 's/27001/27003/g' -e 's/s1/s3/g' /root/s3/sentinel.conf
sed -i -e 's/27001/27002/g' -e 's/s1/s2/g' /root/s2/sentinel.conf
#cat查看是否修改成功
cat /root/s2/sentinel.conf
cat /root/s3/sentinel.conf

启动:

redis-sentinel /root/s1/sentinel.conf
redis-sentinel /root/s2/sentinel.conf
redis-sentinel /root/s3/sentinel.conf
#启动之后,将端口为7001的server关闭。查看哨兵状态,发现当主节点down了之后,哨兵机制会将slave中的一个给选举为master主节点。在为主服务选举之前,sentinel也会先选举一个主服务。
#在sentinel的日志中,vote-for-leader这一步就是在选举主服务。一般谁会先发现master先down机,谁就是主的sentinel。
#在sentinel选出来主之后,switch-master mymaster表示切换主master节点

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白白白斩鸡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值