redis学习(一)——主从架构实现高并发原理

几个原理:主从复制原理、哨兵原理、集群模式工作原理
redis 实现高并发主要依靠主从架构,一主多从。主从后要高可用,就要加哨兵,可以实现,任何一个实例宕机,可以进行主备切换。高并发高可用后想容纳大数据,要redis集群
哨兵:哨兵集群
redis集群:redis集群

一、主从复制理论介绍


1.1、主从复制原理
(1)主从结构:主从(master-slave)架构,一主多从,主数据库负责写,并且将数据复制到其它的 slave 节点;从数据库负责读,实现数据库读写分离。这样可以水平扩容,支撑读高并发。

(注意:redis里边只能一主多从,不能多主多从)
在这里插入图片描述
(2)主从复制核心机制(redis replication)
采用异步方式复制数据到slave 节点,一个主节点可以配置多个从节点,从节点也可以连接其他从节点并且它复制时不会中断主节点,也不会中断对自己的查询操作,它用旧数据集提供服务,复制完后删除旧数据集加载新数据集,这时会暂停对外服务。

主从复制应用场景:集群、读写分离、日志备份、高可用
(3)主从复制的核心原理
将服务器分为主服务器和从服务器,当启动一个从节点的时候,它会发送一个 PSYNC 命令给主节点;

如果这是初次连接会触发一次 full resynchronization 全量复制,此时master 启动一个后台线程生成一份RDB快照文件,同时将从客户端收到的所有写命令缓存在内存中;

RDB生成完毕主节点会将它发给slave,slave会先写入本地磁盘然后从本地磁盘加载到内存,然后master 将内存中缓存的写命令发给slave,slave也会同步这些数据;

(注意:从节点如果跟主节点有网络故障,断开后会自动重连,连接后主节点仅复制给从节点缺少的数据)
在这里插入图片描述

详细过程

(1)当一个从数据库启动,会向主数据库发送sync命令; 

(2)主数据库接收到sync命令后,开始在后台执行快照(执行RDB操作),并将保存快照期间接收到的命令保存起来;

(3)当快照完成后,redis会将 快照文件和所有缓存命令 发送给从数据库;

(4)从数据库收到后,会载入快照文件并执行收到的缓存命令。

1.2、主从复制的一些问题 


(1)断点续传:

主节点在内存中维护一个backlog,master 和 slave 都会保存一个副本偏移量和主运行id,偏移量保存在backlog中,如果断网slave 会让 master 从上次副本偏移量复制,如果没找到偏移量则进行一次全量复制
(2)过期 key 处理:

slave 不会过期 key,只会等待 master 过期 key,如果 master 过期了一个 key,或者通过 LRU 淘汰了一个 key,那么会模拟一条 del 命令发送给 slave。


1.3、三个复制类型


(1)全量复制:

master 执行 bgsave ,在本地生成一份 rdb 快照文件,然后发给从节点,如果rdb复制时间超过60s,那么从节点会认为执行失败,主节点生成rdb时将写命令缓存在内存中,在 从节点保存了 rdb 之后,再将新的写命令复制给从节点,从节点接收rdb后清空自己旧数据然后将rdb加载进内存,同时基于旧的数据版本对外提供服务
(2)增量复制:

全量复制过程中断网,slave 重新连接 master 时会触发增量复制,master 直接从自己的 backlog 中获取部分丢失的数据,发送给 slave node。
主从节点互相都会发送 心跳信息,主节点默认每隔 10秒 发送一次心跳,从节点每隔1秒发送一个心跳
(3)异步复制:

master 每次接收到写命令之后,先在内部写入数据,然后异步发送给 slave node

1.4、配置主从复制:是在从服务器配置

修改从Redis从配置文件:
修改slave从redis中的 redis.conf文件
slaveof 192.168.33.130 6379  
masterauth 123456--- 主redis服务器配置了密码,则需要配置
一主多从如何实现 

二、Linux下Redis安装

下载Redis安装包
wget http://download.redis.io/releases/redis-3.2.9.tar.gz
解压Redis安装包
tar -zxvf redis-3.2.9.tar.gz
安装
cd redis-3.2.9
Make
Cd src
make install PREFIX=/usr/local/redis
移动配置文件到安装目录下
cd ../
mkdir /usr/local/redis/etc
mv redis.conf /usr/local/redis/etc

配置redis为后台启动
vi /usr/local/redis/etc/redis.conf //将daemonize no 改成daemonize yes
vi /usr/local/redis/etc/redis.conf // requirepass 123
开启redis
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf 

连接Redis客户端

./redis-cli -h 127.0.0.1 -p 6379 -a "123456" 
PING 结果表示成功


关闭防火墙


//临时关闭
systemctl stop firewalld
//禁止开机启动
systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.


停止Redis服务
./redis-cli -h 127.0.0.1 -p 6379 -a "123456"  shutdown
修改redis.conf
注释掉
#bind 127.0.0.1 开启外网访问

发布了52 篇原创文章 · 获赞 116 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/RuiKe1400360107/article/details/103649957