Elasticsearch-8.11.1 (2+1)HA(高可用)集群部署

目录

一、环境描述

二、安装 ES

2.1 下载Elasticsearch

2.2 解压Elasticsearch

2.3 创建es服务账号/密码

2.3 修改服务器配置

2.4 配置节点

2.4.1 配置说明

2.4.2 配置高可用集群

2.4.2.1 maser节点服务配置

2.4.2.2 node1 节点服务配置

2.4.2.3 node2 节点服务配置

2.4.2.3 node3 节点服务配置

2.4.2.3 node4 节点服务配置

2.4.3 服务启动

2.4.4 验证服务启动有没有成功

2.4.4.1 ps查看有没有es进程

2.4.4.2 访问服务

三、部署Kibana

3.1 下载Kibana

3.2 解压

3.3 配置Kibana

3.4  给账号密码做目录授权

3.5 启动服务

3.6 访问Kibana

四、安装Head 插件

4.1 下载Head插件

4.2 修改Gruntfile.js文件

4.3 修改ES配置文件

4.3 安装head 服务

4.4 启动服务

4.5 访问Head

五、ES集群安全

5.1 集群安全策略

5.1.1 版本支持

5.1.2 支持的策略

5.2 不同策略的实现

5.2.1 Minimal security(最低安全等级)配置

5.2.1.1 Minimal security配置步骤

5.2.1.1.1 启动Security

5.2.1.1.2 重启节点服务

5.2.1.1.2 创建用户密码

5.2.1.1.3 配置Kibana的账号信息

5.2.2 Basic security(基本安全等级)配置

5.2.2.1 适用范围和概念

5.2.2.2 配置步骤

5.2.2.2.1 配置文件 elasticsearch.yml

5.2.2.2.2 生成密钥文件

5.2.2.2.3 为节点颁发证书

5.2.2.2.4 把证书拷贝的每个节点

5.2.2.2.5 启动所有节点

5.2.2.2.6 设置集群密码

5.2.2.2.7 配置Kibana

5.2.3 基本安全+HTTPS

5.2.3.1 前置条件

5.2.3.2 配置步骤

5.2.3.2.1 保证每个节点的服务处于停止状态

5.2.3.2.2 生成证书签名文件

5.2.3.2.2.1 当询问您是否要生成 CSR 时,请输入 n

5.2.3.2.2.2 当询问您是否要使用现有 CA 时,输入 y

5.2.3.2.2.3 输入您的 CA 的路径

5.2.3.2.2.4 输入您的 CA 的密码

5.2.3.2.2.5 输入证书的到期值

5.2.3.2.2.6 当询问您是否要为每个节点生成一个证书时,输入 y

5.2.3.2.2.7 出现提示时,输入集群中第一个节点的名称

5.2.3.2.2.8 输入用于连接到您的第一个节点的所有主机名

5.2.3.2.2.9 输入客户端可用于连接到您的节点的 IP 地址

5.2.3.2.3 设置私钥密码

5.2.3.2.3.1 解压elasticsearch-ssl-http.zip文件

5.2.3.2.3.3 修改 elasticsearch.yml 文件

5.2.3.2.3.4 复制证书到config目录中

5.2.3.2.3.5 把私钥密码添加到 Elasticsearch 的安全设置中

5.2.3.3 启动节点服务

5.2.3.4 配置Kibana

5.2.3.4.1 拷贝证书到config下

5.2.3.4.2 修改Kibana配置


一、环境描述

系统环境描述:本教程基于CentOS 8.0版本虚拟机

es集群规划:

节点Master(主节点/候选节点)Master(紧选举)Data(数据节点)KibanaIP
master*192.168.31.215
node1*192.168.31.8
node2**192.168.31.9
node3*192.168.31.167
node4*192.168.31.154

软件版本:
Elasticsearch    8.11.1
kibana      8.11.1

二、安装 ES

2.1 下载Elasticsearch

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.11.1-linux-x86_64.tar.gz

2.2 解压Elasticsearch

tar -zxvf elasticsearch-8.11.1-linux-x86_64.tar.gz

mv  elasticsearch-8.11.1 /usr/local/

2.3 创建es服务账号/密码

#ES无法通过root账号启动服务
(elastic/xiaoning)
# 创建账号
useradd elastic

# 创建密码
passwd elastic

# 给账号密码做目录授权
chown -R elastic:elastic /usr/local/elasticsearch-8.11.1

2.3 修改服务器配置

vim  /etc/security/limits.conf

hard nofile 65536
soft nofile 65636
elastic soft memlock unlimited
elastic hard memlock unlimited

vim /etc/sysctl.conf

vm.max_map_count=262144
vm.swappiness=0
#重启
sysctl -p

ulimit -l unlimited

提示:以上操作,所有节点都需要操作

2.4 配置节点

2.4.1 配置说明

cluster.name:集群名称,节点根据集群名称确定是否是同一个集群。

node.name:节点名称,集群内唯一。

node.roles:[ data, master, voting_only ],node.roles配置项如果没有显式的配置,那么当前节点拥有所有角色(master、data、ingest、ml、remote_cluster_client、transform)。如果你放开了注释,或者手动显式添加了 node.roles配置项,那么当前节点仅拥有此配置项的中括号中显式配置的角色,没有配置的角色将被阉割。因此如果在不熟悉角色配置的情况下,不要轻易修改角色配置值, 切勿画蛇添足 。

network.host:节点对外提供服务的地址以及集群内通信的ip地址

bootstrap.memory_lock: Swapping对性能和节点稳定性非常不利,应该不惜一切代价避免。它可能导致GC持续几分钟而不是几毫秒,并且可能导致节点响应缓慢甚至与集群断开连接。在弹性分布式系统中,使用Swap还不如让操作系统杀死节点效果更好。可以通过设置 bootstrap.memory_lock: true 以防止任何 Elasticsearch 堆内存被换出。

http.port:对外提供服务的端口号

discovery.seed_hosts: 集群初始化的种子节点,可配置部分或全部候选节点,大型集群可通过嗅探器发现剩余节点,考试环境配置全部节点即可

cluster.initial_master_nodes:节点初始 active master节点, 必须是有master角色的节点,即必须是候选节点,但并不是必须配置所有候选节点。生产模式下启动新集群时,必须明确列出应在第一次选举中计算其选票的候选节点。第一次成功形成集群后,cluster.initial_master_nodes从每个节点的配置中删除设置。重新启动集群或向现有集群添加新节点时,请勿使用此设置。

2.4.2 配置高可用集群

2.4.2.1 maser节点服务配置
vim elasticsearch.yml

cluster.name: ning_cluster
node.name: ning_cluster_node-1
node.roles: [master]
path.data: /usr/local/elasticsearch-8.11.1/data
path.logs: /usr/local/elasticsearch-8.11.1/logs
bootstrap.memory_lock: true
network.host: 192.168.31.215
http.port: 9200
transport.port: 9300
xpack.security.enabled: false
discovery.seed_hosts: ["192.168.31.215:9300", "192.168.31.8:9300","192.168.31.9:9300", "192.168.31.167:9300","192.168.31.154:9300"]
cluster.initial_master_nodes: ["ning_cluster_node-1"]
2.4.2.2 node1 节点服务配置
vim elasticsearch.yml

cluster.name: ning_cluster
node.name: ning_cluster_node-2
node.roles: [master]
path.data: /usr/local/elasticsearch-8.11.1/data
path.logs: /usr/local/elasticsearch-8.11.1/logs
bootstrap.memory_lock: true
network.host: 192.168.31.8
http.port: 9200
transport.port: 9300
xpack.security.enabled: false
discovery.seed_hosts: ["192.168.31.215:9300", "192.168.31.8:9300","192.168.31.9:9300", "192.168.31.167:9300","192.168.31.154:9300"]
cluster.initial_master_nodes: ["ning_cluster_node-1"]
2.4.2.3 node2 节点服务配置
vim elasticsearch.yml

cluster.name: ning_cluster
node.name: ning_cluster_node-3
node.roles: [master,data,voting_only]
path.data: /usr/local/elasticsearch-8.11.1/data
path.logs: /usr/local/elasticsearch-8.11.1/logs
bootstrap.memory_lock: true
network.host: 192.168.31.9
http.port: 9200
transport.port: 9300
xpack.security.enabled: false
discovery.seed_hosts: ["192.168.31.215:9300", "192.168.31.8:9300","192.168.31.9:9300", "192.168.31.167:9300","192.168.31.154:9300"]
cluster.initial_master_nodes: ["ning_cluster_node-1"]
2.4.2.3 node3 节点服务配置
vim elasticsearch.yml

cluster.name: ning_cluster
node.name: ning_cluster_node-4
node.roles: [data]
path.data: /usr/local/elasticsearch-8.11.1/data
path.logs: /usr/local/elasticsearch-8.11.1/logs
bootstrap.memory_lock: true
network.host: 192.168.31.167
http.port: 9200
transport.port: 9300
xpack.security.enabled: false
discovery.seed_hosts: ["192.168.31.215:9300", "192.168.31.8:9300","192.168.31.9:9300", "192.168.31.167:9300","192.168.31.154:9300"]
cluster.initial_master_nodes: ["ning_cluster_node-1"]
2.4.2.3 node4 节点服务配置
vim elasticsearch.yml

cluster.name: ning_cluster
node.name: ning_cluster_node-5
node.roles: [data]
path.data: /usr/local/elasticsearch-8.11.1/data
path.logs: /usr/local/elasticsearch-8.11.1/logs
bootstrap.memory_lock: true
network.host: 192.168.31.154
http.port: 9200
transport.port: 9300
xpack.security.enabled: false
discovery.seed_hosts: ["192.168.31.215:9300", "192.168.31.8:9300","192.168.31.9:9300", "192.168.31.167:9300","192.168.31.154:9300"]
cluster.initial_master_nodes: ["ning_cluster_node-1"]

2.4.3 服务启动

#前台进程

./bin/elasticsearch

#后台启动 守护进程

./bin/elasticsearch -d

#推荐方式(保存进程号 不占用窗口,并且方便杀进程):

./bin/elasticsearch -d -p pid

2.4.4 验证服务启动有没有成功

2.4.4.1 ps查看有没有es进程
ps -ef|grep elastic
2.4.4.2 访问服务

直接浏览器输入:

http://192.168.31.8:9200/

出现以上内容则说明启动成功。

提示:所有节点都需要执行上述命令

三、部署Kibana

3.1 下载Kibana

wget https://artifacts.elastic.co/downloads/kibana/kibana-8.11.1-linux-x86_64.tar.gz

3.2 解压

tar -zxvf kibana-8.11.1-linux-x86_64.tar.gz

3.3 配置Kibana

server.port: 5601
server.host: "192.168.31.9"
elasticsearch.hosts: ["192.168.31.215:9200", "192.168.31.8:9200","192.168.31.9:9200", "192.168.31.167:9200","192.168.31.154:9200"]

3.4  给账号密码做目录授权

chown -R elastic:elastic /usr/local/kibana-8.11.1

3.5 启动服务

./bin/kibana

3.6 访问Kibana

浏览器直接访问:http://192.168.31.9:5601/

四、安装Head 插件

4.1 下载Head插件

https://github.com/mobz/elasticsearch-head

4.2 修改Gruntfile.js文件

#添加
hostname:'*',

4.3 修改ES配置文件

#ES配置文件中设置允许跨域
vim elasticsearch.yml

http.cors.enabled: true
http.cors.allow-origin: "*"

4.3 安装head 服务

进入 elasticsearch-head 解压目录,执行命令

npm install

4.4 启动服务

执行命令:

npm run start

4.5 访问Head

浏览器直接输入:http://localhost:9100

五、ES集群安全

5.1 集群安全策略

5.1.1 版本支持

不同版本对 Security 的支持不同,对于 ES 6.8 及之前版本,需要手动安装 x-pack,对于7.X以上版本 X-Pack 已经内置,所以不需要额外的操作。

5.1.2 支持的策略

不同环境对集群安全的策略等级要求不同,主要区别在于你是开发环境还是生产集群环境。ES提供了三个不同等级的安全策略:最低安全等级、基本安全等级、基本安全 + HTTPS
就实际而言,在处于 ES 学习 或者本地开发模式下,是可以关闭 Security 功能的,因为如果是以学习为目的,不存在所谓的数据安全问题,因为数据即便被删除也是没关系的。而如果在学习或开发模式下也开启安全策略,意味着你需要频繁的跟密码较劲,实属没必要。

5.2 不同策略的实现

5.2.1 Minimal security(最低安全等级)配置

5.2.1.1 Minimal security配置步骤
5.2.1.1.1 启动Security
vim vim elasticsearch.yml

xpack.security.enabled: true

5.2.1.1.2 重启节点服务
# kill -9 [pid]
./bin/elasticsearch -d -p pid

提示:单节点环境下,能启动成功,集群环境的安全策略最低要求配置成基本安全等级模式,所以这里是启动不了的,过不了集群的安全检查,会直接报错

5.2.1.1.2 创建用户密码
./bin/elasticsearch-setup-passwords interactive

提示:单节点环境下,可以按照这个步骤,集群环境下,需要完成Basic security(基本安全等级)配置后才能创建

5.2.1.1.3 配置Kibana的账号信息

提示:单节点环境下,可以按照这个步骤,集群环境下,需要完成Basic security(基本安全等级)配置后才能配置Kibana账号信息

5.2.2 Basic security(基本安全等级)配置

5.2.2.1 适用范围和概念

最低安全配置仅适用于单节点服务,而不符合集群的最低安全要求。如果集群有多个节点,那么您必须在节点之间配置 TLS。如果您不启用 TLS,无法启动生产集群。

传输层依赖双向 TLS 对节点进行加密和认证。正确应用 TLS 可确保恶意节点无法加入集群并与其他节点交换数据。虽然在 HTTP 层实现用户名和密码身份验证对于保护本地集群很有用,但节点之间的通信安全需要 TLS。

Transport 协议是 Elasticsearch 节点用于相互通信的协议的名称。此名称特定于 Elasticsearch,用于区分传输端口(默认 9300)和 HTTP 端口(默认 9200)。节点使用传输端口相互通信,REST 客户端使用 HTTP 端口与 Elasticsearch 通信。

5.2.2.2 配置步骤
5.2.2.2.1 配置文件 elasticsearch.yml
# 开启ssl访问请求头配置(head访问需要)
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type
#配置SSL证书
xpack.security.transport.ssl.enabled: true

#设置验证模式为:certificate
xpack.security.transport.ssl.verification_mode: certificate

#设置证书路径
xpack.security.transport.ssl.key: certs/elastic-certificates.key
xpack.security.transport.ssl.certificate: certs/elastic-certificates.crt
xpack.security.transport.ssl.certificate_authorities: certs/ca.crt
5.2.2.2.2 生成密钥文件

提示:

1、删除各个es节点$ELASTICSEARCH_HOME/config目录下的elasticsearch.keystore文件
2、清空各个es节点$ELASTICSEARCH_HOME/ 下的data和log目录

./bin/elasticsearch-certutil ca --pem --out ca.zip --days 36500 -s

5.2.2.2.3 为节点颁发证书
#解压ca.zip
unzip ca.zip

# 颁发证书
./bin/elasticsearch-certutil cert --ca-cert ca/ca.crt --ca-key ca/ca.key --pem --name elastic-certificates --out elastic-certificates.zip --days 36500 -s

5.2.2.2.4 把证书拷贝的每个节点

#每个节点的config文件夹下,新建一个certs目录

mkdir certs

#拷贝文件到节点的cert目录下

#解压证书文件
unzip elastic-certificates.zip
#拷贝到certs文件夹下
cp ca/* elastic-certificates/* config/certs

# 拷贝给其他机器
scp config/certs/* elastic@node1:/usr/local/elasticsearch-8.11.1/config/certs/

scp config/certs/* elastic@node2:/usr/local/elasticsearch-8.11.1/config/certs/

scp config/certs/* elastic@node3:/usr/local/elasticsearch-8.11.1/config/certs/

scp config/certs/* elastic@node4:/usr/local/elasticsearch-8.11.1/config/certs/
5.2.2.2.5 启动所有节点
5.2.2.2.6 设置集群密码
bin/elasticsearch-setup-passwords interactive

elastic xiaoning
apm_system xiaoning
kibana_system xiaoning
logstash_system xiaoning
beats_system xiaoning
remote_monitoring_user xiaoning

5.2.2.2.7 配置Kibana
# 配置账号密码
vim kibana.yml

elasticsearch.username: "kibana_system"
elasticsearch.password: "xiaoning"

5.2.3 基本安全+HTTPS

在生产环境中,如果没有基于HTTPS上启用 TLS,那么部分安全功能会无法使用,比如Token和API密钥。

官方文档参考:

Set up basic security for the Elastic Stack plus secured HTTPS traffic | Elasticsearch Guide [8.11] | Elastic

5.2.3.1 前置条件

启用 HTTPS 必须要配置集群 Security,即基础集群安全策略。

5.2.3.2 配置步骤
5.2.3.2.1 保证每个节点的服务处于停止状态
5.2.3.2.2 生成证书签名文件
./bin/elasticsearch-certutil http

提示:
此命令会生成一个 .zip文件,其中包含用于 Elasticsearch 和 Kibana 的证书和密钥。每个文件夹都包含一个 README.txt 解释如何使用这些文件。

5.2.3.2.2.1 当询问您是否要生成 CSR 时,请输入 n

5.2.3.2.2.2 当询问您是否要使用现有 CA 时,输入 y

5.2.3.2.2.3 输入您的 CA 的路径

elastic-stack-ca.p12这是您为集群生成 的文件的绝对路径

5.2.3.2.2.4 输入您的 CA 的密码
5.2.3.2.2.5 输入证书的到期值

您可以输入年、月或日的有效期。例如,输入 90D90 天.

5.2.3.2.2.6 当询问您是否要为每个节点生成一个证书时,输入 y

每个证书都有自己的私钥,并针对特定的主机名或 IP 地址颁发.

5.2.3.2.2.7 出现提示时,输入集群中第一个节点的名称

使用生成节点证书时使用的相同节点名称.

5.2.3.2.2.8 输入用于连接到您的第一个节点的所有主机名

这些主机名将作为 DNS 名称添加到证书的主题备用名称 (SAN) 字段中。
列出用于通过 HTTPS 连接到集群的每个主机名和变体

5.2.3.2.2.9 输入客户端可用于连接到您的节点的 IP 地址

到此,证书生成完成,可以看到生成的证书名称

5.2.3.2.3 设置私钥密码
5.2.3.2.3.1 解压elasticsearch-ssl-http.zip文件
unzip elasticsearch-ssl-http.zip

5.2.3.2.3.3 修改 elasticsearch.yml 文件
#启用 HTTPS
xpack.security.http.ssl.enabled: true
#指定 http.p12 安全证书的位置
xpack.security.http.ssl.keystore.path: http.p12
5.2.3.2.3.4 复制证书到config目录中
#拷贝到本机
cp elasticsearch/http.p12 config/
# 拷贝给其他机器

scp elasticsearch/http.p12 elastic@node1:/usr/local/elasticsearch-8.11.1/config/

scp elasticsearch/http.p12 elastic@node2:/usr/local/elasticsearch-8.11.1/config/

scp elasticsearch/http.p12 elastic@node3:/usr/local/elasticsearch-8.11.1/config/

scp elasticsearch/http.p12 elastic@node4:/usr/local/elasticsearch-8.11.1/config/
5.2.3.2.3.5 把私钥密码添加到 Elasticsearch 的安全设置中
#每个节点都需要执行,每个节点的密码可以设置的并不一样,生产环境可以做好密码记录,这里我为了方便,就设置一样了
./bin/elasticsearch-keystore add xpack.security.http.ssl.keystore.secure_password
输入密码:xiaoning
5.2.3.3 启动节点服务
5.2.3.4 配置Kibana
5.2.3.4.1 拷贝证书到config下
scp kibana/elasticsearch-ca.pem elastic@node2:/usr/local/kibana-8.11.1/config
5.2.3.4.2 修改Kibana配置
vim kibana.yml

elasticsearch.ssl.certificateAuthorities:[config/elasticsearch-ca.pem]

elasticsearch.hosts: ["https://192.168.31.215:9200", "https://192.168.31.8:9200","https://192.168.31.9:9200", "https://192.168.31.167:9200","https://192.168.31.154:9200"]

以上之后,kibana 与Elasticsearch之间的SSL加密通道传输就完成了。

好了,本次分享就到这里,如果帮助到大家,欢迎大家点赞+关注+收藏,有疑问也欢迎大家评论留言!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ARCGIS PRO SDK GeometryEngine处理独立几何图形

1、面积类:pol为Polygon 1).Area:获取几何图形的面积。这是使用二维笛卡尔数学来计算面积的平面测量 double d GeometryEngine.Instance.Area(pol) 2).GeodesicArea:获取几何图形的椭球面积 …

SLAM学习入门--机器学习

文章目录 机器学习逻辑回归(LR)基本原理为什么 LR 要使用 sigmoid 函数?LR 可以用核函数么?为什么 LR 用交叉熵损失而不是平方损失?LR 能否解决非线性分类问题?LR为什么要离散特征?逻辑回归是处…

【JavaScript】垃圾回收与内存泄漏

✨ 专栏介绍 在现代Web开发中,JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性,还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言,JavaScript具有广泛的应用场景&#x…

SPI机制原理+使用

一、概述 SPI全称(Service Provider Interface),是JDK内置的一种服务提供发现机制;SPI机制提供了组件发现和注册方式,可以为应用程序提供灵活的插件机制, 主要原理:接口 反射 配置文件。 二、…

软件测试/测试开发丨Python常用数据结构学习笔记

Python常用数据结构 list 列表 列表定义 列表是有序的可变元素的集合,使用中括号[]包围,元素之间用逗号分隔列表是动态的,可以随时扩展和收缩列表是异构的,可以同时存放不同类型的对象列表中允许出现重复元素 列表使用&#x…

python练习2【题解///考点列出///错题改正】

一、单选题 【文件】 *1.【单选题】 ——文件:读取方法 下列哪个选项可以从文件中读取任意字节的内容?(C )A A.read() B.readline() C.readlines() D.以上全部 A\B\C三种方法都是可以读取文件中任意的字节内容的&#xff0…

消息队列基础知识

学一点,整一点,基本都是综合别人的,弄成我能理解的内容 https://blog.csdn.net/BenJamin_Blue/article/details/125946812 https://blog.csdn.net/qq_46119575/article/details/129794304 📌导航小助手📌 生产者-消费者…

JS作用域:全局作用域,函数作用域,块级作用域

JS作用域:全局作用域,函数作用域,块级作用域 背景作用域全局作用域函数作用域块级作用域通过调用栈分析块级作用域开发者工具查看作用域选项卡示例 背景 由于 JavaScript 存在变量提升这种特性,从而导致很多与直觉不符的代码&…

详解数组的轮转

𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - :来于“云”的“羽球人”。…

Git 分布式版本控制系统(序章1)

第一章 Git 分布式版本控制系统 为什么学Git? 某些企业面试需要掌握Git,同时,也方便管理自己的Qt项目。 一、Git 客户端下载(Windows) 下载地址 https://gitee.com/all-about-git#git-%E5%A4%A7%E5%85%A8 二、Git 的特点 分支…

vue3引入百度地图(两种方法)

首先要有百度开放平台并进行注册&#xff0c;不懂看这里 ### 第一种方法 地图引入流程 安装vue-baidu-map-3x插件 参考官网地址&#xff1a;快速上手 | vue-baidu-map-3x npm install vue-baidu-map-3x --save 在public/index.html文件中引入 <!-- 百度地图 --> &…

微软开源,全平台通用:Shell 自动补全工具 | 开源日报 No.132

microsoft/inshellisense Stars: 7.6k License: MIT inshellisense 是一个为 Shell 提供 IDE 风格自动补全的工具。它是一个终端本地运行时自动完成&#xff0c;支持 600 多个命令行工具&#xff0c;并且可以在 Windows、Linux 和 macOS 上使用。主要功能包括安装后可通过运行…

HTML教程(1)——概述和第一个网页

一、什么是HTML HTML 是用来描述网页的一种语言。 HTML 指的是超文本标记语言 (Hyper Text Markup Language)HTML 不是一种编程语言&#xff0c;而是一种标记语言 (markup language)标记语言是一套标记标签 (markup tag)HTML 使用标记标签来描述网页 二、什么是HTML 标签 H…

设计模式:工厂方法模式(讲故事图文易懂)

目录 简单工厂工厂方法模式 简单工厂 定义&#xff1a;简单工厂由一个工厂根据参数类型决定创建哪种产品的实例。 简单工厂不包含在23种设计模式之内&#xff08;简单工厂不满足开闭原则&#xff0c;后面会详细讲&#xff09; 举例&#xff1a;张三去4S店买了车&#xff0c;显…

城市生态数据大屏,PSD设计稿

现分享生态系统可视化大数据大屏的 Photoshop 源文件&#xff0c;下载即用&#xff01;以下为截图示意。 若需 更多行业 相关的大屏&#xff0c;请移步小7的另一篇文章&#xff1a;200套精选数据可视化大屏&#xff0c;大屏PSD设计&#xff08;各行业大屏UI&#xff09;https:…

DevExpress 皮肤改变触发后触发的事件,用来保存皮肤配置

代码&#xff1a; private UserLookAndFeel userLookAndFeel; public MainGeneral() {InitializeComponent();// 创建 UserLookAndFeel 实例userLookAndFeel new UserLookAndFeel(this);// 订阅 StyleChanged 事件userLookAndFeel.StyleChanged UserLookAndFeel_StyleChange…

UDP套接字搭建简易服务器与客户端

使用UDP套接字搭建 文章目录 使用UDP套接字搭建前言一、基本结构二、使用步骤1.服务器端2.客户端 三、效果展示总结 前言 这次较上个版本《Python 网络编程之搭建简易服务器和客户端》https://only-me.blog.csdn.net/article/details/135251171增加了&#xff1a; UDP协议来进…

1.PHP简单入门

1.PHP代码执行方式 PHP是在服务器端执行&#xff0c;然后返回给用户结果。 如果直接使用浏览器打开&#xff0c;就会解析为文本。 意思是说&#xff0c;浏览器通过 http请求&#xff0c;才能够执行php页面。 2.PHP代码框架 开启本机服务器&#xff08;下载软件略&#xff09…

数据结构: 位图

位图 概念 用一个bit为来标识数据在不在 功能 节省空间快速查找一个数在不在一个集合中排序 去重求两个集合的交集,并集操作系统中的磁盘标记 简单实现 1.设计思想:一个bit位标识一个数据, 使用char(8bit位)集合来模拟 2.预备工作:a.计算这个数在第几个char b.是这个ch…

全球日光地图分布地图数据

日光地图分布地图数据 Daylight 是全球开放地图数据的完整分发版&#xff0c;可在社区和专业地图制作者的支持下免费获取。我们将 OpenStreetMap 等项目的全球贡献者的工作与日光制图合作伙伴的质量和一致性检查结合起来&#xff0c;创建免费、稳定且易于使用的街道比例全球地…