百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

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里的&quot;老六&quot;数据结构,专治各种不服

大家好,我是你们的码农段子手,今天要给大家讲一个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应用开发中,使用多线程编程有很多好处,比如可以同时处理多个任务,提高程序的并发性;可以充分利用计算机的多核处理器,使得程序能够更好地利用计算机的资源,...

取消回复欢迎 发表评论: