05. Redis 环境搭建-高可用集群(HA)

news/2025/2/12 10:39:42/

在生产环境中,Redis 架构使用最多的就是Sentinel主从架构, 因为单点容易产生故障, 分片集群又过于复杂. 笔者尝试在一台服务器上搭建一个一主两从, 三个哨兵监听的Redis 集群架构。由于哨兵也可能发生单点故障,所以笔者也使用了三个哨兵来监听. 对于学习而言,搭建一个伪集群即可.

1. 配置模板

笔者创建一个redis的配置模板文件: template-redis.conf,一个sentinel的配置模板: template-sentinel.conf, 用于复制配置.

1.1 创建Redis配置文件模板

  • 从Redis 源码目录复制一个redis.conf 文件到/usr/local/etc/redis目录
  • 创建redis 配置模板文件: /usr/local/etc/redis/template-redis.conf
  • 复制模板时, 只需要替换配置文件中端口号即可,即只需要全局替换6379就可以把配置文件中端口号, 日志文件,pid文件等全部替换.
# 引入原配置
include /usr/local/etc/redis/redis.conf######################################## 自定义配置 ######################################### 修改绑定ip
bind 127.0.0.1# 设置关闭保护模式
protected-mode no# 设置端口号为6379
port 6379# 设置后台启动为yes
daemonize yes# 设置pid文件
pidfile /logs/redis/redis.pid.6379# 设置日志文件
logfile /logs/redis/redis.log.6379# 设置RDB dum文件名
dbfilename dump.rdb.6379# 设置dump文件存放目录
dir /data/redis# 设置主节点密码
masterauth 123456# 设置从节点只读
replica-read-only yes# 设置当前节点访问密码为
requirepass 123456# 设置客户端最多连接数
maxclients 1000# 设置最大内存
maxmemory 2GB# 设置达到最大内存后策略,报错
maxmemory-policy noeviction# 启动AOF持久化模式
appendonly yes# 设置AOF文件名
appendfilename "appendonly.aof.6379"# 设置AOF写入磁盘策略, 每秒写入一次
appendfsync everysec

1.2 创建sentinel 配置模板

  • 从源码目录复制一个sentinel.conf配置文件, 或者新创建一个文件也行, 因为sentinel配置项比较少. 命名为: template-sentinel.conf
  • 复制模板时, 只需要替换配置文件中端口号即可,即只需要全局替换6379就可以把配置文件中端口号, 日志文件,pid文件等全部替换.
# 设置ip
bind 127.0.0.1# 绑定端口号
port 26379# 设置后台运行
daemonize yes# 指定pid文件
pidfile /logs/redis/sentinel.pid.26379# 指定日志文件
logfile /logs/redis/sentinel.log.26379# 指定启动目录
dir /tmp# 监听
sentinel monitor redis.localhost 127.0.0.1 6480 2# redis 密码
sentinel auth-pass redis.localhost 123456# 指定sentinel认为redis宕机所需毫秒数, 指定为10秒
sentinel down-after-milliseconds redis.localhost 10000# 指定故障转移时,最多多少个从节点向主节点进行数据同步
sentinel parallel-syncs redis.localhost 1# 指定故障转移总耗时最多多少毫秒, 默认
sentinel failover-timeout redis.localhost 180000# 故障转移时, 不能修改脚本配置
sentinel deny-scripts-reconfig yes

2. 创建配置文件

1.1 创建目录

创建配置之前应先创建相关目录, 笔者的目录规划如下:

  • /usr/local/etc/redis: 存储相关配置文件
  • /logs/redis: 存储redis 日志和pid文件
  • /data/redis: redis 数据库RDB文件,AOF文件存储目录
mkdir -p /usr/local/etc/redis /logs/redis /data/redis 

2.1 复制三份redis配置

使用redis配置模板创建三份redis 配置文件

# 复制三份新的配置文件
cp template-redis.conf /usr/local/etc/redis/redis.conf.6480
cp template-redis.conf /usr/local/etc/redis/redis.conf.6481
cp template-redis.conf /usr/local/etc/redis/redis.conf.6482

2.2 替换相关配置

使用sed命令, 将配置文件中所有需要区分的项(日志, 文件名等)进行全局替换

# 替换各配置文件
sed -i "s/6379/6480/g" /usr/local/etc/redis/redis.conf.6480
sed -i "s/6379/6481/g" /usr/local/etc/redis/redis.conf.6481
sed -i "s/6379/6482/g" /usr/local/etc/redis/redis.conf.6482

2.3 复制三份sentinel 配置

使用redis配置模板创建三份sentinel 配置文件

cp template-sentinel.conf /usr/local/etc/redis/sentinel.conf.26480
cp template-sentinel.conf /usr/local/etc/redis/sentinel.conf.26481
cp template-sentinel.conf /usr/local/etc/redis/sentinel.conf.26482

2.4 替换相关配置

使用sed命令, 将配置文件中所有需要区分的项(日志, 文件名等)进行全局替换

# 替换各配置文件
sed -i "s/6379/6480/g" /usr/local/etc/redis/sentinel.conf.26480
sed -i "s/6379/6481/g" /usr/local/etc/redis/sentinel.conf.26481
sed -i "s/6379/6482/g" /usr/local/etc/redis/sentinel.conf.26482

3. 启动集群

3.1 启动redis 集群

通过redis-server 命令依次启动redis服务器, 启动之后并未建立主从关系.

redis-server /usr/local/etc/redis/redis.conf.6480
redis-server /usr/local/etc/redis/redis.conf.6481
redis-server /usr/local/etc/redis/redis.conf.6482

3.2 设置主从关系

通过命令建立主从关系, 笔者认为这种方式比在配置文件中指定要更好一点儿.

redis-cli -p 6481 -a 123456 slaveof 127.0.0.1 6480
redis-cli -p 6482 -a 123456 slaveof 127.0.0.1 6480

3.3 启动sentinel 集群

使用redis-sentinel 依次启动sentinel集群, sentinel会自动建关系.

redis-sentinel /usr/local/etc/redis/sentinel.conf.26480
redis-sentinel /usr/local/etc/redis/sentinel.conf.26481
redis-sentinel /usr/local/etc/redis/sentinel.conf.26482

3.4 查看集群

  • 可以登录sentinel客户端来查看相关消息,也可以直接在命令行查看sentinel集群关系。从输出结果可以看出:
  • redis 集群名称: redis.localhost
  • 主节点状态: ok
  • 主节点地址:127.0.0.1:6480
  • 从节点个数: 2个
  • sentinel 个数: 3个
$ redis-cli -p 26481 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=redis.localhost,status=ok,address=127.0.0.1:6480,slaves=2,sentinels=3

4. 测试故障转移

4.1 关闭maste 服务器

$ redis-cli -a 123456 -p 6480 shutdown

4.2 通过sentinel查看集群状态

$ redis-cli -p 26481 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=redis.localhost,status=ok,address=127.0.0.1:6482,slaves=2,sentinels=3

4.3 查看sentinel 日志

5648:X 09 May 2019 10:52:10.288 # +sdown master redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:10.340 # +odown master redis.localhost 127.0.0.1 6480 #quorum 3/2
5648:X 09 May 2019 10:52:10.340 # +new-epoch 1
5648:X 09 May 2019 10:52:10.340 # +try-failover master redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:10.378 # +vote-for-leader e5acadd929ffd1feefdde0602d3a72172908fd90 1
5648:X 09 May 2019 10:52:10.445 # 156e8a353eea2e78bf16230e144086956e5c7c8e voted for e5acadd929ffd1feefdde0602d3a72172908fd90 1
5648:X 09 May 2019 10:52:10.445 # 2279bbefc80a9f66259f5d148a73638d92448653 voted for e5acadd929ffd1feefdde0602d3a72172908fd90 1
5648:X 09 May 2019 10:52:10.507 # +elected-leader master redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:10.507 # +failover-state-select-slave master redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:10.608 # +selected-slave slave 127.0.0.1:6482 127.0.0.1 6482 @ redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:10.608 * +failover-state-send-slaveof-noone slave 127.0.0.1:6482 127.0.0.1 6482 @ redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:10.699 * +failover-state-wait-promotion slave 127.0.0.1:6482 127.0.0.1 6482 @ redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:11.496 # +promoted-slave slave 127.0.0.1:6482 127.0.0.1 6482 @ redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:11.496 # +failover-state-reconf-slaves master redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:11.505 * +slave-reconf-sent slave 127.0.0.1:6481 127.0.0.1 6481 @ redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:12.549 # -odown master redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:12.549 * +slave-reconf-inprog slave 127.0.0.1:6481 127.0.0.1 6481 @ redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:12.549 * +slave-reconf-done slave 127.0.0.1:6481 127.0.0.1 6481 @ redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:12.615 # +failover-end master redis.localhost 127.0.0.1 6480
5648:X 09 May 2019 10:52:12.615 # +switch-master redis.localhost 127.0.0.1 6480 127.0.0.1 6482
5648:X 09 May 2019 10:52:12.616 * +slave slave 127.0.0.1:6481 127.0.0.1 6481 @ redis.localhost 127.0.0.1 6482
5648:X 09 May 2019 10:52:12.616 * +slave slave 127.0.0.1:6480 127.0.0.1 6480 @ redis.localhost 127.0.0.1 6482
5648:X 09 May 2019 10:52:22.666 # +sdown slave 127.0.0.1:6480 127.0.0.1 6480 @ redis.localhost 127.0.0.1 6482

http://www.ppmy.cn/news/736435.html

相关文章

Elasticsearch(六)--ES文档的操作(中)---修改文档

一、前言 上篇文章我们了解了ES的插入和批量插入文档的操作,分别通过ES的kibana客户端以及Java高级Rest客户端进行学习,那么本篇则进入到对文档的修改操作,同新增文档,也有更新单条文档和批量更新文档操作,但还多出一…

【Redis高可用】

有时候单机形式下的redis性能不足时可能会挂掉导致系统服务异常,为了解决这个问题就有了下面这个内容。

全志H616芯片 以太网模块初始化失败如何解决?

1.【问题现象】 执行ifconfig -a/ifconfig eth0/ifconfig eth0 up命令,找不到eth0设备,有如下类似打印: rootTinaLinux:/# ifconfig -a lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0inet6 addr: ::1/128 Sco…

​华为年内二度招聘“天才少年”;540万Twitter账号信息泄露,卖价3万美元;谷歌解雇了相信AI有意识的工程师|极客头条...

「极客头条」—— 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews) 一分钟速览新闻点&#…

Linux下Redis哨兵集群模式搭建详解(1主2从+3哨兵)

文章目录 前言一、Redis主从模式搭建二、redis哨兵集群搭建三.springboot整合redis哨兵模式总结 前言 Redis 是C语言开发的一个开源高性能键值对的内存数据库,可以用来做数据库、缓存、消息中间件等场景,是一种NoSQL(not-only sql,非关系型数据库)的数据…

LabVIEW编程LabVIEW开发雷赛SMC6480运动控制模块例程与相关资料

LabVIEW编程LabVIEW开发雷赛SMC6480运动控制模块例程与相关资料 雷赛SMC6480运动控制模块是深圳雷赛公司的产品,在做呼吸机时,需要控制电机做正弦运动,调研了很久,选择了SMC6480,后来其他项目的时候得知,有…

Kafka读这一篇就够了

kafka 由 broker,topic,分区 ,副本,生产者,消费者主要模块构成 一个topic对应多个分区(分区是逻辑概念,目的提高吞吐量),每个分区对应一个leader副本(负责读写…

学习 | 药品GMP认证和药厂GMP认证是怎么回事?

可能本身从事药品生产经营的朋友会知道,药品的GMP认证是怎么一回事,但是对于一些想要进入药品生产行业的企业,例如化工产品想进入原料药生产、药用辅料生产,塑料等材料制作商进入药品包装材料生产,只是听这说听那说&am…