redis-哨兵
1.哨兵高可用
主从存在的问题:
主从复制,主节点发生鼓掌,可以手动转移,让其中一个slave变成master,这就是哨兵
主从复制,只能是主来写数据,所以写的能力和存储能力有限,需要做集群
哨兵:sentinel
哨兵就是一个redis进程
哨兵的工作原理:
1.多个sentinel发现并确认master有问题
2.选取出一个sentinel作为领导
3.选取一个slave作为新的master
4.通知其余slave成为新的master的salve
5.通知客户端主从变化
6.等待老的master复活成为新的master的slave
搭建哨兵步骤:
一:先搭建redis一主两从:
1.现将6379端口的配置文件复制一份到redis_6390.conf:
cp redis_6379.conf redis_6390.conf
2.配置从
daemonize yes
port 6390
dir "/root/redis-6.2.9/data2"
logfile "6390.log"
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite yes
aof-use-rdb-preamble yes
slaveof 127.0.0.1 6379
slave-read-only yes
3.需要在redis目录下新建data2目录:
mkdir data2
4.然后我们启动从:
./src/redis-server ./redis_6381.conf &
5.再启动主:
./src/redis-server ./redis_6379.conf &
6.连接客户端:
# -p是指端口,不写默认连接6379
./src/redis-cli -p 6381
7.连接6379的服务端:
./src/redis-cli
info # info查看服务端信息
二:配置哨兵文件,启动哨兵(哨兵是一个redis的进程)
1.新建sentinal_26379.conf的哨兵配置文件,编辑:
vim sentinal_26379.conf
port 26379
daemonize yes
dir /root/redis/data5 # data5文件可以保存缓存,多个哨兵可以使用一个data文件
bind 0.0.0.0
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
2.复制两份,端口分别改为26380和26381
cp sentinal_26379.conf sentinal_26380.conf
cp sentinal_26379.conf sentinal_26381.conf
# 26380和26381的配置文件只需要将端口修改为26380和26381即可,三个配置文件都使用data5文件
3.启动哨兵
./src/redis-sentinel sentinel_26379.conf
./src/redis-sentinel sentinel_26380.conf
./src/redis-sentinel sentinel_26381.conf
以上高可用就搭建完毕
三.主库停止服务
主库可能是手动宕机,也可能是被动宕机
现在我们在主服务端(6379)设置值,可以在从服务端看到值:
然后我们手动停止掉6379的进程:
kill -9 6379的进程号
这是我们再查看6381的info,发现6381成了主:
所以此时我们停掉=一台从服务器,或者停掉一台哨兵,依然不会影响我们的数据安全
2.redis操作哨兵
高可用架构后,不能直接连接某一个主库了,因为主库可能会挂掉,后来它就不是主库了
之前的链接redis的操作(不能用了):
import redis
conn=redis.Redis(host='',port=6379)
conn.set()
conn.close()
新的连接哨兵的操作:
1.搭建哨兵:
vim sentinel_26379.conf # 配置26380,26381时将数字改掉
2.配置哨兵,配置三个端口的哨兵,分别是26379,26380,26381:
port 26379
daemonize yes
dir data
protected-mode no
bind 0.0.0.0
logfile "redis_sentinel.log"
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
哨兵26380:
port 26380
daemonize yes
dir data
protected-mode no
bind 0.0.0.0
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
哨兵26381:
port 26381
daemonize yes
dir data
protected-mode no
bind 0.0.0.0
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
3.配置一主两从:
首先配置主库:
vim redis_6379.conf
daemonize no
bind 0.0.0.0
protected-mode no
port 6379
timeout 0
dir /data
配置从库6380:
vim redis_6380.conf
daemonize no
bind 0.0.0.0
protected-mode no
port 6380
timeout 0
dir /data
slaveof 127.0.0.1 6379 # 是6379的从库
slave-read-only yes
配置从库6381:
daemonize no
bind 0.0.0.0
protected-mode no
port 6381
timeout 0
dir /data
slaveof 127.0.0.1 6379
slave-read-only yes
4.在redis根路径创建 data目录
mkdir /data
5.启动三个:
./src/redis-server ./redis_6379.conf & # 加&表示在后台运行
# 如果提示端口被占用,先用kill -9停止进程
./src/redis-server ./redis_6380.conf &
./src/redis-server ./redis_6381.conf &
6.查看进程:
ps aux |grep redis
7.连接主库6379,设置name:
./src/redis-cli -p 6379
set name max
8.退出,连接从库,查看name,发现有值:
exit
./src/redis-cli -p 6380
get name # max
9.启动哨兵
./src/redis-sentinel sentinel_26379.conf
./src/redis-sentinel sentinel_26380.conf
./src/redis-sentinel sentinel_26381.conf
此时有一个主:6381,两个从:6379和6392
我们停掉6381:
kill -9 6381进程号
此时我们再直接连接6381的客户端是连不上的,我们需要先启动6381的服务端:这句命令在redis目录下执行,在redis目录下有一个 redis_6381.conf,直接启动即可:
./src/redis-server redis_6381.conf
然后我们再连接6381的客户端即可连接成功:
./src/redis-cli -p 6381
此时的6381已经不是主了:
此时的6381可以读取,但是无法写入:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律