分布式缓存
流程图
因为传统的关系型数据库如Mysql已经不能适用所有的场景了,比如秒杀的库存扣减,APP首页的访问流量高峰等等,都很容易把数据库打崩,所以引入了缓存中间件redis
redis 集群
主从模式
特点:
主数据库可以进行读写操作 当写操作导致数据变化时会同步给从数据库
从数据库一般是只读的,而且接收同步主数据库的数据
一个master可以对应多个slave 但是一个slave只能对应一个master
slave挂了不会影响其他slave的读和master的读写 重新启动后会同步master的数据
master挂了不影响slave的读 但redis不再提供写服务,master重启后 redis将重新对外提供写服务
master挂了以后不会在slave里面选择master
缺点:
从上面可以看出,master节点在主从模式中唯一,若master挂掉,则redis无法对外提供写服务。
创建网关
docker network create myredis
docker pull redis:5.0.5
创建文件 当然也可以使用shell脚本
mkdir -p ./redis/node-6380/conf
touch ./redis/node-6379/conf/redis.conf
mkdir -p ./redis/node-6380/conf
touch ./redis/node-6380/conf/redis.conf
mkdir -p ./redis/node-6381/conf
touch ./redis/node-6281/conf/redis.conf
master redis.conf
port 6380
requirepass 123456
appendonly yes
masterauth 123456 // sentinel集群时需要不然连接不上
salve redis.conf
port 6381
requirepass 123456
appendonly yes
slaveof masterip 6380
masterauth 123456
docker模式下设置 daemonize yes
无法启动,所以不设置该项。已踩坑
启动
创建 redisrun.sh
touch redisrun.sh
给予权限
chmod +x redisrun.sh
编写文件
for port in $(seq 6380 6382); \
do \
docker run -it -d -p ${port}:${port} -p 1${port}:1${port} \
--privileged=true -v /root/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
--privileged=true -v /root/redis/node-${port}/data:/data \
--restart always --name redis-${port} --net myredis \
--sysctl net.core.somaxconn=1024 redis:5.0.5 redis-server /etc/redis/redis.conf
done
运行
./redisrun.sh
最后在Redis Desktop Manager 上面测试 成功 slave同步了数据
本例为简单例子 如需其他性质 可以配置redis.conf
sentinel模式
主从模式的弊端就是不具备高可用性,当master挂掉以后,Redis将不能再对外提供写入操作,因此sentinel应运而生。
sentinel模式建立在主从模式之上 拥有主从基本的性质 稍微有一点不同
当master挂了以后,sentinel会在slave中选择一个做为master 并修改他们的配置文件 其他的配置文件也会被修改,比如salveof属性会指向新的master
当master重新启动 他将不再是master 而是作为slave接收新的master同步数据
sentinel也是一个进程 也可能会挂掉 所以sentinel也会启动多个形成一个sentinel集群
多sentinel配置时 sentinel之间也会自动监控
当主从模式配置密码时,sentinel也会同步将配置信息修改到配置文件中,不需要担心
一个sentinel或sentinel集群可以管理多个主从Redis,多个sentinel也可以监控同一个redis
sentinel最好不要和Redis部署在同一台机器,不然Redis的服务器挂了以后,sentinel也挂了
每个sentinel以每秒钟一次的频率向它所知的master,slave以及其他sentinel实例发送一个 PING 命令
如果一个实例距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被sentinel标记为主观下线。
如果一个master被标记为主观下线,则正在监视这个master的所有sentinel要以每秒一次的频率确认master的确进入了主观下线状态
当有足够数量的sentinel(大于等于配置文件指定的值)在指定的时间范围内确认master的确进入了主观下线状态, 则master会被标记为客观下线
在一般情况下, 每个sentinel会以每 10 秒一次的频率向它已知的所有master,slave发送 INFO 命令
当master被sentinel标记为客观下线时,sentinel向下线的master的所有slave发送 INFO 命令的频率会从 10 秒一次改为 1 秒一次
若没有足够数量的sentinel同意master已经下线,master的客观下线状态就会被移除;
若master重新向sentinel的 PING 命令返回有效回复,master的主观下线状态就会被移除
sentinel集群搭建
1.下载 redis
wget http://download.redis.io/releases/redis-5.0.4.tar.gz
2.创建挂载包
mkdir ./redis/node-6380/sentinel
mkdir ./redis/node-6381/sentinel
mkdir ./redis/node-6382/sentinel
将 解压的sentinel.conf 复制进三个sentinel文件(这里不演示)
修改sentinel.conf (6381) 6380 6382配置一样
port 26381 修改端口
pidfile "/var/run/redis-sentinel.pid"
logfile ""
dir "/tmp"
sentinel monitor mymaster 服务器ip 6380 2
sentinel auth-pass mymaster 123456
启动
创建 redisrun.sh
touch redissentinel.sh
给予权限
chmod +x redissentinel.sh
编写文件
vi redissentinel.sh
for port in $(seq 6380 6382); \
do \
docker run -it -d -p 2${port}:2${port} \
--privileged=true -v /root/redis/node-${port}/sentinel/sentinel.conf:/etc/redis/sentinel.conf \
--restart always --name redis-sentinel-2${port} --net myredis \
--sysctl net.core.somaxconn=1024 redis:5.0.5 redis-sentinel /etc/redis/sentinel.conf
done
运行
./redissentinel.sh
测试
1.docker stop redis-6380
模拟master挂了
2.docker logs redis-sentinel-26381
master竞争结果查看
3.docker start redis-6380
重启原master 变成slave
cluster模式
sentinel模式基本可以满足一般生产的需求,具备高可用性。但是当数据量过大到一台服务器存放不下的情况时,主从模式或sentinel模式就不能满足需求了,这个时候需要对存储的数据进行分片,将数据存储到多个Redis实例中。cluster模式的出现就是为了解决单机Redis容量有限的问题,将Redis的数据根据一定的规则分配到多台机器。
面对大量数据 其实也可以分片
* 多个redis节点网络互联,数据共享
* 所有的节点都是一主一从(也可以是一主多从),其中从不提供服务,仅作为备用
* 不支持同时处理多个key(如MSET/MGET),因为redis需要把key均匀分布在各个节点上,
并发量很高的情况下同时创建key-value会降低性能并导致不可预测的行为
* 支持在线增加、删除节点
* 客户端可以连接任何一个主节点进行读写
集群搭建
与sentinel 无关 与redis.conf有关
加上
cluster-enabled yes
cluster-config-file nodes_7001.conf
cluster-node-timeout 15000
多服务器 的redis集群 避免服务器挂掉导致 服务连接失败