redis集群解析 docker搭建redis集群

分布式缓存

流程图

因为传统的关系型数据库如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集群 避免服务器挂掉导致 服务连接失败

文章redis集群说明来自

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值