redis四大策略-单机模式、主从模式、哨兵模式、集群模式搭建

1、前言

最近学习搭建redis服务器,主要包含三种模式:主从模式、哨兵模式、集群模式,由于服务器有限,所以使用docker本机搭建

2、服务搭建

2.1 单机redis

### docker服务搭建略过
### docker 下载 redis
docker pull redis:latest
### 启动redis
docker run --name redis -p 6379:6379 --restart always -d redis:latest
### 重启命令
docker restart redis

此时一台redis服务器就已经启动了,我们可以通过redis命令进行链接

### 连接redis
redis-cli -h 127.0.0.1 -p 6379

连接完成后,可以在redis中进行命令操作,例如set、get、zadd、hget、hset等命令,此时一台单机redis已经搭建完成

2.2 redis主从模式

需要准备三台服务器,搭建以一主二从,这是需要设置每台服务器的配置文件

## 绑定文件 所有ip均可访问
bind 0.0.0.0 -::1
### 设置端口
port 6379
### 设置快照文件
dbfilename dump79.rdb
### 设置logfile 
logfile "6379.log"

此时设置一台服务器完成,另外两台端口分别为 6380、6381,讲上面文件中79均改成80即可,保存前,先创建文件夹作为redis配置及日志共享文件夹,例如我的文件夹为tool/myData/redis/conf、tool/myData/redis/data,用来分别保存配置文件及日志文件,并在启动时加上文件夹 -v映射

!! !批量删除删除之前镜像(如需要自行选择)
docker ps -a|awk 'NR>1'|grep redis|awk '{print $NF}'|xargs docker rm -f

###创建文件夹
mkdir tool/myData/redis/conf&mkdir tool/myData/redis/data
### 6379服务器
docker run --name  redis79 -p 6379:6379 -v /Users/****/tool/myData/redis/conf/redis79.conf:/etc/redis/redis.conf -v /Users/****/tool/myData/redis/data:/data  -d redis redis-server /etc/redis/redis.conf --appendonly yes
###6380服务器
docker run --name  redis80 -p 6380:6380 -v /Users/****/tool/myData/redis/conf/redis80.conf:/etc/redis/redis.conf -v /Users/****/tool/myData/redis/data:/data  -d redis redis-server /etc/redis/redis.conf --appendonly yes
###6381服务器
docker run --name  redis81 -p 6381:6381 -v /Users/****/tool/myData/redis/conf/redis81.conf:/etc/redis/redis.conf -v /Users/****/tool/myData/redis/data:/data  -d redis redis-server /etc/redis/redis.conf --appendonly yes

#或者自己写个for循环网上自己百度

此时三台镜像创建完毕,如图
在这里插入图片描述在这里插入图片描述
此时随意进入一台

### 进入docker 镜像内部
docker exec -it redis79 bash
### 登录redis
redis-cli -h 127.0.0.1 -p 6379
### 查询主从状态
info replication

在这里插入图片描述
此时,当前节点为默认主节点,无从节点链接,这是我们需要登录从节点服务器,进行从节点配置

### 配置从节点,也可写在conf文件中
slaveof 127.0.0.1 6379
## 如想恢复主节点
slaveof no one

在这里插入图片描述
同理 操作81进行指定为从节点,此时查询主节点状态,一主二从搭建完成

在这里插入图片描述
此时,简单主从关系搭建完成,此时主节点进行插入操作,从节点进行查询操作

思考: 此时主从节点搭建完成,但是如果主节点挂掉,导致整个redis失效,如何处理,这就引出 redis哨兵模式

2.3、redis 哨兵模式

哨兵主要有两个重要作用:
第一:哨兵节点会以每秒一次的频率对每个 Redis 节点发送PING命令,并通过 Redis 节点的回复来判断其运行状态。
第二:当哨兵监测到主服务器发生故障时,会自动在从节点中选择一台将机器,并其提升为主服务器,然后使用 PubSub 发布订阅模式,通知其他的从节点,修改配置文件,跟随新的主服务器。

在实际生产情况中,Redis Sentinel 是集群的高可用的保障,为避免 Sentinel 发生意外,它一般是由 3~5 个节点组成,这样就算挂了个别节点,该集群仍然可以正常运转。其结构图如下所示:
在这里插入图片描述
上图所示,多个哨兵之间也存在互相监控,这就形成了多哨兵模式,现在对该模式的工作过程进行讲解,介绍如下:
1) 主观下线
主观下线,适用于主服务器和从服务器。如果在规定的时间内(配置参数:down-after-milliseconds),Sentinel 节点没有收到目标服务器的有效回复,则判定该服务器为“主观下线”。比如 Sentinel1 向主服务发送了PING命令,在规定时间内没收到主服务器PONG回复,则 Sentinel1 判定主服务器为“主观下线”。
2) 客观下线
客观下线,只适用于主服务器。 Sentinel1 发现主服务器出现了故障,它会通过相应的命令,询问其它 Sentinel 节点对主服务器的状态判断。如果超过半数以上的 Sentinel 节点认为主服务器 down 掉,则 Sentinel1 节点判定主服务为“客观下线”。
3) 投票选举
投票选举,所有 Sentinel 节点会通过投票机制,按照谁发现谁去处理的原则,选举 Sentinel1 为领头节点去做 Failover(故障转移)操作。Sentinel1 节点则按照一定的规则在所有从节点中选择一个最优的作为主服务器,然后通过发布订功能通知其余的从节点(slave)更改配置文件,跟随新上任的主服务器(master)。至此就完成了主从切换的操作。

示例

### 创建 sentinel.conf 文件
sentinel monitor myredis 172.17.0.1 6379 1
# 1表示主机宕机之后slave进行的投票选取谁来称为新的主机
### 将 文件复制进容器中
docker cp /Users/cuizhiming/tool/myData/redis/conf/sentinel79.conf redis79:/etc/redis/sentinel.conf
###  sentinel配置文件引入
docker run --name  redis80 -p 6380:6380 -v /Users/cuizhiming/tool/myData/redis/conf/redis80.conf:/etc/redis/redis.conf -v /Users/cuizhiming/tool/myData/redis/conf/sentinel79.conf:/etc/redis/sentinel.conf -v /Users/cuizhiming/tool/myData/redis/data:/data  -d redis redis-server /etc/redis/redis.conf --appendonly yes
### 启动监听节点
docker exec -it redis80 bash
redis-sentinel /etc/redis/sentinel.conf

成功启动,如图:
在这里插入图片描述
此时如果管理主节点,6379,则从节点会自动升为主节点
在这里插入图片描述
此时6181节点升为主节点,查看信息如下
在这里插入图片描述
但是,哨兵模式只是解决了手动设置主从的问题,他还有其他缺点:

特别是在主从切换的瞬间存在访问瞬断的情况,等待时间比较长,至少十来秒不可用。
哨兵模式只有一个主节点对外提供服务,没法支持很高的并发
单个主节点内存也不宜设置得过大,否则会导致持久化文件过大,影响数据恢复或主从同步的效率。
与主从相比,哨兵仅解决了手动切换主从节点问题,至于其他的问题,基本上仍然存在。

2.4、集群模式

Redis Cluster 是 3.0 版后推出的 Redis 分布式集群解决方案,主要解决 Redis 分布式方面的需求,比如,当遇到单机内存,并发和流量等瓶颈的时候,Redis Cluster 能起到很好的负载均衡的目的。

Redis Cluster 集群节点最小配置 6 个节点以上(3 主 3 从),其中主节点提供读写操作,从节点作为备用节点,不提供请求,只作为故障转移使用。Redis Cluster 采用虚拟槽分区,所有的键根据哈希函数映射到 0~16383 个整数槽内,每个节点负责维护一部分槽以及槽所印映射的键值数据。

注意:集群模式下 从节点不提供读写,与主从模式不一样。 总结一下经验,分布式 场景下:集群模式一般从节点不参与读写,仅作为备用节点。而主从一般都要负责读或写,都要参与具体的工作。

创建子网

### 区分docker默认 host bridge none,创建自己的配置
docker network create --subnet 172.18.0.0/16 --gateway 172.18.0.1 redis
### 查看时候创建成功
docker network ls
### 查看详情
docker network inspect redis

网络配置创建完成,然后开始创建镜像,修改conf配置,添加如下配置(示例)

#cluster-enabled yes
#cluster-config-file nodes81.conf
#cluster-node-timeout 15000
#cluster-announce-ip 172.18.0.4
#cluster-announce-port 6381
#cluster-announce-bus-port 16381

六个节点配置完成后,开始创建镜像

### 指定创建网络 redis,指定ip
docker run --net=redis --name redis79 -p 6379:6379  --ip 172.18.0.2  -v  /Users/cuizhiming/tool/mydata/redis/conf/redis79.conf:/etc/redis/redis.conf  -v /Users/cuizhiming/tool/mydata/redis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes

创建完成后统一加入集群

### 加入集群
redis-cli  --cluster create --cluster-replicas 1 172.18.0.1:6379 172.18.0.1:6380 172.18.0.1:6381 172.18.0.1:6382 172.18.0.1:6383 172.18.0.1:6384

如图:
在这里插入图片描述
此时出现waiting for the cluster to join 问题,解决此类问题有两种方案

1、启动时指定网络为host 即启动时指定
2、启动时将10000+port端口开启,并在命令中启动
docker run --net=redis --name redis79 -p 6379:6379 -p 16379:16379 --ip 172.18.0.2  -v  /Users/cuizhiming/tool/mydata/redis/conf/redis79.conf:/etc/redis/redis.conf  -v /Users/cuizhiming/tool/mydata/redis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes 

再次启用集群命令后,成功
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值