Redis 部署实践一文搞定(单机、Sentinel、Cluster)
mhr18 2024-11-07 11:00 16 浏览 0 评论
Redis集群
基于CentOS7下的Redis集群教程安装部署,包括:
- Redis 单机
- Redis 主从
- Redis 哨兵
- Redis 分片
1.Redis 单机安装
1.1.准备工作
# 下载Redis源码文件
wget -P /opt/ https://download.redis.io/releases/redis-6.2.6.tar.gz
# 安装Redis所需要的依赖
yum install -y gcc tcl
1.2.编译安装
[root@localhost opt]# tar -xzf redis-6.2.6.tar.gz
# 进入Redis目录
[root@localhost opt]# cd redis-6.2.6
# 运行编译安装命令
[root@localhost redis-6.2.6]# make && make install
# 理论上没有什么错误,至此安装成功
1.3.配置启动
然后修改redis.conf文件中的一些配置:
此处只是简单演示,具体见配置文件详解
# 绑定地址,默认是127.0.0.1,会导致只能在本地访问。修改为0.0.0.0则可以在任意IP访问
bind 0.0.0.0
# 保护模式,关闭保护模式
protected-mode no
# 启动Redis
[root@localhost redis-6.2.6]# ./src/redis-server redis.conf
# 停止redis服务:
[root@localhost redis-6.2.6]# ./src/redis-cli shutdown
Redis开机启动可见:Redis systemd管理
2.Redis主从集群
2.1.集群结构
我们搭建的主从集群结构如图:
共包含三个节点,一个主节点,两个从节点。
这里我们会在同一台虚拟机中开启3个redis实例,模拟主从集群,信息如下:
IP | PORT | 角色 |
192.168.241.138 | 7001 | master |
192.168.241.138 | 7002 | slave |
192.168.241.138 | 7003 | slave |
2.2.准备实例和配置
要在同一台虚拟机开启3个实例,必须准备三份不同的配置文件和目录,配置文件所在目录也就是工作目录。
1)创建目录
我们创建三个文件夹,名字分别叫7001、7002、7003:
# 进入/opt目录
cd /opt
# 创建目录
mkdir 7001 7002 7003
2)恢复原始配置
修改redis-6.2.6/redis.conf文件,将其中的持久化模式改为默认的RDB模式,AOF保持关闭状态。
# 开启RDB
# save ""
save 3600 1
save 300 100
save 60 10000
# 关闭AOF
appendonly no
3)拷贝配置文件到每个实例目录
然后将redis-6.2.6/redis.conf文件拷贝到三个目录中(在/opt目录执行下列命令):
# 方式一:逐个拷贝
cp redis-6.2.6/redis.conf 7001
cp redis-6.2.6/redis.conf 7002
cp redis-6.2.6/redis.conf 7003
# 方式二:管道组合命令,一键拷贝
echo 7001 7002 7003 | xargs -t -n 1 cp redis-6.2.6/redis.conf
4)修改每个实例的端口、工作目录
修改每个文件夹内的配置文件,将端口分别修改为7001、7002、7003,将rdb文件保存位置都修改为自己所在目录(在/opt目录执行下列命令):
sed -i -e 's/6379/7001/g' -e 's/dir .\//dir \/opt\/7001\//g' 7001/redis.conf
sed -i -e 's/6379/7002/g' -e 's/dir .\//dir \/opt\/7002\//g' 7002/redis.conf
sed -i -e 's/6379/7003/g' -e 's/dir .\//dir \/opt\/7003\//g' 7003/redis.conf
5)修改每个实例的声明IP
虚拟机本身有多个IP,为了避免将来混乱,我们需要在redis.conf文件中指定每一个实例的绑定ip信息,格式如下:
# redis实例的声明 IP
replica-announce-ip 192.168.241.138
每个目录都要改,我们一键完成修改(在/opt目录执行下列命令):
# 逐一执行
sed -i '1a replica-announce-ip 192.168.241.138' 7001/redis.conf
sed -i '1a replica-announce-ip 192.168.241.138' 7002/redis.conf
sed -i '1a replica-announce-ip 192.168.241.138' 7003/redis.conf
# 或者一键修改
printf '%s\n' 7001 7002 7003 | xargs -I{} -t sed -i '1a replica-announce-ip 192.168.241.138' {}/redis.conf
2.3.启动
为了方便查看日志,我们打开3个ssh窗口,分别启动3个redis实例,启动命令:
# 第1个
./redis-6.2.6/src/redis-server 7001/redis.conf
# 第2个
./redis-6.2.6/src/redis-server 7002/redis.conf
# 第3个
./redis-6.2.6/src/redis-server 7003/redis.conf
如果要一键停止,可以运行下面的命令:
printf '%s\n' 7001 7002 7003 | xargs -I{} -t redis-cli -p {} shutdown
2.4.开启主从关系
现在三个实例还没有任何关系,要配置主从可以使用replicaof 或者slaveof(5.0以前)命令。
其实有临时和永久两种模式:
- 修改配置文件(永久生效)
在redis.conf中添加一行配置:slaveof <masterip> <masterport>
- 使用redis-cli客户端连接到redis服务,执行slaveof命令(重启后失效)
slaveof <masterip> <masterport>
注意:在5.0以后新增命令replicaof,与salveof效果一致。
这里我们为了演示方便,使用方式二。
通过redis-cli命令连接7002,执行下面命令:
# 连接 7002
redis-cli -p 7002
# 执行slaveof
slaveof 192.168.241.138 7001
通过redis-cli命令连接7003,执行下面命令:
# 连接 7003
redis-cli -p 7003
# 执行slaveof
slaveof 192.168.241.138 7001
然后连接 7001节点,查看集群状态:
# 连接 7001
redis-cli -p 7001
# 查看状态
info replication
结果:
2.5.测试
执行下列操作以测试:
- 利用redis-cli连接7001,执行set num 123
- 利用redis-cli连接7002,执行get num,再执行set num 666
- 利用redis-cli连接7003,执行get num,再执行set num 888
可以发现,只有在7001这个master节点上可以执行写操作,7002和7003这两个slave节点只能执行读操作。
3.搭建哨兵集群
3.1.集群结构
这里我们搭建一个三节点形成的Sentinel集群,来监管之前的Redis主从集群。如图:
三个sentinel实例信息如下:
节点 | IP | PORT |
s1 | 192.168.241.138 | 27001 |
s2 | 192.168.241.138 | 27002 |
s3 | 192.168.241.138 | 27003 |
3.2.准备实例和配置
要在同一台虚拟机开启3个实例,必须准备三份不同的配置文件和目录,配置文件所在目录也就是工作目录。
在这里我们直接使用主从集群下的7001 7002 7003目录
然后我们在7001目录创建一个sentinel.conf文件,添加下面的内容:
port 27001
sentinel announce-ip 192.168.241.138
sentinel monitor mymaster 192.168.241.138 7001 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
dir "/opt/7001/"
解读:
- port 27001:是当前sentinel实例的端口
- sentinel monitor mymaster 192.168.241.138 2:指定主节点信息
- mymaster:主节点名称,自定义,任意写
- 192.168.241.138 7001:主节点的ip和端口
- 2:选举master时的quorum值
然后将7001/sentinel.conf文件拷贝到7002、7003两个目录中(在/opt目录执行下列命令):
# 方式一:逐个拷贝
cp 7001/sentinel.conf 7002
cp 7001/sentinel.conf 7003
# 方式二:管道组合命令,一键拷贝
echo 7002 7003 | xargs -t -n 1 cp 7001/sentinel.conf
修改7001、7002两个文件夹内的配置文件,将端口分别修改为27002、27003:
sed -i -e 's/27001/27002/g' -e 's/7001/7002/g' 7002/sentinel.conf
sed -i -e 's/27001/27003/g' -e 's/7001/7003/g' 7003/sentinel.conf
3.3.启动
为了方便查看日志,我们打开3个ssh窗口,分别启动3个redis实例,启动命令:
# 第1个
./redis-6.2.6/src/redis-sentinel 7001/sentinel.conf
# 第2个
./redis-6.2.6/src/redis-sentinel 7002/sentinel.conf
# 第3个
./redis-6.2.6/src/redis-sentinel 7003/sentinel.conf
3.4.测试
尝试让master节点7001宕机,查看sentinel日志:
4.搭建分片集群
4.1.集群结构
分片集群需要的节点数量较多,这里我们搭建一个最小的分片集群,包含3个master节点,每个master包含一个slave节点,结构如下:
这里我们会在同一台虚拟机中开启6个redis实例,模拟分片集群,信息如下:
IP | PORT | 角色 |
192.168.241.138 | 7001 | master |
192.168.241.138 | 7002 | master |
192.168.241.138 | 7003 | master |
192.168.241.138 | 8001 | slave |
192.168.241.138 | 8002 | slave |
192.168.241.138 | 8003 | slave |
4.2.准备实例和配置
删除之前的7001、7002、7003这几个目录,重新创建出7001、7002、7003、8001、8002、8003目录:
# 进入/opt目录
cd /opt
# 删除旧的,避免配置干扰
rm -rf 7001 7002 7003
# 创建目录
mkdir 7001 7002 7003 8001 8002 8003
在/opt下准备一个新的redis.conf文件,内容如下:
port 6379
# 开启集群功能
cluster-enabled yes
# 集群的配置文件名称,不需要我们创建,由redis自己维护
cluster-config-file /opt/6379/nodes.conf
# 节点心跳失败的超时时间
cluster-node-timeout 5000
# 持久化文件存放目录
dir /opt/6379
# 绑定地址
bind 0.0.0.0
# 让redis后台运行
daemonize yes
# 注册的实例ip
replica-announce-ip 192.168.241.138
# 保护模式
protected-mode no
# 数据库数量
databases 1
# 日志
logfile /opt/6379/run.log
将这个文件拷贝到每个目录下:
# 进入/opt目录
cd /opt
# 执行拷贝
echo 7001 7002 7003 8001 8002 8003 | xargs -t -n 1 cp redis.conf
修改每个目录下的redis.conf,将其中的6379修改为与所在目录一致:
# 进入/opt目录
cd /opt
# 修改配置文件
printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t sed -i 's/6379/{}/g' {}/redis.conf
4.3.启动
因为已经配置了后台启动模式,所以可以直接启动服务:
# 进入/opt目录
cd /opt
# 一键启动所有服务
printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-server {}/redis.conf
通过ps查看状态:
ps -ef | grep redis
发现服务都已经正常启动:
如果要关闭所有进程,可以执行命令:
ps -ef | grep redis | awk '{print $2}' | xargs kill
或者(推荐这种方式):
printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-cli -p {} shutdown
4.4.创建集群
虽然服务启动了,但是目前每个服务之间都是独立的,没有任何关联。
我们需要执行命令来创建集群,在Redis5.0之前创建集群比较麻烦,5.0之后集群管理命令都集成到了redis-cli中。
1)Redis5.0之前
Redis5.0之前集群命令都是用redis安装包下的src/redis-trib.rb来实现的。因为redis-trib.rb是有ruby语言编写的所以需要安装ruby环境。
# 安装依赖
yum -y install zlib ruby rubygems
gem install redis
然后通过命令来管理集群:
# 进入redis的src目录
cd /opt/redis-6.2.6/src
# 创建集群
./redis-trib.rb create --replicas 1 192.168.241.138:7001 192.168.241.138:7002 192.168.241.138:7003 192.168.241.138:8001 192.168.241.138:8002 192.168.241.138:8003
2)Redis5.0以后
我们使用的是Redis6.2.6版本,集群管理以及集成到了redis-cli中,格式如下:
redis-cli --cluster create --cluster-replicas 1 192.168.241.138:7001 192.168.241.138:7002 192.168.241.138:7003 192.168.241.138:8001 192.168.241.138:8002 192.168.241.138:8003
命令说明:
- redis-cli --cluster或者./redis-trib.rb:代表集群操作命令
- create:代表是创建集群
- --replicas 1或者--cluster-replicas 1 :指定集群中每个master的副本个数为1,此时节点总数 ÷ (replicas + 1) 得到的就是master的数量。因此节点列表中的前n个就是master,其它节点都是slave节点,随机分配到不同master
运行后的样子:
这里输入yes,则集群开始创建:
通过命令可以查看集群状态:
redis-cli -p 7001 cluster nodes
4.5.测试
尝试连接7001节点,存储一个数据:
# 连接
redis-cli -p 7001
# 存储数据
set num 123
# 读取数据
get num
# 再次存储
set a 1
结果悲剧了:
集群操作时,需要给redis-cli加上-c参数才可以:
redis-cli -c -p 7001
这次可以了:
5.Systemd 管理
为了便于管理redis的启动,在这里建议使用systemd进行管理
仅列举redis、sentinel的两个service文件,具体目录和上述安装目录不同,可自行灵活调整
5.1.redis.service
[Unit]
#Description:描述服务
Description=Redis
#After:描述服务类别
After=network.target
#服务运行参数的设置
[Service]
#Type=forking是后台运行的形式
Type=forking
PIDFile=/usr/local/redis/run/redis_6379.pid
#ExecStart为服务的具体运行命令,路径必须是绝对路径
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
#PrivateTmp=True表示给服务分配独立的临时空间
PrivateTmp=true
[Install]
#运行级别下服务安装的相关设置,可设置为多用户,即系统运行级别为3
WantedBy=multi-user.target
5.2.redis-sentinel.service
[Unit]
#Description:描述服务
Description=RedisSentinel
#After:描述服务类别
After=network.target
#服务运行参数的设置
[Service]
#Type=forking是后台运行的形式
Type=forking
#ExecStart为服务的具体运行命令,路径必须是绝对路径
ExecStart=/usr/local/redis/bin/redis-sentinel /usr/local/redis/conf/sentinel.conf
#ExecReload为重启命令 ,路径必须是绝对路径
ExecReload=/usr/local/redis/bin/redis-sentinel -s reload
#ExecStop为停止命令 ,路径必须是绝对路径
ExecStop=/usr/local/redis/bin/redis-sentinel -s stop
#PrivateTmp=True表示给服务分配独立的临时空间
PrivateTmp=true
#运行级别下服务安装的相关设置,可设置为多用户,即系统运行级别为3
[Install]
WantedBy=multi-user.target
5.2.systemd 命令
systemctl daemon-reload #加载
systemctl start redis #启动
systemctl enable redis #开启启动
相关推荐
- B站收藏视频失效?mybili 收藏夹备份神器完整部署指南
-
本内容来源于@什么值得买APP,观点仅代表作者本人|作者:羊刀仙很多B站用户都有过类似经历:自己精心收藏的视频突然“消失”,点开一看不是“已被删除”,就是“因UP主设置不可见”。而B站并不会主动通知...
- 中间件推荐初始化配置
-
Redis推荐初始化配置bind0.0.0.0protected-modeyesport6379tcp-backlog511timeout300tcp-keepalive300...
- Redis中缓存穿透问题与解决方法
-
缓存穿透问题概述在Redis作为缓存使用时,缓存穿透是常见问题。正常查询流程是先从Redis缓存获取数据,若有则直接使用;若没有则去数据库查询,查到后存入缓存。但当请求的数据在缓存和数据库中都...
- 后端开发必看!Redis 哨兵机制如何保障系统高可用?
-
你是否曾在项目中遇到过Redis主服务器突然宕机,导致整个业务系统出现数据读取异常、响应延迟甚至服务中断的情况?面对这样的突发状况,作为互联网大厂的后端开发人员,如何快速恢复服务、保障系统的高可用...
- Redis合集-大Key处理建议
-
以下是Redis大Key问题的全流程解决方案,涵盖检测、处理、优化及预防策略,结合代码示例和最佳实践:一、大Key的定义与风险1.大Key判定标准数据类型大Key阈值风险场景S...
- 深入解析跳跃表:Redis里的"老六"数据结构,专治各种不服
-
大家好,我是你们的码农段子手,今天要给大家讲一个Redis世界里最会"跳科目三"的数据结构——跳跃表(SkipList)。这货表面上是个青铜,实际上是个王者,连红黑树见了都要喊声大哥。...
- Redis 中 AOF 持久化技术原理全解析,看完你就懂了!
-
你在使用Redis的过程中,有没有担心过数据丢失的问题?尤其是在服务器突然宕机、意外断电等情况发生时,那些还没来得及持久化的数据,是不是让你夜不能寐?别担心,Redis的AOF持久化技术就是...
- Redis合集-必备的几款运维工具
-
Redis在应用Redis时,经常会面临的运维工作,包括Redis的运行状态监控,数据迁移,主从集群、切片集群的部署和运维。接下来,从这三个方面,介绍一些工具。先来学习下监控Redis实时...
- 别再纠结线程池大小 + 线程数量了,没有固定公式的!
-
我们在百度上能很轻易地搜索到以下线程池设置大小的理论:在一台服务器上我们按照以下设置CPU密集型的程序-核心数+1I/O密集型的程序-核心数*2你不会真的按照这个理论来设置线程池的...
- 网络编程—IO多路复用详解
-
假如你想了解IO多路复用,那本文或许可以帮助你本文的最大目的就是想要把select、epoll在执行过程中干了什么叙述出来,所以具体的代码不会涉及,毕竟不同语言的接口有所区别。基础知识IO多路复用涉及...
- 5分钟学会C/C++多线程编程进程和线程
-
前言对线程有基本的理解简单的C++面向过程编程能力创造单个简单的线程。创造单个带参数的线程。如何等待线程结束。创造多个线程,并使用互斥量来防止资源抢占。会使用之后,直接跳到“汇总”,复制模板来用就行...
- 尽情阅读,技术进阶,详解mmap的原理
-
1.一句话概括mmapmmap的作用,在应用这一层,是让你把文件的某一段,当作内存一样来访问。将文件映射到物理内存,将进程虚拟空间映射到那块内存。这样,进程不仅能像访问内存一样读写文件,多个进程...
- C++11多线程知识点总结
-
一、多线程的基本概念1、进程与线程的区别和联系进程:进程是一个动态的过程,是一个活动的实体。简单来说,一个应用程序的运行就可以被看做是一个进程;线程:是运行中的实际的任务执行者。可以说,进程中包含了多...
- 微服务高可用的2个关键技巧,你一定用得上
-
概述上一篇文章讲了一个朋友公司使用SpringCloud架构遇到问题的一个真实案例,虽然不是什么大的技术问题,但如果对一些东西理解的不深刻,还真会犯一些错误。这篇文章我们来聊聊在微服务架构中,到底如...
- Java线程间如何共享与传递数据
-
1、背景在日常SpringBoot应用或者Java应用开发中,使用多线程编程有很多好处,比如可以同时处理多个任务,提高程序的并发性;可以充分利用计算机的多核处理器,使得程序能够更好地利用计算机的资源,...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)