Linux中ES的安装

文章目录


一、ES是什么

1.1、ES概念介绍

ES(Elasticsearch)是一种基于Lucene的搜索服务器,具有实时分布式存储、搜索和分析引擎的功能。
Elasticsearch是一个高度可扩展的开源全文搜索和分析引擎,可以快速地对大数据进行存储、搜索和分析。它是基于Java开发的,作为Apache许可条款下的开放源码发布,成为流行的企业级搜索引擎。
ES不仅具备强大的搜索能力,还支持模糊查询和相关性搜索,这使得它在处理大量数据时表现出色。相对于传统数据库,ES能够更高效地进行模糊查询,因为它内部使用倒排索引(inverted index)结构,这种结构特别适用于快速的文本搜索。倒排索引将数据分词并建立索引,使得搜索时能够快速找到相关文档,而不是遍历整个数据集。

1.2、技术架构

ES的技术架构是一个高度可扩展的分布式系统,旨在处理大规模的数据搜索和分析任务。
ES的底层依赖于Lucene,这是一个高性能、全功能的搜索引擎库。然而,Lucene的使用门槛较高,需要开发者具备一定的信息检索知识,并且直接集成到应用程序中。为了简化这一过程,ES应运而生,它使用Java编写,内部采用Lucene进行索引和搜索,并提供一套简单的RESTful API供用户使用。
在ES的架构中,集群不需要依赖任何外部组件即可实现高可用性(HA)。集群中的节点通过自建的选举算法来选择master节点,无需额外的系统如Zookeeper。

  • 节点类型:

    • Master节点:负责保存和更新集群的元数据,包括集群配置、节点信息、索引设置等。这些信息同步到所有节点,以保持数据的一致性。
    • Data节点:负责数据的存储和查询操作。这些节点实际持有数据分片,执行数据的读写操作。
    • Coordinator节点:负责路由索引请求和聚合搜索结果集,以及分发批量索引请求,起到负载均衡的作用。
      Ingestor节点:类似于Logstash,用于处理和转换输入数据。
  • Master选举:

    • 选举策略:如果集群中已存在master,则认可该master;如果不存在,则从具有master资格的节点中选举出ID最小的节点作为master。
    • 选举时机:包括集群启动时和现有master离开集群时。后台线程会定时检测master的状态,若master异常离开,则会重新进行选举。
    • 选举流程:通过"过半原则"避免脑裂问题,即任何新的master必须得到超过半数节点的票数才能当选,确保集群稳定性。
  • 数据存储:

    • 分片与副本:ES通过分片方式实现数据的分布式存储,每个索引被分成若干个分片,均匀分布在不同节点上。同时,通过副本分片提高数据的可用性和并发处理能力。
    • 写入过程:数据先写入主分片,成功后异步复制到副本分片。通过translog保证数据的持久性,确保服务器宕机时数据不丢失。
  • 数据查询:

    • 查询过程:任意节点都可以作为查询请求的协调节点,将请求转发到相关分片进行查询,最后汇总各个分片的结果返回给客户端。
    • 负载均衡:通过合理配置分片数量和副本数,实现数据存储的负载均衡和高可用性。

1.2.1、Lucene介绍

Lucene是一个高性能、可扩展的开源Java库,用于实现全文检索和搜寻功能。
Lucene最初由Doug Cutting开发,他也是Hadoop的创始人之一。作为一个开源项目,Lucene主要由Apache软件基金会支持,并在Java开发社区中广泛使用。它提供了一个强大的应用程序接口(API),允许开发者在自己的应用程序中实现全文索引和搜索功能。
Lucene的核心功能包括全文搜索和索引建立,这两者是实现高效数据检索的基础。在全文搜索中,Lucene能够对非结构化数据进行快速查找和匹配,这得益于其内部使用的"倒排索引"结构。倒排索引是一种数据结构,通过将文档内容分词并建立索引,从而快速定位相关文档位置,而不需要遍历整个数据集。

  • 索引过程

    • 分词组件(Tokenizer):处理输入的文档,将其分解成单词或词元(Tokens),去除标点符号和停用词(如英文中的"the"、"an"等)。例如,文章 "Tom lives in Guangzhou, I live in Guangzhou too." 经过分词后得到的结果为:[Tom] [lives] [Guangzhou] [I] [live] [Guangzhou]。
    • 语言处理组件:对得到的词元进行进一步处理,如转换为小写、词根还原(reduce to root form)等。处理完的结果为:[tom] [live] [guangzhou] [i] [live] [guangzhou]。
    • 索引组件(Indexer):将处理后的词构建成索引,索引结构包含关键词、文章号[出现频率]、出现位置等信息。例如,关键词 "guangzhou" 可能被存储为:
关键词 文章号[出现频率] 出现位置
guangzhou 1[2] 3, 6
  • 搜索过程

    • 词典查找:用户输入查询字符串后,Lucene会在词典中进行二元查找,定位到该词的频率文件和位置文件。
    • 结果返回:通过指针读出所有文章号,并在具体文章中根据出现位置找到该词,最终返回结果给用户。这种索引方式使得Lucene在首次建立索引时可能较慢,但之后的搜索会非常迅速。

Lucene不仅提供强大的索引和搜索能力,还具有高扩展性。其索引结构主要采用FST(有限状态机)实现,这一结构具有查询速度快、内存占用少、结合内存和磁盘存储的优点。这使得Lucene能够支持大规模数据的检索,同时在内存利用率和查询速度上都有优异表现。

1.3、ES的工作原理

ES(Elasticsearch)的工作原理基于分布式、可扩展的架构和倒排索引机制,能够实现高效的数据存储和检索功能。

  • 分布式架构
    • 节点类型:ES集群由多个节点组成,这些节点可以分成不同的类型,包括Master节点、Data节点、Coordinator节点和Ingestor节点。Master节点负责保存和更新集群的元数据信息,如集群配置、节点信息、索引设置等。Data节点则负责数据的存储和查询操作。
    • 分片与副本:为了支持大规模数据,ES将索引划分为多个分片,每个分片可以独立存储和处理数据。同时,每个分片可以有多个副本,用于提供数据冗余、故障恢复和读取负载均衡。
  • 数据写入流程
    • 内存缓冲区与Translog:当文档被写入ES时,它们首先被放置在内存中的一个缓冲区中,并同时记录到事务日志(Translog)中以确保数据的持久性。
    • 刷新操作:随着时间的推移,缓冲区中的数据会积累到一定量,此时需要将这些数据刷新(Refresh)到Lucene的索引中,形成新的段(Segment)。刷新操作会创建一个新的Lucene段,并将缓冲区中的数据写入这个段中。
    • Flush操作:与刷新不同,Flush操作会将内存中的数据以及Translog中的更改持久化到磁盘上。这是通过一个称为Flush的操作完成的,该操作将所有缓冲的数据和Translog内容写入磁盘。
  • 数据搜索过程
    • 倒排索引:ES使用Lucene作为其底层的搜索库,Lucene构建倒排索引来加速搜索过程。倒排索引将文档中的单词映射到包含这些单词的文档列表,从而实现快速查找和检索。
    • 查询执行:当客户端发送搜索请求时,请求首先到达一个协调节点。协调节点解析查询语句,确定需要访问的分片,并将请求转发给相应的数据节点。数据节点在本地执行查询,并将结果返回给协调节点,协调节点聚合来自各个数据节点的结果,并进行排序、分页等处理,最终将结果返回给客户端。
  • 倒排索引结构
    • 词条:索引里面最小的存储和查询单元,对于英文来说是一个单词,对于中文则是分词后的一个词。
    • 词典:是词条的集合,记录单词到倒排列表的关联关系,一般通过B+树或哈希表实现。
    • 倒排列表:记录了单词对应的文档结合,由倒排索引项组成,包括文档ID、词频(TF)、位置和偏移信息,用于实现相关性评分、语句搜索和高亮显示。
  • 数据副本机制
    • 同步机制:一旦文档被写入到主分片,主分片会开始将数据同步到其对应的副本分片上。这个过程是异步进行的,因此写入请求可以在主分片处理完毕后就返回给客户端。
    • 写入确认:当主分片和足够数量的副本分片都成功写入了文档后,协调节点会收到确认信息并向客户端发送成功的响应。

ES通过其分布式架构、倒排索引机制以及复杂的写入和查询流程,确保了数据的高效存储和快速检索。这种设计不仅提高了系统的可用性和稳定性,还带来了良好的扩展性和灵活的配置选项,适应了现代大数据环境下的各种复杂应用场景。

1.4、ES的适用场景

  • 全文搜索

    • 网站搜索:ES在网站搜索中表现出色,能够提供快速、准确的搜索结果。例如,电商网站的商品搜索功能可以通过ES实现,支持对商品名称、描述、类别等信息的高效检索。
    • 文档管理系统:在文档管理系统中,ES能够实现对大量文档的快速搜索和分类。例如,企业的内部知识库可以通过ES来构建,员工可以迅速找到需要的资料。
    • 电子商务搜索:电商平台通过ES提供强大的商品搜索功能,用户可以进行关键词搜索、过滤和排序,快速找到所需商品。例如,京东、淘宝和拼多多等电商平台都使用ES来处理海量商品数据的搜索。
  • 实时分析

    • 实时监控系统:ES能够实时处理和分析数据,适用于实时监控系统。例如,企业的实时销售数据可以通过ES进行追踪和分析,帮助管理层及时调整销售策略。
    • 业务分析:在业务分析中,ES提供了低延迟的数据存储和查询功能,使得企业能够实时分析业务数据,发现潜在的机会和问题。例如,金融行业可以利用ES进行交易数据的实时分析和预警。
    • 物联网数据处理:ES在物联网场景中也有广泛应用,能够处理来自传感器和设备的大量实时数据。例如,工厂的生产线可以通过ES监控设备状态,实时分析生产数据,提高生产效率。
  • 日志和事件数据分析

    • 系统监控:ES常用于系统监控,通过收集和分析各种日志数据,帮助识别系统问题和优化系统性能。例如,公司的IT部门可以使用ES构建日志分析平台,实时监控服务器和应用程序的运行状态。
    • 应用日志分析:在应用日志分析中,ES能够汇总和分析来自不同来源的应用日志,帮助开发者定位问题和改进应用。例如,软件开发团队可以使用ES分析应用的错误日志,快速定位并修复bug。
    • 安全事件管理:ES在安全事件管理中也有重要应用,能够收集和分析安全事件数据,帮助企业及时发现和应对安全威胁。例如,网络安全公司可以使用ES构建SIEM(安全信息和事件管理)系统,实时监测网络攻击和异常行为。
  • 机器学习

    • 异常检测:ES的机器学习功能可以自动检测数据中的异常和异常行为,有助于及时发现潜在的问题。例如,银行的信用卡欺诈检测系统可以通过ES来实现,自动识别异常交易行为。
    • 预测维护:在工业领域,ES的机器学习功能可以用于预测设备的维护需求,减少设备故障和停机时间。例如,制造企业可以利用ES分析设备的运行数据,预测并提前进行设备维护。
    • 用户行为分析:在用户行为分析中,ES可以分析用户的行为数据,挖掘用户的兴趣和偏好,提升用户体验和营销效果。例如,新闻推荐系统可以利用ES分析用户的阅读历史,推荐感兴趣的内容。
  • 地理数据应用

    • 地图服务:ES支持地理空间索引和搜索,可以在地图服务中应用,提供基于位置的搜索和可视化功能。例如,旅游平台可以使用ES构建地图搜索功能,帮助用户查找附近的景点和餐馆。
    • 物流管理:在物流管理中,ES可以用于优化配送路线和调度。例如,快递公司可以利用ES实现智能路由规划,提高配送效率。
    • 位置服务:位置服务中,ES可以帮助管理和分析大量的地理数据,提供基于位置的服务和推荐。例如,共享单车平台可以使用ES管理车辆的位置信息,优化车辆分布和调度。
  • 安全信息和事件管理

    • 网络安全监控:ES在网络安全监控中扮演着重要角色,能够实时分析网络流量和日志,识别潜在的网络威胁。例如,企业的安全团队可以使用ES构建网络安全防护系统,实时监测并应对网络攻击。
    • 入侵检测:在入侵检测系统中,ES能够分析各种安全事件数据,识别异常行为和潜在的入侵行为。例如,金融机构可以使用ES构建入侵检测系统,保护客户资金和数据安全。
    • 威胁分析:ES还可以用于威胁分析,帮助安全专家分析复杂的安全事件,找出潜在的攻击模式和源头。例如,国家安全部门可以使用ES分析大量的网络情报数据,识别并防范潜在的恐怖威胁。

二、安装前的配置

2.1、创建普通用户

由于ES禁止使用root用户启动,需要创建一个普通用户来运行ES

  • 创建一个组
bash 复制代码
[root@iZbp129gypomkv7w7deqpqZ ~]# groupadd elasticsearch
  • 创建一个普通用户并配置密码
bash 复制代码
[root@iZbp129gypomkv7w7deqpqZ ~]# useradd esroot
[root@iZbp129gypomkv7w7deqpqZ ~]# passwd esroot 
Changing password for user esroot.
New password: 
BAD PASSWORD: The password contains the user name in some form
Retype new password: 
passwd: all authentication tokens updated successfully.
  • 将新用户添加到elasticsearch用户组
bash 复制代码
[root@iZbp129gypomkv7w7deqpqZ ~]# usermod -G elasticsearch esroot
  • 给esroot用户设置sudo权限

在 在root ALL=(ALL) ALL一行下面添加esroot ALL=(ALL) ALL

bash 复制代码
[root@iZbp129gypomkv7w7deqpqZ /]# visudo 
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
esroot   ALL=(ALL)       ALL

2.2、调整文件描述符数量和虚拟内存

bash 复制代码
[root@iZbp129gypomkv7w7deqpqZ /]# ulimit -n 65536
[root@iZbp129gypomkv7w7deqpqZ /]# ulimit -u 4096

2.3、设置shell会话的资源限制(软限制和硬限制)

在文本最后添加下面两段代码

bash 复制代码
[root@iZbp129gypomkv7w7deqpqZ /]# vi /etc/security/limits.conf
shcms soft nofile 65536
shcms hard nofile 65536

2.4、增加虚拟内存的设置

添加vm.max_map_count=262144

bash 复制代码
[root@iZbp129gypomkv7w7deqpqZ /]# vi /etc/sysctl.conf
vm.swappiness = 0
kernel.sysrq = 1
vm.max_map_count=262144

net.ipv4.neigh.default.gc_stale_time = 120

# see details in https://help.aliyun.com/knowledge_detail/39428.html
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2

# see details in https://help.aliyun.com/knowledge_detail/41334.html
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_slow_start_after_idle = 0

2.5、使虚拟内存配置立即生效

bash 复制代码
[root@iZbp129gypomkv7w7deqpqZ /]# sysctl -p
vm.swappiness = 0
kernel.sysrq = 1
vm.max_map_count = 262144
net.ipv4.neigh.default.gc_stale_time = 120
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_slow_start_after_idle = 0

三、ES安装

3.1、下载与解压

  • 创建一个software文件夹
bash 复制代码
[root@iZbp129gypomkv7w7deqpqZ home]# mkdir software
  • 下载
bash 复制代码
[root@iZbp129gypomkv7w7deqpqZ software]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.6.1-linux-x86_64.tar.gz
--2024-08-11 14:56:47--  https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.6.1-linux-x86_64.tar.gz
Resolving artifacts.elastic.co (artifacts.elastic.co)... 34.120.127.130, 2600:1901:0:1d7::
Connecting to artifacts.elastic.co (artifacts.elastic.co)|34.120.127.130|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 296454172 (283M) [application/x-gzip]
Saving to: 'elasticsearch-7.6.1-linux-x86_64.tar.gz'

100%[================================================================================================================================================>] 296,454,172 6.65MB/s   in 37s    

2024-08-11 14:57:25 (7.56 MB/s) - 'elasticsearch-7.6.1-linux-x86_64.tar.gz' saved [296454172/296454172]
  • 解压
bash 复制代码
[root@iZbp129gypomkv7w7deqpqZ software]# mkdir /opt/es
[root@iZbp129gypomkv7w7deqpqZ software]# ls /opt
es
[root@iZbp129gypomkv7w7deqpqZ software]# tar -zxvf elasticsearch-7.6.1-linux-x86_64.tar.gz -C /opt/es/
elasticsearch-7.6.1/
elasticsearch-7.6.1/lib/
elasticsearch-7.6.1/lib/elasticsearch-7.6.1.jar
elasticsearch-7.6.1/lib/elasticsearch-x-content-7.6.1.jar
elasticsearch-7.6.1/lib/elasticsearch-cli-7.6.1.jar
elasticsearch-7.6.1/lib/elasticsearch-core-7.6.1.jar
elasticsearch-7.6.1/lib/elasticsearch-secure-sm-7.6.1.jar
elasticsearch-7.6.1/lib/elasticsearch-geo-7.6.1.jar
elasticsearch-7.6.1/lib/lucene-core-8.4.0.jar

3.2、配置文件修改

  • 需要先切换到esroot用户
bash 复制代码
[root@iZbp129gypomkv7w7deqpqZ /]# su - esroot
[esroot@iZbp129gypomkv7w7deqpqZ ~]$ 
  • 创建log和data目录
bash 复制代码
[esroot@iZbp129gypomkv7w7deqpqZ ~]$ sudo mkdir -p /opt/es/elasticsearch-7.6.1/log
[sudo] password for esroot: 
[esroot@iZbp129gypomkv7w7deqpqZ ~]$ sudo mkdir -p mkdir -p /opt/es/elasticsearch-7.6.1/data
[esroot@iZbp129gypomkv7w7deqpqZ ~]$ ls /opt/es/elasticsearch-7.6.1/
bin  config  data  jdk  lib  LICENSE.txt  log  logs  modules  NOTICE.txt  plugins  README.asciidoc
[root@iZbp129gypomkv7w7deqpqZ ~]# cd /opt/es/elasticsearch-7.6.1/config
[root@iZbp129gypomkv7w7deqpqZ config]# ls
elasticsearch.yml  jvm.options  log4j2.properties  role_mapping.yml  roles.yml  users  users_roles
[root@iZbp129gypomkv7w7deqpqZ config]# rm -rf elasticsearch.yml
[root@iZbp129gypomkv7w7deqpqZ config]# ls
jvm.options  log4j2.properties  role_mapping.yml  roles.yml  users  users_roles
[root@iZbp129gypomkv7w7deqpqZ config]# vi elasticsearch.yml
[root@iZbp129gypomkv7w7deqpqZ config]# cat elasticsearch.yml 
cluster.name: my-cluster
node.name: my-node
path.data: /opt/es/elasticsearch-7.6.1/data
path.logs: /opt/es/elasticsearch-7.6.1/log
network.host: 0.0.0.0
  • cluster.name: my-cluster:这是设置集群名称,用于标识这个 Elasticsearch 集群。所有的节点都将共享这个名称。
  • node.name: my-node:这是设置每个节点的名称。在集群中,每个节点都需要一个唯一的名称,以便能够相互识别
  • path.data: /opt/es/elasticsearch-7.6.1/data:这是设置数据文件的存储路径。Elasticsearch 将使用这个路径来存储索引和快照
  • path.logs: /opt/es/elasticsearch-7.6.1/log:这是设置日志文件的存储路径。Elasticsearch 将使用这个路径来存储日志文件
  • network.host: 0.0.0.0:这是设置节点的网络主机。这意味着节点将监听所有网络接口。这对于分布式环境中的节点是必要的,因为它们需要能够与其他节点通信

jvm.options文件可以根据自己的实际情况修改配置:-Xms2g 是一个 Java 虚拟机(JVM)选项,用于设置Java堆的初始大小(最小值)。在这个例子中,初始堆大小被设置为 2GB(2048MB)。

3.3、依赖安装

ES的某些版本对JDK有特定要求,需要确保系统中JDK的版本与ES版本兼容。ES 7.x以上通常内置了JDK环境,不需要本地JDK支持。如果需要指定JDK版本,可以在ES的bin目录中修改elasticsearch脚本,设置正确的JAVA_HOME路径。

  • 安装java环境
bash 复制代码
[root@iZbp129gypomkv7w7deqpqZ yum.repos.d]# vi CentOS-Base.repo 
[root@iZbp129gypomkv7w7deqpqZ yum.repos.d]# cat CentOS-Base.repo 
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirror.centos.org/centos/$releasever/os/$basearch/mirror.lst
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
baseurl=https://mirrors.aliyun.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

[updates]
name=CentOS-$releasever
enabled=1
failovermethod=priority
baseurl=http://mirrors.cloud.aliyuncs.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=http://mirrors.cloud.aliyuncs.com/centos/RPM-GPG-KEY-CentOS-7

[extras]
name=CentOS-$releasever
enabled=1
failovermethod=priority
baseurl=http://mirrors.cloud.aliyuncs.com/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=http://mirrors.cloud.aliyuncs.com/centos/RPM-GPG-KEY-CentOS-7
[root@iZbp129gypomkv7w7deqpqZ yum.repos.d]# yum clean all
Loaded plugins: fastestmirror
Cleaning repos: base epel extras mysql-connectors-community mysql-tools-community mysql57-community updates
Cleaning up list of fastest mirrors
[root@iZbp129gypomkv7w7deqpqZ yum.repos.d]# yum makecache
Loaded plugins: fastestmirror
Determining fastest mirrors
[root@iZbp129gypomkv7w7deqpqZ /]# yum install java-11-openjdk-devel
[root@iZbp129gypomkv7w7deqpqZ /]# source /etc/profile
[esroot@iZbp129gypomkv7w7deqpqZ /]$ vi /etc/profile
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.91.x86_64
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin

3.4、启动ES服务

bash 复制代码
[esroot@iZbp129gypomkv7w7deqpqZ /]$ su esroot
[esroot@iZbp129gypomkv7w7deqpqZ /]$ cd /opt/es/elasticsearch-7.6.1/bin
[esroot@iZbp129gypomkv7w7deqpqZ /]$ ./elasticsearch
相关推荐
AI视觉网奇18 分钟前
pytorch3d linux安装
linux·人工智能·pytorch
VVVVWeiYee20 分钟前
Mesh路由组网
运维·网络·智能路由器·信息与通信
双手插兜-装高手28 分钟前
Linux - 线程基础
linux·c语言·笔记
XY.散人44 分钟前
初识Linux · 信号处理
linux·信号处理
北'辰1 小时前
使用ENSP实现DHCP+动态路由
运维·网络
小黑屋说YYDS1 小时前
ElasticSearch7.x入门教程之索引概念和基础操作(三)
elasticsearch
XiaoCCCcCCccCcccC1 小时前
Linux环境下的基础开发工具 -- 包管理器,vim,gcc/g++,make/makefile,git,gdb/cgdb
linux·c语言·gdb
雪碧聊技术1 小时前
Docker3:docker基础1
运维·docker·容器·docker常见命令
懒笑翻1 小时前
Python 使用 Selenuim进行自动化点击入门,谷歌驱动,以百度为例
运维·selenium·自动化
n***85941 小时前
Github 开源 10K Stars 自动化 API、后台作业、工作流和 UI 的开发平台
运维·自动化