Redis 部署实践一文搞定(单机、Sentinel、Cluster)
mhr18 2024-11-07 11:00 21 浏览 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 #开启启动
相关推荐
- 如何检查 Linux 服务器是物理服务器还是虚拟服务器?
-
在企业级运维、故障排查和性能调优过程中,准确了解服务器的运行环境至关重要。无论是物理机还是虚拟机,都存在各自的优势与限制。在很多场景下,尤其是当你继承一台服务器而不清楚底层硬件细节时,如何快速辨识它是...
- 第四节 Windows 系统 Docker 安装全指南
-
一、Docker在Windows上的运行原理(一)架构限制说明Docker本质上依赖Linux内核特性(如Namespaces、Cgroups等),因此在Windows系统上无法直...
- C++ std:shared_ptr自定义allocator引入内存池
-
当C++项目里做了大量的动态内存分配与释放,可能会导致内存碎片,使系统性能降低。当动态内存分配的开销变得不容忽视时,一种解决办法是一次从操作系统分配一块大的静态内存作为内存池进行手动管理,堆对象内存分...
- Activiti 8.0.0 发布,业务流程管理与工作流系统
-
Activiti8.0.0现已发布。Activiti是一个业务流程管理(BPM)和工作流系统,适用于开发人员和系统管理员。其核心是超快速、稳定的BPMN2流程引擎。Activiti可以...
- MyBatis动态SQL的5种高级玩法,90%的人只用过3种
-
MyBatis动态SQL在日常开发中频繁使用,但大多数开发者仅掌握基础标签。本文将介绍五种高阶技巧,助你解锁更灵活的SQL控制能力。一、智能修剪(Trim标签)应用场景:动态处理字段更新,替代<...
- Springboot数据访问(整合Mybatis Plus)
-
Springboot整合MybatisPlus1、创建数据表2、引入maven依赖mybatis-plus-boot-starter主要引入这个依赖,其他相关的依赖在这里就不写了。3、项目结构目录h...
- 盘点金州勇士在奥克兰13年的13大球星 满满的全是...
-
见证了两个月前勇士与猛龙那个史诗般的系列赛后,甲骨文球馆正式成为了历史。那个大大的红色标志被一个字母一个字母地移除,在周四,一切都成为了过去式。然而这座,别名为“Roaracle”(译注:Roar怒吼...
- Mybatis入门看这一篇就够了(mybatis快速入门)
-
什么是MyBatisMyBatis本是apache的一个开源项目iBatis,2010年这个项目由apachesoftwarefoundation迁移到了googlecode,并且改名为M...
- Springboot数据访问(整合druid数据源)
-
Springboot整合druid数据源基本概念SpringBoot默认的数据源是:2.0之前:org.apache.tomcat.jdbc.pool.DataSource2.0及之后:com.z...
- Linux 中的 "/etc/profile.d" 目录有什么作用 ?
-
什么是/etc/profile.d/目录?/etc/profile.d/目录是Linux系统不可或缺的一部分保留配置脚本。它与/etc/profile文件相关联,这是一个启动脚本,该脚...
- 企业数据库安全管理规范(企业数据库安全管理规范最新版)
-
1.目的为规范数据库系统安全使用活动,降低因使用不当而带来的安全风险,保障数据库系统及相关应用系统的安全,特制定本数据库安全管理规范。2.适用范围本规范中所定义的数据管理内容,特指存放在信息系统数据库...
- Oracle 伪列!这些隐藏用法你都知道吗?
-
在Oracle数据库中,有几位特殊的“成员”——伪列,它们虽然不是表中真实存在的物理列,但却能在数据查询、处理过程中发挥出意想不到的强大作用。今天给大家分享Oracle伪列的使用技巧,无论...
- Oracle 高效处理数据的隐藏神器:临时表妙用
-
各位数据库搬砖人,在Oracle的代码世界里闯荡,处理复杂业务时,是不是总被数据“搅得头大”?今天给大家安利一个超实用的隐藏神器——临时表!当你需要临时存储中间计算结果,又不想污染正式数据表...
- Oracle 数据库查询:多表查询(oracle多表关联查询)
-
一、多表查询基础1.JOIN操作-INNERJOIN:返回两个表中满足连接条件的匹配行,不保留未匹配数据。SELECTa.emp_id,b.dept_nameFROMempl...
- 一文掌握怎么利用Shell+Python实现多数据源的异地备份程序
-
简介:在信息化时代,数据安全和业务连续性已成为企业和个人用户关注的焦点。无论是网站数据、数据库、日志文件,还是用户上传的文档、图片等,数据一旦丢失,损失难以估量。尤其是当数据分布在多个不同的目录、服务...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 如何检查 Linux 服务器是物理服务器还是虚拟服务器?
- 第四节 Windows 系统 Docker 安装全指南
- C++ std:shared_ptr自定义allocator引入内存池
- Activiti 8.0.0 发布,业务流程管理与工作流系统
- MyBatis动态SQL的5种高级玩法,90%的人只用过3种
- Springboot数据访问(整合Mybatis Plus)
- 盘点金州勇士在奥克兰13年的13大球星 满满的全是...
- Mybatis入门看这一篇就够了(mybatis快速入门)
- Springboot数据访问(整合druid数据源)
- Linux 中的 "/etc/profile.d" 目录有什么作用 ?
- 标签列表
-
- oracle位图索引 (74)
- oracle基目录 (50)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (53)
- 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)