i️ 此存储库包含有关各种技术主题的问题和练习,有时与 DevOps 和 SRE 相关
开发运营 |
吉特 |
网络 |
硬件 |
Kubernetes |
软件开发 |
蟒 |
去 |
佩尔 |
正则表达式 |
云 |
自主技术 |
天蓝色 |
谷歌云平台 |
开放堆栈 |
操作系统 |
Linux目录 |
虚拟化 |
域名解析 |
外壳脚本 |
数据库 |
.SQL |
蒙戈 |
测试 |
大数据 |
CI/CD |
证书 |
器皿 |
开放移位 |
存储 |
大地形态 |
木偶 |
分散式 |
你可以提出的问题 |
安斯布尔 |
可观察性 |
普罗 米修斯 |
圈子CI |
格拉法纳 |
|
阿尔戈 |
软技能 |
安全 |
系统设计 |
|
混沌工程 |
杂项 |
弹性的 |
卡 夫 卡 |
以太网仅指当今最常用的局域网(LAN)类型。与跨越较大地理区域的 WAN(广域网)相比,LAN 是位于小区域(如办公室、大学校园甚至家庭)的计算机连接网络。
MAC 地址是用于标识网络上各个设备的唯一标识号或代码。
在以太网上发送的数据包始终来自 MAC 地址并发送到 MAC 地址。如果网络适配器正在接收数据包,则会将数据包的目标 MAC 地址与适配器自己的 MAC 地址进行比较。
当设备将数据包发送到广播 MAC 地址 (FF:FF:FF:FF:FF) 时,该数据包将传送到本地网络上的所有站点。以太网广播用于在数据链路层将 IP 地址解析为 MAC 地址(通过 ARP)。
互联网协议地址(IP 地址)是分配给连接到使用互联网协议进行通信的计算机网络的每个设备的数字标签。IP 地址有两个主要功能:主机或网络接口识别和位置寻址。
子网掩码是一个 32 位数字,用于屏蔽 IP 地址并将 IP 地址划分为网络地址和主机地址。子网掩码是通过将网络位设置为所有“1”并将主机位设置为所有“0”来实现的。在给定的网络中,在总可用主机地址中,有两个始终保留用于特定目的,不能分配给任何主机。这些是保留为网络地址(也称为网络 ID)的第一个地址,也是用于网络广播的最后一个地址。
你可以在 penguintutor.com 中阅读有关 OSI 模型的更多信息
单播:一对一通信,其中有一个发送方和一个接收方。
广播:向网络中的每个人发送消息。地址 ff:ff:ff:ff:ff:ff 用于广播。使用广播的两种常见协议是ARP和DHCP。
多播:向一组订阅者发送消息。它可以是一对多或多对多。
CSMA/CD 代表 载波检测多址/碰撞检测。它的主要重点是管理对共享介质/总线的访问,其中只有一个主机可以在给定的时间点进行传输。
CSMA/CD 算法:
路由器、交换机和集线器都是用于连接局域网 (LAN) 中的设备的网络设备。但是,每个设备的运行方式不同,并且有其特定的用例。以下是每个设备的简要说明以及它们之间的差异:
三个冲突域和一个广播域
路由器是在两个或多个分组交换计算机网络之间传递信息的物理或虚拟设备。路由器检查给定数据包的目标 Internet 协议地址(IP 地址),计算其到达目的地的最佳方式,然后相应地转发它。
网络地址转换 (NAT) 是将一个或多个本地 IP 地址转换为一个或多个全局 IP 地址的过程,反之亦然,以便为本地主机提供 Internet 访问。
代理服务器充当你和互联网之间的网关。它是一个中间服务器,将最终用户与他们浏览的网站分开。
如果你使用的是代理服务器,则互联网流量会流经代理服务器到达你请求的地址。然后,请求通过同一代理服务器返回(此规则有例外),然后代理服务器将从网站接收的数据转发给你。
代理服务器提供不同级别的功能、安全性和隐私,具体取决于你的用例、需求或公司策略。
TCP 3 向握手或 TCP/IP 网络中用于在服务器和客户端之间建立连接的过程。
三次握手主要用于创建 TCP 套接字连接。它在以下情况下有效:
TCP在客户端和服务器之间建立连接以保证包的顺序,另一方面,UDP不会在客户端和服务器之间建立连接,也不处理包订单。这使得UDP比TCP更轻量级,并且是流等服务的完美候选者。
Penguintutor.com 提供了一个很好的解释。
默认网关充当接入点或 IP 路由器,联网计算机使用该接入点或 IP 路由器将信息发送到另一个网络或 Internet 中的计算机。
ARP 代表 地址解析协议。当你尝试 ping 本地网络上的 IP 地址(例如 192.168.1.1)时,你的系统必须将 IP 地址 192.168.1.1 转换为 MAC 地址。这涉及使用 ARP 解析地址,因此得名。
系统保留一个 ARP 查找表,其中存储有关哪些 IP 地址与哪些 MAC 地址关联的信息。当尝试将数据包发送到 IP 地址时,系统将首先查阅此表以查看它是否已经知道 MAC 地址。如果缓存了值,则不使用 ARP。
它代表动态主机配置协议,并将 IP 地址、子网掩码和网关分配给主机。这是它的工作原理:
在此处阅读更多内容
在同一网络上可以有两个DHCP服务器,但是,不建议这样做,并且仔细配置它们以防止冲突和配置问题非常重要。
以下是 SSL 隧道的工作原理:
我们应该考虑使用 IPv6 而不是 IPv4 有几个原因:
MTU 代表 最大传输单位。它是可以在单个事务中发送的最大 PDU(协议数据单元)的大小。
使用 IPv4 协议,路由器可以对 PDU 进行分段,然后通过事务发送所有分段的 PDU。
使用 IPv6 协议时,它会向用户的计算机发出错误。
假。Ping实际上使用的是ICMP(互联网控制消息协议),这是一种网络协议,用于发送诊断消息和控制与网络通信相关的消息。
ICMP 消息用于多种用途,包括:
NAT 代表 网络地址转换。这是一种在传输信息之前将多个本地专用地址映射到公共地址的方法。希望多个设备使用单个 IP 地址的组织使用 NAT,大多数家用路由器也是如此。例如,你计算机的专用 IP 可能是 192.168.1.100,但你的路由器将流量映射到其公共 IP(例如 1.1.1.1)。互联网上的任何设备都会看到来自你的公共 IP (1.1.1.1) 而不是你的私有 IP (192.168.1.100) 的流量。
有几个因素会影响网络性能,包括:
APIPA 是一组 IP 地址,当无法访问主 DHCP 服务器时,设备将分配这些地址
APIPA使用的IP范围:169.254.0.1 - 169.254.255.254。
控制平面是网络的一部分,用于决定如何将数据包路由和转发到其他位置。
数据平面是实际转发数据/数据包的网络的一部分。
它指的是监视和管理功能。
控制平面。
OSPF(开放最短路径优先)是一种路由协议,可以在各种类型的路由器上实现。通常,大多数现代路由器都支持 OSPF,包括思科、瞻博网络和华为等供应商的路由器。该协议旨在与基于 IP 的网络(包括 IPv4 和 IPv6)配合使用。此外,它使用分层网络设计,其中路由器被分组到区域中,每个区域都有自己的拓扑图和路由表。这种设计有助于减少需要在路由器之间交换的路由信息量,并提高网络可扩展性。
OSPF 4 类型的路由器包括:
了解有关 OSPF 路由器类型的更多信息:https://www.educba.com/ospf-router-types/
延迟是信息从源到达目的地所花费的时间。
带宽是通信通道衡量后者在特定时间段内可以处理多少数据的能力。更多的带宽意味着更多的流量处理,从而更多的数据传输。
吞吐量是指对特定时间段内通过任何传输通道传输的实际数据量的测量。
延迟。为了获得良好的延迟,应将搜索查询转发到最近的数据中心。
吞吐量。为了获得良好的吞吐量,应将上传流路由到未充分利用的链路。
当网络上要传输的数据太多并且没有足够的容量来处理需求时,就会发生网络拥塞。这可能会导致延迟增加和数据包丢失。原因可能有多种,例如网络使用率高、文件传输量大、恶意软件、硬件问题或网络设计问题。为了防止网络拥塞,监控网络使用情况并实施限制或管理需求的策略非常重要。
00110011110100011101
互联网是指一个网络网络,在全球范围内传输大量数据。
万维网是在互联网之上的数百万台服务器上运行的应用程序,通过所谓的网络浏览器访问
ISP(互联网服务提供商)是本地互联网公司提供商。
名字 | 主题 | 目标和说明 | 溶液 | 评论 |
---|---|---|---|---|
叉子 101 | 叉 | 链接 | 链接 | |
叉 102 | 叉 | 链接 | 链接 |
摘自《操作系统:三个简单的部分》一书:
“负责使运行程序变得容易(甚至允许你同时运行许多程序),允许程序共享内存,使程序能够与设备交互,以及其他类似有趣的东西”。
进程是正在运行的程序。程序是一条或多条指令,程序(或进程)由操作系统执行。
它将支持以下内容:
假。过去确实如此,但今天的操作系统执行延迟加载,这意味着仅首先加载进程运行所需的相关部分。
即使使用具有一个物理 CPU 的系统,也可以允许多个用户在其上工作并运行程序。这可以通过分时来实现,其中计算资源共享的方式在用户看来系统有多个CPU,但实际上它只是通过应用多并发和多任务共享一个CPU。
与分时度假有些相反。在时间共享中,一个实体使用资源一段时间,然后同一资源可以被另一个资源使用,而在空间共享中,空间由多个实体共享,但不会在它们之间传输。
它由一个实体使用,直到该实体决定摆脱它。以存储为例。在存储中,文件是你的,直到你决定删除它。
中央处理器调度程序
虚拟内存将计算机的 RAM 与硬盘上的临时空间相结合。当 RAM 不足时,虚拟内存有助于将数据从 RAM 移动到称为分页文件的空间。将数据移动到分页文件可以释放 RAM,以便你的计算机可以完成其工作。通常,计算机的RAM越多,程序运行的速度就越快。https://www.minitool.com/lib/virtual-memory.html
这个想法:
内核是操作系统的一部分,负责以下任务:
真
缓冲区:RAM中的保留位置,用于临时保存数据 缓存:缓存通常在进程读取和写入磁盘时使用,通过使不同程序使用的类似数据易于访问来加快进程速度。
虚拟化使用软件在计算机硬件上创建一个抽象层,允许将单个计算机的硬件元素(处理器、内存、存储等)划分为多个虚拟计算机,通常称为虚拟机 (VM)。
红帽:“虚拟机管理程序是创建和运行虚拟机 (VM) 的软件。虚拟机监控程序(有时称为虚拟机监视器 (VMM))将虚拟机管理程序操作系统和资源与虚拟机隔离开来,并允许创建和管理这些虚拟机。
在此处阅读更多内容
托管虚拟机管理程序和裸机虚拟机管理程序。
由于具有自己的驱动程序和对硬件组件的直接访问,裸机虚拟机管理程序通常具有更好的性能以及稳定性和可扩展性。
另一方面,加载(任何)驱动程序可能会有一些限制,因此托管虚拟机管理程序通常会受益于更好的硬件兼容性。
操作系统虚拟化 网络功能虚拟化 桌面虚拟化
是的,这是一个操作系统级别的虚拟化,其中内核是共享的,并允许使用多个隔离的用户空间实例。
虚拟机的引入允许公司在同一硬件上部署多个业务应用程序,而每个应用程序都以安全的方式彼此分离,每个应用程序都在自己单独的操作系统上运行。
是的,即使在容器时代,虚拟机仍然具有相关性。虽然容器为虚拟机提供了一种轻量级和可移植的替代方案,但它们确实存在一定的局限性。虚拟机仍然很重要,因为它们提供隔离和安全性,可以运行不同的操作系统,并且适用于旧版应用。例如,容器限制是共享主机内核。
Prometheus是一个流行的开源系统监控和警报工具包,最初由SoundCloud开发。它旨在收集和存储时间序列数据,并允许使用称为 PromQL 的强大查询语言查询和分析该数据。Prometheus 经常用于监控云原生应用程序、微服务和其他现代基础架构。
普罗米修斯的一些主要功能包括:
1. Data model: Prometheus uses a flexible data model that allows users to organize and label their time-series data in a way that makes sense for their particular use case. Labels are used to identify different dimensions of the data, such as the source of the data or the environment in which it was collected. 2. Pull-based architecture: Prometheus uses a pull-based model to collect data from targets, meaning that the Prometheus server actively queries its targets for metrics data at regular intervals. This architecture is more scalable and reliable than a push-based model, which would require every target to push data to the server. 3. Time-series database: Prometheus stores all of its data in a time-series database, which allows users to perform queries over time ranges and to aggregate and analyze their data in various ways. The database is optimized for write-heavy workloads, and can handle a high volume of data with low latency. 4. Alerting: Prometheus includes a powerful alerting system that allows users to define rules based on their metrics data and to send alerts when certain conditions are met. Alerts can be sent via email, chat, or other channels, and can be customized to include specific details about the problem. 5. Visualization: Prometheus has a built-in graphing and visualization tool, called PromDash, which allows users to create custom dashboards to monitor their systems and applications. PromDash supports a variety of graph types and visualization options, and can be customized using CSS and JavaScript.
总体而言,Prometheus 是一款强大而灵活的监控和分析系统和应用程序的工具,在业界广泛用于云原生监控和可观测性。
来自 Prometheus 文档:“如果你需要 100% 的准确性,例如按请求计费”。
普罗米修斯架构由四个主要组件组成:
1. Prometheus Server: The Prometheus server is responsible for collecting and storing metrics data. It has a simple built-in storage layer that allows it to store time-series data in a time-ordered database. 2. Client Libraries: Prometheus provides a range of client libraries that enable applications to expose their metrics data in a format that can be ingested by the Prometheus server. These libraries are available for a range of programming languages, including Java, Python, and Go. 3. Exporters: Exporters are software components that expose existing metrics from third-party systems and make them available for ingestion by the Prometheus server. Prometheus provides exporters for a range of popular technologies, including MySQL, PostgreSQL, and Apache. 4. Alertmanager: The Alertmanager component is responsible for processing alerts generated by the Prometheus server. It can handle alerts from multiple sources and provides a range of features for deduplicating, grouping, and routing alerts to appropriate channels.
总体而言,Prometheus 架构旨在实现高度可扩展和弹性。服务器和客户端库可以以分布式方式部署,以支持跨大规模、高度动态环境的监视
与其他监控解决方案(如InfluxDB)相比,Prometheus以其高性能和可扩展性而闻名。它可以处理大量数据,并且可以轻松地与监控生态系统中的其他工具集成。另一方面,InfluxDB以其易用性和简单性而闻名。它具有用户友好的界面,并提供易于使用的API来收集和查询数据。
另一个流行的解决方案Nagios是一个更传统的监控系统,它依赖于基于推送的模型来收集数据。Nagios已经存在了很长时间,以其稳定性和可靠性而闻名。然而,与Prometheus相比,Nagios缺少一些更高级的功能,例如多维数据模型和强大的查询语言。
总体而言,监视解决方案的选择取决于组织的特定需求和要求。虽然 Prometheus 是大规模监控和警报的绝佳选择,但 InfluxDB 可能更适合需要易用性和简单性的小型环境。对于优先考虑稳定性和可靠性而不是高级功能的组织来说,Nagios 仍然是一个可靠的选择。
在普罗米修斯中,实例是指正在监视的单个目标。例如,单个服务器或服务。作业是一组执行相同功能的实例,例如一组为同一应用程序提供服务的 Web 服务器。作业允许你一起定义和管理一组目标。
从本质上讲,实例是 Prometheus 从中收集指标的单个目标,而作业是可以作为一个组管理的类似实例的集合。
1. 计数器:用于跟踪事件或样本计数的单调递增值。示例包括处理的请求数或遇到的错误总数。2. 仪表:可以上升或下降的值,例如 CPU 使用率或内存使用率。与计数器不同,仪表值可以是任意的,这意味着它们可以根据被监视系统的变化而上升和下降。3. 直方图:一组根据其值划分为桶的观测值或事件。直方图有助于分析指标的分布,例如请求延迟或响应大小。4. 摘要:摘要类似于直方图,但它不是存储桶,而是为观测值提供一组分位数。摘要可用于监视请求延迟或响应大小随时间推移的分布。
Prometheus 还支持各种函数和运算符来聚合和操作指标,例如总和、最大值、最小值和速率。这些功能使其成为监视和警报系统指标的强大工具。
导出器充当服务器,在特定网络端口上侦听来自 Prometheus 的请求以抓取指标。它从第三方系统或应用程序中收集指标,并将其转换为普罗米修斯可以理解的格式。然后,导出器通过 HTTP 端点将这些指标公开给 Prometheus,使其可用于收集和分析。
导出器通常用于监视各种类型的基础结构组件,例如数据库、Web 服务器和存储系统。例如,有导出器可用于监视流行的数据库,如MySQL和PostgreSQL,以及像Apache和Nginx这样的Web服务器。
总体而言,出口商是 Prometheus 生态系统的关键组成部分,允许监控广泛的系统和应用程序,并为平台提供高度的灵活性和可扩展性。
1. 仔细标记:仔细且一致的指标标记对于有效的查询和警报至关重要。标签应清晰、简洁,并包含有关指标的所有相关信息。2. 保持指标简单:导出商公开的指标应该简单,并专注于被监控系统的单个方面。这有助于避免混淆,并确保团队的所有成员都可以轻松理解指标。3. 谨慎使用警报:虽然警报是 Prometheus 的一项强大功能,但应谨慎使用,并且仅用于最关键的问题。设置过多警报可能会导致警报疲劳,并导致忽略重要警报。建议仅设置最重要的警报,并根据警报的实际频率随时间调整阈值。
sum(rate(http_requests_total[1h]))
在此查询中,http_requests_total是跟踪 HTTP 请求总数的指标的名称,速率函数计算过去一小时的每秒请求速率。然后,sum 函数将所有请求相加,为你提供过去一小时内的请求总数。
你可以通过更改速率函数中的持续时间来调整时间范围。例如,如果你想获取最后一天的请求总数,你可以将函数更改为 rate(http_requests_total[1d])。
HA 代表 高可用性。这意味着该系统设计为高度可靠且始终可用,即使遇到故障或其他问题也是如此。在实践中,这通常涉及设置 Prometheus 的多个实例,并确保它们都同步并能够无缝地协同工作。这可以通过各种技术来实现,例如负载平衡、复制和故障转移机制。通过在 Prometheus 中实施 HA,用户可以确保其监控数据始终可用且最新,即使面临硬件或软件故障、网络问题或其他可能导致停机或数据丢失的问题。
下面是如何使用 join() 函数联接两个指标的示例:
sum_series( join( on(service, instance) request_count_total, on(service, instance) error_count_total, ) )
在此示例中,join() 函数根据服务和实例标签值组合request_count_total和error_count_total时序。然后,sum_series() 函数计算结果时间序列的总和
例如,如果你有一个名为 http_requests_total 的指标,其标签名为 method,并且你想要返回方法标签的所有值,则可以使用以下查询:
label_values(http_requests_total, method)
这将返回http_requests_total指标中方法标签的所有值的列表。然后,可以在进一步的查询中使用此列表或筛选数据。
100 * sum(rate(process_cpu_user_seconds_total{job=“<job-name>”}[<time-period>])) by (instance) / (<time-period> * <num-cpu-cores>)
此处是要查询的作业的名称,是要查询的时间范围(例如 5m、1h),是要查询的计算机上的 CPU 内核数。
例如,若要获取在具有 4 个 CPU 内核的计算机上运行的名为 my-job 的作业过去 5 分钟的 CPU 使用率百分比,可以使用以下查询:
100 * sum(rate(process_cpu_user_seconds_total{job="my-job"}[5m])) by (instance) / (5m * 4)
Go也有很好的社区。
var x int = 2
x := 2
结果是相同的,值为 2 的变量。
我们将变量类型设置为整数,而让 Go 自己找出类型。
var x int = 2
x := 2
假。我们不能重新声明变量,但是是的,我们必须使用声明的变量。
这应该根据你的使用情况回答,但一些示例是:
func main() { var x float32 = 13.5 var y int y = x }
package main
import "fmt"
func main() {
var x int = 101
var y string
y = string(x)
fmt.Println(y)
}
它查看设置为 101 的 unicode 值,并使用它来将整数转换为字符串。如果你想得到“101”,你应该使用包“strconv”并替换为
y = string(x)
y = strconv.Itoa(x)
package main func main() { var x = 2 var y = 3 const someConst = x + y }
Go 中的常量只能使用常量表达式声明。但是,它们的总和是可变的。
x
y
const initializer x + y is not a constant
package main
import "fmt"
const (
x = iota
y = iota
)
const z = iota
func main() {
fmt.Printf("%v\n", x)
fmt.Printf("%v\n", y)
fmt.Printf("%v\n", z)
}
Go 的 iota 标识符用于 const 声明中,以简化递增数字的定义。由于它可以在表达式中使用,因此它提供了超越简单枚举的通用性。
在第一个 iota 组中,在第二个组中。
Go Wiki 中的 iota 页面
x
y
z
package main
import "fmt"
const (
_ = iota + 3
x
)
func main() {
fmt.Printf("%v\n", x)
}
由于第一个 iota 是用值 () 声明的,因此下一个 iota 的值为
3
+ 3
4
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
wg.Add(1)
go func() {
time.Sleep(time.Second * 2)
fmt.Println("1")
wg.Done()
}()
go func() {
fmt.Println("2")
}()
wg.Wait()
fmt.Println("3")
}
输出: 2 1 3
package main
import (
"fmt"
)
func mod1(a []int) {
for i := range a {
a[i] = 5
}
fmt.Println("1:", a)
}
func mod2(a []int) {
a = append(a, 125) // !
for i := range a {
a[i] = 5
}
fmt.Println("2:", a)
}
func main() {
s1 := []int{1, 2, 3, 4}
mod1(s1)
fmt.Println("1:", s1)
s2 := []int{1, 2, 3, 4}
mod2(s2)
fmt.Println("2:", s2)
}
输出:
1 [5 5 5 5]
1 [5 5 5 5]
2 [5 5 5 5 5]
2 [1 2 3 4]
在 is 链接中,当我们使用 时,我们正在将值更改为。但是在 中,创建新切片,我们只更改值,而不是 .
mod1
a[i]
s1
mod2
append
a
s2
package main
import (
"container/heap"
"fmt"
)
// An IntHeap is a min-heap of ints.
type IntHeap []int
func (h IntHeap) Len() int { return len(h) }
func (h IntHeap) Less(i, j int) bool { return h[i] < h[j] }
func (h IntHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] }
func (h *IntHeap) Push(x interface{}) {
// Push and Pop use pointer receivers because they modify the slice's length,
// not just its contents.
*h = append(*h, x.(int))
}
func (h *IntHeap) Pop() interface{} {
old := *h
n := len(old)
x := old[n-1]
*h = old[0 : n-1]
return x
}
func main() {
h := &IntHeap{4, 8, 3, 6}
heap.Init(h)
heap.Push(h, 7)
fmt.Println((*h)[0])
}
输出: 3
MongoDB的优势如下:
主要区别在于SQL数据库是结构化的(数据以带有行和列的表的形式存储 - 就像excel电子表格表一样),而NoSQL是非结构化的,数据存储可以根据NoSQL DB的设置方式而变化,例如键值对,面向文档等。
db.books.find({"name": /abc/})
db.books.find().sort({x:1})
find()返回与查询条件匹配的所有文档。
名字 | 主题 | 目标和说明 | 溶液 | 评论 |
---|---|---|---|---|
函数与比较 | 查询改进 | 锻炼 | 溶液 |
SQL(结构化查询语言)是关系数据库(如MySQL,MariaDB等)的标准语言。
它用于读取、更新、删除和创建关系数据库中的数据。
主要区别在于SQL数据库是结构化的(数据以带有行和列的表的形式存储 - 就像excel电子表格表一样),而NoSQL是非结构化的,数据存储可以根据NoSQL DB的设置方式而变化,例如键值对,面向文档等。
SQL - 最适合在数据完整性至关重要时使用。SQL通常在金融领域的许多业务和领域实施,因为它符合ACID标准。
NoSQL - 如果你需要快速扩展,那就太好了。NoSQL在设计时考虑了Web应用程序,因此如果你需要将相同的信息快速传播到多个服务器,它非常有用。
此外,由于 NoSQL 不遵守关系数据库所需的具有列和行结构的严格表,因此你可以将不同的数据类型存储在一起。
对于这些问题,我们将使用如下所示的客户和订单表:
客户
Customer_ID | Customer_Name | Items_in_cart | Cash_spent_to_Date |
---|---|---|---|
100204 | 约翰·史密斯 | 0 | 20.00 |
100205 | 简·史密斯 | 3 | 40.00 |
100206 | 鲍比·弗兰克 | 1 | 100.20 |
订单
Customer_ID | Order_ID | 项目 | 价格 | Date_sold |
---|---|---|---|---|
100206 | A123 | 橡皮鸭 | 2.20 | 2019-09-18 |
100206 | A123 | 泡泡浴 | 8.00 | 2019-09-18 |
100206 | Q987 | 80 包 TP | 90.00 | 2019-09-20 |
100205 | Z001 | 猫粮 - 金枪鱼 | 10.00 | 2019-08-05 |
100205 | Z001 | 猫粮 - 鸡肉 | 10.00 | 2019-08-05 |
100205 | Z001 | 猫粮 - 牛肉 | 10.00 | 2019-08-05 |
100205 | Z001 | 猫粮 - 小猫玉米饼 | 10.00 | 2019-08-05 |
100204 | X202 | 咖啡 | 20.00 | 2019-04-29 |
从客户中选择 *
;
从Customer_Name
=“约翰·史密斯”的客户中选择Items_in_cart;
选择 SUM(Cash_spent_to_Date) 作为客户的SUM_CASH
;
选择 count(1) 作为 Number_of_People_w_items 来自客户
,其中Items_in_cart > 0;
你将在唯一键上加入它们。在这种情况下,唯一键同时Customer_ID在“客户”表和“订单”表中
选择 c.Customer_Name, o.来自客户的项目
c
左 加入订单 o
在 c.Customer_ID = o.Customer_ID;
cat_food为 ( 选择 Customer_ID, 总和(价格) 作为 TOTAL_PRICE 从订单
中 像“%猫粮%”
这样的项目按Customer_ID分组
)
选择Customer_name,TOTAL_PRICE
来自客户 c
内部连接 cat_food f
在 c.Customer_ID = f.Customer_ID c.Customer_ID
的地方(从cat_food中选择Customer_ID);
尽管这是一个简单的语句,但当复杂查询需要在连接到另一个表之前在表上运行时,“with”子句确实大放异彩。with 语句很好,因为你在运行查询时会创建一个伪临时值,而不是创建一个全新的表。
所有购买的猫粮的总和并不容易获得,因此我们使用 with 语句创建伪表来检索每个客户花费的价格总和,然后正常联接表。
SELECT count(*) SELECT count(*) FROM shawarma_purchases FROM shawarma_purchases WHERE vs. WHERE YEAR(purchased_at) == '2017' purchased_at >= '2017-01-01' AND purchased_at <= '2017-31-12'
SELECT count(*) FROM shawarma_purchases WHERE purchased_at >= '2017-01-01' AND purchased_at <= '2017-31-12'
当你使用函数()时,它必须扫描整个数据库,而不是使用索引和基本上是列,处于其自然状态。
YEAR(purchased_at)
造成这种情况的原因有很多。例如:如果分配了活动端口,则无法删除路由器。
不是默认的。对象存储 API 将每个对象的最大限制为 5GB,但可以进行调整。
假。如果两个对象位于不同的容器中,则可以具有相同的名称。
用:
服务及其终结点的列表
弹性堆栈包括:
Elasticsearch,Logstash和Kibana也被称为ELK堆栈。
来自官方文档:
“Elasticsearch是一个分布式文档存储。Elasticsearch 不是将信息存储为列式数据行,而是存储已序列化为 JSON 文档的复杂数据结构”
Beats 是轻量级的数据发送器。这些数据发送器安装在数据所在的客户端上。节拍示例:Filebeat、Metricbeat、Auditbeat。还有更多。
来自官方文档:
“Kibana 是一个开源分析和可视化平台,旨在与 Elasticsearch 配合使用。你可以使用 Kibana 来搜索、查看存储在 Elasticsearch 索引中的数据并与之交互。你可以轻松执行高级数据分析,并在各种图表、表格和 map中可视化数据。
该过程可能因所选体系结构和你可能希望应用于日志的处理而有所不同。一种可能的工作流程是:
这是存储数据的地方,也是进行不同处理的地方(例如,当你搜索数据时)。
部分主节点责任:
虽然实际上可以有多个主节点,但其中只有选择的主节点。
负责根据摄取管道处理数据的节点。如果你不需要使用 logstash,那么这个节点可以从 beats 接收数据并处理它,类似于在 Logstash 中处理它的方式。
来自官方文档:
仅协调节点可以通过从数据和符合主节点条件的节点中卸载协调节点角色,使大型集群受益。它们加入群集并接收完整的群集状态(与其他节点一样),并且使用群集状态将请求直接路由到适当的位置。
在大多数情况下,Elasticsearch 中的索引与 SQL/NoSQL 世界中的整个数据库进行比较。
你可以选择使用一个索引来保存应用的所有数据,也可以选择使用多个索引,其中每个索引包含不同类型的应用(例如,应用正在运行的每个服务的索引)。
官方文档也提供了一个很好的解释(一般来说,这是非常好的文档,因为每个项目都应该有):
“索引可以被认为是文档的优化集合,每个文档都是字段的集合,字段是包含数据的键值对”
索引被拆分为分片,文档被散列到特定的分片。每个分片可能位于集群中的不同节点上,并且每个分片都是一个独立的索引。
这允许 Elasticsearch 扩展到整个服务器集群。
来自官方文档:
“倒排索引列出了任何文档中出现的每个唯一单词,并标识每个单词出现的所有文档。”
继续与SQL/NoSQL进行比较,Elasticsearch中的文档在SQL的情况下是表中的一行,对于NoSQL来说,是集合中的文档。与NoSQL一样,文档是一个JSON对象,它将数据保存在应用程序中的一个单元上。此单位是什么取决于你的应用。如果你的应用与图书相关,则每个文档都会描述一本书。如果你的应用程序是关于衬衫的,那么每个文档都是一件衬衫。
红色表示某些数据在群集中不可用。索引的某些分片是未确定的。群集还有其他一些状态。黄色表示集群中有未分配的分片。如果你有单个节点并且索引具有副本,则可以处于此状态。绿色表示集群中的所有分片都分配给节点,并且你的集群运行正常。
假。来自官方文档:
“每个索引字段都有一个专用的、优化的数据结构。例如,文本字段存储在倒排索引中,数值和地理字段存储在 BKD 树中。
在随时可能发生故障的网络/云环境中,如果分片/节点以某种方式脱机或因任何原因消失,则使用故障转移机制非常有用,强烈建议使用。为此,Elasticsearch 允许你将索引分片的一个或多个副本创建为所谓的副本分片,或简称副本。
术语频率是术语在给定文档中出现的频率,文档频率是术语在所有文档中出现的频率。它们都用于通过计算术语频率/文档频率来确定术语的相关性。
curl -X PUT "localhost:9200/customer/_doc/1?pretty" -H 'Content-Type: application/json' -d'{ "name": "John Doe" }'
如果不存在,它会创建客户索引,并添加一个字段名称设置为“John Dow”的新文档。此外,如果它是第一个文档,它将获得 ID 1。
当你需要为多个文档编制索引时,将使用批量 API。对于大量文档,使用比单个请求要快得多,因为网络往返较少。
来自官方文档:
“在查询上下文中,查询子句回答了以下问题:”此文档与此查询子句的匹配程度如何?除了确定文档是否匹配之外,查询子句还计算_score元字段中的相关性分数。
“在筛选器上下文中,查询子句回答问题”此文档是否与此查询子句匹配?答案是简单的是或否 - 不计算分数。过滤上下文主要用于过滤结构化数据”
这个问题有几种可能的答案。其中之一如下:
弹性的小规模架构将由弹性堆栈组成。这意味着我们将拥有 beats、logstash、elastcsearch 和 kibana。
具有大量数据的生产环境可以包括某种缓冲组件(例如Reddis或RabbitMQ)以及安全组件(例如Nginx)。
一个日志插件,它以一种格式修改信息并将其沉浸在另一种格式中。
存储在索引中的原始数据。你可以搜索和过滤它。
与搜索结果匹配的文档总数。如果未使用查询,则只需文档总数。
“可视化”是你可以为数据创建可视化表示的地方(饼图、图形等)
假。一台收割机收获一个锉刀。
你可以使用提供的弹性实用程序生成证书,并更改配置以使用证书模型启用安全性。
根据Martin Kleppmann的说法:
“许多进程在许多机器上运行...只有通过具有可变延迟的不可靠网络传递消息,系统可能会遭受部分故障、不可靠的时钟和进程暂停。
另一个定义:“物理上分离但逻辑连接的系统”
根据 CAP 定理,分布式数据存储不可能同时提供以下两个以上的数据:
它是一种架构,其中数据是从单个非共享源检索的,通常专门连接到一个节点,而不是请求可以到达许多节点之一并且数据将从一个共享位置检索的架构(存储、内存等)。
名字 | 主题 | 目标和说明 | 溶液 | 评论 |
---|---|---|---|---|
高可用性“Hello World” | 锻炼 | 溶液 |
待办事项:添加更多详细信息!
我喜欢 blog.christianposta.com 的这个定义:
“一个明确且有目的的接口,旨在通过网络调用,使软件开发人员能够以受控和舒适的方式以编程方式访问组织内的数据和功能。
假。从 swagger.io:
“API 定义类似于 API 规范,因为它提供了对 API 组织方式和 API 功能的理解。但 API 定义针对的是机器消费,而不是人类对 API 的消费。
API 网关就像守门人,控制不同部分如何相互通信以及它们之间如何交换信息。
API 网关为所有客户端提供单一入口点,它可以执行多项任务,包括将请求路由到相应的后端服务、负载平衡、安全性和身份验证、速率限制、缓存和监控。
通过使用 API 网关,组织可以简化其 API 的管理,确保一致的安全性和治理,并提高其后端服务的性能和可扩展性。它们也常用于微服务架构,其中有许多小型的独立服务需要由不同的客户端访问。
优势:
自动化是自动化任务的行为,以减少与IT技术和系统有关的人为干预或交互。
虽然自动化侧重于任务级别,但编排是自动化流程和/或工作流的过程,它由通常跨多个系统的多个任务组成。
有关数据的数据。基本上,它描述了基础数据将包含的信息类型。
我无法为你回答这个问题:)
领域特定语言 (DSL) 用于创建表示领域的自定义语言,以便领域专家可以轻松解释它。
当今许多技术(如Kubernetes,Ansible等)使用的数据序列化语言。
真。因为 YAML 是 JSON 的超集。
{ applications: [ { name: "my_app", language: "python", version: 20.17 } ] }
applications: - app: "my_app" language: "python" version: 20.17
someMultiLineString: | look mama I can write a multi-line string I love YAML
它适用于编写 shell 脚本等用例,其中脚本的每一行都是不同的命令。
someMultiLineString: |
someMultiLineString: >
使用将使多行字符串折叠成单行
>
someMultiLineString: > This is actually a single line do not let appearances fool you
它们允许你引用值而不是直接写入它们,它的用法如下:
username: {{ my.user_name }}
使用这个: 例如:
---
document_number: 1 --- document_number: 2
维基百科:“在计算中,固件是一类特定的计算机软件,它为设备的特定硬件提供低级控制。固件,例如个人计算机的BIOS可以包含设备的基本功能,并且可以为操作系统等更高级的软件提供硬件抽象服务。
假。它不维护传入请求的状态。
它包括:
HTTPS 是 HTTP 协议的安全版本,用于在 Web 浏览器和 Web 服务器之间传输数据。它使用 SSL/TLS 加密对通信进行加密,以确保数据的私密性和安全性。
了解更多: https://www.cloudflare.com/learning/ssl/why-is-http-not-secure/
HTTP 是无状态的。为了共享状态,我们可以使用 Cookie。
TODO:解释什么是真正的 Cookie
服务器未及时收到来自与其通信的另一台服务器的响应。
代理是充当客户端设备和目标服务器之间的中间人的服务器。它可以通过隐藏客户端的 IP 地址、筛选内容和缓存经常访问的数据来帮助提高隐私、安全性和性能。
反向代理是一种位于客户端和服务器之间的代理服务器,但它用于管理与传统正向代理相反方向的流量。在转发代理中,客户端将请求发送到代理服务器,然后代理服务器将这些请求转发到目标服务器。但是,在反向代理中,客户端将请求发送到目标服务器,但请求在到达服务器之前被反向代理截获。
维基百科:“X-Forwarded-For (XFF) HTTP 标头字段是一种常用方法,用于识别通过 HTTP 代理或负载均衡器连接到 Web 服务器的客户端的原始 IP 地址。
负载均衡器接受(或拒绝)来自客户端的传入网络流量,并根据某些条件(应用程序相关、网络等)将这些通信分发到服务器(至少一个)。
L4 和 L7
是的,你可以使用 DNS 执行负载平衡。
你希望确保用户不会丢失当前会话数据。
饼干。有基于应用程序的 Cookie 和基于持续时间的 Cookie。
在 GCP 和 AWS 上,最大超时值可以设置为 1 到 3600 秒。
知识共享许可是一组版权许可,允许创作者与公众分享他们的作品,同时保留对如何使用作品的一些控制权。该许可的开发是为了回应传统版权法的限制性标准,这些标准限制了创意作品的获取。其创作者选择其作品可以被他人共享、分发和使用的条款。它们是六种主要类型的知识共享许可证,每种许可证都有不同级别的限制和权限,这六个许可证是:
简单地说,知识共享许可是创作者与公众分享其作品的一种方式,同时保留对如何使用作品的一些控制权。这些许可促进创造力、创新和协作,同时也尊重创作者的权利,同时仍然鼓励负责任地使用创意作品。
在 Copyleft 中,任何衍生作品都必须使用相同的许可,而在宽松许可中则没有这样的条件。GPL-3 是 copyleft 许可证的一个例子,而 BSD 是宽松许可证的一个例子。
内存泄漏是当程序无法释放不再需要的内存时发生的编程错误,导致程序随着时间的推移消耗越来越多的内存。
泄漏可能导致各种问题,包括系统崩溃、性能下降和不稳定。通常在旧系统维护失败以及与新组件的兼容性之后发生。
SSH HTTP DHCP DNS ...
优点:
优点:
本地文件系统 Dropbox Google Drive
文件系统是计算机和其他电子设备组织和存储数据文件的一种方式。它提供了一种结构,有助于将数据组织到文件和目录中,从而更轻松地查找和管理信息。文件系统对于提供以有组织的方式存储和管理数据的方法至关重要。
常用的归档系统: 视窗:
苹果操作系统:
作为候选人,你可以在面试期间或之后向面试官提出的问题清单。这些只是一个建议,请谨慎使用。不是每个面试官都能回答(或乐于回答)这些问题,这也许是对你在这样的地方工作的危险信号警告,但这真的取决于你。
问这个问题时要小心——所有公司,无论规模大小,都有一定程度的技术债务。根据所有公司都处理这个问题来表达这个问题,但你希望看到他们正在处理的当前痛点
这是了解经理如何处理计划外工作的好方法,以及他们在设定项目期望方面的表现。
这可以让你深入了解公司正在从事的一些很酷的项目,如果你喜欢从事此类项目。这也是查看经理是否允许员工在正常工作之外的项目中学习和成长的好方法。
与技术债务问题类似,这可以帮助你确定公司的任何痛点。此外,这可能是展示你将如何成为团队资产的好方法。
例如,如果他们提到他们有问题X,而你过去已经解决了这个问题,你可以展示你如何能够缓解这个问题。
这不仅会告诉你对你的期望,它还会为你在工作的头几个月要做的工作类型提供很大的提示。
单元测试是一种软件测试技术,涉及系统分解系统并测试程序集的每个单独部分。这些测试是自动化的,可以重复运行,使开发人员能够在开发时快速捕获边缘情况或错误。
单元测试的主要目标是验证每个函数在给定一组输入的情况下是否产生正确的输出。
给定一个文本文件,执行以下练习
“^\w+” 奖励:提取每行的最后一个单词
“\w+(?=\W*$)”(在大多数情况下,取决于行格式)
CDN(内容交付网络)负责按地理位置分发内容。其中一部分是所谓的边缘站点,又名缓存代理,由于缓存功能和地理分布,它允许用户快速获取内容。
在单个 CDN 中,整个内容源自内容分发网络。
在多 CDN 中,内容分布在多个不同的 CDN 中,每个 CDN 可能位于完全不同的提供商/云上。
该功能可根据需求和使用情况轻松增加大小和容量。
增长的能力,但也根据需要减少
灾难恢复是在发生破坏性事件后恢复关键业务系统和数据的过程。目标是将影响降至最低并快速恢复正常的业务活动。这包括创建计划、测试计划、备份关键数据并将其存储在安全位置。在发生灾难时,将执行计划,恢复备份,并希望使系统重新联机。恢复过程可能需要数小时或数天,具体取决于基础设施的损坏情况。这使得业务规划变得非常重要,因为精心设计和测试的灾难恢复计划可以最大限度地减少灾难的影响并保持运营。
容错 - 自我修复并恢复正常能力的能力。还具有承受故障并保持功能的能力。
高可用性 - 能够访问资源(在某些用例中,使用不同的平台)
wintellect.com:“简单地说,高可用性就是消除单点故障,而灾难恢复是在系统无法运行时使系统恢复到运行状态的过程。从本质上讲,当高可用性失败时,灾难恢复就会开始,所以首先是HA。
垂直扩展是添加资源以增加现有服务器功能的过程。例如,添加更多 CPU、添加更多 RAM 等。
仅通过垂直缩放,组件仍然是单点故障。此外,它还具有硬件限制,如果你没有更多资源,则可能无法垂直扩展。
数据库,缓存。这主要适用于非分布式系统。
水平扩展是添加更多资源的过程,这些资源将能够作为一个单元处理请求
负载均衡器。你可以添加更多资源,但如果你希望它们成为流程的一部分,则必须为他们提供请求/响应。此外,数据不一致是水平扩展的一个问题。
生产者或消费者的负载可能很高,这将导致它们挂起或崩溃。
消费者只有在准备好处理任务时才能拉取任务,而不是在“推送模式”下工作。它可以通过使用Kafka,Kinesis等流媒体平台来修复。该平台将确保处理高负载/流量,并仅在准备好获取任务/消息时才将任务/消息传递给消费者。
缓存用于通过将频繁访问的数据存储在内存或快速存储介质上来加快读取操作。通过使数据靠近应用程序,缓存可以减少从较慢、更远的存储系统(如数据库或磁盘)访问数据的延迟和开销。
另一方面,数据库针对存储和管理持久性数据进行了优化。数据库旨在处理并发读写操作,强制实施一致性和完整性约束,并提供索引和查询等功能。
你可以提及:
回滚和前滚剪切彩排 DNS 重定向
其他练习可以在系统设计笔记本存储库中找到。
中央处理器 (CPU) 执行程序中指令指定的基本算术、逻辑、控制和输入/输出 (I/O) 操作。这与主存储器和 I/O 电路等外部组件以及图形处理单元 (GPU) 等专用处理器形成鲜明对比。
RAM(随机存取存储器)是计算设备中的硬件,其中保存了操作系统 (OS)、应用程序和当前使用的数据,以便设备的处理器可以快速访问它们。RAM 是计算机中的主存储器。它的读取和写入速度比其他类型的存储(如硬盘驱动器 (HDD)、固态驱动器 (SSD) 或光盘驱动器)快得多。
嵌入式系统是一种计算机系统,由计算机处理器、计算机内存和输入/输出外围设备组成,在较大的机械或电子系统中具有专用功能。它作为完整设备的一部分嵌入,通常包括电气或电子硬件和机械部件。
树莓派
有几种类型的存储,包括硬盘驱动器 (HDD)、固态驱动器 (SSD) 和光盘驱动器 (CD/DVD/蓝光)。其他类型的存储包括 USB 闪存驱动器、存储卡和网络连接存储 (NAS)。
正如道格·莱尼(Doug Laney)所定义的那样:
DataOps 旨在缩短数据分析的端到端周期时间,从想法的起源到创造价值的图表、图形和模型的字面创建。DataOps 结合了敏捷开发、DevOps 和统计流程控制,并将其应用于数据分析。
负责管理集群中的计算资源和调度用户的应用程序
用于大规模数据处理的编程模型
通常,Packer会自动创建机器映像。它允许你在创建映像时专注于部署之前的配置。在大多数情况下,这使你可以更快地启动实例。
具有以下优点的配置>部署:
本页完美地解释了它:
Given a version number MAJOR.MINOR.PATCH, increment the: MAJOR version when you make incompatible API changes MINOR version when you add functionality in a backwards compatible manner PATCH version when you make backwards compatible bug fixes Additional labels for pre-release and build metadata are available as extensions to the MAJOR.MINOR.PATCH format.
如果你正在寻找一种准备某种考试的方法,那么本节就是适合你的部分。在这里,你将找到证书列表,每个证书都引用一个单独的文件,其中包含重点问题,可帮助你准备考试。祝你好运:)
感谢我们所有出色的贡献者,他们让每个人都可以轻松学习新事物:)
徽标信用可以在这里找到