Redis几种运行模式
主从复制
概述
主从复制的作用
-
1. 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式
-
2. 故障恢复:当主节点出现问题是,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
-
3. 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供些服务,由从节点提供读服务。实现服务器负载均衡;通过多个从节点负担负载能提高Redis服务器的并发量。
-
4. 高可用。主从复制是哨兵模式和集群的基础。
主从复制的工作机制
-
1. slave从节点启动后,向master发送SYNC命令,master接收到SYNC命令后通过bgsave保存快照, 并使用缓冲区记录快照这段时间内执行的写指令。
-
2. master主节点将保存的快照文件发送个slave从节点,并继续记录执行写命令。
-
3. slave接收到快照文件后,加载快照文件,载入数据。
-
4. master快照发送玩成后开始向slave发送缓冲区写指令,slave接收并执行,开始数据初始化。
-
5. 此后master每次执行一个写命令都会同步发送个slave,保持master和slave的一致性。
主从复制操作
-
• 主从复制是由
从节点
发起的,主节点啥都不用干。 -
• 有三种方式进行主从复制:
-
1. 在配置文件中配置
slaveof masterip masterport
-
2. 在启动时配置 在启动命令后加入
--slaveof masterip masterport
-
3. 启动后在客户端通过指令配置
slaveof masterip masterport
使用主从复制时从节点的配置文件
-
1. 在本地已经启动了一个redis,使用默认的6379端口。
-
2. 我们通过下面的配置文件,再启动一个redis作为从节点,使用6380端口,
slaveof
写的是主节点的ip和端口。
protected-mode no
daemonize no
port 6380
slaveof 192.168.2.36 6379
-
1. 配置redis主节点
protected-mode
设置为no
2. 指定配置文件运行redis,通过指令
info replication
查看主从关系redis-server ./redis6380.conf
-
-
3. 登录master主节点,并设置key value
127.0.0.1:6379> set k1 v1
OK
-
4. 登录slave从节点,查看key
❯redis-cli -h 127.0.0.1 -p 6380 ─╯
127.0.0.1:6380> get k1
"v1"
127.0.0.1:6380>
-
5. 在从节点尝试写入,是不允许的
127.0.0.1:6380> set k1 v1
(error) READONLY You can't write against a read only replica.
主从模式的特点
优点:
-
1. 当主节点宕机,从节点作为备份能继续提供服务。
-
2. 读写分离,分担主节点压力。
缺点:
-
1. 主节点宕机时重新选主节点需要人工干预。
-
2. 主节点的写能力受到单机限制。
注意事项
-
• 在主从复制模式时主机如果有要求密码
requirepass
要么注释掉,要么设置masterauth
-
•
# masterauth <master-password>
,否则节点无法工作。 -
• 在主从模式中,主节点宕机后重启仍然是主节点。
哨兵模式
-
• 哨兵模式是在一主多从的集群环境中,如果主节点宕机,那么将自动在从节点中选出一个新的主节点,并且剩余的从节点(slave)配置文件会自动修改(无需人为干预)。
-
• 多个哨兵可以监控同一个redis节点,哨兵之间也会自动监控。
哨兵模式的工作机制
-
1. 在哨兵的配置文件中,配置
port
和sentinel monitor
来鉴定master节点,一个哨兵可以监控多个master节点,哨兵启动后会与要监控的master建立两条连接: -
1. 一个连接用来订阅master的_sentinel_:hello频道与获取其它监控该master的哨兵节点信息。
-
2. 另一条连接定向向master发送INFO等命令获取master自身信息。
-
2. 在与master建立连接后,哨兵会执行三个操作:
-
1. 定期向master和slave节点发送INFO命令
-
2. 定期向master和slave的_sentinel_hello 频道发送自己的信息
-
3. 定期(1s)向master、slave和其他哨兵发送PING命令
哨兵模式步骤
-
• Redis主节点在物理机上运行,其余2个从节点和3个哨兵使用docker运行(6380、6381为从节点;26379、26380、26381为哨兵)
-
1. 运行主节点
-
2. 使用docker运行从节点和哨兵节点
-
1. 修改配置文件
cd /home
mkdir redis && cd redis
mkdir config && cd config
touch redis6380.conf redis6381.conf
chmod 777 redis*
cd /home/redis && mkdir data && cd data
mkdir data6380 data6381
将以下配置分别写入到redis6380.conf和redis6381.conf上,主要是修改port
和slaveof
protected-mode no
daemonize no
port 6380
slaveof masterip masterport
-
3. 使用docker启动两台从机(slave),使用上面的slave配置文件
docker run
-p 6380:6380
--name salve1-redis
-v /home/redis/data/data6380:/data
-v /home/redis/config/redis6380.conf:/etc/redis/redis.conf
-v /etc/localtime:/etc/localtime
-d redis:6.2 redis-server /etc/redis/redis.conf
docker run
-p 6381:6381
--name salve2-redis
-v /home/redis/data/redis6381:/data
-v /home/redis/config/redis6381.conf:/etc/redis/redis.conf
-v /etc/localtime:/etc/localtime
-d redis:6.2 redis-server /etc/redis/redis.conf
-
4. 使用docker运行哨兵模式
-
创建哨兵模式配置文件
cd /home/redis/config
touch sentinel-26379.conf sentinel-26380.conf sentinel-26381.conf
-
• 主节点信息:
sentinel <master-name> <ip> <redis-port> <quorum>;
-
•
<master-name>
自定义主节点名称 -
•
<ip>
主节点的ip<redis-port>
主节点的端口 -
•
<qiorum>
检测到多少个主节点有问题进就行故障转移
将以下内容分别改写到相应的配置文件中:
port 26379
sentinel monitor mymaster <masterip> <masterport> 2
-
5. 使用Docker启动哨兵x3
docker run
--name sentinel-26379
-p 26379:26379
-v /home/redis/config/sentinel-26379.conf:/etc/redis/sentinel.conf
-v /etc/localtime:/etc/localtime
-d redis:6.2 redis-sentinel /etc/redis/sentinel.conf
docker run
--name sentinel-26380
-p 26380:26380
-v /home/redis/config/sentinel-26380.conf:/etc/redis/sentinel.conf
-v /etc/localtime:/etc/localtime
-d redis:6.2 redis-sentinel /etc/redis/sentinel.conf
docker run
--name sentinel-26381
-p 26381:26381
-v /home/redis/config/sentinel-26381.conf:/etc/redis/sentinel.conf
-v /etc/localtime:/etc/localtime
-d redis:6.2 redis-sentinel /etc/redis/sentinel.conf
指令执行完后会有5个容器
看看master节点和slave节点的状态
将master节点关掉,哨兵模式重新选举新的master节点
能看到6380从节点从slave
变成了master
重启旧的master节点
发现6380仍然是master节点,而之前的主节点6379变成了新master的slave
Redis Cluster集群模式
-
• Redis Cluster是一种服务Sharding,从3.0版本开始正式提供。
• Redis的哨兵模式已经基本可以实现高可用、读写分离,但每台redis的服务器都存储相同数据,很浪费内存。所以redis的cluster集群模式, 实现了redis的分布式存储,也就是说每个redis节点上存储不同的内容。
• 每个redis集群节点都需要打开两个TCP连接,一个是给客户端提供服务的端口,如6379;另一个是基于6379+10000的端口,用于集群总线使用。因此要检查防火墙中两个端口都要打开。
使用Docker-compose搭建Redis集群
计划使用6371,6372,6373,6374,6375,6376几个端口号的服务搭建redis集群。
redis的配置文件如下
cluster-enabled yes
cluster-config-file nodes-6371.conf
cluster-node-timeout 5000
appendonly yes
protected-mode no
cluster-announce-ip 192.168.2.36
cluster-announce-port 6371
cluster-announce-bus-port 16371
port 6371
其中
-
•
cluster-announce-ip
是集群节点ip,填写master节点的ip -
•
cluster-announce-port
是集群节点映射端口 -
•
cluster-announce-bus-port
是集群节点总线端口
redis-cli --cluster create 192.168.2.36:6371
192.168.2.36:6372
192.168.2.36:6373
192.168.2.36:6374
192.168.2.36:6375
192.168.2.36:6376
--cluster-replicas 1
随便设个值
-
• 使用交互模式进入docker容器
-
•
redis-cli -h 127.0.0.1 -p 6371 -c
-
•
redis-cli -h 127.0.0.1 -p 6372 -c
127.0.0.1:6371> set k1 v1
-> Redirected to slot [12706] located at 192.168.2.36:6373
OK
127.0.0.1:6372> get k1
-> Redirected to slot [12706] located at 192.168.2.36:6373
"v1"
要注意的点
-
• 使用docker-compose做redis集群要将network设置为
host
原文始发于微信公众号(ProgrammerHe):Redis笔记(三)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/207944.html