【Docker】使用docker搭建redis-cluster环境【实测成功】

本文详细介绍如何使用Docker快速搭建Redis Cluster环境,包括创建虚拟网卡、配置文件模板、启动容器及集群创建等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

临时接到一个测试任务,而测试需要用到redis-cluster环境,却没有现成的环境可用,于是只能自力更生搭建测试环境。一开始想采用在宿主机上硬搭,但苦于没有那么多的服务器,于是决定试试docker。以下为详细搭建步骤:

基础环境信息

基础环境如下所示:

CentOS Linux release 7.5.1804
Docker version 18.09.4

搭建步骤

  • 1、下载redis镜像
docker pull redis

如果需要拉取指定版本,需要在redis后面添加版本号,如果不指定则拉取最新版本镜像,可以使用docker search redis来搜索镜像

查看本地镜像,可以使用命令docker images

  • 2、创建虚拟网卡

创建虚拟网卡,主要是用于redis-cluster能于外界进行网络通信,一般常用桥接模式。

docker network create redis-net

查看docker的网卡信息,可使用命令docker network ls

查看dockerr网络详细信息,可使用命令docker network inspect redis-net

  • 3、创建redis配置文件模板
mkdir -p /home/redis-cluster
cd /home/redis-cluster
vim redis-cluster.tmpl

在redis-cluster.tmpl中输入以下内容

port ${PORT}
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 192.168.168.131
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
appendonly yes

各节点解释如下所示:

  • port:节点端口,即对外提供通信的端口
  • cluster-enabled:是否启用集群
  • cluster-config-file:集群配置文件
  • cluster-node-timeout:连接超时时间
  • cluster-announce-ip:集群各节点IP地址
  • cluster-announce-port:集群节点映射端口
  • cluster-announce-bus-port:集群总线端口
  • appendonly:持久化模式

cluster-announce-ip:这个IP需要特别注意一下,如果要对外提供访问功能,需要填写宿主机的IP,如果填写docker分配的IP(172.x.x.x),可能会导致部分集群节点在跳转时失败。

  • 4、创建节点配置文件

在redis-cluser中执行以下命令

for port in $(seq 8010 8015); \
do \
  mkdir -p ./${port}/conf  \
  && PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf \
  && mkdir -p ./${port}/data; \
done

验证上述命令执行的结果是否正确

  • 5、创建redis节点容器

执行以下命令即可

for port in $(seq 8010 8015); \
do \
   docker run -it -d -p ${port}:${port} -p 1${port}:1${port} \
  --privileged=true -v /home/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
  --privileged=true -v /home/redis-cluster/${port}/data:/data \
  --restart always --name redis-${port} --net redis-net \
  --sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf; \
done

验证容器是否创建成功

查看docker给每个节点分配的IP信息

  • 6、创建redis-cluster集群

进入一个容器节点

docker exec -it redis-8010 bash

在进入容器后,执行以下命令:

cd /usr/local/bin/

redis-cli --cluster create 192.168.168.131:8010 192.168.168.131:8011 192.168.168.131:8012 192.168.168.131:8013 192.168.168.131:8014 192.168.168.131:8015

出现选择提示信息,输入yes,结果如下所示:

  • 7、连接redis-cluster,并添加数据到redis

在节点8010中输入以下命令

redis-cli -c -h 192.168.168.131 -p 8010

  • 8、验证集群是否可以任意地方访问

以下验证是基于Windows版本的redis。其下载地址如下:

https://github.com/microsoftarchive/redis/releases

在Windows中验证的结果如下所示:

搭建中遇到的问题

  • 1、所有都搭建完成后,在创建redis-cluster时一直报错

Could not connect to Redis at 192.168.168.131:8010: No route to host

这个原因是因为宿主机的防火墙未关,导致相应的端口被阻止,创建的时候临时关闭防火墙,后面再允许相应的端口即可。

  • 2、在成功创建完redis-cluster后,可以成功连接,但在获取值时,一直处于跳转中,导致最终出现TTL exhaust

-> Redirected to slot [15495] located at 172.18.0.7:8015

这种情况通常是因为在前面写配置文件,将cluster-announce-ip写成了docker分配的IP,只需要将该IP换为宿主机的IP即可。

其他参考

在搭建过程,可能在出现问题后,需要停止或直接删除docker容器,可以使用以下参考命令

批量停止docker 容器:

docker ps -a | grep -i "redis-801*" | awk '{print $1}' | xargs docker stop

批量删除docker 容器:

docker ps -a | grep -i "redis-801*" | awk '{print $1}' | xargs docker rm -f

批量删除文件

rm -rf 801{0..5}/conf/redis.conf

以上就是基于docker搭建redis-cluster的简单步骤,实际应用中可能并没有这么简单,该文也仅用于参考。

 

<think>好的,用户现在想了解使用Node.js作为博客项目后端技术的可行性或最佳实践。之前用户询问过博客后端技术选型,我推荐了Java Spring Boot、Python Django之类的选项,但用户现在特别关注Node.js,可能是因为他们看到了站内引用的相关内容,或者对JavaScript生态系统比较熟悉。需要结合之前的回答和引用中的信息来给出全面的建议。 首先,用户提到的三个引用都涉及Node.js的应用。引用[1]提到Node.js的高性能和事件驱动模型,适合处理并发请求,这对博客的高并发场景有帮助。引用[2]讨论了使用Express.js的结构化项目,这对代码组织和可维护性很重要。引用[3]展示了一个简易后端项目的代码,包括处理POST数据和数据库连接,这可以作为实现的具体参考。 我需要比较之前推荐的Java/Python方案和Node.js的优劣。Node.js的优势在于非阻塞I/O、JavaScript全栈、丰富的npm生态,适合I/O密集型应用。而Java更适合复杂的业务逻辑和事务处理。用户可能关心性能、开发效率、维护成本等方面。 接下来要考虑最佳实践。根据引用中的内容,项目结构、中间件使用、异步处理、数据库集成、身份认证、部署等都是关键点。例如,引用[2]提到代码结构的重要性,应该建议遵循MVC模式,合理分目录。引用[3]中的代码示例如何处理POST数据和数据库操作,可以推荐使用ORM如Sequelize或Mongoose,而避免手动处理SQL拼接,以提高安全性和效率。 另外,用户之前的问题中提到了MySQL和Redis使用,所以在Node.js方案中也需要包括这些组件的整合,比如使用mysql2库连接MySQL,使用ioredis连接Redis。同时,安全方面需要考虑JWT认证、输入验证、防止SQL注入等,引用[1]中的JWT和Spring Security在Node.js中可以用Passport.js或jsonwebtoken库替代。 部署方面,之前建议使用Nginx、Docker等,同样适用于Node.js。需要提到PM2作为进程管理工具,保证应用稳定运行。监控和日志也是必要的,可以使用Winston或Morgan记录日志,Prometheus监控性能。 可能还需要比较Node.js和其他技术的优劣,比如开发速度更快,适合小到中型项目,但可能不适合CPU密集型任务。如果用户预期有高并发或实时需求,Node.js会更合适。 最后,用户可能希望知道具体的步骤或示例代码,比如如何设置Express项目结构,如何连接数据库,实现路由等,这需要给出简洁的示例,如引用[3]中的代码片段,但建议使用更现代的语法或框架特性,比如async/await代替Promise链,使用中间件处理请求等。 总结起来,回答需要涵盖可行性分析(优势)、最佳实践(项目结构、技术选型、安全、性能优化)、示例代码、部署方案,以及与之前推荐技术的对比,帮助用户全面理解Node.js在博客项目中的应用。</think>根据技术特性与博客项目需求,使用Node.js构建博客后端是可行且高效的选择。以下从技术优势、实现方案、最佳实践三个维度进行说明: --- ### 一、Node.js的核心优势 1. **高性能并发处理** - 事件驱动与非阻塞I/O模型,单线程处理高并发请求 $$ \text{QPS} = \frac{\text{最大并发连接数}}{\text{平均请求处理时间}} $$ 实测Express框架可轻松支撑5000+ QPS[^1] 2. **全栈一致性** - 前端React/Vue与后端共用JavaScript语言,降低开发成本 - 统一JSON数据格式处理请求响应 3. **生态体系成熟** - npm仓库提供超过200万模块,如Express、Koa、NestJS等框架 - 支持MySQL/MongoDB/Redis等主流数据库驱动 --- ### 二、典型技术方案 #### 1. 框架选型建议 | 框架类型 | 推荐方案 | 适用场景 | |------------|--------------|-------------------------| | 轻量级 | Express.js | 小型博客/快速原型开发[^2] | | 结构化 | NestJS | 企业级博客/需要严格架构规范 | | 全功能 | AdonisJS | 自带ORM/认证等完整功能的博客系统 | #### 2. 项目结构规范 ```bash project/ ├── config/ # 环境配置 ├── src/ │ ├── controllers # 请求处理层 │ ├── services # 业务逻辑层 │ ├── models # 数据模型层 │ ├── routes # 路由定义 │ ├── middleware # 认证/日志等中间件 │ └── utils # 工具函数 ├── test/ # 单元测试 └── app.js # 入口文件 ``` #### 3. 关键技术实现 **数据库操作示例(Sequelize ORM)**: ```javascript // models/Blog.js const { DataTypes } = require('sequelize'); module.exports = (sequelize) => { return sequelize.define('Blog', { title: DataTypes.STRING, content: DataTypes.TEXT, authorId: DataTypes.INTEGER }); }; // controllers/blogController.js const getBlogList = async (req, res) => { try { const blogs = await Blog.findAll(); res.json({ code: 200, data: blogs }); } catch (err) { res.status(500).json({ code: 500, message: err.message }); } }; ``` --- ### 三、最佳实践指南 1. **性能优化** - 使用`cluster`模块充分利用多核CPU - 通过Redis缓存高频查询(如热门文章列表) ```javascript // 缓存中间件示例 const cacheMiddleware = (req, res, next) => { const key = req.originalUrl; redis.get(key, (err, data) => { if (data) return res.json(JSON.parse(data)); next(); }); }; ``` 2. **安全防护** - 使用`helmet`设置HTTP安全头 - 通过`express-validator`校验请求参数 ```javascript app.post('/blog', body('title').isLength({ min: 5 }), (req, res) => { const errors = validationResult(req); if (!errors.isEmpty()) { return res.status(400).json({ errors: errors.array() }); } // 安全处理逻辑 } ); ``` 3. **部署方案** - 使用PM2管理进程:`pm2 start app.js -i max` - Nginx反向代理配置: ```nginx server { listen 80; location / { proxy_pass http://localhost:3000; proxy_set_header Host $host; } } ``` --- ### 四、对比其他技术栈 | 指标 | Node.js | Spring Boot | Django | |-------------|--------------|--------------|--------------| | 学习曲线 | 低(JS基础即可) | 中(需Java基础) | 中(Python基础) | | 并发处理能力 | ★★★★☆ | ★★★☆☆ | ★★☆☆☆ | | 生态丰富度 | ★★★★★ | ★★★★☆ | ★★★☆☆ | | 适合场景 | I/O密集型应用 | 复杂业务系统 | 快速原型开发 | ---
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值