阿里云ECS

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
云服务器 ECS,每月免费额度200元 3个月
简介: docker部署ES集群

我是来自南京的一所高校大三本科在读,是通过老师的推荐与介绍了解到飞天加速计划的,在南京某公司实习期间,看到了公司所搭建的ES集群,想要使用阿里云服务器自己亲自动手尝试一下

在云服务器使用时,我选装的是centos7.9系统,在部署搭建ES集群时,也踩了很多坑。使用Docker容器技术,虚拟三个节点,以下是我搭建时所学习记录的笔记,同时也发布在CSDN,和阿里开发社区。

Docker安装

# 删除历史docker相关包及配置

sudo yum remove docker \

               docker-client \

               docker-client-latest \

               docker-common \

               docker-latest \

               docker-latest-logrotate \

               docker-logrotate \

               docker-engine

# 安装所需要安装的包

sudo yum install -y yum-utils

# 配置镜像仓库

sudo yum-config-manager \

  --add-repo \

 http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 更新yum软件包索引

yum makecache fast

# 安装Docker相关

sudo yum install docker-ce docker-ce-cli containerd.io

# 启动Docker

systemctl start docker

# 检查是否安装成功

docker version

# 测试hello-world程序

docker run hello-world

# 查看当前下载的hello-world 镜像

[root@iZuf68bhooanbyuniyoqm0Z ~]# docker images

REPOSITORY   TAG       IMAGE ID       CREATED       SIZE

hello-world   latest   feb5d9fea6a5   4 months ago   13.3kB

# 卸载docker

# 卸载依赖

sudo yum remove docker-ce docker-ce-cli containerd.io

# 删除资源

sudorm-rf /var/lib/docker

$ sudorm-rf /var/lib/containerd

Docker常用命令

docker --help

# 镜像

docker image COMMAND

# Commands:

 build       构建镜像

 history     查看镜像构建历史

 import     Import the contents from a tarball to create a filesystem image

 inspect     洞察:查看详情

 load       导入

  ls         List images

 prune       移除未使用的

 pull       从仓库拉取

 push       推送到仓库

  rm         Remove one or more images

 save       导出

 tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE

# 导出镜像为文件

docker image save hello-world -o hello.img

# 导入镜像

docker image load -i hello.img

# 网络

docker network --help

# 环境部署的三个时代

# 同一个服务器部署多个网站,一个被入侵,全体都挂

#同一个服务器安装多个虚拟机,虚拟机里部署网站(实现隔离)

#同一个服务器,多个容器(默认隔离)

Usage: docker network COMMAND

Manage networks

Commands:

connect     Connect a container to a network

create     Create a network

disconnect Disconnect a container from a network

inspect     Display detailed information on one or more networks

ls         List networks

prune       Remove all unused networks

rm         Remove one or more networks

# 文件存储 (volume)

# 卷(volume)是Docker持久化工具,文件存储

Usage: docker volume COMMAND

Manage volumes

Commands:

create     Create a volume

inspect     Display detailed information on one or more volumes

ls         List volumes

prune       Remove all unused local volumes

rm         Remove one or more volumes

# 容器(*)

Usage: docker container COMMAND

Manage containers

Commands:

attach     Attach local standard input, output, and error streams to a running container

commit     Create a new image from a container's changes

cp         Copy files/folders between a container and the local filesystem

create     Create a new container

diff       Inspect changes to files or directories on a container's filesystem

exec       Run a command in a running container

export     Export a container's filesystem as a tar archive

inspect     Display detailed information on one or more containers

kill       Kill one or more running containers

logs       Fetch the logs of a container

ls         List containers

pause       Pause all processes within one or more containers

port       List port mappings or a specific mapping for the container

prune       Remove all stopped containers

rename     Rename a container

restart     Restart one or more containers

rm         Remove one or more containers

run         Run a command in a new container

start       Start one or more stopped containers

stats       Display a live stream of container(s) resource usage statistics

stop       Stop one or more running containers

top         Display the running processes of a container

unpause     Unpause all processes within one or more containers

update     Update configuration of one or more containers

wait       Block until one or more containers stop, then print their exit code

 

# run命令重点参数

docker run [参数] [镜像名称] bash

--name my_name # 指定容器名称

--rm# 结束自动删除

--net my_net # 指定容器加入的网络

--volume${PWD}:/tmp # 把当前目录挂载到容器中

-it# 进入容器内部,挂载终端

-d# 以守护进程运行

-p# 端口映射

Docker compose

# 用于定义和运行多容器的docker工具

# 可以使用yaml配置程序和服务

# 使用单个命令,创建并启动所有的服务

# 安装docker——compose

# ubuntun安装

sudo apt install docker-compose

# centos安装

# 1、下载docker-compose

curl-L"https://get.daocloud.io/docker/compose/releases/download/1.27.3/docker-compose-$(uname -s)-$(uname -m)"-o/usr/local/bin/docker-compose

# 2、加上可执行权限:

chmod+x /usr/local/bin/docker-compose

# 3、查看docker-compose版本

docker-compose --version

# docker-compose命令

# Commands:

 build             Build or rebuild services(构建)

 config             Validate and view the Compose file

 create             Create services

 down               Stop and remove containers, networks, images, and volumes

 events             Receive real time events from containers

 exec               Execute a command in a running container

 help               Get help on a command

 images             List images

  kill               Kill containers

 logs               View output from containers

 pause             Pause services

 port               Print the public port for a port binding

  ps                 List containers

 pull               Pull service images

 push               Push service images

  restart           Restart services

  rm                 Remove stopped containers

 run               Run a one-off command

 scale             Set number of containers for a service

  start             Start services

  stop               Stop services

  top               Display the running processes

 unpause           Unpause services

 up                 Create and start containers

 version           Show version information and quit

# 配合docker-compose.yaml文件

# docker-compose内容结构

# dockerfile一定以from开头(指令建议大写)

# 例子

version: '3.7'  # 指定docker-compose版本

services:

postgres:     # 服务名称

 image: ''  # 指定镜像

 container_name: ''# 容器名称,非必填

 restart: always # 启动方式

 networks:

   - postgresql # 指定网络

 ports:

   - 5432:5432

 environment: # 环境命令 **重点

   TZ: Asia/Shanghai

   POSTGRES_USER: postgres

   POSTGRES_PASSWORD: postgres_pass

 

 volumes:

   - ./data:/var/lib/postgresql/data

   

   

   

pgadmin:

 image: ''  # 指定镜像

 container_name: ''# 容器名称,非必填

 restart: unless-stopped # 启动方式

 ports:

   - 5431:80

 environment:  # 环境变量是 服务编排 重点

   PGADMIN_DEFAULT_EMAIL: san@q.com

   PGADMIN_DEFAULT_PASSWORD: PGadmin

 depends_on:    # 启动依赖 重点

   - postgres

     

 networks:

   - postgresql

 

 

# 声明使用了哪些共享文件夹

volumes:

data:

# 声明使用了哪些网络

networks:

postgresql:

 external:

   name: postgresql            

   

# 核心是services(描述服务之间的关系)

# 配置阿里云镜像加速

sudomkdir-p /etc/docker

sudotee /etc/docker/daemon.json <<-'EOF'

{

"registry-mirrors": ["https://ysyq7xvr.mirror.aliyuncs.com"]

}

EOF

sudo systemctl daemon-reload

sudo systemctl restart docker

DockerUI Portainer

# 查看DockerUI Portainer镜像

docker search Portainer

# 选择喜欢的DockerUI风格镜像下载

docker pull docker.io/portainer/portainer

# 启动UI

docker run -d-p9000:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --name prtainer portainer/portainer

# 查看容器

docker ps-a

Docker ES 安装集群的搭建

# 使用docker安装ES并且完成集群配置工作

# 安装ES镜像

docker pull elasticsearch:7.17.0

# 在根目录建立一个文件夹ES/config

mkdir-p /ES/config

# 进入config

cd /ES/config

# 分别创建三个文件

vim es1.yml

vim es2.yml

vim es3.yml

# 三个文件内容如下

# 集群唯一名称,所有节点一致

cluster.name: elasticsearch-cluster

# 节点名称

node.name: es-node1

# 设置可以访问的ip,默认为0.0.0.0,这里全部设置通过

network.host: 0.0.0.0

# 设置其他节点和该节点交互的ip地址

network.publish_host: 47.113.201.81

# 设置对外服务的http端口,默认9200

http.port: 9200

# 设置节点之间交互的tcp端口,默认为9300

transport.tcp.port: 9300

# 是否支持跨域

http.cors.enabled: ture

# 表示支持所有域名

http.cors.allow-origin: "*"

# 配置该节点是否有资格被选举为主节点(候选主节点),为了防止脑裂,配置奇数个候选主节点

node.master: ture

# 配置该节点是数据节点,用于保存数据

node.data: ture

# 集群各节点IP地址

discovery.zen.ping.unicast.hosts:

["47.113.201.81:9300","47.113.201.81:9301",i"47.113.201.81:9302"]

# 自动发现master节点的最小数

discovery.zen.minimum_master_nodes: 1

# v7+ 集群配置新方案cluster.name: elasticsearch-cluster node.name: es-node1 node.master: true  node.data: true # path.data: /opt/elasticsearch-7.0.0/data # path.logs: /opt/elasticsearch-7.0.0/logs network.host: 0.0.0.0transport.tcp.port: 9300 transport.tcp.compress: true http.port: 9200 http.max_content_length: 100mb bootstrap.memory_lock: true discovery.seed_hosts: ["47.113.201.81:9300","47.113.201.81:9301","47.113.201.81:9302"]cluster.initial_master_nodes: ["47.113.201.81:9300","47.113.201.81:9301","47.113.201.81:9302"]gateway.recover_after_nodes: 2 gateway.recover_after_time: 5m gateway.expected_nodes: 3

  • Es1.yml

cluster.name: elasticsearch-clusternode.name: es-node1network.host: 0.0.0.0network.publish_host: 47.113.201.81http.port: 9200transport.tcp.port: 9300http.cors.enabled: truehttp.cors.allow-origin: "*"node.master: truenode.data: truecluster.initial_master_nodes: ["es-node1"]discovery.zen.ping.unicast.hosts: ["47.113.201.81:9300","47.113.201.81:9301","47.113.201.81:9302"]# discovery.zen.minimum_master_nodes: 1  # v7+ 版本ES不在使用该配置

  • Es2.yml

cluster.name: elasticsearch-clusternode.name: es-node2network.host: 0.0.0.0network.publish_host: 47.113.201.81http.port: 9201transport.tcp.port: 9301http.cors.enabled: truehttp.cors.allow-origin: "*"node.master: truenode.data: truecluster.initial_master_nodes: ["es-node1"]discovery.zen.ping.unicast.hosts: ["47.113.201.81:9300","47.113.201.81:9301","47.113.201.81:9302"]# discovery.zen.minimum_master_nodes: 1  # v7+ 版本ES不在使用该配置

  • Es3.yml

cluster.name: elasticsearch-clusternode.name: es-node3network.host: 0.0.0.0network.publish_host: 47.113.201.81http.port: 9202transport.tcp.port: 9302http.cors.enabled: truehttp.cors.allow-origin: "*"node.master: truenode.data: truecluster.initial_master_nodes: ["es-node1"]discovery.zen.ping.unicast.hosts: ["47.113.201.81:9300","47.113.201.81:9301","47.113.201.81:9302"]# discovery.zen.minimum_master_nodes: 1  # v7+ 版本ES不在使用该配置

OpenJdk搭建

# 检查并卸载OpenJDK# 检查命令java -versionrpm -qa | grep java# 卸载命令rpm -e –nodeps tzdata-java-2012c-1.el6.noarchrpm -e –nodeps java-1.6.0-openjdk-1.6.0.0-1.45.1.11.1.el6.x86_64# 将安装文件上传到linux服务器后,进入到该目录执行解压安装tar -xvf jdk-7u75-linux-x64.tar# 解压完成后创建一个新的java目录并将刚刚解压的jdk目录移动到我们创建的目录mkdir -p /wocloud/javamv ./jdk1.7.0_75 /workcloud/java/# 最后再删除安装文件rm -rf jdk-7u75-linux-x64.gz# 安装完成后需要配置一下环境变量,编辑/etc/profile文件vi /etc/profile# 在文件尾部添加如下配置export JAVA_HOME=/wocloud/java/jdk1.7.0_75 export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin# source命令重新加载/etc/profile文件,使得修改后的内容生效source /etc/profile

# 分别创建三个容器# 查看ES镜像IDdocker images# 创建容器docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9200:9200 -p 9300:9300 -v /ES/config/es1.yml:/usr/share/elasticsearch/config/elasticsearch.yml --name ES01 [镜像ID]docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9201:9201 -p 9301:9301 -v /ES/config/es2.yml:/usr/share/elasticsearch/config/elasticsearch.yml --name ES02 [镜像ID]docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9202:9202 -p 9302:9302 -v /ES/config/es3.yml:/usr/share/elasticsearch/config/elasticsearch.yml --name ES03 [镜像ID]

# 本机配置docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9200:9200 -p 9300:9300 -v /ES/config/es1.yml:/usr/share/elasticsearch/config/elasticsearch.yml --name ES01 6fe993d6e7eddocker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9201:9201 -p 9301:9301 -v /ES/config/es2.yml:/usr/share/elasticsearch/config/elasticsearch.yml --name ES02 6fe993d6e7eddocker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9202:9202 -p 9302:9302 -v /ES/config/es3.yml:/usr/share/elasticsearch/config/elasticsearch.yml --name ES03 6fe993d6e7ed

# 如果遇到elasticsearch启动时错误# 查看日志docker logs [容器ID]# 最大虚拟内存区域vm.max_map_count[65530]太低,请至少增加到[262144]# 解决方法# 在/etc/sysctl.conf文件最后添加一行,退出系统目录vim /etc/sysctl.conf# 最后一行添加vm.max_map_count = 655360# 并执行命令sysctl -p# 重新启动elasticsearch,即可启动成功# 重启三个容器docker restart ES01 ES02 ES03# 访问:http://47.113.201.81:9200/# 查看节点信息http://47.113.201.81:9200/_cat/nodes?pretty

ES启动常见问题

# 问题一Exception in thread "main" SettingsException[Failed to load settings from [elasticsearch.yml]]; nested: ElasticsearchParseException[malformed, expected settings to start with 'object', instead was [VALUE_STRING]];# 原因:elasticsearch.yml文件错误# 解决:参数与参数值等号间需要空格node.name ="node"  ##错误node.name = "node" ##正确# 问题二org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root# 原因:处于对root用户的安全保护,需要使用其他用户组进行授权启动# 解决:# step1:用户组进行授权启动   groupadd elsearch               useradd elsearch -g elsearch -p elasticsearch    chown -R elsearch:elsearch  elasticsearch-6.3.0    # 备注: 添加用户组 elsearch           # 添加用户 elsearch 密码为 elasticsearch 到用户组 elsearch         # 将elsearch安装目录授权给 用户组:用户  即 elsearch:elsearch# step2: 重新启动    su elsearch    /elasticsearch-6.3.0/bin/elasticsearch   # 备注:切换 elsearch 用户          # 重新启动                    # 问题三OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000085330000, 2060255232, 0) failed; error='Cannot a ...'(errno=12);# 原因:jvm要分配最大内存超出系统内存# 解决:# step1:适当调整指定jvm内存vi /home/elasticsearch-6.3.0/config/jvm.options #备注:编辑elasticsearch jvm配置文件 修改如下 esc+:wq保存退出## JVM configuration ################################################################## IMPORTANT: JVM heap size#################################################################### You should always set the min and max JVM heap## size to the same value. For example, to set## the heap to 4 GB, set:#### -Xms4g## -Xmx4g#### See https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html## for more information################################################################## # Xms represents the initial size of total heap space# Xmx represents the maximum size of total heap space -Xms512m-Xmx512m # 备注:由于虚拟机内存制定1g,所以适当降低jvm内存指定# step2:重启su elsearch/elasticsearch-6.3.0/bin/elasticsearch# 问题四ERROR: [3] bootstrap checks failed# 原因:虚拟机限制用户的执行内存# 解决:[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536][2]: max number of threads [3802] for user [elsearch] is too low, increase to at least [4096]# step1:修改安全限制配置文件su root vi /etc/security/limits.conf    # 备注:使用最高权限 修改安全配置 在文件末尾加入    # End of file    elsearch       hard        nofile        65536     elsearch       soft        nofile        65536    *               soft       nproc         4096    *               hard       nproc         4096    # 备注: elsearch为用户名 可以是使用*进行通配      # nofile 最大打开文件数目    # nproc 最大打开线程数目[3]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]# step2:修改系统配置文件vi /etc/sysctl.conf # 备注:行末加上vm.max_map_count = 655360 ,esc +:wq保存退出# step3:重启# 问题五org.elasticsearch.bootstrap.StartupException: java.lang.IllegalStateException: failed to obtain node locks, tried [[/home/elasticsearch-6.3.0/data/elasticsearch]] with lock id [0]; maybe these locations are not writable or multiple nodes were started without increasing [node.max_local_storage_nodes] (was [1])?# 原因:线程占用# 解决:重新启动# step1:杀死elasticsearch线程ps -ef | grep elastic# step2: 重启# 问题六ERROR: bootstrap checks failedmemory locking requested for elasticsearch process but memory is not locked# 原因:锁定内存失败# 解决:vim /etc/security/limits.conf 添加下面两行soft memlock unlimitedhard memlock unlimited# tips:* 代表的是linux内所有的用户# 问题七Unsupported major.minor version 52.0# 原因:java版本太低# 解决:更换jdk版本,ElasticSearch5.0.0支持jdk1.8.0以上# 问题八org.elasticsearch.bootstrap.StartupException: java.lang.IllegalArgumentException: Property [elasticsearch.version] is missing for plugin [head]# 原因:elasticsearch新版本是不允许安装插件在文件目录plugins下面的# 解决:将plugins下面的插件目录放到其他目录即可

Elasticsearch-Head管理界面

# Docker 部署 Elasticsearch-Head# 可以通过管理界面查看ElasticSearch相关信息# 拉取镜像docker pull mobz/elasticsearch-head:5# 运行容器docker run -d --name es_admin -p 9100:9100 mobz/elasticsearch-head:5# 等待启动成功# 常见问题_search 406 (Not Acceptable)# 解决办法  # 进入docker es_admin容器  # 命令 docker exec -it [容器ID] /bin/bash  docker exec -it es_admin /bin/bash  # 进入head安装目录  # cd 进入_site/目录,编辑vendor.js共两处(若无vim编辑器,见下面Docker容器vim安装)  6886行:/contentType: "application/x-www-form-urlencoded"改成 -->   contentType: "application/json;charset=UTF-8"  7573行:var inspectData = s.contentType === "appliaction/x-www-form-urlencoded"&& 改成 -->  var inspectData = s.contentType === "application/json;charset=UTF-8"&&  # Docker容器vim安装# 更新源apt-get update# 先更新 防止提示:Unable to locate package vim# 安装vimapt-get install vim


最后,通过这次短暂的学习和体验,感受到了阿里云服务器的强大,同时,也加深了自己对强大技术学习的渴望,在今后的日子里,我将继续深入学习云服务器相关技术,让编程变得更加奇趣无穷。

相关实践学习
一小时快速掌握 SQL 语法
本实验带您学习SQL的基础语法,快速入门SQL。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情:&nbsp;https://www.aliyun.com/product/ecs
相关文章
|
1天前
|
负载均衡 固态存储 Linux
阿里云轻量应用服务器、云服务器、gpu云服务器最新收费标准参考
轻量应用服务器、云服务器、gpu云服务器是阿里云服务器产品中,比较热门的云服务器产品类型,不同类型的云服务器产品收费模式与收费标准是不一样的,本文为大家展示这几个云服务器产品的最新收费标准情况,以供参考。
阿里云轻量应用服务器、云服务器、gpu云服务器最新收费标准参考
|
1天前
|
弹性计算 负载均衡 容灾
应用阿里云弹性计算:打造高可用性云服务器ECS架构
阿里云弹性计算助力构建高可用云服务器ECS架构,通过实例分布、负载均衡、弹性IP、数据备份及多可用区部署,确保业务连续稳定。自动容错和迁移功能进一步增强容灾能力,提供全方位高可用保障。
9 0
|
1天前
|
存储 弹性计算 监控
探索阿里云弹性计算:如何优化云服务器ECS的性能与成本
在云时代,【阿里云ECS】的性能优化与成本控制至关重要。利用实例规格选择、自动伸缩、网络和存储配置,可增强性能、减少成本。结合监控工具和优化建议,用户能解决性能问题,提升应用稳定性,实现高效且经济的云计算运营。
9 1
|
1天前
|
弹性计算 运维 监控
解密阿里云弹性计算:探索云服务器ECS的核心功能
阿里云ECS是核心计算服务,提供弹性云服务器资源,支持实例按需配置、集群管理和监控,集成安全防护,确保服务稳定、安全,助力高效业务运营。
11 0
|
3天前
|
弹性计算 运维 安全
阿里云ecs使用体验
整了台服务器部署项目上线
|
4天前
|
编解码 缓存 安全
阿里云目前活动内各云服务器实例规格适用场景与价格参考
目前阿里云的活动中,云服务器有多种不同实例规格可选,实例规格定义了实例的基本属性:CPU和内存(包括CPU型号、主频等),但是不同实例规格所适用的场景是不一样的,价格也有很大差别,有的用户初次选购阿里云服务器可能并不知道这些实例规格的具体适用场景,下面是小编整理汇总的2024年截止目前阿里云的活动中云服务器实例规格适用场景与活动价格,以供参考。
阿里云目前活动内各云服务器实例规格适用场景与价格参考
|
5天前
|
弹性计算
阿里云ECS的使用心得
本文主要讲述了我是如何了解到ECS,使用ECS的一些经验,以及自己的感悟心得
|
5天前
|
弹性计算
阿里云ECS使用体验
在申请高校学生免费体验阿里云ECS云服务器后的一些使用体验和感受。
|
6天前
|
弹性计算 运维 安全
阿里云ecs使用体验
整了台服务器部署项目上线
|
6天前
|
弹性计算 运维 数据安全/隐私保护
【雾锁王国开服】阿里云一键部署雾锁王国联机服务器详细教程
阿里云提供雾锁王国服务器搭建教程,借助计算巢服务,用户可在3分钟内创建Enshrouded游戏服务器。8核32G服务器1个月109元,3个月327元;4核16G10M带宽1个月30元,3个月90元。需先注册并实名认证阿里云账号,然后通过傻瓜式一键部署入口进行购买和设置,包括地域、购买时长、服务器参数等。部署完成后,分享服务器信息给游戏伙伴,即可开始游戏。详细教程和更多配置信息可在阿里云ECS产品页查看。
24 0

热门文章

最新文章