• [课程学习] 学习docker使用
    教程非常适合新手,学到了不少东西
  • [热门活动] 【案例共创】ESC基于RAGFlow和DeepSeek构建本地问答知识库
    【案例共创】ESC基于RAGFlow和DeepSeek构建本地问答知识库一、案例介绍在人工智能技术飞速发展的当下,企业知识库智能化正成为提升运营效率的核心路径。DeepSeek 几乎家喻户晓,而 RAGFlow 是一个基于深入文档理解的开源RAG(检索增强生成)引擎。当与LLMs集成时,它能够提供真实的问题回答功能,并由来自各种复杂格式数据的有理有据的引用支持。本次我们基于ESC使用 Docker 部署RAGFlow,并使用 ollama 部署 DeepSeek R1 模型和 bge-m3 嵌入模型,体验 RAGFlow 的知识库、对话、Agent等功能,通过RAGFlow的智能文档解析与DeepSeek大语言模型的精准推理能力,构建具备多源异构数据处理、语义深度理解及动态知识更新特征的问答知识库、Agent。二、案例用时本案例总时长预计120分钟。三、案例流程 说明:通过ECS中安装dokcer部署ragflow通过ECS中docker部署ollama来运行deepseek通过配置ragflow来调用deepseek-r1模型能力用过通过公网ip访问ECS从而体验ragflow+deepseek四、资源总览云资源消耗/时时长ECS(含公网IP、磁盘等)0.9885120min合计:1.977元五、实践步骤0. 购买ECS配置如下:bash计费模式: 按需计费区域: 西南-贵阳一可用区: 随机分配CPU架构:x86计算实例规格:通用计算增强型 | x1e.4u.16g | 4vCPUs | 16GiB镜像: 公共镜像-Ubuntu 24.04 server 64bit(10GiB)磁盘: 通用型SSD 50G弹性公网IP:现在购买-全动态BGP-按带宽计算-5Mbit/s-随实例释放云服务器名称:ecs-ragflow密码:RagFlow@123使用时长:设定删除时间为 8 小时之后购买数量: 1清单链接:https://www.huaweicloud.com/pricing/calculator.html?shareListId=267c3c60fc6411efa933bd915e6892f51、安装 RAGFlow1.1 安装 Docker CE 和 Docker Compose打开终端,新建 install-docker.sh:bash# 查看系统uname -alsb_release -a# 准备安装 dockercd ~pwdmkdir RAGFlowcd RAGFlowvi install-docker.sh写入以下脚本到 install-docker.shbash#!/bin/bash# 定义日志文件路径LOGFILE="/var/docker-install.log"# 将标准输出和错误输出重定向到日志文件,同时显示到终端exec > >(tee -a "$LOGFILE") 2>&1# 设置DEBUG模式下的时间戳输出格式trap '{ set +x; } 2>/dev/null; echo -n "[$(date -Is)] "; set -x' DEBUG# 下载并安装 docker CE 和 docker composeecho "开始安装 Docker CE 和 Docker Compose..."# 添加Docker官方GPG密钥curl -fsSL https://mirrors.huaweicloud.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -echo "已添加 Docker GPG 密钥"# 添加Docker软件源echo "" | sudo add-apt-repository "deb [arch=amd64] https://mirrors.huaweicloud.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"echo "已添加 Docker 软件源"# 更新软件包列表echo "正在更新软件包列表..."echo "y" | sudo apt-get update# 安装Docker CE和Docker Composeecho "正在安装 Docker CE 和 Docker Compose..."echo "y" | sudo apt-get install docker-ce docker-composeecho "Docker 安装完成"# 配置docker镜像仓库为华为云镜像echo "正在配置华为云镜像源..."sudo echo '{"registry-mirrors": ["https://b4a1f63a156e435f9aeb797bdf515250.mirror.swr.myhuaweicloud.com"]}' >/etc/docker/daemon.json# 重启docker服务使配置生效echo "正在重启 Docker 服务..."sudo systemctl restart dockerecho "Docker 配置完成"接着运行 docker 安装脚本:bashsudo bash ./install-docker.sh我们查看版本发现 docker-compse 版本有点低,可能会影响后续的安装,因此尝试升级 docker-composebashdocker -vdocker-compse -v升级 docker-compose:bash# 先看看 docker-compose 的路径whereis docker-compose# 备份一下sudo mv /usr/bin/docker-compose /usr/bin/docker-compose.bak# 下载对应系统的 docker-composewget https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-linux-x86_64 -O docker-compose# 如果速度慢可以尝试使用加速源,如 https://hub.gitmirror.com/、https://github.moeyy.xyz/、https://ghfast.top/# wget https://hub.gitmirror.com/https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-linux-x86_64 -O docker-compose# 也可以自行去 github 下载: https://github.com/docker/compose/releases# 替换 docker-composesudo cp ./docker-compose /usr/bin/docker-compose# 加权限sudo chmod +x /usr/bin/docker-compose# 验证docker-compose -v1.2 安装 RAGFlow先设置一下最大虚拟内存。vm.max_map_count该值设置进程可能拥有的内存映射区域的最大数量。它的默认值是65530。虽然大多数应用程序需要的映射少于一千个,但减小此值可能会导致异常行为,并且当进程达到限制时,系统将抛出内存不足错误。RAGFlow v0.17.0使用Elasticsearch或Infinity进行多次调用。正确设置vm.max_map_count的值对于Elasticsearch组件的正常运行至关重要。bash# 检查vm.max_map_count的值sysctl vm.max_map_count# 如果小于 262144 则至少设置为 262144sudo sysctl -w vm.max_map_count=262144接着安装 RAGFlowbash# 下载源码git clone https://github.com/infiniflow/ragflow.git# 如果下载比较慢请尝试使用镜像加速,如:# git clone https://ghfast.top/https://github.com/infiniflow/ragflow.gitcd ragflow/docker# 切换最新稳定分支 (截止 20205-03-08 为 0.17.0)git checkout -f v0.17.0git branch我们可以修改 .env 启用全量版本(非必须,可无须修改直接使用 slim 版本),并设置 docker 镜像源:bashsudo echo '{"registry-mirrors": ["https://b4a1f63a156e435f9aeb797bdf515250.mirror.swr.myhuaweicloud.com"]}' >/etc/docker/daemon.jsonRAGFlow镜像标签镜像大小(GB)是否包含嵌入模型和Python包是否稳定v0.17.0≈9✔️稳定版本v0.17.0-slim≈2❌稳定版本nightly≈9✔️nightly 构建不稳定nightly-slim≈2❌nightly 构建不稳定接着通过 docker-compose 启动 RAGFlow,全量的镜像约 9G,安装稍微慢些,需要耐心等待大约10分钟bash# 拉取镜像并启动(默认不包含 embedding 模型, 可以修改 .env 配置,选为华为云镜像v0.17.0 )# vi .env 找到对应位置进行修改docker-compose -f docker-compose.yml up -d# 如果minio拉取不顺,请尝试切换镜像源,需修改 docker-compose-base.yml 的:quay.io 为 quay.m.daocloud.io# 查看日志docker-compose logs -f ragflow-server# 查看端口情况netstat -nptl2. 访问本地 RAGFlow并配置模型RAGFlow是一个RAG引擎,需要与大模型服务一起搭配使用,实现本地、无幻觉的问答功能。RAGFlow支持大多数主流LLMs。2.1 访问本地RAGFlow 并注册账号登录如本次案例中 ecs-ragflow 的 ip 为1.95.184.111 则访问: http://1.95.184.111/login ,注册账号即可使用 RAGFlow。登录之后的主界面如下:⚠️本地模型为选配,同样可以使用其他大模型API服务,比如 Mass、硅基流动等2.2 通过 Docker 安装 ollama首先我们设置docker镜像源,重启docker之后,通过docker拉取ollama镜像并运行bash# 设置 docker 镜像源sudo echo '{"registry-mirrors": ["https://b4a1f63a156e435f9aeb797bdf515250.mirror.swr.myhuaweicloud.com"]}' >/etc/docker/daemon.jsonsudo systemctl restart dockersudo docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama2.3 安装 DeepSeek-R1 模型和 bge-m3 鉴于网络下载速度比较慢,我们拉取相对较小的 deepseek-r1:1.5b 和嵌入模型 bge-m3 (预计25分钟,具体看网络状况)bash# 拉取 deepseek-r1:1.5bsudo docker exec ollama ollama pull deepseek-r1:1.5b# 拉取 bge-m3sudo docker exec ollama ollama pull bge-m32.4 配置模型虽然RAGFlow和Ollama都是跑在同一台机器上,但由于分别使用了docker-compose和docker来部署,可能会导致网络不通的情况,那我们可以通过暴露 11434 ollama的端口来提高大模型服务。于是,我们在模型提供商选择Ollam之后分别配置了嵌入模型 bge-m3 和聊天模型deepseek-r1:1.5b。接着并在设置--系统模型设置中配置好聊天模型和嵌入模型。3. 简单使用接下来,我们简单体验一下RAGFlow 提供的功能,分别是知识库、聊天、搜索、Agent。3.1 知识库功能体验点击知识库,我们创建了一个名为ModelArts助手的知识库,传入了几个pdf文件作为本地知识库。在RAGFlow中知识库被称为数据集,我们可以上次多个文件作为数据集,并通过不通的解析方法将文档进行处理如切片、Q/A等。解析成功的文档可以在后续功能中作为知识库引入。3.2 聊天功能体验我们创建了ModelArts助手的助理,可以对助理进行配置如基本信息、关键词分析、模型参数设置等,并选取知识库作为回答语料。我们一个“如何快速入门”的简单问题开始,AI助理根据挂载的知识给了相关的回答。3.3 搜索功能体验在RAGFlow中,还有搜索功能,类似于传统的搜索引擎给出结果并添加了智能回答和思维导图。3.4 Agent功能体验最后我们来体验Agent功能,这里我们使用的是预置的 text2sql。Agent 会提供一个工作流编排界面,并提供运行测试功能,我们发现Agent也是可以作为单独的页面嵌入到其他网站,简单地要Agent给出“用户转化率”,它基于 deepseek-r1 模型,因此也有思考能力,最终它生成了一段完整的 SQL 语句。至此,案例实践就结束了,记得释放资源哦!记得释放资源哦!记得释放资源哦!我正在参加【案例共创】第2期 构建开发场景最佳实践/体验评测,创作案例文章cid:link_0
  • [专题汇总] 二月技术干货合集【合集贴】
    1.Docker应用部署(Mysql、tomcat、Redis、redis)https://bbs.huaweicloud.com/forum/thread-0251176000289103057-1-1.html    2. 鸿蒙NEXT开发案例:随机数生成https://bbs.huaweicloud.com/forum/thread-0226175856046738051-1-1.html3.ExaGear for Server on Ubuntuhttps://bbs.huaweicloud.com/forum/thread-02127175583262901024-1-1.html4.惊叹数据结构之美,品味排序算法之妙:对快排的详细介绍 -转载https://bbs.huaweicloud.com/forum/thread-0210175572143077031-1-1.html5.修改 Docker 容器的 http_proxy 和 https_proxy -转载https://bbs.huaweicloud.com/forum/thread-02127175572007355023-1-1.html6.【Linux】gdb_进程概念-转载https://bbs.huaweicloud.com/forum/thread-0257175571963347026-1-1.html7.详解Redis之事务-转载https://bbs.huaweicloud.com/forum/thread-0251175571892832022-1-1.html8.Python中的对象关系映射SQLAlchemy ORM在Web开发中的实践 -转载https://bbs.huaweicloud.com/forum/thread-0218175571849778026-1-1.html9.鸿蒙NEXT开发案例:颜文字搜索器https://bbs.huaweicloud.com/forum/thread-0225175848016900053-1-1.html10.鸿蒙NEXT开发案例:经纬度距离计算https://bbs.huaweicloud.com/forum/thread-02127175847897096052-1-1.html11.鸿蒙NEXT开发案例:世界时间表https://bbs.huaweicloud.com/forum/thread-0220175848120824046-1-1.html12.鸿蒙NEXT开发案例:保质期计算https://bbs.huaweicloud.com/forum/thread-0257175848211239048-1-1.html13.鸿蒙NEXT开发案例:九宫格随机https://bbs.huaweicloud.com/forum/thread-0257175848540835049-1-1.html14.Python中的对象关系映射SQLAlchemy ORM在Web开发中的实践 -转载https://bbs.huaweicloud.com/forum/thread-0218175571849778026-1-1.html15.【MySQL】 表的操作-转载https://bbs.huaweicloud.com/forum/thread-0220174982575490008-1-1.html
  • [技术干货] Docker应用部署(Mysql、tomcat、Redis、redis)
    Docker 是一种开源的容器化技术,它可以帮助开发人员和运维人员以更高效、更轻松的方式管理应用程序和服务。通过容器技术,我们可以将应用与其所有的依赖包一起打包,使得应用可以在任何环境中快速、可靠地运行。本文将展示如何在 Docker 容器中部署 MySQL、Tomcat 和 Redis 服务,帮助你快速构建一个多服务的应用环境。1. 准备工作在开始 Docker 部署之前,请确保已经安装了 Docker。可以通过以下命令检查 Docker 是否安装成功:bashCopy Codedocker --version如果没有安装 Docker,可以参考官方文档进行安装:Docker 官方安装文档2. 部署 MySQL 服务2.1. 拉取 MySQL 镜像首先,我们需要拉取 MySQL 镜像。使用 Docker Hub 提供的官方 MySQL 镜像:bashCopy Codedocker pull mysql:latest2.2. 启动 MySQL 容器接下来,通过以下命令启动一个 MySQL 容器:bashCopy Codedocker run --name mysql-container -e MYSQL_ROOT_PASSWORD=root -d mysql:latest--name mysql-container:指定容器名称为 mysql-container。-e MYSQL_ROOT_PASSWORD=root:设置 MySQL 的 root 用户密码为 root。-d:以后台模式运行容器。mysql:latest:使用 mysql 的最新版本镜像。2.3. 连接到 MySQL 容器要进入 MySQL 容器,可以使用以下命令:bashCopy Codedocker exec -it mysql-container mysql -uroot -p输入密码 root 即可进入 MySQL 命令行。2.4. 设置数据库在 MySQL 中创建一个数据库和一个用户(可选):sqlCopy CodeCREATE DATABASE mydb; CREATE USER 'myuser'@'%' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'%'; FLUSH PRIVILEGES;3. 部署 Tomcat 服务3.1. 拉取 Tomcat 镜像我们可以使用官方的 Tomcat 镜像:bashCopy Codedocker pull tomcat:latest3.2. 启动 Tomcat 容器启动 Tomcat 容器,指定要暴露的端口:bashCopy Codedocker run --name tomcat-container -d -p 8080:8080 tomcat:latest--name tomcat-container:指定容器名称为 tomcat-container。-d:后台运行容器。-p 8080:8080:将容器内的 8080 端口映射到主机的 8080 端口。Tomcat 启动后,可以通过浏览器访问 http://localhost:8080 来查看 Tomcat 默认的欢迎页面。3.3. 部署 Web 应用将自己的 WAR 文件部署到 Tomcat 中的 webapps 目录中,方法如下:bashCopy Codedocker cp your-app.war tomcat-container:/usr/local/tomcat/webapps/将 your-app.war 替换为你自己的应用包。重新启动 Tomcat 容器以加载新部署的应用:bashCopy Codedocker restart tomcat-container此时,你的应用可以通过 http://localhost:8080/your-app 来访问。4. 部署 Redis 服务4.1. 拉取 Redis 镜像我们可以使用官方的 Redis 镜像:bashCopy Codedocker pull redis:latest4.2. 启动 Redis 容器启动 Redis 容器并将端口映射到主机:bashCopy Codedocker run --name redis-container -d -p 6379:6379 redis:latest--name redis-container:指定容器名称为 redis-container。-d:后台运行容器。-p 6379:6379:将容器内的 6379 端口映射到主机的 6379 端口。4.3. 连接到 Redis 容器要连接到 Redis 容器,可以使用以下命令:bashCopy Codedocker exec -it redis-container redis-cli5. 测试应用是否正常运行测试 MySQL:可以通过以下命令测试 MySQL 服务是否正常运行:bashCopy Codedocker exec -it mysql-container mysql -uroot -p -e "SHOW DATABASES;" 这会列出当前 MySQL 实例中的所有数据库。测试 Tomcat:通过访问 http://localhost:8080,可以检查 Tomcat 是否成功启动。测试 Redis:可以通过以下命令测试 Redis 是否正常运行:bashCopy Codedocker exec -it redis-container redis-cli ping如果返回 PONG,则表示 Redis 正常运行。6. 总结通过 Docker 容器化技术,我们能够轻松地部署 MySQL、Tomcat 和 Redis 服务。Docker 提供了简单的命令来启动、配置和管理这些服务,使得开发和部署过程更加高效和便捷。通过容器化的方式,你可以确保应用在任何环境中都能保持一致性和可移植性。这种方法对于开发、测试以及生产环境的部署都非常有用,并且可以通过 Docker Compose 进一步简化多个服务的管理。希望这篇文章能帮助你更好地理解如何使用 Docker 部署和管理 MySQL、Tomcat 和 Redis 服务。
  • [技术干货] 修改 Docker 容器的 http_proxy 和 https_proxy -转载
    修改 Docker 容器的 http_proxy 和 https_proxy 可以通过几种方式实现。以下是一些常用的方法:在运行容器时设置环境变量:当你启动一个新的容器时,可以使用 -e 选项设置这些环境变量:docker run -e HTTP_PROXY=http://proxy.example.com:8080 -e HTTPS_PROXY=http://proxy.example.com:8080 your_image1对于已经运行的容器:a. 使用 docker exec 命令:docker exec -it your_container_name /bin/bashexport HTTP_PROXY=http://proxy.example.com:8080export HTTPS_PROXY=http://proxy.example.com:8080123注意,这种方法只在当前会话中有效,容器重启后就会失效。b. 修改容器的 /etc/environment 文件:docker exec -it your_container_name /bin/bashecho "HTTP_PROXY=http://proxy.example.com:8080" >> /etc/environmentecho "HTTPS_PROXY=http://proxy.example.com:8080" >> /etc/environment123这种方法在容器重启后仍然有效。在 Dockerfile 中设置:如果你正在构建自己的镜像,可以在 Dockerfile 中设置这些环境变量:ENV HTTP_PROXY http://proxy.example.com:8080ENV HTTPS_PROXY http://proxy.example.com:808012使用 Docker Compose:如果你使用 Docker Compose,可以在 docker-compose.yml 文件中设置环境变量:version: '3'services:  your_service:    image: your_image    environment:      - HTTP_PROXY=http://proxy.example.com:8080      - HTTPS_PROXY=http://proxy.example.com:8080修改 Docker 守护进程的配置:你可以为 Docker 守护进程设置全局代理,这会影响所有容器。编辑 /etc/systemd/system/docker.service.d/http-proxy.conf 文件(如果不存在就创建它):[Service]Environment="HTTP_PROXY=http://proxy.example.com:8080"Environment="HTTPS_PROXY=http://proxy.example.com:8080"123然后重启 Docker 服务:sudo systemctl daemon-reloadsudo systemctl restart docker12注意事项:确保使用正确的代理地址和端口。某些应用程序可能使用小写的环境变量名(http_proxy, https_proxy),你可能需要同时设置大写和小写版本。如果你的代理需要认证,格式应该是:http://username:password@proxy.example.com:8080————————————————                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                        原文链接:https://blog.csdn.net/jsyzliuyu/article/details/142873507
  • [技术干货] docker 中的 entrypoint.sh
    entrypoint.sh 文件通常用于 Docker 容器中,作为容器启动时执行的默认脚本。这个文件定义了容器启动时需要执行的一系列命令或操作。通过自定义 entrypoint.sh,开发者可以控制容器如何初始化、启动应用程序、设置环境变量等。下面是一些关于 entrypoint.sh 的关键点和用法示例:关键点启动应用程序:entrypoint.sh 中通常会包含启动容器中主要应用程序的命令。环境配置:可以在脚本中设置环境变量,确保应用程序在正确的环境中运行。权限管理:根据需要,脚本中可能包含更改文件或目录权限的命令。前置/后置操作:在启动应用程序之前或之后,可以执行一些前置或后置操作,比如数据库迁移、静态资源编译等。错误处理:添加错误处理逻辑,确保在出现问题时能够正确记录日志或进行其他处理。示例以下是一个简单的 entrypoint.sh 示例,它展示了如何设置环境变量、执行一个前置操作(如数据库迁移),然后启动应用程序:#!/bin/sh # 设置环境变量 export DATABASE_URL="postgres://user:password@db/dbname" # 前置操作:数据库迁移 echo "Running database migrations..." ./manage.py migrate # 启动应用程序 echo "Starting application..." exec gunicorn myapp.wsgi:application --bind 0.0.0.0:8000使用方法创建 entrypoint.sh 文件:在你的项目根目录或 Docker 上下文中创建一个名为 entrypoint.sh 的文件,并将上述脚本内容粘贴进去。修改权限:确保 entrypoint.sh 文件具有可执行权限。你可以使用 chmod +x entrypoint.sh 命令来设置。在 Dockerfile 中引用:在你的 Dockerfile 中,使用 COPY 命令将 entrypoint.sh 文件复制到镜像中,并使用 ENTRYPOINT 指令指定它为容器启动时执行的命令。例如:# ... 其他 Dockerfile 指令 ... COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"] 构建和运行容器:使用 docker build 命令构建镜像,然后使用 docker run 命令启动容器。此时,容器将按照 entrypoint.sh 中定义的逻辑启动和运行。通过自定义 entrypoint.sh,你可以灵活控制 Docker 容器的启动过程,确保应用程序在最佳状态下运行。
  • [问题求助] 开发者空间的ubuntu系统如何安装docker?试了好几种网上的方案,都报错
    开发者空间的ubuntu系统如何安装docker?试了好几种网上的方案,都报错
  • [技术干货] 使用Docker部署postgresql-转载
    使用Docker部署postgresqlpostgresql数据库在Docker中的镜像的名称为postgres,可以从DockerHub中pull下来,如果pull不下来那么很大概率是网络问题导致的,这时候你可能需要在网上找一些能用的镜像源,以成功拉取postgres镜像。有了postgres的镜像之后,你就可以在本地的Docker创建一个postgres的容器并运行。我们有两种方式来创建容器:直接使用命令行来创建postgres的容器并运行;使用docker-compose来创建postgres的容器并运行;这里先介绍使用命令行的方式来创建postgres容器的方式:docker run -d \--name postgres-exprdb \-p 5432:5432 \-e POSTGRES_PASSWORD=123456 \-e POSTGRES_USER=aderversa \-e POSTGRES_DB=testdb \-v ~/postgresql/data:/var/lib/postgresql/data \postgres12345678-e是用来设置postgres容器中环境变量的值的,有些特殊的环境变量将会影响到启动后的postgresql的一些参数,比如postgresql数据库的密码、用户等等。具体一些环境变量的含义可以查看dockerhub中有关于环境变量的介绍,本文的最后也会介绍一些环境变量的含义。-p将PostgreSQL的5432端口暴露到宿主机的5432端口,方便我们在外部访问容器内的PostgreSQL服务。-v将容器内的/var/lib/postgresql/data文件夹挂载到宿主机的~/postgresql/data文件夹下,这样数据库中的数据就不会因为我们删除了容器而丢失。你需要自己定义好这个数据文件夹该挂载到自己主机的什么地方上,这里我给出的值仅做参考。--name postgres-exprdb指定创建的PostgreSQL容器的名字。-d表示该容器在后台运行,并打印创建容器的ID到控制台。postgres是我们所使用的镜像。运行上述命令,使用docker ps查看容器状态:CONTAINER ID   IMAGE      COMMAND                   CREATED         STATUS         PORTS                    NAMESb1f5d4521cd0   postgres   "docker-entrypoint.s…"   8 seconds ago   Up 7 seconds   0.0.0.0:5432->5432/tcp   postgres-exprdb12可以看见,容器已经在后台运行了。之后,我们可以使用别的什么工具去访问已经创建好的testdb数据库,用定义好的特权用户aderversa,以及指定好的密码123456。IP已知,端口已知,用户名和密码都有了,那么你就可以用你能想象到的方式去连接这个PostgreSQL数据库啦。使用docker-compose来部署相比于在命令行中写冗长的命令,我更喜欢将容器的配置写到docker-compose.yaml文件中,然后一行:docker compose -f docker-compose.yaml -p package_name up -d1-f指定要要操作的文件。-p指定项目的名称。up是创建并启动容器的命令。-d表示容器在后台启动。比如,我编写了一个docker-compose.yaml文件:version: "3.8"services:  database_expr:    image: postgres:latest    container_name: postgres-expr    restart: on-failure:3    ports:      - 5432:5432    volumes:      - ./db:/var/lib/postgresql/data    healthcheck:      test: [ "CMD", "pg_isready" ]      interval: 10s      timeout: 5s      retries: 5    environment:      - POSTGRES_PASSWORD=123456      - POSTGRES_USER=aderversa      - POSTGRES_DB=testdb1234567891011121314151617181920直接对其进行操作就可以创建好容器并启动,用户不需要关心里面有什么配置。甚至如果你觉得使用docker compose的命令行来启动不够抽象,那么你可以将它编写入shell脚本中,用户直接运行脚本,只要用户安装了Docker环境,就可以安装PostgreSQL成功,他甚至不需要关心Docker命令应该如何使用。进入postgres容器中执行SQL使用命令:docker ps1查找出刚才创建的PostgreSQL容器的ID:CONTAINER ID   IMAGE             COMMAND                   CREATED        STATUS                  PORTS                    NAMESdcf5e3c0ff7f   postgres:latest   "docker-entrypoint.s…"   13 hours ago   Up 13 hours (healthy)   0.0.0.0:5432->5432/tcp   postgres-expr12获得container_id = dcf5e3c0ff7f,接着我们使用以下命令进入容器的bash中,方便在操作容器:docker exec -it dcf5e3c0ff7f /bin/bash1注意,如果是在Windows下执行这条命令的时候,使用Git Bash来执行可能会因为终端的一些问题执行失败,此时需要更换一下执行命令的终端,比如:PowerShell。进入到容器中是这个样子的:> docker exec -it dcf5e3c0ff7f /bin/bashroot@dcf5e3c0ff7f:/# 12第一行是在PowerShell中执行的,而第二行则是PostgreSQL容器中运行的bash进程。接着我们就可以使用:psql [OPTION]... [DBNAME [USERNAME]]1这里介绍连接数据库需要使用的OPTION选项,具体的你可以使用psql --help来查看:-h指定PostgreSQL数据库的IP地址。-p指定PostgreSQL数据库的端口号。-U指定登录到数据库的用户名,不指定默认就是root。-w从不提示输入密码,字面意思,不需要输入密码来进行访问数据库,默认是不需要输入密码的。-W强制密码输入。按照这个用法,我们可以用以下两种方式连接数据库:# 这里由于我们在创建容器的时候指定的特权用户是aderversa,因此root被挤占掉了# 用户名对于我这里来说是必须设置的。psql -p 127.0.0.1 -p 5432 -U aderversa testdb 123或者省事一点,直接使用:psql testdb aderversa1执行成功后我们就能够进入psql的命令行:psql (17.2 (Debian 17.2-1.pgdg120+1))Type "help" for help.testdb=#1234psql的使用这里我们并不知道如何使用这个命令行,它提示我们可以使用help来获得帮助,那么就执行一波help,得到了以下信息:You are using psql, the command-line interface to PostgreSQL.Type:  \copyright for distribution terms       \h for help with SQL commands       \? for help with psql commands       \g or terminate with semicolon to execute query       \q to quit123456这里它告诉我们:\copyright,可以PostgreSQL DDMS的一些条款,里面大概是说:不管你出于何种目的,该软件和其文档都是允许你使用、复制、修改和发布的,并且是不需要任何费用,不需要修改的同意…看起来是非常宽松的声明,毕竟PostgreSQL遵循的是BSD协议。\h显示SQL命令,比如CREATE TABLE ALTER TABLE…。\?显示psql的命令,这里面还是非常多命令的,大多都是用来查看数据库的状态的,比如存在什么表、数据库、视图之类的。这里介绍一些常用的、简单的命令:\l,列出所有数据库;\c[onnect],连接到数据库某个数据库,如果先前有连接到某个数据库那么这个操作就是更换连接的数据库;\dt,查看正在使用的数据库中存在哪些表(注意,默认创建的表似乎是不会列出来的);\g执行psql的上一个命令。\q退出psql。以上就是psql的基本用法了,你可以按照自己的在上面执行SQL语句,比如:create table user ( id int primary key );1注意SQL命令以;结尾就可以了。创建完成后可以使用:\dt1来查看你是否创建成功。接下来就是你发挥创造力的时候了,自己尝试着使用psql吧。补充postgres容器的环境变量POSTGRES_PASSWORD,必要的环境变量。这个环境变量将设置PostgreSQL容器中特权用户的密码。如果你要使用PostgreSQL镜像,让它以容器的形式的运行,那么这个环境变量就必须要设置,它一定不能够为空或者未定义。默认的特权用户将由POSTGRES_USER来定义。POSTGRES_USER,可选的环境变量。设置PostgreSQL容器中的特权用户名,需要与POSTGRES_PASSWORD一起使用,以此设置好特权用户的名字和密码。如果该环境变量未被指定,那么默认的特权用户名为postgres。POSTGRES_DB,可选的环境变量。定义容器首次运行创建的默认数据库的名字。如果该环境变量未被使用,那么该环境变量的值等于POSTGRES_USER的值。POSTGRES_INITDB_ARGS,可选的环境变量。大概最终是以这种方式被利用:postgres initdb ${POSTGRES_INITDB_ARGS}。POSTGRES_INITDB_WALDIR,可选的环境变量。定义PostgreSQL事务日志的位置。默认的事务日志的位置是PostgreSQL主数据文件夹(PGDATA指定)下的一个子文件夹。POSTGRES_HOST_AUTH_METHOD,可选的环境变量。(个人理解,似乎是与密码摘要相关的东西,这一般不需要我们关注,如果有兴趣可以去PostgreSQL: Documentation: 14: 21.5. Password Authentication了解一下)。PGDATA,可选的环境变量。定义PostgreSQL主数据文件夹的位置,默认是/var/lib/postgresql/data,如果有调整位置的需求那么可以按需求设置该变量的值。————————————————                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                        原文链接:https://blog.csdn.net/A_zyx0808/article/details/144519236
  • [AI Gallery] 编写PyTorch-Ascend的dockerfile时需要注意哪些事项
    我想使用Ascend资源搭建一个支持 PyTorch-Ascend 的Notebook环境,将 A800上训练的模型直接部署在昇腾计算卡上,期望在 Ubuntu 20.04 LTS上 使用 PyTorch 2.4.0 + CANN >= 8.0.RC3 (参考昇腾辅助软件)。目前现有的公有云镜像中CANN的版本为 8.0.RC2,不太能满足我的需求。我在阅读 在Notebook中通过Dockerfile从0制作自定义镜像 和 从0制作自定义镜像用于创建训练作业(Pytorch+Ascend) 、编写Dockerfile时遇到以下问题:我没有获得 CANN商业版 的资格,无法下载,能直接使用 CANN 社区版吗?是否需要安装NPU驱动?如何确保在使用自定义镜像时能正确识别到Ascend资源?以及想请问是否有相关的帖子或开源dockerfile可供参考?
  • [问题求助] 使用eciot-ova脚本制作LXC容器运行build_sdk_base.sh报错
    使用eciot-ova脚本制作LXC容器运行build_sdk_base.sh报错Step 1/10 : FROM debian:busterGet "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
  • [问题求助] 流水线构建报错,pip源怎么修改?
    [2024/11/05 16:58:39.301 GMT+08:00] abc3a19a1358: Verifying Checksum[2024/11/05 16:58:39.301 GMT+08:00] abc3a19a1358: Download complete[2024/11/05 16:58:42.790 GMT+08:00] abc3a19a1358: Pull complete[2024/11/05 16:58:45.368 GMT+08:00] 5046bd3dbdb4: Pull complete[2024/11/05 16:58:45.368 GMT+08:00] Digest: sha256:49abd03aa63ce2e929564d858e18830eee7e577f3313d39b5cd91be763b3a3b6[2024/11/05 16:58:45.368 GMT+08:00] Status: Downloaded newer image for************[2024/11/05 16:58:49.694 GMT+08:00] + pip config set global.index-url http://mirrors.tools.huawei.com/pypi/simple[2024/11/05 16:58:49.699 GMT+08:00] starting check in ***/@tmp/durable-2c6c6cbc[2024/11/05 16:58:49.954 GMT+08:00] Writing to /home/build/.config/pip/pip.conf[2024/11/05 16:58:50.225 GMT+08:00] + pip config set global.trusted-host mirrors.tools.huawei.com[2024/11/05 16:58:50.510 GMT+08:00] Writing to /home/build/.config/pip/pip.conf[2024/11/05 16:58:50.510 GMT+08:00] + pip install -r requirements.txt --target=target[2024/11/05 16:58:51.089 GMT+08:00] Looking in indexes: http://mirrors.tools.huawei.com/pypi/simple[2024/11/05 16:58:51.089 GMT+08:00] WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.HTTPConnection object at 0x7f9de550abe0>: Failed to establish a new connection: [Errno -2] Name or service not known',)': /pypi/simple/requests/[2024/11/05 16:58:51.660 GMT+08:00] WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.HTTPConnection object at 0x7f9de550a9e8>: Failed to establish a new connection: [Errno -2] Name or service not known',)': /pypi/simple/requests/[2024/11/05 16:58:52.634 GMT+08:00] WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.HTTPConnection object at 0x7f9de54aa5f8>: Failed to establish a new connection: [Errno -2] Name or service not known',)': /pypi/simple/requests/[2024/11/05 16:58:54.772 GMT+08:00] WARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.HTTPConnection object at 0x7f9de54aa7f0>: Failed to establish a new connection: [Errno -2] Name or service not known',)': /pypi/simple/requests/[2024/11/05 16:58:58.990 GMT+08:00] WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.HTTPConnection object at 0x7f9de54aa9e8>: Failed to establish a new connection: [Errno -2] Name or service not known',)': /pypi/simple/requests/[2024/11/05 16:58:58.990 GMT+08:00] ERROR: Could not find a version that satisfies the requirement requests (from versions: none)[2024/11/05 16:58:58.990 GMT+08:00] ERROR: No matching distribution found for requests[2024/11/05 16:58:59.008 GMT+08:00] [ERROR]  : script returned exit code 1, exitMessage is: command run failed[2024/11/05 16:59:00.601 GMT+08:00] dockerindocker18.09-1.3.3: Pulling from *****构建过程中,用的docker自动构建容器,指定requirements.txt,代码一直找http://mirrors.tools.huawei.com/pypi/simple下载requests模块,里边没有requests,封装就一直过不去...把模块一起上传可以正常封装,这个pip源的问题怎么解决?折腾了好几天,难道只能连模块一起上传么?
  • [技术干货] docker 配置国内镜像源
    1 安装docker desktop 配置镜像源2 国内镜像源"registry-mirrors": [ "https://ccr.ccs.tencentyun.com", "https://docker.rainbond.cc", "https://elastic.m.daocloud.io", "https://elastic.m.daocloud.io", "https://docker.m.daocloud.io", "https://gcr.m.daocloud.io", "https://ghcr.m.daocloud.io", "https://k8s-gcr.m.daocloud.io", "https://k8s.m.daocloud.io", "https://mcr.m.daocloud.io", "https://nvcr.m.daocloud.io", "https://quay.m.daocloud.io" ]
  • [问题求助] 华为云容器镜像docker登陆后push时仍然提示未登录 denied: You may not login yet 
    华为云容器镜像docker登陆后push时仍然提示未登录 docker login -u cn-north-4@XXXXXXXXXX-p XXXXXXXXXXXX swr.cn-north-4.myhuaweicloud.com WARNING! Using --password via the CLI is insecure. Use --password-stdin. WARNING! Your password will be stored unencrypted in /home/crf/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credential-stores  Login Succeeded  sudo docker push swr.cn-north-4.myhuaweicloud.com/crf/mynginx:1.0 The push refers to repository [swr.cn-north-4.myhuaweicloud.com/xxxx/mynginx] 825fb68b6033: Preparing  7619c0ba3c92: Preparing  1c1f11fd65d6: Preparing  6b133b4de5e6: Preparing  3d07a4a7eb2a: Preparing  756474215d29: Waiting  8d853c8add5d: Waiting  denied: You may not login yet 
  • [技术干货] Docker Overlay2磁盘空间占满-转载
     前言 在日常生产环境中,我们通常会使用Docker来做容器化管理,通过运行容器来执行任务。但是,随着业务量的不断扩大,容器的不断启动,往往会出现磁盘空间不足的情况。  1、查看当前磁盘使用情况         df -h  其中Use%过大的目录需要排查 2、进入目录,查看当前目录下的文件大小         du -sh *  发现containers目录、overlayer2目录、volumes目录占用空间比较大 containers目录 进入某个容器目录,发现里面是Docker的日志文件  查看同级目录下的所有-json.log du -ha /home/docker/containers/ | grep "json.log" | sort -rh volumes目录         进入volumes目录中,查看大小         du -sh * 进入某个volume,查看其中内容,发现是数据卷内容,可以看情况清理 overlayer2目录 查看其中目录占用空间大小 发现其中部分目录占用空间较大,进入里面看看都由哪些东西 merged 和 diff 占磁盘空间比较大,work 目录可以不用管。 这两个文件夹内容开始是一样的 ,merged会多一些由容器本身产出的写文件,进merged继续往下找 进入./csp目录,发现其中有很多的日志文件  我这里是sentinel的日志,个人项目视情况是否删除,或者通过配置限制文件个数和大小。  3、解决方法 1、docker 镜像占用磁盘 Docker 中查询磁盘占用情况命令: docker system df   可通过执行docker system prune 命令可用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像) 【慎用】 docker system prune -a 命令清理更干净、彻底,可以将没有容器使用的Docker镜像都删掉。  2、containers目录 Docker 容器的日志文件可能会增长并占用大量的磁盘空间。可以检查并删除不再需要的容器日志文件。  (1)临时方案:这个命令将删除 /home/docker/containers/ 目录下的容器日志文件。  sudo find /home/docker/containers/ -name "*-json.log" -type f -delete  (2)稳定方案:设置容器服务的日志大小上线  方式一:每个容器都可以单独设置  logging:   driver: "json-file"   options:     max-size: "256m"     max-file: "3"     方式二:全局设置   方式三:contab定时执行清理脚本  echo "======== start clean docker containers logs ========" logs=$(find /home/docker/containers/ -name *-json.log) for log in $logs         do                 echo "clean containers logs : $log"                 cat /dev/null > $log         done echo "======== end clean docker containers logs ========"    3、volumes目录   可通过命令删除  find /var/lib/docker/volumes -type f -name "*.log" -delete  3、overlayer2目录 通过排查overlayer2下merged目录中的占用空间较大的目录排查是否需要删除 ————————————————                              版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                          原文链接:https://blog.csdn.net/weixin_44012070/article/details/139067735 
  • [技术干货] 在k8s中部署Elasticsearch高可用集群详细教程 -转载
     一、引言 1、Elasticsearch简介 Elasticsearch是一个开源的、基于Lucene的分布式搜索和分析引擎,设计用于云计算环境中,能够实现实时的、可扩展的搜索、分析和探索全文和结构化数据。  1. 核心特性:  分布式:Elasticsearch是分布式的,可以在多个服务器上运行,并且能够自动将数据在服务器之间进行负载均衡。 可扩展性:Elasticsearch提供了可扩展的架构,无论是存储、节点还是查询吞吐量,都可以随着业务需求的变化而增加资源。它可以扩展到上百台服务器,处理PB级别的数据。 实时性:Elasticsearch能够实时地处理数据,提供了近实时的搜索和分析功能。 全文检索:Elasticsearch提供了全文检索功能,支持对大量数据进行复杂的搜索和分析。 分析性:Elasticsearch提供了强大的分析功能,包括聚合、统计和排序等。 多租户能力:Elasticsearch可以配置为多租户环境,允许不同的用户和应用共享相同的集群资源。 监控和警报:Elasticsearch提供了内置的监控和警报功能,使得用户可以实时了解系统的运行状态,并在出现异常时得到通知。    2. 数据支持:  Elasticsearch为所有类型的数据提供近乎实时的搜索和分析。无论您拥有结构化或非结构化文本、数字数据还是地理空间数据,Elasticsearch都能以支持快速搜索的方式高效地存储和索引它。  3. 技术实现:  Elasticsearch使用Java开发,并基于Lucene作为其核心来实现所有索引和搜索的功能。但其目的是通过简单的RESTful API来隐藏Lucene的复杂性,通过面向文档从而让全文搜索变得简单。 Elasticsearch支持多种数据类型,包括字符串、数字、日期等。 Elasticsearch的水平可扩展性允许通过增加节点来扩展其处理能力。 在硬件故障或节点故障的情况下,Elasticsearch具有容错能力,能够保持数据的完整性和服务的可用性。  4. 应用场景:  Elasticsearch在众多场景下都有广泛的应用,如企业搜索、日志和事件数据分析、安全监控等。  5. 集成方案:  Elasticsearch与名为Logstash的数据收集和日志解析引擎以及名为Kibana的分析和可视化平台一起开发的。这三个产品被设计成一个集成解决方案,称为“Elastic Stack”(以前称为“ELK stack”)。     2、为什么在k8s中部署elasticsearch 1. 自动化和编排  自动化部署和管理:  Kubernetes 提供了自动化的部署、扩展和管理功能,可以简化 Elasticsearch 集群的配置、启动和监控。 自愈能力:  Kubernetes 能够自动检测并重新调度失败的 Pod,确保 Elasticsearch 集群的高可用性和稳定性。  2. 可扩展性  水平扩展:  Elasticsearch 的节点可以在 Kubernetes 中水平扩展,通过增加或减少节点数目来应对数据量和查询量的变化。 弹性资源分配:  Kubernetes 允许为不同的 Elasticsearch 节点(如数据节点、主节点、协调节点)分配不同的资源配额,确保资源的合理利用和优化。  3. 高可用性  多副本管理:  Kubernetes 能够通过其副本控制器和 StatefulSets 管理 Elasticsearch 的数据副本和分片,确保在节点失败时数据不会丢失,并且服务能迅速恢复。 跨可用区分布:  Kubernetes 可以将 Elasticsearch 节点分布在不同的可用区(Availability Zones),提高容灾能力。  4. 容器化优势  一致的环境:  使用容器化的 Elasticsearch 可以确保在开发、测试和生产环境中运行的一致性,减少环境差异带来的问题。 依赖管理:  容器化可以简化依赖管理,确保 Elasticsearch 及其依赖组件能够在独立的环境中运行,不会相互干扰。 二、k8s基础 1、k8s简介 K8s,全称Kubernetes,是一个开源的容器编排系统,旨在自动化容器化应用程序的部署、扩展和管理。 1. 定义与概念: K8s是一个用于管理容器的开源平台,允许用户方便地部署、扩展和管理容器化应用程序。 它通过自动化的方式实现负载均衡、服务发现和自动弹性伸缩等功能。 Kubernetes将应用程序打包成容器,并将这些容器部署到一个集群中,自动处理容器的生命周期管理、自动扩容等操作。 2. 主要特点: 自动化管理:自动化管理容器应用程序的部署、扩展、运维等一系列操作,减少了人工干预,提高了效率。 弹性伸缩:根据应用负载情况自动进行扩容或缩容,保证应用的性能和稳定性。 高可用性:当某个节点故障时,K8s会自动将应用迁移至其他健康节点,保证应用的正常运行。 自愈能力:能够监测应用状态并进行自动修复,如自动重启或迁移故障应用。  3. 架构与组件: K8s集群由多个节点(Node)组成,包括Master节点和Worker节点。 Master节点作为整个集群的控制中心,负责集群的管理和调度工作,包括API服务器、调度器、控制器管理器等核心组件。 Worker节点是集群的工作节点,负责运行Pod(容器组)并提供应用程序的运行环境。 2、Pods、Services、StatefulSet等基本概念 2.1 Pods Pods 是Kubernetes中最小的可部署计算单元。一个Pod可以包含一个或多个容器,这些容器共享网络命名空间和存储资源,并总是共同调度在同一个节点上。  单容器Pod: 最常见的情况,一个Pod包含一个容器。 多容器Pod: 包含多个需要紧密协作的容器,例如共享存储或网络的协同进程。 特点:  共享相同的存储卷和网络命名空间。 作为一个整体被调度到同一个节点上。 2.2 Services Services 是一种抽象,它定义了一组逻辑上相同的Pods,并且提供一个稳定的访问入口(IP地址和端口)。Services实现了负载均衡,并且允许Pod进行自动发现和通信。 类型: ClusterIP: 默认类型,仅在集群内部可访问。 NodePort: 在每个节点上开放一个静态端口,使得服务可以通过<NodeIP>:<NodePort>访问。 LoadBalancer: 使用云提供商的负载均衡器,公开服务到外部网络。 ExternalName: 将服务映射到外部名称,比如DNS名称。 功能: 提供Pod的负载均衡。 稳定的网络接口,不会因为Pod的创建和销毁而变化。 2.3 StatefulSets  StatefulSets 专门用于管理有状态应用,确保Pod有固定的标识符和稳定的存储。适用于数据库、分布式文件系统等需要持久化存储的应用。 特点: 稳定的网络标识: 每个Pod有一个固定的DNS名,例如pod-0.service.namespace.svc.cluster.local。 有序部署和更新: Pod按顺序进行创建、删除和更新(例如从pod-0到pod-N)。 稳定的存储: 每个Pod可以有一个独立的PersistentVolume,与Pod的生命周期无关。 三、Elasticsearch集群架构 1、Elasticsearch集群的组成 一Elasticsearch集群主要由以下几个部分组成: 1. 节点(Node): 节点是Elasticsearch集群中的一个单独运行实例,每个节点都存储数据并参与集群的索引和搜索功能。 2. 主节点(Master Node): 负责集群范围内的管理任务,如创建或删除索引、跟踪集群中各个节点的状态,并选择主分片和副本分片的位置。 一个集群中只有一个主节点是活动的,但可以配置多个候选主节点以提高容错性。 3. 数据节点(Data Node): 负责存储数据和处理CRUD(创建、读取、更新、删除)操作以及搜索请求。数据节点需要较多的内存和存储资源。 4. 协调节点(Coordinating Node): 处理来自客户端的请求,将请求分发到合适的数据节点,并汇总结果后返回给客户端。 任何节点都可以作为协调节点,但可以专门配置一些节点只作为协调节点。 5. 主节点候选节点(Master-Eligible Node): 可以被选举为主节点的节点。通常,集群会配置多个候选主节点,以防止单点故障。 6. 专用节点(Dedicated Node): 可以配置专门的节点来处理特定任务,如专用的主节点、数据节点或协调节点,以优化集群性能。 2、Elasticsearch工作原理 1. 索引和分片(Shards): 数据在存储时被划分为多个分片。每个索引(类似于关系数据库中的表)可以被分成一个或多个主分片(Primary Shard),每个主分片可以有多个副本分片(Replica Shard)。 主分片负责处理数据写入,副本分片用于数据冗余和读取操作,以提高查询性能和数据安全性。 2. 数据分布:  Elasticsearch使用一致性哈希算法将分片分布到集群中的各个节点上。主节点负责跟踪分片的位置,并在节点故障时重新分配分片。 3. 查询和搜索: 当客户端发送查询请求时,协调节点会解析请求并将其分发到相关的分片上。每个分片在本地执行查询,并返回结果给协调节点,协调节点汇总结果后返回给客户端。 查询可以并行执行,从而提高性能。  4. 数据写入:  当客户端发送数据写入请求时,协调节点将数据发送到相关的主分片。主分片处理写入后,将数据同步到所有副本分片。确保所有副本分片都成功写入数据后,协调节点才会向客户端确认写入成功。 3、集群高可用设计 本次部署的elasticsearch设计为5节点,一主多从的高可用方式,如果一个主节点意外宕掉,其他节点自主选举出新的Master节点接管任务,从而保证集群的高可用性 四、部署环境准备 1、准备k8s集群 这里我们使用的k8s集群版本为 1.23,也可以使用其他的版本,只是镜像导入命令不通,如果还未搭建k8s集群,请参考《在Centos中搭建 K8s 1.23 集群超详细讲解》这篇文章 2、准备StorageClass  因为我们要对Elasticsearch中的数据进行持久化,避免Pod漂移后数据丢失,保证数据的完整性与可用性 如果还未创建存储类,请参考《k8s 存储类(StorageClass)创建与动态生成PV解析,(附带镜像)》这篇文件。 五、部署Elasticsearch集群  1、编写部署Elasticsearch的YAML文件 apiVersion: v1 kind: Namespace metadata:   name: es --- #创建ConfigMap用于挂载配置文件 apiVersion: v1 kind: ConfigMap metadata:   name: sirc-elasticsearch-config   namespace: es   labels:     app: elasticsearch data:             #具体挂载的配置文件   elasticsearch.yml: |+          cluster.name: "es-cluster"     network.host: 0.0.0.0     http.cors.enabled: true     http.cors.allow-origin: "*"     http.cors.allow-headers: "*"     bootstrap.system_call_filter: false     xpack.security.enabled: false     index.number_of_shards: 5     index.number_of_replicas: 1 #创建StatefulSet,ES属于数据库类型的应用,此类应用适合StatefulSet类型 --- apiVersion: apps/v1 kind: StatefulSet metadata:   name: elasticsearch   namespace: es spec:   serviceName: "elasticsearch-cluster"   #填写无头服务的名称   replicas: 5   selector:      matchLabels:        app: elasticsearch   template:     metadata:       labels:         app: elasticsearch     spec:       initContainers:       - name: fix-permissions         image: busybox         imagePullPolicy: IfNotPresent         command: ["sh", "-c", "chown -R 1000:1000 /usr/share/elasticsearch/data"]         securityContext:           privileged: true         volumeMounts:         - name: es-data           mountPath: /usr/share/elasticsearch/data       - name: increase-vm-max-map         image: busybox         imagePullPolicy: IfNotPresent         command: ["sysctl", "-w", "vm.max_map_count=262144"]         securityContext:           privileged: true       - name: increase-fd-ulimit         image: busybox         imagePullPolicy: IfNotPresent         command: ["sh", "-c", "ulimit -n 65536"]         securityContext:           privileged: true       containers:       - name: elasticsearch         image: elasticsearch:7.17.18         imagePullPolicy: Never         resources:           requests:             memory: "1000Mi"             cpu: "1000m"           limits:             memory: "2000Mi"             cpu: "2000m"         ports:         - containerPort: 9200           name: elasticsearch         env:         - name: node.name           valueFrom:             fieldRef:               fieldPath: metadata.name  #metadata.name获取自己pod名称添加到变量MY_POD_NAME,status.hostIP获取自己ip等等可以自己去百度         - name: discovery.type           value: zen         - name: cluster.name           value: elasticsearch         - name: cluster.initial_master_nodes           value: "elasticsearch-0,elasticsearch-1,elasticsearch-2,elasticsearch-3,elasticsearch-4"         - name: discovery.zen.minimum_master_nodes           value: "3"         - name: discovery.seed_hosts           value: "elasticsearch-0.elasticsearch-cluster.es,elasticsearch-1.elasticsearch-cluster.es,elasticsearch-2.elasticsearch-cluster.es,elasticsearch-3.elasticsearch-cluster.es,elasticsearch-4.elasticsearch-cluster.es"         - name: network.host           value: "0.0.0.0"         - name: "http.cors.allow-origin"           value: "*"         - name: "http.cors.enabled"           value: "true"         - name: "number_of_shards"           value: "5"         - name: "number_of_replicas"           value: "1"         - name: path.data           value:  /usr/share/elasticsearch/data         volumeMounts:                                      - name: es-data                  #挂载数据             mountPath: /usr/share/elasticsearch/data        volumes:       - name: elasticsearch-config         configMap:                                #configMap挂载           name: sirc-elasticsearch-config   volumeClaimTemplates:                     #这步自动创建pvc,并挂载动态pv     - metadata:         name: es-data       spec:         accessModes: ["ReadWriteMany"]         storageClassName: nfs         resources:           requests:             storage: 10Gi #创建Service --- apiVersion: v1 kind: Service metadata:   name: elasticsearch-cluster  #无头服务的名称,需要通过这个获取ip,与主机的对应关系   namespace: es   labels:     app: elasticsearch spec:   ports:     - port: 9200       name: elasticsearch   clusterIP: None   selector:     app: elasticsearch   --- apiVersion: v1 kind: Service metadata:   name: elasticsearch   #service服务的名称,向外暴露端口   namespace: es   labels:     app: elasticsearch spec:   ports:     - port: 9200       name: elasticsearch   type: NodePort   selector:     app: elasticsearch --- apiVersion: v1 kind: Service metadata:   name: my-nodeport-service-0   namespace: es spec:   type: NodePort   selector:     statefulset.kubernetes.io/pod-name: elasticsearch-0   ports:     - protocol: TCP       port: 80        # Service 暴露的端口       targetPort: 9200   # Pod 中容器的端口       nodePort: 30000    # NodePort 类型的端口范围为 30000-32767,可以根据需要调整 --- apiVersion: v1 kind: Service metadata:   name: my-nodeport-service-1   namespace: es spec:   type: NodePort   selector:     statefulset.kubernetes.io/pod-name: elasticsearch-1   ports:     - protocol: TCP       port: 80        # Service 暴露的端口       targetPort: 9200   # Pod 中容器的端口       nodePort: 30001    # NodePort 类型的端口范围为 30000-32767,可以根据需要调整 --- apiVersion: v1 kind: Service metadata:   name: my-nodeport-service-2   namespace: es spec:   type: NodePort   selector:     statefulset.kubernetes.io/pod-name: elasticsearch-2   ports:     - protocol: TCP       port: 80        # Service 暴露的端口       targetPort: 9200   # Pod 中容器的端口       nodePort: 30002    # NodePort 类型的端口范围为 30000-32767,可以根据需要调整 --- apiVersion: v1 kind: Service metadata:   name: my-nodeport-service-3   namespace: es spec:   type: NodePort   selector:     statefulset.kubernetes.io/pod-name: elasticsearch-3   ports:     - protocol: TCP       port: 80        # Service 暴露的端口       targetPort: 9200   # Pod 中容器的端口       nodePort: 30003    # NodePort 类型的端口范围为 30000-32767,可以根据需要调整 --- apiVersion: v1 kind: Service metadata:   name: my-nodeport-service-4   namespace: es spec:   type: NodePort   selector:     statefulset.kubernetes.io/pod-name: elasticsearch-4   ports:     - protocol: TCP       port: 80        # Service 暴露的端口       targetPort: 9200   # Pod 中容器的端口       nodePort: 30004    # NodePort 类型的端口范围为 30000-32767,可以根据需要调整 --- apiVersion: apps/v1 kind: Deployment metadata:   name: elasticsearchhead   namespace: es spec:   replicas: 1   selector:     matchLabels:       app: elasticsearchhead   template:     metadata:       labels:         app: elasticsearchhead     spec:       containers:       - name: elasticsearchhead         image: mobz/elasticsearch-head:5         ports:         - containerPort: 9100 --- apiVersion: v1 kind: Service metadata:   name: elasticsearchhead-service   namespace: es spec:   type: NodePort   ports:   - port: 9100     targetPort: 9100     nodePort: 30910  # 可根据需要选择合适的端口号   selector:     app: elasticsearchhead  上述Kubernetes配置文件定义了Elasticsearch集群的部署,使用StatefulSet来管理其有状态的Pod。  配置说明  1. 命名空间 (Namespace)  创建一个命名空间es,用于组织和隔离Elasticsearch资源。 2. ConfigMap  创建一个ConfigMap,用于存储Elasticsearch的配置文件elasticsearch.yml。 3. StatefulSet  StatefulSet 用于部署和管理有状态应用。 包含5个副本(replicas),每个副本都有唯一的标识符(如elasticsearch-0)。 使用初始化容器(initContainers)来处理权限、系统参数和文件描述符的设置。 定义了主容器elasticsearch,并指定了环境变量、资源请求和限制,以及挂载数据卷。 4. Services  创建了一个无头服务elasticsearch-cluster,用于Pod之间的内部通信。 创建了一个NodePort服务elasticsearch,暴露9200端口到集群外部。 为每个StatefulSet的Pod创建单独的NodePort服务,分别暴露在不同的端口(30000-30004),用于直接访问特定的Pod。 5. Elasticsearch Head 部署和服务  部署Elasticsearch Head插件,用于图形化管理和浏览Elasticsearch集群。 暴露Elasticsearch Head的9100端口,使用NodePort类型服务,端口号为30910。 2、部署 Elasticsearch 执行下面的命令  kubectl get pod -n es 3、查看Pod状态 执行下面的命令 kubectl get svc -n es 4、访问测试  查看svc的nodeport端口  在浏览器输入Node的IP加30910端口  在连接窗口输入 Node的IP加30001端口,点击连接  如果能显示下面的结果,则集群部署成功    💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于Elasticsearch的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺  🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!  ————————————————                              版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                          原文链接:https://blog.csdn.net/weixin_53269650/article/details/139632433