Redis 主从复制 哨兵模式实战
时间:2022-07-24
本文章向大家介绍Redis 主从复制 哨兵模式实战,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
0x00
项目中因为并发不是很高一直偷懒用的单节点 Redis ,但是有很多大 key 写入的场景,这样会影响读性能,于是准备做主从复制,顺便做一下哨兵模式。
Redis 主从复制配置
这里很简单,只需要配置slaveof <masterip> <masterport>
参数即可实现。
注: Redis 5.0 版本后建议使用
replicaof
代替slaveof
。 因为奇妙的政治正确
原因,迫使作者修改了配置名,虽然slaveof
仍能使用,但是只是暂时的兼容方案。
修改后重启 Redis 查看配置显示, 表示成功
# Replication
role: slave
master_host: 192.168.14.130
master_port: 6379
master_link_status: up
...
Redis 哨兵模式配置
必要配置如下
port 26379
# 当前哨兵绑定的ip,一般为本机ip
bind 192.168.2.210
# 设置master节点为 192.168.14.130 6379 上的redis,
# 别名为redis-master,当两个哨兵同意故障转移就会执行
# 一般设置N/2+1(N为哨兵总数)
sentinel monitor redis-master 192.168.14.130 6379 2
# 认为master节点断线所需的毫秒(SDOWN)
sentinel down-after-milliseconds redis-master 5000
# 如果在 180000 毫秒内 master 节点没有恢复,则认为是真正宕机
# 当下一次检测宕机 master 节点恢复后,则并入 slave 中
sentinel failover-timeout redis-master 180000
# 当 master 宕机后,最多可以多少个节点对新 master 进行同步
# 数字越小完成故障转移的时间越长
sentinel parallel-syncs redis-master 2
配置成功后显示如下
$ redis-cli -p 26379 -h 192.168.14.130
192.168.14.128:26379> info Sentinel
# Sentinel
sentinel_masters: 1
sentinel_tilt: 0
sentinel_running_scripts: 0
sentinel_scripts_queue_length: 0
sentinel_simulate_failure_flags: 0
master0: name=mymaster, status=ok, address=192.168.14.130:6379, slaves=2, sentinels=3
坑点
- 哨兵模式启动顺序为:
Master -> Slave -> Sentinel
- 启动后
sentinels
永远等于1
:
因为当时配置的bind 127.0.0.1 192.168.14.130
,如果sentinel配置了bind参数,sentinel将获取第一个ip去检测主节点状态, 由于127.0.0.1是个回环地址,所以当bind第一个ip配置成127.0.0.1时无法连接其他机器的ip,所以配置时第一个ip不能配置为回环地址,建议redis相关的ip绑定都先写私网ip再写回环ip。
使用 Python 连接哨兵模式 Redis
from redis.sentinel import Sentinel
class RedisSentinel:
def __init__(self, sentinel_list, name="mymaster", password="", db=0):
self.sentinel = Sentinel(sentinel_list, socket_timeout=60)
self.name = name
self.password = password
self.db = db
def get_master_and_slave_conn(self):
master = self.sentinel.master_for(
service_name=self.name,
socket_timeout=60,
password=self.password,
db=self.db)
slave = self.sentinel.slave_for(
service_name=self.name,
socket_timeout=60,
password=self.password,
db=self.db
)
return master, slave
if __name__ == "__main__":
sentinel_list = [
("192.168.14.128", "26379"),
("192.168.14.129", "26379"),
("192.168.14.130", "26379")
]
mySentinel = RedisSentinel(sentinel_list)
master_conn, slave_conn = mySentinel.get_master_and_slave_conn()
master_conn.set('a', 123)
print(slave_conn.get('a'))
Tips
- Master和Slave服务器切换后,Master的redis.conf、Slave的redis.conf和sentinel.conf的配置文件的内容都会发生相应的改变,即,Master主服务器的redis.conf配置文件中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换。
- Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件。如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次
- Java中使用栈实现一个队列,实用代码
- NDK 的开发流程
- 蜜罐背后的影子系统探秘
- Oracle 免费的数据库--Database 快捷版 11g 安装使用与SOD框架对Oracle的CodeFirst支持
- 如何求最小三元组距离
- 如何将Pastebin上的信息应用于安全分析和威胁情报领域
- Optionsbleed 漏洞泄露 Apache Server 的内存信息
- 对两个有序数组进行合并
- No.016 3Sum Closest
- Java中实现解码字符串的方法,实用代码
- PDF.NET SOD 开源框架红包派送活动 && 新手快速入门指引
- No.015 3Sum
- Java 8新特性——提供了一种可以看作多重继承的默认方法
- WebSocket 学习笔记--IE,IOS,Android等设备的兼容性问题与代码实现
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Leetcode 628. 三个数的最大乘积 (数学)
- Vue 组件化开发
- Spring Boot 基础配置
- 读懂 Java 单例模式
- 数值分析第一次实习题报告
- Leetcode 409. 最长回文串 (Hash)
- Vue 前后端交互基础
- Spring Boot 入门
- Nginx 负载均衡
- Leetcode 289. 生命游戏(元胞自动机模拟)
- Nginx 简介
- 详解 Vue 目录及配置文件之 package.json
- Codeforces Round #382 (Div. 2) D. Taxes (数论 哥猜 大胆尝试)
- Vue Router
- Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 1) B. Bear and Blocks (技巧dp 难想)