Redis 集群部署(redis集群部署模式有哪几种)
mhr18 2024-11-07 11:00 19 浏览 0 评论
一、Redis及Redis集群简介
1.Redis
redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。
2.Redis集群
Redis Cluster 即 Redis 集群,是 Redis 官方在 3.0 版本推出的一套分布式存储方案。完全去中心化,由多个节点组成,所有节点彼此互联。Redis 客户端可以直接连接任何一节点获取集群中的键值对,不需要中间代理,如果该节点不存在用户所指定的键值,其内部会自动把客户端重定向到键值所在的节点。
Redis 集群是一个网状结构,每个节点都通过 TCP 连接跟其他每个节点连接。在一个有 N 个节点的集群中,每个节点都有 N-1 个流出的 TCP 连接,和 N-1 个流入的连接,这些 TCP 连接会永久保持。
Redis Cluster 同其他分布式存储系统一样,主要具备以下两个功能:
数据分区:Redis 集群会将用户数据分散保存至各个节点中,突破单机 Redis 内存最大存储容量。集群引入了 哈希槽slot的概念,其搭建完成后会生成 16384 个哈希槽slot,同时会根据节点的数量大致均等的将 16384 个哈希槽映射到不同的节点上。当用户存储key-value时,集群会先对key进行 CRC16 校验然后对 16384 取模来决定key-value放置哪个槽,从而实现自动分割数据到不同的节点上。
数据冗余:Redis 集群支持主从复制和故障恢复。集群使用了主从复制模型,每个主节点master应至少有一个从节点slave。假设某个主节点故障,其所有子节点会广播一个数据包给集群里的其他主节点来请求选票,一旦某个从节点收到了大多数主节点的回应,那么它就赢得了选举,被推选为主节点,负责处理之前旧的主节点负责的哈希槽。
二、Redis部署
1.下载安装Redis
wget http://download.redis.io/releases/redis-5.0.6.tar.gz
2.解压Redis源码包
tar -zxvf redis-5.0.3.tar.gz
3.安装
Redis 基于 C 语言开发,故编译源码需要 GCC(Linux下的一个编译器,这里需要用来编译.c文件)的支持。如机器上未安装需要先执行命令yum -y install gcc安装 GCC 编译工具,然后make distclean清除之前生成的文件,最后make && make install重新编译安装。进入解压后的目录并使用make命令执行编译安装Redis(以/home目录为例)
* 注:make编译安装前需提前安装GCC编译器,否则会编译失败,安装命令:
yum -y install gcc
cd /home/redis-5.0.6
make
* 出现类似下列输出则表示安装成功
* 安装成功后,Redis目录文件会出现如下文件
- redis-benchmark:redis性能测试工具
- redis-check-aof:检查aof日志的工具
- redis-check-rdb:检查rdb日志的工具
- redis-cli:连接用的客户端
- redis-server:redis服务进程
4.启动集群各个节点
cd /home/redis-5.0.6/src
./run-server /home/redis-5.0.6/redis-cluster/7001/redis.conf
5.Redis配置文件---redis.conf释义
- daemonize: 如需要在后台运行,把该项的值改为yes
- pdifile: 设置 Redis 实例 pid 文件
- bind: 设置当前节点主机地址
- port: 监听端口,默认为6379
- timeout: 设置客户端连接时的超时时间,单位为秒
- loglevel: 日志等级:debug,revbose,notice和warning
- logfile: 配置log文件地址,默认使用标准输出
- database: 设置数据库的个数,默认使用的数据库是0
- save: 设置redis进行数据库镜像的频率
- dbfilename: 镜像备份文件的文件名
- dir: 数据库文件放置的路径
- cluster-enabled yes 启用集群模式
- cluster-node-timeout 15000 设置当前节点连接超时毫秒数
- cluster-config-file nodes-7001.conf 设置当前节点集群配置文件路径
三、集群部署
依据 Redis Cluster 内部故障转移实现原理,Redis 集群至少需要 3 个主节点,而每个主节点至少有 1 从节点,因此搭建一个集群至少包含 6 个节点,三主三从,并且分别部署在不同机器上。(本次以部署在同一台机器上为例)
目前 Redis Cluster 的搭建有两种方式:
- 手动方式搭建,即手动执行 cluster 命令,一步步完成搭建流程。
- 自动方式搭建,即使用官方提供的集群管理工具快速搭建。
两种方式原理一样,自动搭建方式只是将手动搭建方式中需要执行的 Redis 命令封装到了可执行程序。生产环境下推荐使用第二种方式,简单快捷,不易出错。(本次以自动搭建为例)
由于我们这是在一台机器上模拟多个节点,可以预先规划下各个节点的属性:
节点编号 | IP 地址 | TCP 端口 | 节点类型 | 从节点 | 启动配置 |
A | 127.0.0.1 | 7001 | 主 | D | /home/redis-5.0.6/redis-cluster/7001/redis.conf |
B | 127.0.0.1 | 7002 | 主 | E | /home/redis-5.0.6/redis-cluster/7002/redis.conf |
C | 127.0.0.1 | 7003 | 主 | F | /home/redis-5.0.6/redis-cluster/7003/redis.conf |
D | 127.0.0.1 | 8001 | 从 | / | /home/redis-5.0.6/redis-cluster/8001/redis.conf |
E | 127.0.0.1 | 8002 | 从 | / | /home/redis-5.0.6/redis-cluster/8002/redis.conf |
F | 127.0.0.1 | 8003 | 从 | / | /home/redis-5.0.6/redis-cluster/8003/redis.conf |
1.创建节点
mkdir /home/redis-5.0.6/redis-cluster
cd redis-cluster
mkdir -p 7001 7002 7003 8001 8002 8003
2.分别复制配置文件到各个节点目录
cp redis.conf /home/redis-5.0.6/redis-cluster/7001
cp redis.conf /home/redis-5.0.6/redis-cluster/7002
cp redis.conf /home/redis-5.0.6/redis-cluster/7003
cp redis.conf /home/redis-5.0.6/redis-cluster/8001
cp redis.conf /home/redis-5.0.6/redis-cluster/8002
cp redis.conf /home/redis-5.0.6/redis-cluster/8003
3.分别修改节点配置文件(以7001节点为例,其他原理相同)
cd /home/redis-5.0.6/redis-cluster/7001
vi redis.conf
* 具体修改内容如下:
bind 192.168.83.128 # 设置当前节点主机地址
port 7001 # 设置客户端连接监听端口
pidfile /var/run/redis_7001.pid # 设置 Redis 实例 pid 文件
daemonize yes # 以守护进程运行 Redis 实例
cluster-enabled yes # 启用集群模式
cluster-node-timeout 15000 # 设置当前节点连接超时毫秒数
cluster-config-file nodes-7001.conf # 设置当前节点集群配置文件路径
4.启动集群各个节点
cd /home/redis-5.0.6/src
./run-server /home/redis-5.0.6/redis-cluster/7001/redis.conf
./run-server /home/redis-5.0.6/redis-cluster/7002/redis.conf
./run-server /home/redis-5.0.6/redis-cluster/7003/redis.conf
./run-server /home/redis-5.0.6/redis-cluster/8001/redis.conf
./run-server /home/redis-5.0.6/redis-cluster/8002/redis.conf
./run-server /home/redis-5.0.6/redis-cluster/8003/redis.conf
* 启动后,会有如下提示:
* 通过ps命令查看确认各个节点是否运行
5.自动搭建集群
Redis 3.0 版本之后官方发布了一个集群管理工具 redis-trib.rb,集成在 Redis 源码包的src目录下。其封装了 Redis 提供的集群命令,使用简单、便捷。不过 redis-trib.rb 是 Redis 作者使用 Ruby 语言开发的,故使用该工具之前还需要先在机器上安装 Ruby 环境。后面作者可能意识到这个问题,Redis 5.0 版本开始便把这个工具集成到 redis-cli 中,以--cluster参数提供使用,其中create命令可以用来创建集群。如果您安装的 Redis 是 3.x 和 4.x 的版本可以使用 redis-trib.rb 搭建,不过之前需要安装 Ruby 环境。先使用 yum 安装 Ruby 环境以及其他依赖项:
yum -y install ruby ruby-devel rubygems rpm-build
确认安装版本:
ruby -v
* 本次搭建使用的 Redis 版本是 5.0.6,所以我可以直接使用redis-cli --cluster create命令搭建,具体命令如下所示(重点):
./redis-cli --cluster create 10.252.30.241:7001 10.252.30.241:7002 10.252.30.241:7003 10.252.30.241:8001 10.252.30.241:8002 10.252.30.241:8003 --cluster-replicates 1
* 主节点在前,从节点在后。其中--cluster-replicas参数用来指定一个主节点带有的从节点个数,如上--cluster-replicas 1即表示 1 个主节点有 1 个从节点。
* 创建成功会有如下提示
至此,Redis集群搭建完毕!
四、Redis基本使用
1.Redis启动/重启
./run-server /home/redis-5.0.6/redis.conf
2.客户端登录
./redis-cli
./redis-cli -h ip 进入指定服务器的Redis实例
3.关闭Redis
· 方式一:shell交互命令关闭
1)进入Redis的shell命令行
./redis-cli
2)关闭Redis
shutdown
在 shell 交互界面输入 shutdown 命令就可以关闭 Redis 实例,后面有一个可选参数,nosave 就是不将内存中的数据持久化,save 就是将内存中的数据持久化。shutdown 关闭方式是比较优雅的关闭方式,建议使用这种关闭方式
· 方式二:kill+进程号关闭
1)查看Redis进程号
ps -ef | grep redis
2)杀掉Redis进程
kill 19317
使用 kill方式关闭 Redis 实例服务,需要注意一个地方,那就是需要把 pid 文件删掉,pid文件存放的位置我们在 redis.conf 里配置的 pidfile /var/run/redis_6379.pid,我们需要到 /var/run 目录下把 redis_6379.pid 删掉,这样下一次才能正常重启 Redis 服务。
上面两种方式都可以关闭 Redis 服务,随便选一种都行,但是切记不要使用 Kill 9 方式关闭 Redis 进程,这样 Redis 不会进行持久化操作,除此之外,还会造成缓冲区等资源不能优雅关闭,极端情况下会造成 AOF 和复制丢失数据的情况
4.设置Redis开机自启动
5.Redis进程绑定到指定的CPU
1)查看Redis进程
ps -ef | grep redis
2)显示进程运行的CPU
taskset -p 19317
3)查看本服务器CPU数量
lscpu
4)指定进程运行在某个特定的CPU上(将7001节点的Redis绑定到CPU2上)
taskset -pc 1 23197
显示结果:
pid 23197’s current affinity list: 0-3
pid 23197’s new affinity list: 1
* 注:0-3表示一共4个CPU,1表示CPU将只会运行在第2个CPU上(从0开始计数)
5)进程启动时指定CPU
taskset -c 1 ./redis-server ../redis-cluster/7001/redis.conf
taskset -c 1 ./redis-server ../redis-cluster/8001/redis.conf
taskset -c 2 ./redis-server ../redis-cluster/7002/redis.conf
taskset -c 2 ./redis-server ../redis-cluster/8002/redis.conf
taskset -c 3 ./redis-server ../redis-cluster/7003/redis.conf
taskset -c 3 ./redis-server ../redis-cluster/8003/redis.conf
五、常见问题及解决办法
1.使用./redis-cli进入shell时报错Could not connect to Redis at 127.0.0.1:6379: Connection refused
【解决办法】
1)编辑redis配置文件redis.conf 并修改 daemonize no(第128行) 为 daemonize yes ,这样就可以默认启动就后台运行
2)重启redis服务
redis-server /etc/redis.conf
* 注:开启客户端要确保服务端启动
2.外部无法访问redis
【解决办法】
1)编辑redis配置文件redis.conf 并修改 bind 127.0.0.1 为bind 0.0.0.0(代表不做限制)
2)重启redis服务
redis-server /etc/redis.conf
* 其他可能原因:防火墙未添加redis端口、安全组、protected-mode保护模式未关闭、密码错误等
相关推荐
- 如何检查 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)