redis(2):四种模式(单机、哨兵、集群、主从复制)部署

学习自:Redis 的四种模式 - 何童鞋 - 博客园

深入理解Redis的部署模式四种模式的探索(redis部署四种模式)-数据库运维技术服务

redis部署和运行原理 redis的三种部署方式_小咪咪的技术博客_51CTO博客

上一节:Redis(1):四种模式(单机、哨兵、集群、主从复制)原理

关于配置过程中碰到的问题,可以看Redis:各种错误 - ShineLe - 博客园

0、缩写

m:master,主服务器

s:slave,从服务器

1、单机模式

学习自:redis部署和运行原理 redis的三种部署方式_小咪咪的技术博客_51CTO博客

数据库部署在一台服务器上,只有一个redis服务实例

当安装部署了一个Redis后,默认模式就是单机模式。

redis-server & /usr/local/redis/redis-6.2.13/redis.conf

这种模式下,redis服务器的IP和端口默认为127.0.0.1和6379。

也可以定制IP和端口:

redis-cli -h IP地址 -p 端口

 

此时可以用redis-cli去进行一些指令,验证redis服务器是否连接成功:

ping:检测连接

127.0.0.1:6379> ping // 检测连接是不是好的
PONG
127.0.0.1:6379> ping "hello the world" // 也可以发送指定消息
"hello the world"

set、get:存取K-V对

127.0.0.1:6379> set key1 value1
OK
127.0.0.1:6379> get key1
"value1"
127.0.0.1:6379>  ttl key1
(integer) -1
127.0.0.1:6379> set key1 value1 EX 1000
OK
127.0.0.1:6379> get key1
"value1"
127.0.0.1:6379> ttl key1
(integer) 990
127.0.0.1:6379> ttl key1
(integer) 984
127.0.0.1:6379> del key1
(integer) 1
127.0.0.1:6379> get key1

备注: 其他命令实际操作,可以参考:http://redisdoc.com/

 

2、主从复制模式

学习自:Redis(主从复制、哨兵模式、集群)概述及部署_redis主从模式部署_超级驼鹿️的博客-CSDN博客(主要)

Redis 主从模式部署步骤(参考)

服务器部署在多台服务器上,形成m和s的结构。

m承担所有客户端请求处理所有数据备份的任务;s只负责备份数据不处理客户端请求。

实现

现在有3台机器(为了保证主从,这三台机器必须是同一个网段,相互可以连通):

192.168.10.11 #s
192.168.10.12 #s
192.168.10.20 #m

默认s和m上都已经安装了redis

1、在m上修改配置文件redis.conf

vim /usr/local/redis/conf/redis.conf
bind 0.0.0.0                       #监听地址 0.0.0.0
protected-mode no                    #本机访问保护模式 no
port 6379                            #监听6379端口
daemonize yes                        #设置为守护进程,后台启动
pidfile /usr/local/redis/log/redis_6379.pid     #PID 文件
logfile "/usr/local/redis/log/redis_6379.log"   #日志文件
dir /usr/local/redis/data                       #指定持久化文件所在目录
requirepass Wrt65536                             #可选,设置redis密码
appendonly yes                                  #开启AOF

2、在s上修改redis.conf

vim /usr/local/redis/conf/redis.conf
bind 0.0.0.0                       #监听地址 0.0.0.0
protected-mode no                    #本机访问保护模式 no
port 6379                            #监听6379端口
daemonize yes                        #设置为守护进程,后台启动
pidfile /usr/local/redis/log/redis_6379.pid     #PID 文件
logfile "/usr/local/redis/log/redis_6379.log"   #日志文件
dir /usr/local/redis/data                       #指定持久化文件所在目录
requirepass Wrt65536                            #可选,设置redis密码
appendonly yes                                  #开启AOF
#相比m的附加项
replicaof 192.168.10.20 6379            #指定要同步的m节点的ip和端口
masterauth Wrt65536                  #指定m的密码,仅在m节点设置了requirepass时起作用

3、启动s和m上的redis

sudo redis-server /路径/redis.conf &

4、验证主从关系

在master上添加K-V对

redis-cli -h 192.168.10.20 -p 6379 -a Wrt65536

在两台slave上查看K(这里我为了方便,将三台机器的密码设为统一了)

redis-cli -h 192.168.10.11 -p 6379 -a Wrt65536
redis-cli -h 192.168.10.12 -p 6379 -a Wrt65536

 

3、哨兵模式

学习自:Redis哨兵模式

redis哨兵模式来进行主从替换以及故障恢复_redis 主服务恢复后依然是主服务_Rapig1的博客-CSDN博客

主从复制的基础上,哨兵模式引入了主节点的自动故障转移。

1)实现之前,注意事项

  • m+s数量≥3;
  • 哨兵集群中的机器数量为奇数;
  • redis哨兵和redis服务本身没啥关系,你可以把redis哨兵部署在一个没开启redis服务的机器上,也可以把它部署在开启了redis服务的机器上,redis服务的开关与否不影响本机哨兵的正常运行(但可能会对哨兵日志文件产生影响,因为启停过程会影响整个系统)

2)实现原理图

3)哨兵模式作用

①监控

监控m和s节点是否正常工作;

②自动故障转移

当m不工作时,哨兵自动开始故障转移,将失效m中的一个s升级为m,并让其他s从新m复制

③通知

将故障转移结果告知client

4)结构

哨兵节点:由一个或多个哨兵节点组成

数据节点:m和s节点

5)故障转移机制

①定期检测,哨兵每1s向m、s、其他哨兵发送一次ping心跳检测。如果m在一段时间内不回复或错误回复,该哨兵会认为这个节点主观下线超半数哨兵认为主观下线,则变为客观下线

②当m故障,哨兵通过Raft算法(选举算法)共同选举出一个哨兵leader,来处理主节点的故障转移和通知。所以哨兵集群中节点≥3。

③由leader执行故障转移:

  • 将某个s升级为m,让其他s指向新m;
  • 若原m恢复,也变为s并指向新m;
  • 通知client更换了m。

注意,下线是单纯针对m才有的概念,对s、哨兵不会有后续。

m的选举

1.过滤掉不健康的(已下线的),没有回复哨兵 ping 响应的从节点。
2.选择配置文件中从节点优先级配置最高的。(replica-priority,默认值为100)
3.选择复制偏移量最大,也就是复制最完整的从节点。

6)实现

哨兵的实现依赖于主从模式,所以在做哨兵模式前要先做主从模式。

①基于第2节的主从复制,已经搭建完3台redis服务器

主机IP地址
Master 192.168.10.20
Slave1 192.168.10.11
Slave2 192.168.10.12

关闭防火墙

systemctl stop firewalld #关闭firewalld防火墙
setenforce 0 #关闭selinux防火墙

②修改哨兵配置文件sentinel.conf(所有主机)

vim /usr/local/redis/redis-6.2.13/sentinel.conf
protected-mode no                                #关闭保护模式,允许远程访问
port 26379                                        #Redis哨兵默认的监听端口
daemonize yes                                    #指定sentinel为后台启动
pidfile /usr/local/redis/log/sentinel.pid
logfile "/usr/local/redis/log/sentinel.log"
#指定哨兵日志存放路径 dir dir /usr/local/redis/6379 #指定数据库存放路径

#指定该哨兵节点监控192.168.10.20:6379这个主节点,该主节点的名称是mymaster,
#最后的2的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移
sentinel monitor mymaster
192.168.10.20 6379 2

#这两项一开始是注释掉的,需要手动添加
#113行,判定服务器down掉的时间周期,默认3000毫秒(3秒) sentinel down-after-milliseconds mymaster 3000
#146行,故障节点的最大超时时间为1800毫秒(1.8秒) sentinel failover
-timeout mymaster 1800

#如果接入外界的网络是NAT,那么还要设置下边两项
sentinel announce-ip 本机ip
sentinel announce-port 26379

要确保这里写的所有目录(比如log,6379)都是存在的,如果不存在需要先去新建

③启动哨兵模式:先m后s

redis-sentinel sentinel.conf &

注意:

  • 这里是哨兵的启动过程,在此之前要先启动m和s上的redis服务
    redis-server redis.conf &
  • 这里是redis-sentinel sentinel.conf而不是redis-server redis.conf
  • 先m后s,共启动3次(有多少台启动多少次)

④故障模拟

在m上执行如下指令:

  • 先用ps -ef查询redis-server的进程号
  • kill该redis-server进程(注意是server不是sentinel)
  • 查看日志 

日志显示切换成功

⑤验证

在已经成为master的主机192.168.10.12上,设置新的K-V对:

在另一台slave上查看结果

 

4、集群模式

本节学习自:三、Redis 集群模式

数据库部署在一组Redis实例,形成一个相互关联的集群。它支持多个客户端同时连接多台服务器,实现真正的分布式系统,可以更好地满足大型系统的高可用性和高吞吐性要求。

redis-server --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 15000

 

集群,即Redis Cluster,是Redis 3.0开始引入的分布式存储方案

  • 集群由多个节点Node组成,Redis的数据分布在这些节点中。
  • 集群中的节点分为m和s:m负责读写请求集群信息的维护s负责复制m的数据状态信息。

1)集群的作用

①数据分区(核心)

  • 集群将数据分散到多节点,一方面突破了redis单机内存大小的限制,存储容量大大增加;另一方面每个m都可以对外提供读写服务,大大提高了集群的响应能力。
  • Redis单机内存大小受限问题,如果单机内存太大,bgsave和bgwriteaof的fork操作可能导致主进程阻塞,主从环境下主机切换时可能导致从节点长时间无法提供服务全量复制阶段主节点缓冲区可能溢出

②高可用

集群支持主从复制m节点的自动故障转移,当任一节点发生故障时,集群仍能对外提供服务

2)Redis数据分片

  • Redis集群引入了哈希槽的概念
  • Redis集群有16384个哈希槽(2^14,编号0-16383)
  • 每个Key通过CRC16校验后,对16384取余来决定放哪个哈希槽,通过这个值,去找对应的插槽对应的节点,然后自动跳转到该节点上进行存取操作

主从复制模型

以3个节点组成的集群为例,不同节点管理的哈希槽编号为:

节点A:0-5460

节点B:5461-10922

节点C:10923-16383

集群中有A、B、C三个节点,如果节点B失败了,整个集群就会因缺少5461-10922这个范围槽而不可用。

为每个节点添加一个从节点A1、B1、C1,整个集群就由三个m节点(ABC)和三个s节点(A1B1C1)组成,在节点B失效后,集群选举B1为m继续服务。当B和B1都失败,集群会不可用。

3)集群的工作模式

①用crc16算法对Key键进行计算,得到一个数字,之后对该数字除16384取余

②余数即为哈希槽位置,根据位置判断对应的node节点;

③到对应的node上执行该命令。

4)Redis集群模式实现

redis集群一般要6个节点——3m3s

为了方便起见,这里所有节点都在同一台服务器上模拟:以端口号进行区分,3个m的端口号6001、6002、6003,3个s的端口号6004、6005、6006。

①环境准备

cd /usr/local/redis
mkdir -p redis-cluster/redis600{1..6} #创建6个目录redis6001-redis6006

for i in {1..6}
do
#把redis.conf复制到这6个目录下
cp /usr/local/redis/redis-6.2.13/redis.conf /usr/local/redis/redis-cluster/redis600$i
#把redis-cli和redis-server复制到这6个目录下
cp /usr/local/redis/bin/redis-cli /usr/local/redis/bin/redis-server /usr/local/redis/redis-cluster/redis600$i
done

②修改conf文件,以启动集群功能(6个conf文件修改项相同,除了端口port以及对应的数字项600x)

vim redis6001/redis.conf
#其他5个文件夹的配置文件以此类推修改,注意6个端口都要不一样。

cd /usr/local/redis/redis-cluster/redis6001
vim redis.conf
#bind 127.0.0.1                              #注释掉bind项,默认监听所有网卡
protected-mode no                            #关闭保护模式
port 6001                                    #修改redis监听端口
daemonize yes                                #设置为守护进程,后台启动
pidfile /usr/local/redis/log/redis_6001.pid  #指定 PID 文件
logfile "/usr/local/redis/log/redis_6001.log"#指定日志文件
dir ./                                       #指定持久化文件所在目录
appendonly yes                               #开启AOF
cluster-enabled yes                          #开启群集功能
cluster-config-file nodes-6001.conf          #群集名称文件设置
cluster-node-timeout 15000                   #群集超时时间设置

③所有节点都启动redis节点

分别进入六个目录,执行命令redis-server redis.conf,来启动redis节点:

cd redis-cluster/redis6001
redis-server redis.conf

也可以用一个循环来写

for i in {6001..6006}
do
cd /usr/local/redis/redis-cluster/redis$i
./redis-server redis.conf
done

④启动集群

redis-cli --cluster create 127.0.0.1:6001 127.0.0.1:6002 127.0.0.1:6003 127.0.0.1:6004 127.0.0.1:6005 127.0.0.1:6006 --cluster-replicas 1

启动后

 ⑤测试集群

redis-cli -h 127.0.0.1 -p 6001 -c #加选项c,节点间可以互相跳转
1) 1) (integer) 0      #哈希槽范围下限
   2) (integer) 5460  #哈希槽范围上限
   3) 1) "127.0.0.1"  #主节点
      2) (integer) 6001
      3) "ce6976f8b5f757d946a4d48b618f301057ddcfa8"
   4) 1) "127.0.0.1"  #从节点
      2) (integer) 6005
      3) "9142ba20bb594c887831643db9e3588a19bd8c7d"
2) 1) (integer) 5461
   2) (integer) 10922
   3) 1) "127.0.0.1"
      2) (integer) 6002
      3) "188fb1f0a81677cf9ceeed865e631c291fee27e9"
   4) 1) "127.0.0.1"
      2) (integer) 6006
      3) "54b9cd5676e3f22e047ada1e2f34f03591d10c2e"
3) 1) (integer) 10923
   2) (integer) 16383
   3) 1) "127.0.0.1"
      2) (integer) 6003
      3) "450b0a5d543578c1be8a905f6c2bd6bf6166142e"
   4) 1) "127.0.0.1"
      2) (integer) 6004
      3) "69ba2f07a2be88c5f5de4aa0bd45048b729ad013"

 ⑥插入数据

插入的数据会根据crc16算法,计算对应的哈希槽。

下文加入了一个数据K-V对name:"redis",这一K-V对用crc16计算后,插入到槽[5789]中,它在节点6002上,所以就跳到节点6002再插入。

set name redis

 如果需要操作该K-V对,就要去6002节点,在其他节点是查不到该K-V的:

 只有m才能读+写,s只能复制m的数据,当m挂掉,s升级为m才会获得读写权限

 ⑦故障模拟

已经有一个K-V对name:"redis",放在槽5798中,在节点6002上。

现在我们断开节点6002

redis-cli -h 127.0.0.1 -p 6002 -c shutdown

另外开启一个终端查看6006节点(6002节点的从节点)的log文件:

tail -f /usr/local/redis/log/redis_6006.log

可以看到一直在尝试重连:

尝试了20s后宣布重连失败,它自己成为m

此时再看整个集群的节点状态,可以发现集群2的主节点变为了6006:

再查看之前的K-V对,可以发现顺利完成了复制转移

此时对6002进行恢复:

cd ../redis6002
redis-server redis.conf

可以看到6006的日志中发现了恢复的6002:

之后二者开始同步,此时6002成为6006的s

 

 5、注意事项

redis启动方式为:redis-server 路径/redis.conf &,符号&必须放在conf文件之后,不然会导致conf文件读取失效

设置了masterauth之后,s在登录时不会用到该密码,登录时的-a密码还是它自己的requirepass

 

posted @ 2023-08-16 10:32  ShineLe  阅读(913)  评论(0编辑  收藏  举报