Elasticsearch基础篇(三):Elasticsearch7.x的集群部署

news2024/11/25 4:54:13

Elasticsearch的集群部署

  • 1. Elasticsearch集群架构
    • 主节点
    • 数据节点
    • 客户端节点
    • 分片
    • 节点间通信
    • 集群状态
  • 2. Elasticsearch集群部署
    • 2.1 系统配置修改
      • 2.1.1 修改文件句柄数和线程数
      • 2.1.2 修改虚拟内存
      • 2.1.3 关闭交换空间(Swap)
    • 2.2 下载es数据库并上传到服务器
    • 2.3 修改集群配置文件
      • 2.3.1 elasticsearch.yml配置项说明
      • 2.3.2 修改node1节点配置信息
      • 2.3.2 修改node2节点配置信息
      • 2.3.3 修改node3节点配置信息
    • 2.4 创建 Elasticsearch 用户和组
    • 2.5 设置目录权限
    • 2.6. 启动 Elasticsearch 服务
      • 2.6.1 配置启动内存(可选)
      • 2.6.2 创建启动和停止服务的脚本
    • 2.7 开放防火墙端口
      • CentOS
      • Ubuntu
    • 2.8 查看es启动状态

1. Elasticsearch集群架构

Elasticsearch集群是一个强大的搜索和分析引擎,由多个节点组成,每个节点都是一个独立的Elasticsearch实例。这些节点协同工作,共同构建一个高度可用和可扩展的搜索引擎。本文将深入探讨Elasticsearch集群的架构和部署,包括主节点、数据节点、客户端节点、分片以及节点间的通信方式。

主节点

在Elasticsearch集群中,有一个节点被指定为主节点。主节点的主要任务是集群管理和协调工作。以下是主节点的一些关键职责:

  1. 维护集群状态: 主节点负责维护整个集群的状态,包括节点列表、索引元数据和分片状态等。

  2. 负责集群重平衡: 当新的节点加入或旧的节点退出集群时,主节点会负责重新平衡集群,确保分片被适当地重新分配给节点,以保持负载均衡

  3. 执行集群级别操作: 主节点可以执行集群级别的操作,例如创建或删除索引、设置索引级别的设置等。

  4. 监控节点状态: 主节点监控集群中的各个节点的状态,及时检测节点是否正常工作。

在一个集群中,只能有一个主节点。如果主节点出现故障,Elasticsearch会自动选举一个新的主节点来接管工作,确保集群的稳定运行。

数据节点

数据节点的主要责任是存储和处理数据。当客户端向集群发起搜索请求时,数据节点会根据请求查询本地数据并返回结果。每个数据节点都负责存储集群中的一部分数据。当新的数据被索引时,数据节点会将数据分配给相应的分片,并将分片存储在本地磁盘上。如果数据节点发生故障,集群中的其他节点会接管该节点的工作,确保数据的可用性和冗余备份。

客户端节点

客户端节点不存储数据,它们的主要作用是向集群发送查询请求,并将查询结果返回给客户端应用程序

客户端节点具有以下两个关键作用:

  1. 负载均衡: 客户端节点可以将查询请求分配给不同的数据节点,实现负载均衡,提高查询性能。

  2. 故障切换: 如果某个数据节点出现故障,客户端节点可以自动将查询请求切换到其他健康的节点,确保服务的可用性。

分片

在Elasticsearch集群中,数据被分成多个分片进行存储和管理。每个分片是一个独立的Lucene索引,包含了一部分数据和索引信息。分片可以在集群中的不同节点之间进行分配和复制,以实现高可用性和数据冗余

每个索引都可以被分成多个主分片和多个副本分片。主分片是索引的基本单元,包含数据的一部分和索引信息。每个主分片都是独立的Lucene索引,可以在集群中的任何节点上存储。副本分片是主分片的拷贝,用于提高查询效率和可用性。

分片的数量在索引创建时指定,并且一旦创建后就不能更改。通常情况下,主分片的数量应该与集群中的数据节点数量相匹配,以确保每个节点都能存储一定数量的分片。

节点间通信

在Elasticsearch集群中,节点之间通过网络进行通信。每个节点都有一个唯一的节点名称,节点名称由Elasticsearch自动生成。节点名称通常采用以下格式:

<host>-<uuid>

其中,host是节点所在的主机名,uuid是一个唯一的标识符,用于确保节点名称的唯一性。

节点之间的通信可以通过两种方式进行:HTTP协议和Transport协议。HTTP协议是Elasticsearch的默认协议,用于处理RESTful API请求。Transport协议是Elasticsearch集群内部使用的协议,用于节点之间的直接通信。

集群状态

Elasticsearch集群的状态可以分为以下三种:

  • Green: 集群正常,所有主分片和副本分片都可用。

  • Yellow: 集群部分可用,所有主分片都可用,但一些副本分片不可用。

  • Red: 集群不可用,至少有一个主分片不可用。

当Elasticsearch集群中的节点发生故障时,主节点会自动将故障节点从集群中移除,并将分配给该节点的分片重新分配给其他节点。一旦故障节点恢复正常

,它会重新加入集群,并重新分配分片,确保数据的完整性和可用性。

Elasticsearch的集群架构为大规模数据存储和搜索提供了高度可扩展性和可用性,使其成为处理复杂搜索和分析需求的理想选择。通过理解集群架构的不同组件和角色,可以更好地规划和管理Elasticsearch集群,以满足业务需求。

2. Elasticsearch集群部署

2.1 系统配置修改

2.1.1 修改文件句柄数和线程数

为了防止 Elasticsearch 用户拥有的可创建文件描述符权限过低而导致错误,需要修改文件句柄数和线程数。编辑 /etc/security/limits.conf 文件并添加以下内容:

# 文件句柄
es  soft nofile 65536
es  hard nofile 65536
# 线程
es  soft nproc 4096
es  hard nproc 4096

保存退出后,需要重新启动系统

以上配置是为了解决:

报错问题:max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
问题描述:elasticsearch用户拥有的可创建文件描述的权限太低,至少需要65536;

2.1.2 修改虚拟内存

编辑 /etc/sysctl.conf 文件并添加以下内容:

vm.max_map_count=262144

保存退出后,刷新配置文件:

sysctl -p

验证是否修改成功:

sysctl vm.max_map_count

以上配置是为了解决:
报错问题:max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

2.1.3 关闭交换空间(Swap)

官方建议:把内存的一半给Lucene+不要超过32G+关闭swap
ES建议要关闭 swap 内存交换空间,禁用swapping。因为当内存交换到磁盘上,一个100微秒的操作可能变成 10毫秒,然后100 微秒的操作时延累加起来,可以看出 swapping 对于性能的影响是致命的

vim /etc/fstab

注释含有swap一行
在这里插入图片描述
注释前:
在这里插入图片描述

保存退出后需要系统重启!

注释后:
在这里插入图片描述

2.2 下载es数据库并上传到服务器

下载 Elasticsearch 7.17.11,上传到服务器,并使用以下命令解压 Elasticsearch:

cd /mnt/data/es-cluster
tar -zxvf elasticsearch-7.17.11-linux-x86_64.tar.gz

复制3份,分别命名如下:
在这里插入图片描述

2.3 修改集群配置文件

2.3.1 elasticsearch.yml配置项说明

配置项配置说明配置示例
cluster.name集群名称es-cluster
node.name节点名称node1
path.data数据目录/home/es/path/node/data
path.logs日志目录/home/es/path/node/logs
node.name节点名称node1
network.host绑定IP地址127.0.0.1
http.port指定服务访问端口9201
transport.tcp.port指定API端户端调用端口9301
discovery.seed_hosts集群通讯地址[“127.0.0.1:9301”, “127.0.0.1:9301:9302”, “127.0.0.1:9301:9303”]
cluster.initial_master_nodes集群初始化能够参选的节点信息[“127.0.0.1:9301”, “127.0.0.1:9301:9302”, “127.0.0.1:9301:9303”]
http.cors.enabled开启跨域访问支持true
http.cors.allow-origin跨域访问允许的域名“*”

端口分配如下:

主机节点名称HTTP端口Transport端口
192.168.0.119node192019301
192.168.0.119node292029302
192.168.0.119node392039303

2.3.2 修改node1节点配置信息

vim /mnt/data/es-cluster/elasticsearch-7.17.11-node1/config/elasticsearch.yml

elasticsearch.yml

# 集群名称
cluster.name: es-cluster
#节点名称
node.name: node1
# 绑定IP地址
network.host: 192.168.0.119
# 数据目录
path.data: /mnt/data/es-cluster/elasticsearch-7.17.11-node1/data
# 日志目录
path.logs: /mnt/data/es-cluster/elasticsearch-7.17.11-node1/logs
# 指定服务访问端口
http.port: 9201
# 指定API端户端调用端口
transport.tcp.port: 9301
#集群通讯地址
discovery.seed_hosts: ["192.168.0.119:9301", "192.168.0.119:9302","192.168.0.119:9303"]
#集群初始化能够参选的节点信息
cluster.initial_master_nodes: ["192.168.0.119:9301", "192.168.0.119:9302","192.168.0.119:9303"]
#开启跨域访问支持,默认为false
http.cors.enabled: true
##跨域访问允许的域名, 允许所有域名
http.cors.allow-origin: "*"
# 单机启动es实例的个数
node.max_local_storage_nodes: 3

2.3.2 修改node2节点配置信息

vim /mnt/sdb/es-cluster/elasticsearch-7.17.11-node2/config/elasticsearch.yml

elasticsearch.yml

# 集群名称
cluster.name: es-cluster
#节点名称
node.name: node2
# 绑定IP地址
network.host: 192.168.0.119
# 数据目录
path.data: /mnt/data/es-cluster/elasticsearch-7.17.11-node2/data
# 日志目录
path.logs: /mnt/data/es-cluster/elasticsearch-7.17.11-node2/logs
# 指定服务访问端口
http.port: 9202
# 指定API端户端调用端口
transport.tcp.port: 9302
#集群通讯地址
discovery.seed_hosts: ["192.168.0.119:9301", "192.168.0.119:9302","192.168.0.119:9303"]
#集群初始化能够参选的节点信息
cluster.initial_master_nodes: ["192.168.0.119:9301", "192.168.0.119:9302","192.168.0.119:9303"]
#开启跨域访问支持,默认为false
http.cors.enabled: true
##跨域访问允许的域名, 允许所有域名
http.cors.allow-origin: "*"
# 单机启动es实例的个数
node.max_local_storage_nodes: 3

2.3.3 修改node3节点配置信息

vim /mnt/sdb/es-cluster/elasticsearch-7.17.11-node3/config/elasticsearch.yml

elasticsearch.yml

# 集群名称
cluster.name: es-cluster
#节点名称
node.name: node3
# 绑定IP地址
network.host: 192.168.0.119
# 数据目录
path.data: /mnt/data/es-cluster/elasticsearch-7.17.11-node3/data
# 日志目录
path.logs: /mnt/data/es-cluster/elasticsearch-7.17.11-node3/logs
# 指定服务访问端口
http.port: 9203
# 指定API端户端调用端口
transport.tcp.port: 9303
#集群通讯地址
discovery.seed_hosts: ["192.168.0.119:9301", "192.168.0.119:9302","192.168.0.119:9303"]
#集群初始化能够参选的节点信息
cluster.initial_master_nodes: ["192.168.0.119:9301", "192.168.0.119:9302","192.168.0.119:9303"]
#开启跨域访问支持,默认为false
http.cors.enabled: true
##跨域访问允许的域名, 允许所有域名
http.cors.allow-origin: "*"
# 单机启动es实例的个数
node.max_local_storage_nodes: 3

2.4 创建 Elasticsearch 用户和组

创建一个名为 “es” 的用户和一个名为 “es” 的群组,然后将用户添加到该群组中:

# 新建群组es
 groupadd es
# 新建用户es并指定群组为es
 useradd -g es es
# 设置用户密码 
 passwd es  
# usermod 将用户添加到某个组group
 usermod -aG root es

2.5 设置目录权限

设置 Elasticsearch 集群目录所属的用户和组:

chown -R es:es /mnt/data/es-cluster

2.6. 启动 Elasticsearch 服务

2.6.1 配置启动内存(可选)

如果单机的内存大小有限,可以设置es的启动内存大小。分别进入三个节点的/config目录,执行 vim jvm.options,修改配置

-Xms512m
-Xmx512m

在这里插入图片描述

2.6.2 创建启动和停止服务的脚本

三个es节点创建启动和停止 Elasticsearch 服务的脚本
注意当前目录是在 ../elasticsearch-7.17.11-node1

  • startes-single.sh

    #!/bin/bash
    cd "$(dirname "$0")"
    # -d:后台(daemon)方式运行 Elasticsearch
    ./bin/elasticsearch -d -p pid
    
  • stopes-single.sh

    #!/bin/bash
    cd "$(dirname "$0")"
    if [ -f "pid" ]; then
      pkill -F pid
    fi
    
  • 赋予执行权限:

    chmod 755 startes-single.sh stopes-single.sh
    chown es:es startes-single.sh stopes-single.sh
    
  • 以 Elasticsearch 用户身份启动 Elasticsearch 服务:

    su es
    cd /mnt/sdb/es-cluster/elasticsearch-7.17.11-node1
    ./startes-single.sh
    

可能的报错:

  1. failed to obtain node locks, tried [[/mnt/sdb/es-cluster/elasticsearch-7.17.11-node2/data]] with lock id [0]; maybe these locations are not writable or multiple nodes were started without increasing
][ERROR][o.e.b.ElasticsearchUncaughtExceptionHandler] [node2] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: java.lang.IllegalStateException: failed to obtain node locks, tried [[/mnt/sdb/es-cluster/elasticsearch-7.17.11-node2/data]] with lock id [0]; maybe these locations are not writable or multiple nodes were started without increasing [node.max_local_storage_nodes] (was [1])?
        at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:173) ~[elasticsearch-7.17.11.jar:7.17.11]
        at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:160) ~[elasticsearch-7.17.11.jar:7.17.11]
        at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:77) ~[elasticsearch-7.17.11.jar:7.17.11]
        at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:112) ~[elasticsearch-cli-7.17.11.jar:7.17.11]
        at org.elasticsearch.cli.Command.main(Command.java:77) ~[elasticsearch-cli-7.17.11.jar:7.17.11]
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:125) ~[elasticsearch-7.17.11.jar:7.17.11]
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:80) ~[elasticsearch-7.17.11.jar:7.17.11]
Caused by: java.lang.IllegalStateException: failed to obtain node locks, tried [[/mnt/sdb/es-cluster/elasticsearch-7.17.11-node2/data]] with lock id [0]; maybe these locations are not writable or multiple nodes were started without increasing [node.max_local_storage_nodes] (was [1])?
        at org.elasticsearch.env.NodeEnvironment.<init>(NodeEnvironment.java:328) ~[elasticsearch-7.17.11.jar:7.17.11]
        at org.elasticsearch.node.Node.<init>(Node.java:429) ~[elasticsearch-7.17.11.jar:7.17.11]
        at org.elasticsearch.node.Node.<init>(Node.java:309) ~[elasticsearch-7.17.11.jar:7.17.11]
        at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:234) ~[elasticsearch-7.17.11.jar:7.17.11]
        at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:234) ~[elasticsearch-7.17.11.jar:7.17.11]
        at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:434) ~[elasticsearch-7.17.11.jar:7.17.11]
        at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:169) ~[elasticsearch-7.17.11.jar:7.17.11]
        ... 6 more
uncaught exception in thread [main]
java.lang.IllegalStateException: failed to obtain node locks, tried [[/mnt/sdb/es-cluster/elasticsearch-7.17.11-node2/data]] with lock id [0]; maybe these locations are not writable or multiple nodes were started without increasing [node.max_local_storage_nodes] (was [1])?
        at org.elasticsearch.env.NodeEnvironment.<init>(NodeEnvironment.java:328)
        at org.elasticsearch.node.Node.<init>(Node.java:429)
        at org.elasticsearch.node.Node.<init>(Node.java:309)
        at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:234)
        at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:234)
        at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:434)
        at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:169)
        at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:160)
        at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:77)
        at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:112)
        at org.elasticsearch.cli.Command.main(Command.java:77)
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:125)
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:80)

解决: 配置文件中增加:node.max_local_storage_nodes: 3
这个配置限制了单节点上可以开启的ES存储实例的个数。单机需要启动多个实例就需要把这个配置写到配置文件中,并为这个配置赋值为2或者更高

2.7 开放防火墙端口

CentOS

# 查看防火墙状态
systemctl status firewalld
# 查看开放的端口
firewall-cmd --query-port=9200/tcp
# 添加端口
firewall-cmd --zone=public --add-port=9200/tcp --permanent
# 重载防火墙
firewall-cmd --reload
# 再次查看端口是否已经开放
firewall-cmd --query-port=9200/tcp

Ubuntu

# 查看防火墙状态
sudo ufw status
# 开放端口 9200
sudo ufw allow 9200/tcp
# 查看已添加的规则
sudo ufw status numbered
# 查看防火墙状态
sudo ufw status

2.8 查看es启动状态

  1. 分别访问三个节点的http端口
    在这里插入图片描述
  2. 查看节点状态
http://192.168.0.119:9201/_cat/nodes?pretty

可以看到三个节点信息,三个节点会自行选举出主节点(ES的是基于Bully选举算法做的改进实现)
在这里插入图片描述

  1. 查看集群健康状态
http://192.168.0.119:9201/_cluster/health?pretty

在这里插入图片描述

4.elasticsearch header查看

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1053847.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业部署,springboot+vue+vue,Linux上部署mysql与redis,docker中部署nginx,jenkins。完整详细。

企业项目部署全流程笔记 前言 涉及&#xff1a;Linux服务器&#xff0c;docker&#xff0c;Jenkins&#xff0c;nginx&#xff0c;springoot&#xff0c;vue&#xff0c;mysql&#xff0c;redis&#xff0c;git&#xff0c; docker生成容器类型&#xff1a;MySql&#xff0c…

5G消息发展的前景与挑战

随着5G技术的快速发展和普及&#xff0c;5G消息正逐渐成为全球通信领域的新焦点。 随着5G技术的快速发展和普及&#xff0c;5G消息正逐渐成为全球通信领域的新焦点。 5G消息发展呈现规模化、产业化趋势 自2020年4月国内三大运营商联合发布5G消息白皮书以来&#xff0c;已经过…

Ubuntu20.04.1编译qt6.5.3版mysql驱动

下载qtbase6.5.3源码&#xff0c;将plugin中sqldrivers源码拷至于项目工程中&#xff0c;使用qtcreator打开文件 1、下载mysql开发库 sudo apt-get update sudo apt-get install build-essential libmysqlclient-dev 2、在msyql子目录中CMakeLists.txt第一行添加头文件、引…

面试必考精华版Leetcode236. 二叉树的最近公共祖先

题目&#xff1a; 代码(首刷看解析 10.1&#xff09;&#xff1a; class Solution { public:TreeNode* ansnullptr;bool FindSon(TreeNode* root,TreeNode* p,TreeNode* q){if(root nullptr) return false;bool lson FindSon(root->left,p,q);bool rson FindSon(root-&…

力扣 -- 712. 两个字符串的最小ASCII删除和

解题过程&#xff1a; 参考代码&#xff1a; class Solution { public:int minimumDeleteSum(string s1, string s2) {int ms1.size();int ns2.size();//求两个字符串的总ASCII和int sum0;for(const auto& e:s1){sume;}for(const auto& e:s2){sume;}//多开一行&#x…

数据结构与算法-(6)---栈的应用-(2)进制转换

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

基于STM32设计的智能化钻杆系统(华为云IOT)

一、项目引言 在现代石油、天然气等资源勘探和开采过程中,钻井是一项关键的工艺。为了提高钻井作业的准确性和效率,我们设计了一种基于STM32的智能化钻杆系统。该系统利用先进的控制和通信技术,实现了远程控制管子的转动和移动角度,并通过管子设备端的OLED显示屏显示接收到…

Docker从认识到实践再到底层原理(八)|Docker网络

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…

WiFi网络分析工具Airtool for Mac

Airtool是一款Mac平台上的WiFi网络分析工具&#xff0c;它可以帮助用户监测、分析和管理无线网络。 以下是Airtool的一些主要功能和特点&#xff1a; 实时监测&#xff1a;Airtool可以实时监测当前Mac设备所连接的WiFi网络&#xff0c;包括网络速度、信号强度、连接状态等。信…

Linux CentOS7 vim重复行

在用vim编辑处理文件时&#xff0c;会有重复行。有的是情境需要&#xff0c;有的可能是误操作而形成。对于正常形成的重复行&#xff0c;我们不作讨论&#xff0c;我们仅讨论什么情况下会出现重复行&#xff0c;如何避免&#xff0c;如何处理。 在文件中的单行或多个连续空白行…

Docker从认识到实践再到底层原理(九)|Docker Compose 容器编排

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…

每日一练-Q1-大数加法-20231001

目录 1.题目描述 2.输入描述 3.示例提示 4.问题分析 5.通过代码 1.题目描述 大数一直是一个c语言的一个难题。 现在我们需要你手动模拟出大数加法过程。 请你给出两个大整数加法结果。 2.输入描述 第一行输入整数n&#xff0c;第二行输入整数m。 (1<number<1e100)…

Leetcode 224. 基本计算器

文章目录 题目代码&#xff08;10.1 首刷看解析&#xff09; 题目 Leetcode 224. 基本计算器 代码&#xff08;10.1 首刷看解析&#xff09; class Solution { public:int calculate(string s) {stack<int> sk; // 存储正负号sk.push(1);int sign 1;int res 0;int i…

优维低代码实践:应用级配置

优维低代码技术专栏&#xff0c;是一个全新的、技术为主的专栏&#xff0c;由优维技术委员会成员执笔&#xff0c;基于优维7年低代码技术研发及运维成果&#xff0c;主要介绍低代码相关的技术原理及架构逻辑&#xff0c;目的是给广大运维人提供一个技术交流与学习的平台。 优维…

【Vue】Vuex详解,一文读懂并使用Vuex

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《ELement》。&#x1f3af;&#x1f3af; &#x1…

一图带你了解封装与分用

一、前缀知识 IP地址&#xff1a;用于定位主机的网络地址。 端口号&#xff1a;区分主机上不同的应用程序。 协议&#xff1a;描述了网络通信传输的数据的含义。 二、TCP/IP五层网络模型 物理层&#xff1a;描述了网络通信中基础设施的规范。 数据链路层&#xff1a;相邻节点之…

fcntl函数 非阻塞轮询

fcntl&#xff08;&#xff09; 在打开的文件描述符 FD 上执行下面描述的操作之一。 操作由 cmd 确定。 fcntl&#xff08;&#xff09; 可以采用可选的第三个参数。 是否需要此参数由 cmd 确定。 所需的参数类型在后面的括号中指示。 每个cmd名称&#xff08;在大多数情况下&…

公众号迁移是什么?

公众号账号迁移的作用是什么&#xff1f;只能变更主体吗&#xff1f;微信公众平台的帐号迁移功能可将原公众号的粉丝、文章素材、违规记录、留言功能、名称等迁移至新的公众号。通过迁移可以实现公众号的公司主体变更、粉丝转移、开通留言功能、服务号转为订阅号等作用。因此不…

博弈论——劳资博弈

劳资博弈 0 引言 前一篇文章介绍了静态博弈中常见的几个案例以及场景&#xff0c;并且在此之前也还介绍过斯塔克尔伯格博弈等动态博弈&#xff0c;以及相关的解决方法——反应函数法。今天我们继续介绍一个常见的动态博弈——劳资博弈&#xff0c;并利用反应函数解决&#xff…

视觉人机器视觉线下培训遵循十大原则

1.​上课期间&#xff0c;自习时间没收手机&#xff0c;偷偷使用手机&#xff0c;将会被通报严重批评。 2.完善的教学设备&#xff0c;与具备现场落地设备要求。 3.教学与实操结合&#xff0c;老师教学的同时&#xff0c;要求你按照老师的效果&#xff0c;进行复现&#xff0…