对运维的面试总结

ps:根据个人喜好来写,大多贴近实际情况,仅供参考使用。

一  Kafaka介绍

Kafaka是由Apache软件基金会开发的一个开源流处理平台,主要用于处理大量数据流。kafka的主要特性:1高吞吐量和低延迟,kafka每秒可以处理几十万条消息,每个topic可以分为多个Partition,ConsumerGroup对Partition进行consum操作。2,可扩展性。3持久性和可靠性,消息持久化到磁盘,支持数据备份和删除节点。4,容错性,5,高并发。

Kafka使用场景:1,实时数据处理,2.日志文件处理,kafka可以处理web服务器日志,数据库日志和操作系统日志等,将日志文件快速发布和订阅,日志聚合和分析。还可以处理传感器的数据,3,分布式消息队列,应用于多个应用程序之间的数据传输。kafka提供了点对点模式,多主节点模式,发布\订阅模式。

二k8s介绍

1.k8s是什么?

Kubernetes(简称K8s)是一个开源的容器编排引擎,它主要用于自动化部署、扩展和管理容器化应用程序。

2.Kubernetes是由Google创建并开源的容器编排系统,旨在解决容器化应用程序的部署、扩展和管理问题。它提供了一套完整的解决方案,允许开发者以更灵活、高效的方式运行和管理容器化应用程序。

3.k8s主要功能

容器编排:Kubernetes可以自动化地部署、扩展和管理容器化应用程序,支持多个实例的负载均衡。
自我修复:通过内置的自动重启、复制和替换机制,Kubernetes可以确保应用程序的高可用性。
水平扩展:Kubernetes可以自动扩展应用程序以满足不同的需求,无需人工干预。
服务发现和负载均衡:Kubernetes提供了内置的服务发现和负载均衡机制,使应用程序更加易于发现和访问。存储编排:Kubernetes支持挂载外部存储系统,为容器提供持久化存储能力。

4.k8s的组件Kubernetes主要由两部分组成:控制平面(Master节点)和数据平面(Node节点)。控制平面:kube-apiserver:提供RESTful API供外部客户端和集群内部组件调用。
ETCD:存储集群的配置信息和元数据。
kube-controller-manager:运行各种控制器来确保集群的状态符合预期。
kube-scheduler:负责将Pod调度到合适的Node上运行。
cloud-controller-manager(可选):与云提供商交互,管理云资源。
数据平面:kubelet:在每个Node上运行,负责启动和管理Pod。
kube-proxy:在每个Node上运行,负责实现服务发现和负载均衡。


5.k8s特点:可移植性:支持公有云、私有云、混合云和多重云环境。
可扩展性:模块化、插件化设计,支持各种形式的扩展。
自动化:通过声明式语法提供强大的自修复能力,自动部署、自动重启、自动复制和自动伸缩/扩展。Kubernetes适用于各种场景,包括微服务架构、云原生应用、持续集成/持续部署(CI/CD)等。它可以帮助企业更高效地运行和管理容器化应用程序,提高应用程序的可靠性和可扩展性。

三K8S的网络插件

kubernetes支持多种网络插件,这些插件负责为pod提供网络通信能力。常见的有1.flannel,使用覆盖网络技术为k8s集群提供网络连接能力,支持后端,包括VXLAN,UDP,简单易用适用于小规模集群。 2,Calico,使用路由表来路由容器之间的流量,拥有较好的网络性能和可扩展性,提供网络策略和安全性功能。3,Cana是flannel和calico的组合,使用flannel来提供容器之间的通信,同时使用calico来提供网络策略和安全性功能。同时,K8s使用API(容器网络接口)作为网络提供商和Kubernetes Pod网络之间的接口,API只关注容器的网络连接,并在容器被删除时移除所分配的资源。

四基本操作

列出正在运行的容器:该命令将会显示所有正在运行的容器的详细信息,包括容器ID、镜像、创建时间等。你可以通过这些信息找到你想要查看的容器。

进入容器:找到你想要查看的容器后,记录下它的容器ID或名称。然后,使用以下命令进入容器:这个命令会以交互模式进入容器,并启动一个bash终端(或其他你在容器内定义的shell)。现在,你已经在容器内部了。

查看运行的应用:pa aux        这条命令会显示正在运行的进程列表,包括进程ID,CPU使用率等信息。top或者htop会显示实时的监控系统界面,可显示正在运行的进程及系统资源的使用情况,僵尸进程等等。退出容器可以输入exit或者ctrl+D.

四K8S的控制器有哪些?

工作负载(workload)控制器:1 Deployment适用于无状态服务部署,提供滚动更新,会回滚和扩展功能。2,ReplicaSet是Deployment的底层实现,可确保pod副本正常运行。3,StatefulSet适用于有状态的服务部署,提供稳定的网络标识和有序部署。4,DaemonSet,确保所有节点都运行一个pod的副本,常用于运行存储集群,日志收集,监控等守护进程。     任务控制器job和cronjob,用于批量处理任务,周期性执行任务,基于时间调度的job.       service,提供了pod的访问方式,为pod提供稳定的网络访问,提供ClusterIP,NodePort,LoadBalancer等类型。        自动扩展控制器HPA,根据CPU,内存等资源使用情况自动扩展pod副本数量,确保高负载时有足够的资源,低负载时节省资源。           

 其他控制器PV,PVC接口:管理持久化资源。Namespace用于隔离集群资源,实现多租户,不同的Namespace中的资源是相互隔离的。ConfigMap存储非敏感的配置信息,Secret存储敏感的配置信息如密码,密钥等。     

  Ingress提供了http和https路由到集群内部服务的能力。通常与ingress Controller一起使用,用于实现复杂的路由规则和TLS终止。这些控制器共同构成了Kubernetes的控制平面(Control Plane),负责管理和协调集群中的资源。用户可以通过创建这些控制器的实例来定义和管理集群中的工作负载、任务、服务发现、网络、自动化扩展等各个方面。

五pod的生命周期是什么?

1创建creation---2调度schduling---3初始化initialization---4容器启动container start---5运行和就绪running and readiness ---运行和服务running and serving ----终止termination

用户通过kubectl 或者API客户端工具向kubernets API Server提交pod的定义(一个yaml文件或者json文件)。API Server将pod信息存储在etcd中。。k8s的调度器从etcd中读取pod的定义,并基于一系列算法来选择一个合适的节点来运行pod(算法包括:资源需求,亲和性和反亲和性规则,污点和容忍度等)。调度器指定pod运行在某个节点上。。。在主容器启动前,初始化容器通常用于准备pod运行的环境,比如加载配置文件或等待外部服务就绪。。。。一旦容器启动,pod就进入了运行状态,kubectl会执行就绪探针,探针检查成功,确定容器已经准备好接受请求,pod会被标记为就绪状态,service可以将pod纳入负载均衡后端。。。。。

pod继续运行,主容器继续提供服务,kubectl会持续监控pod的健康情况,包括执行存活探针,来检查容器是否还活着。。。如果Pod不再需要(例如,通过kubectl delete命令删除Pod,或者Pod所在的ReplicaSet、Deployment等控制器进行了缩容),则开始Pod的终止过程。
kubelet会向Pod发送SIGTERM信号,允许容器进行优雅的关闭。

六k8s中的pod如何被部署?

1. 定义Pod的规格和容器
API版本和对象类型:首先,需要定义Pod所使用的Kubernetes API的版本(如apiVersion: v1)以及对象的类型(kind: Pod)。
元数据:在metadata部分,需要为Pod指定名称、标签和其他元数据。
Pod规格:在spec部分,定义Pod的详细规格,包括容器列表、存储、网络等。
容器列表:在containers字段下,列出Pod中的每个容器。每个容器需要指定名称、使用的镜像、端口映射等信息。
2. 创建Pod
使用kubectl命令:通过kubectl create -f pod.yaml命令,根据之前定义的YAML文件(如pod.yaml)创建Pod。
Kubernetes API:另外,也可以使用Kubernetes API直接创建Pod。这通常涉及使用编程语言(如Python)中的Kubernetes客户端库。
3. Pod的创建流程
kubectl发送YAML到API:kubectl将包含Pod定义的YAML文件发送到Kubernetes API服务器。
Pod存储在etcd中:API服务器将Pod的配置信息存储在etcd(一个分布式键值存储系统)中。
调度程序分配节点:Kubernetes调度程序(Scheduler)查看etcd中的Pod定义,并选择一个合适的节点来运行Pod。
kubelet开始创建Pod:节点上的kubelet进程接收到调度程序的指令后,开始创建Pod。
kubelet首先通过容器运行时接口(CRI)创建容器。
然后,kubelet将容器连接到容器网络接口(CNI)管理的网络中,并为其分配IP地址。
检查探针:在Pod创建过程中,kubelet会检查容器是否满足readiness和liveness探针的条件。
报告IP地址:一旦Pod创建成功并分配了IP地址,kubelet会将IP地址报告给控制平面。
4. Pod的发布(如果属于服务)
如果Pod是服务的一部分,Kubernetes会创建一个端点(Endpoint),将Pod的IP地址和端口映射到服务上。
这些端点将被用于服务发现,如kube-proxy设置iptables规则、CoreDNS更新DNS条目等。
5. 确认Pod的运行状态
使用kubectl get pods命令,可以查看Pod的运行状态,包括正在运行、挂起、失败等。
6. 总结
在Kubernetes中,Pod的部署是一个从定义、创建到运行状态的完整过程。这个过程涉及Kubernetes API、etcd、调度程序、kubelet等多个组件的协同工作。通过合理的配置和监控,可以确保Pod在Kubernetes集群中高效、稳定地运行。

七数据库的主从延迟怎么看?

1. 使用SHOW SLAVE STATUS命令
在MySQL中,可以通过SHOW SLAVE STATUS命令来查看主从复制的状态,其中包含了主从延迟的信息。具体步骤如下:

登录到从服务器。
执行SHOW SLAVE STATUS\G;命令(注意末尾的\G,它使得输出结果以垂直格式展示,便于阅读)。
在输出结果中,查找Seconds_Behind_Master字段。
如果该字段的值为0,表示主从同步是实时的,没有延迟。
如果该字段的值大于0,表示从库比主库慢,数字越大表示从库落后主库越多。
如果该字段的值为NULL,表示io_thread或是sql_thread有任何一个发生故障,也就是该线程的Running状态是No,而非Yes。
2. 分析主从延迟的原因
主从延迟可能由多种原因引起,包括但不限于:

网络延迟:网络带宽不足或网络连接不稳定可能导致数据传输延迟。
主从服务器负载:主服务器负载过高可能导致延迟增加。
大事务和慢查询:执行大事务或慢查询会消耗更多时间,导致数据传输到从服务器的延迟。
从服务器性能问题:如果从服务器资源不足,无法及时处理主服务器发送的数据,也会发生延迟。
3. 解决主从延迟的思路
针对上述原因,可以采取以下措施来减少或解决主从延迟:

优化网络环境:确保主备之间的网络连接稳定,并有足够的带宽来处理复制流量。
监控服务器状态:定期监控主从服务器的负载和性能,确保它们能够正常处理数据。
优化查询和事务:减少大事务和慢查询的执行时间,避免对主从复制造成过大的压力。
调整复制配置:根据实际需要调整复制相关的配置参数,如二进制日志格式、同步方式等。
总结
通过SHOW SLAVE STATUS命令可以方便地查看MySQL数据库的主从延迟情况,并根据实际情况采取相应的措施来减少或解决延迟问题。同时,定期监控和评估主从服务器的状态和性能也是预防和解决主从延迟的重要手段。

八mysql的半同步复制是什么?

数据库的半同步复制(Semisynchronous Replication)是一种介于异步复制和全同步复制之间的复制方式,主要用于数据库系统(如MySQL)中以确保数据的一致性和完整性。以下是关于半同步复制的详细解释:

定义与原理:
半同步复制是一种主从复制模式,主库(Master)在执行完客户端提交的事务后,不是立即返回给客户端,而是等待至少一个从库(Slave)接收到并写入到其中继日志(Relay Log)中才返回给客户端。
这种模式在MySQL 5.5版本开始引入,由Google贡献的补丁支持。它解决了异步复制可能带来的数据丢失问题,同时避免了全同步复制的高延迟。
过程与特点:
主库执行事务后,会将二进制日志(Binary Log)发送给从库。
在从库成功接收并写入中继日志后,会向主库发送一个确认消息(ACK)。
主库在接收到至少一个从库的确认消息后,才会向客户端返回操作完成。
如果从库在指定时间内未返回确认消息,主库会暂时切换到异步复制模式,以确保事务的及时提交。
半同步复制提高了数据的完整性,因为它确保了至少有一个从库已经接收到了主库的更新。
与异步复制相比,半同步复制可能导致一定的延迟,因为主库需要等待从库的确认。但相对于全同步复制,延迟较小。
适用场景:
半同步复制适用于对数据一致性要求较高,但又不能容忍全同步复制带来的高延迟的场景。
在金融、电商等对数据一致性要求较高的行业,半同步复制得到了广泛应用。
配置与监控:
在MySQL中,可以通过配置相关的参数来启用和配置半同步复制。
监控半同步复制的状态和性能也是非常重要的,可以通过MySQL提供的性能监控工具来进行。
总结:
半同步复制是一种折中的解决方案,它在保证数据一致性的同时,又尽量减小了延迟。对于大多数应用来说,它是一个很好的选择。

九mysql的窗口函数是什么?

MySQL 在 8.0 及以后的版本中引入了窗口函数(Window Functions)或称为分析函数(Analytic Functions),这些函数允许用户执行跨行集的计算,而不仅仅是针对单个行。窗口函数通常与 OVER() 子句一起使用,以定义窗口的范围或分区。

以下是一些 MySQL 中的常用窗口函数:

ROW_NUMBER()
为结果集中的每一行分配一个唯一的连续整数。

sql
复制代码
SELECT   
    column_name,  
    ROW_NUMBER() OVER (ORDER BY column_name) as row_num  
FROM   
    table_name;
RANK() 和 DENSE_RANK()
为结果集中的每一行分配一个排名。两者的主要区别在于处理相同值的方式。RANK() 在相同值的情况下会跳过下一个排名(例如,1, 2, 2, 4),而 DENSE_RANK() 则不会(例如,1, 2, 2, 3)。

sql
复制代码
SELECT   
    column_name,  
    RANK() OVER (ORDER BY column_name) as rank_num  
FROM   
    table_name;
NTILE(n)
将有序分区中的行分发到指定数量的近似相等的组中,并为结果集中的每一行返回一个组号。

sql
复制代码
SELECT   
    column_name,  
    NTILE(4) OVER (ORDER BY column_name) as quartile  
FROM   
    table_name;
LEAD() 和 LAG()
访问结果集中的前一行或后一行的值。这在计算移动平均值、比较相邻行等方面非常有用。

sql
复制代码
SELECT   
    column_name,  
    LAG(column_name) OVER (ORDER BY column_name) as prev_value  
FROM   
    table_name;
FIRST_VALUE() 和 LAST_VALUE()
返回窗口中第一行或最后一行的值。

sql
复制代码
SELECT   
    column_name,  
    FIRST_VALUE(column_name) OVER (PARTITION BY partition_column ORDER BY order_column) as first_val  
FROM   
    table_name;
SUM()、AVG()、MIN()、MAX() 作为窗口函数
这些聚合函数也可以用作窗口函数,以计算窗口内的总和、平均值、最小值和最大值。

sql
复制代码
SELECT   
    column_name,  
    SUM(column_name) OVER (PARTITION BY partition_column) as sum_val  
FROM   
    table_name;
CUME_DIST()
返回当前行的值在窗口中的相对位置。其值的范围为 0 到 1,其中 0 表示最小值,1 表示最大值。

PERCENT_RANK()
返回相对排名(0 到 1 之间的小数),其中 0 表示最小值,1 表示最大值。与 RANK() 和 DENSE_RANK() 不同,PERCENT_RANK() 的计算基于 (rank - 1) / (total rows - 1)。

在使用窗口函数时,OVER() 子句中的 PARTITION BY 语句允许你将结果集分成多个窗口或分区,并为每个分区独立地计算窗口函数。而 ORDER BY 语句则定义了窗口中的行顺序。

十linux的基本操作命令有哪些?

文件和目录操作
ls:列出目录内容。
-l:以长格式显示详细信息。
-a:显示所有文件,包括隐藏文件。
-h:以人类可读的格式(如KB、MB)显示文件大小。
-R:递归显示子目录内容。
cd:切换目录。
cd /path/to/directory:切换到指定目录。
cd ..:返回上一级目录。
pwd:显示当前工作目录的绝对路径。
mkdir:创建目录。
-p:递归创建目录,即创建多级目录。
rm:删除文件或目录。
-r 或 -R:递归删除目录及其内容。
cp:复制文件或目录。
-r 或 -R:递归复制目录及其内容。
mv:移动文件或重命名文件/目录。
文本操作
cat:显示文件内容。
echo:在控制台打印内容或将内容写入文件。
grep:在文件中搜索指定的字符串。
-i:忽略大小写。
-v:反向选择,即显示不包含指定字符串的行。
系统管理
reboot:重启系统。
poweroff 或 halt:关闭系统。
top 或 htop:查看系统进程和资源使用情况。
netstat:显示网络连接、路由表、接口统计等网络相关信息。
-anp:显示所有活动网络连接及对应的进程信息。
其他常用命令
man 或 info:查看命令的手册页,获取命令的详细帮助信息。
less:分页查看文件内容。
vim 或 nano:文本编辑器,用于创建和编辑文件。
find:在目录树中查找文件。
与时间有关的参数:-mtime n 表示在n天之前被修改过的文件。
tar:打包和压缩文件。
-c:创建压缩文件。
-x:解压文件。
-z:使用gzip压缩或解压。
gzip:压缩或解压.gz文件。
以上只是Linux命令的一小部分,Linux系统中还有许多其他命令和工具,可以根据需要进行学习和使用。

查看打包的日志文件中的报错信息条数
要查看每三个月打包的日志文件中最近两周的报错信息条数,可以使用以下步骤:

定位日志文件:
首先,需要知道这些日志文件的具体位置。通常,它们会按照一定的命名规则(如包含日期)存储在某个目录下。
解压文件(如果日志文件被压缩):
如果日志文件被打包成.tar.gz或.zip等格式,需要先解压。例如,对于.tar.gz文件,可以使用 tar -xzvf <文件名> 解压。
使用grep命令筛选报错信息:
假设日志文件的内容是文本格式,并且报错信息包含某个关键词(如“error”),可以使用 grep 命令来筛选。例如,grep "error" <日志文件>。
统计报错信息条数:
将 grep 命令的输出通过管道(|)传递给 wc -l 命令来统计行数。例如,grep "error" <日志文件> | wc -l。
结合时间条件筛选:
如果日志文件是按时间顺序记录的,并且每行都包含时间戳,可以使用 awk、sed 或其他文本处理工具来结合时间条件筛选最近两周的报错信息。这需要根据具体的日志格式来定制命令。
打包和解包的命令
打包:
使用 tar 命令进行打包。例如,tar -czvf <打包文件名>.tar.gz <要打包的文件或目录>。
解包:
对于 .tar.gz 文件,使用 tar -xzvf <文件名>.tar.gz。
对于其他压缩格式(如 .zip),使用相应的解压命令(如 unzip)。
合并查看压缩包和外部日志文件的报错信息
解压压缩包中的日志文件(如果需要)。
使用 cat、less 或其他命令合并查看外部日志文件和解压后的日志文件。
使用 grep 和 wc -l 统计报错信息条数。
注意:由于日志文件可能非常大(如你提到的20G-30G),直接处理这些文件可能会非常耗时并占用大量内存。因此,在实际操作中,可能需要考虑使用更高效的方法或工具来处理这些文件,如使用 awk、sed 进行文本处理,或使用 logrotate 等工具来管理日志文件的大小和数量。

数据库的连表查询是数据库操作中常见的一种需求,主要用于从两个或更多的表中根据相关的列将数据结合起来。以下是连表查询的主要类型,按照清晰的分点表示和归纳:

内连接(INNER JOIN)
定义:只返回两个表中匹配的行。
示例:假设我们有两个表:employees(员工表)和departments(部门表)。内连接可以用于找出每个员工所在的部门名称。
SQL语句示例:
sql
复制代码
SELECT employees.name, departments.department_name  
FROM employees  
INNER JOIN departments ON employees.department_id = departments.department_id;
左外连接(LEFT JOIN 或 LEFT OUTER JOIN)
定义:返回左表中的所有行,即使在右表中没有匹配。
示例:列出所有员工及其部门名称,即使某些员工没有对应的部门。
SQL语句示例:
sql
复制代码
SELECT employees.name, departments.department_name  
FROM employees  
LEFT JOIN departments ON employees.department_id = departments.department_id;
右外连接(RIGHT JOIN 或 RIGHT OUTER JOIN)
定义:返回右表中的所有行,即使在左表中没有匹配。
注意:虽然右外连接在某些数据库系统中是存在的,但在实际使用中,左外连接更为常见,因为可以通过调整表的顺序和使用左外连接来达到相同的效果。
全外连接(FULL OUTER JOIN)
定义:返回两个表中的所有行,无论它们是否匹配。
示例:列出所有员工及其部门名称,包括没有员工的部门和没有部门的员工。
注意:不是所有的数据库系统都支持全外连接,但可以通过结合左外连接和右外连接的结果来模拟全外连接。
交叉连接(CROSS JOIN)
定义:返回左表中的每一行与右表中的每一行的组合,即笛卡尔积。
示例:当不需要基于任何条件进行连接时,可以使用交叉连接。
SQL语句示例:
sql
复制代码
SELECT *  
FROM employees  
CROSS JOIN departments;
注意:交叉连接的结果集可能会非常大,因为它返回了所有可能的组合。
自连接(SELF JOIN)
定义:一个表与其自身进行连接。这通常用于查找表内的相关记录,例如查找具有相同经理的员工或查找属于同一部门的员工之间的关系。
SQL语句示例(假设要查找员工及其经理的姓名):
sql
复制代码
SELECT e1.name AS employee_name, e2.name AS manager_name  
FROM employees e1  
JOIN employees e2 ON e1.manager_id = e2.employee_id;
以上是连表查询的主要类型,每种类型都有其特定的用途和场景。在实际应用中,选择哪种类型的连接取决于你的具体需求和查询目标。列式数据库是一种特殊类型的数据库管理系统,它以列相关存储架构进行数据存储,主要适合于批量数据处理和即时查询。以下是关于列式数据库的主要特点和介绍:

1. 数据存储方式

列式数据库将数据按列存储,而不是按行存储。这意味着在物理存储层面,同一列的所有数据值会被连续地存储在一起,而不是分散在不同的行中。
2. 主要优点

高效的存储空间利用率:由于列式数据库中的数据是按列连续存储的,因此可以利用数据的相似性进行高效的数据压缩。通常,列式数据库的压缩率可以达到8:1到30:1,远高于传统行式数据库的3:1到5:1。
快速的查询速度:当查询只涉及表中的少数几列时,列式数据库只需要读取这些列的数据,而不需要读取整行数据。这种按需读取的方式可以显著提高查询速度。
更好的扩展性:列式数据库可以更容易地进行水平扩展,通过增加更多的节点和服务器来处理更大规模的数据。
更好的数据分析支持:由于列式数据库可以处理大规模的数据,它可以支持更复杂的数据分析和处理操作,例如数据挖掘、机器学习等。
3. 主要缺点

更慢的写入速度:由于数据是按列存储的,每次写入操作都需要写入整个列,而不是单个行。因此,列式数据库的写入速度通常比行式数据库慢。
更复杂的数据模型:由于列式数据库的数据存储方式与传统行式数据库不同,因此可能需要更复杂的数据模型和设计开发工作。
4. 应用场景

列式数据库在需要进行大规模数据分析和处理的场景中具有显著优势,如金融、医疗、电信、能源、物流等行业。在这些领域中,列式数据库可以更快速地处理大量数据,并支持更复杂的数据分析和处理操作。
5. 代表性产品

SAP HANA、Amazon Redshift、Sybase IQ、ParAccel、Sand/DNA Analytic等都是列式数据库的代表产品。这些产品在不同的领域和场景中得到了广泛的应用和验证。
总之,列式数据库以其独特的存储方式和优势在大数据分析和处理领域发挥着重要作用。随着数据量的不断增长和数据分析需求的不断提高,列式数据库的应用前景将更加广阔。


 


十一列式数据库

数据库的行转列(也称为透视或交叉表查询)是一种将原本多行中的不同内容转换为多个字段(列)的查询技术。在关系型数据库中,这通常涉及到对数据进行分组,并对每个分组应用聚合函数以生成新的列。以下是一些实现行转列的方法,以MySQL为例:

1. 使用CASE语句
CASE语句允许你在查询中根据条件返回不同的值。你可以为每个可能的列值编写一个CASE语句,并使用SUM或MAX等聚合函数来生成新的列。

sql
复制代码
SELECT   
    userid,  
    SUM(CASE WHEN subject = '语文' THEN score ELSE 0 END) AS 语文,  
    SUM(CASE WHEN subject = '数学' THEN score ELSE 0 END) AS 数学,  
    SUM(CASE WHEN subject = '英语' THEN score ELSE 0 END) AS 英语  
FROM   
    tb_score  
GROUP BY   
    userid;
2. 使用SUM(IF())
SUM(IF())是另一种常用的行转列方法,它与CASE语句类似,但语法略有不同。

sql
复制代码
SELECT   
    userid,  
    SUM(IF(subject = '语文', score, 0)) AS 语文,  
    SUM(IF(subject = '数学', score, 0)) AS 数学,  
    SUM(IF(subject = '英语', score, 0)) AS 英语  
FROM   
    tb_score  
GROUP BY   
    userid;
3. 动态SQL
当列的值不确定时,你可能需要编写动态SQL来生成行转列的查询。这通常涉及到构建并执行一个字符串,该字符串包含实际的SQL查询。请注意,动态SQL可能增加SQL注入的风险,因此在使用时必须格外小心。

4. 使用第三方工具或库
有些数据库管理系统或第三方工具提供了内置的行转列功能。例如,在Excel中,你可以使用“数据透视表”功能来实现类似的效果。此外,一些ORM(对象关系映射)库也提供了行转列的支持。

注意事项
行转列通常会增加查询的复杂性,并可能影响性能。因此,在决定使用行转列之前,请仔细评估你的需求和数据量。
如果你的表中有大量的行和列,或者你需要频繁地进行行转列操作,请考虑将数据存储在更适合这种结构的数据库中,如列式存储数据库或NoSQL数据库。
在使用聚合函数时,请注意选择适当的函数来处理NULL值和其他特殊情况。例如,SUM函数会忽略NULL值,而AVG函数则会将NULL值视为0。

数据库的存储

数据库的存储主要依赖于其数据类型,这些数据类型决定了可以存储什么样的数据。以下是一些常见的数据库数据类型:

大数据类型
BLOB(Binary Large Object):用于存放二进制内容,如视频、音频、图片等。
TEXT:保存字符数据,用于存放文本,可以超过255个字符。
数值型
整形:tinyint、smallint、int、bigint等,用于存储整数值。
小数:float(单精度)、double(双精度)以及decimal(高精度小数),用于存储带有小数点的数字。
位数据类型(逻辑性)
BIT:由1或0组成的数据,用于存储逻辑值。
日期型
DATE:日期。
TIME:时间。
DATETIME:日期和时间。
TIMESTAMP:日期和时间都包含,是指某一个时间戳。
其他类型
布尔(BOOLEAN):用于存储真和假两个值。
字符(CHAR):用于存储固定长度的文本字符串。
字符串(VARCHAR):用于存储可变长度的文本字符串。
大整数(BIGINT):用于存储非常大的整数。
数据库的查询

数据库的查询可以根据不同的需求和目的进行分类,主要包括:

简单查询:从单个表中检索数据,选择特定列、应用筛选条件和排序结果。
聚合查询:计算一组值的总和、平均值、最大值、最小值等,通常涉及使用聚合函数(如SUM、AVG、MAX、MIN、COUNT)和GROUP BY子句。
连接查询:联结多个表的数据,使用JOIN子句将多个表连接在一起,并通过指定连接条件获取相关数据。
子查询和嵌套查询:在查询中嵌套另一个查询或多个子查询,用于获取更复杂的查询结果。
联合查询:合并两个或多个查询的结果集,使用UNION、UNION ALL、INTERSECT或EXCEPT操作符。
参数化查询:在查询中使用参数,以便在运行时动态传递值,提高查询的可重用性和安全性。
分析查询:执行复杂的数据分析和统计操作,通常涉及使用窗口函数(如ROW_NUMBER、RANK、LEAD、LAG)和OVER子句。
数据库的聚合函数

聚合函数是数据库中用于对数据进行汇总和统计的函数。以下是一些常见的聚合函数:

SUM:计算一组数据的总和。
COUNT:统计一组数据的行数或非空值的数量。
AVG:计算一组数据的平均值。
MIN:找出一组数据中的最小值。
MAX:找出一组数据中的最大值。
除了这些常见的聚合函数外,数据库还提供了一些其他的聚合函数,如STDEV(计算一组数据的标准差)、VAR(计算一组数据的方差)、GROUP_CONCAT(将一组数据连接成一个字符串并返回)等。

关系型数据库和非关系型数据库是两种截然不同的数据库管理系统,它们在数据结构、存储方式、查询方式等方面有着显著的差异。以下是它们的主要特点对比:

十二关系型数据库
1. 数据结构化

关系型数据库使用二维表格(table)模型来组织数据,数据以行和列的形式存储。
每个表格包含若干列(字段)和若干行(记录),这种结构化的数据组织形式使得数据的存储和查询更加有序和高效。
2. 数据完整性约束

关系型数据库对数据的完整性进行了严格的约束,包括实体完整性、参照完整性和域完整性等,这些约束保证了数据的准确性和可靠性。
3. 支持SQL查询语言

关系型数据库支持SQL(结构化查询语言)作为标准化的查询语言,用户可以通过SQL语句进行数据的检索、更新和删除等操作。
4. 事务处理支持

关系型数据库支持事务处理,能够确保一系列数据操作的原子性、一致性、隔离性和持久性(ACID特性)。
5. 数据独立性

十三关系型数据库中的数据独立于应用程序,包括物理独立性和逻辑独立性,这种独立性使得数据库的使用、调整、优化和进一步扩充更加方便。
非关系型数据库
1. 非关系数据模型

非关系型数据库不使用关系模型,而是使用各种数据模型,如键值对(key-value)、文档(document)、列式(column-oriented)和图(graph)等,这些模型更适合处理非结构化或半结构化数据。
2. 可扩展性

非关系型数据库通常具有高度可扩展性,可以轻松地横向扩展到多个服务器,以满足不断增长的数据需求。
3. 灵活性和可更改性

非关系型数据库的模式非常灵活,可以随时添加或删除字段,而不会影响现有数据,这使得它们非常适合快速变化的环境。
4. 高可用性和容错性

非关系型数据库通常设计为高可用和容错的,通过复制和故障转移机制来确保数据的安全性和可用性。
5. 易于使用

非关系型数据库通常提供简单的API和查询语言,使得非技术人员也能轻松理解和使用。
总结
关系型数据库和非关系型数据库各有优缺点,适用于不同的应用场景。关系型数据库适用于需要保证数据一致性和完整性的结构化数据存储和查询场景,如金融、医疗等领域;而非关系型数据库则更适用于需要处理大量非结构化数据、高并发数据或需要进行快速扩展的场景,如社交网络、云计算、物联网等领域。在选择数据库时,需要根据具体的应用场景和需求进行权衡和选择。

十四运维工程师需要掌握的技能可以分为多个方面,以确保能够高效、稳定地管理和维护企业的IT系统。以下是一些关键技能及其详细解释:

操作系统及网络技能:
熟练掌握Linux和Windows等操作系统的安装、配置和管理。
深入了解网络拓扑、互联网协议(如TCP/IP)、路由器和交换机的配置等网络知识。
掌握常用命令和工具,如iptables、firewalld、Nginx等,能够独立完成配置和排错。
数据库及缓存技术:
了解关系型数据库(如MySQL)和非关系型数据库(如Redis)的基本概念和原理。
能够进行数据库的安装、配置、优化和维护。
掌握缓存技术,如Redis集群、Memcached等,以提高系统性能和可用性。
自动化运维工具与脚本编写:
熟练掌握至少一种脚本编程语言,如Shell、Python或PowerShell,用于自动化常见的重复性任务。
了解并使用自动化运维工具,如Ansible、Puppet等,以提高工作效率。
云计算与虚拟化技术:
了解云计算和虚拟化技术的基本概念和原理,如Docker、Kubernetes等。
能够使用相关工具进行容器编排、部署和管理。
监控与日志分析:
掌握系统性能监控、资源管理、日志分析等方面的知识。
能够使用监控工具(如Zabbix、Prometheus)和日志分析工具(如ELK Stack)进行故障排查和性能优化。
安全性与备份恢复:
熟悉安全最佳实践,能够评估系统和应用程序的安全性。
采取有效的安全措施保护系统免受恶意攻击和数据泄露。
了解数据备份和恢复的基本概念和方法,能够制定和执行严格的数据备份和恢复计划。
持续集成/持续部署(CI/CD):
熟悉持续集成和持续交付的概念。
能够使用相关的工具和方法来改进工作流程,提高部署效率。
学习能力与团队协作:
具备持续学习和改进的意识,不断跟进新技术和行业趋势。
具备良好的沟通能力和团队协作能力,能够与不同部门的人员有效合作。
Web应用开发技能(可选):
了解Web应用开发的基本技术,如HTML、CSS、JavaScript等。
能够使用相关框架和库进行开发,了解常见的Web容器和Web服务器(如Tomcat、Nginx)。
以上技能是运维工程师在职业生涯中需要不断学习和掌握的关键技能。通过不断学习和实践,运维工程师可以不断提升自己的能力,为企业提供稳定和高效的运维支持。

十五在运维工程师的面试中,关于端口的问题通常会涉及到常见的网络服务所使用的端口号,以及这些端口号所对应的服务类型。以下是一些常见的端口号和相关服务的参考:

FTP服务:
端口号:21
描述:FTP(文件传输协议)用于在本地和远程计算机之间传输文件。
SSH服务:
端口号:22
描述:SSH(安全外壳协议)用于远程登录和命令执行,提供了加密的数据传输和主机认证。
SMTP服务:
端口号:25
描述:SMTP(简单邮件传输协议)用于在邮件服务器之间发送电子邮件。
DNS服务:
端口号:53
描述:DNS(域名系统)用于将域名解析为IP地址。
HTTP服务:
端口号:80
描述:HTTP(超文本传输协议)用于在Web服务器上传输网页和其他数据。
HTTPS服务:
端口号:443
描述:HTTPS(安全的超文本传输协议)是HTTP的安全版本,使用SSL/TLS进行加密。
MySQL数据库:
端口号:3306
描述:MySQL是一个流行的关系型数据库管理系统。
Redis数据库:
端口号:6379
描述:Redis是一个开源的、内存中的数据结构存储系统,它可以用作数据库、缓存和消息中介。
Nginx服务器:
端口号:80(HTTP)或443(HTTPS)
描述:Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。
Elasticsearch服务器:
端口号:9200
描述:Elasticsearch是一个基于Lucene的搜索和分析引擎,提供全文搜索、结构化搜索和分析搜索功能。

Tomcat 的默认端口通常是 8080。但请注意,这只是一个默认值,你可以根据你的需要和环境配置来更改它。

在 Tomcat 的 conf 目录下,有一个名为 server.xml 的文件。你可以在这个文件中找到 <Connector> 元素,它定义了 Tomcat 的端口。例如:

xml
复制代码
<Connector port="8080" protocol="HTTP/1.1"  
           connectionTimeout="20000"  
           redirectPort="8443" />
在这个例子中,Tomcat 的 HTTP 连接器正在监听 8080 端口。如果你希望更改这个端口,只需将 port 属性的值更改为你想要的端口号即可。

另外,Tomcat 也可以配置为使用 HTTPS,这通常在 <Connector> 元素中使用 protocol="org.apache.coyote.http11.Http11NioProtocol" 并添加 SSL 配置来实现。在这种情况下,你可能会看到另一个 <Connector> 元素,它监听一个不同的端口(如 8443),用于 HTTPS 请求。

请注意,当你更改 Tomcat 的端口时,你需要确保该端口没有被其他应用程序或服务使用,并且它没有被防火墙阻止。

  • 28
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值