资讯详情

运维开发工程师面试(一)

以下内容由网络收集整理,部分内容不是我整理的,红色是最重要的。 一,TCP/IP 二,HTTP 2.1 HTTP请求 2.2 HTTP响应 2.3 HTTP报文格式 2.4 HTTP更换协议版本 2.5 HTTP网站访问量 三,SHELL 四,命令 五,Apache 六,Tomcat 6.1Tomcat顶层架构 6.2Tomcat顶层结构总结: 6.3Connector和Container的微妙关系 6.4Connector架构分析 6.5 Container架构分析 6.6 Container如何处理请求 6.7 总结 七、负载均衡 7.1负载均衡算法 7.2负载平衡是什么? 7.3.数据层负载均衡 7.4 总结 八,Haproxy 九,Keepalived 9.1 keeplived 工作原理 9.2 keeplived 有哪些模块 9.3解释一下vrrp 协议 9.4keepalived作用 十,MySQL面试题 10.1 考察基础笔试命令 10.2MySQL运维基础知识面试问答问题 十四,Ansible、Jenkins 14.1 [Ansible](https://www.jianshu.com/p/c82737b5485c) 14.2 Jenkins 十二,Docker 12.1 什么是容器 12.2 Docker是什么? 12.3 Docker架构 12.4 Docker的用途 12.5 Docker的主要组成 12.6 Docker的架构 C/S架构 12.7 Docker的组件 12.8 Docker的工作原理 12.9 Docker镜像是怎么工作的? 12.10 Docker仓库是怎么工作的? 12.11 Docker容器是怎么工作的? 12.12 当运行docker容器发生了什么? 12.13 Docker的底层技术 12.14 Docker与VM的区别: 12.15 docker与Openstack的对比 12.16 Docker与虚拟机相比 12.17 Docker用途: 十三,Zabbix 十四、乱七八糟 14.1 简述一下DNS的解析过程 14.2 linux系统的启动过程 14.3 FTP主动模式和被动模式 14.4 真题 一,TCP/IP 简述TCP握手三次的过程? 在TCP/IP协议中,TCP协议提供可靠的连接服务,用三次握手建立连接。第一次握手:建立连接时,客户端发送syn包(syn=j)并进入服务器SYN_SEND等待服务器确认状态。第二次握手:服务器收到syn必须确认客户的包SYN(ack=j 1)同时自己发一个SYN包(syn=k),即SYN ACK此时服务器进入包SYN_RECV状态。第三次握手:客户端收到服务器SYN+ACK将确认包发送到服务器ACK(ack=k 1)发送此包后,客户端和服务器进入ESTABLISHED状态,完成三次握手。完成三次握手后,客户端和服务器开始传输简短的数据版本:首先,A向B发SYN(同步请求)然后B回复SYN ACK(同步请求响应),最后A回复ACK确认,这样TCP建立了一次连接(三次握手)的过程。

为什么连接时握手三次,关闭时握手四次? 这是因为当Server端收到Client端的SYN连接请求报文后,可直接发送SYN ACK报文。其中ACK报文是用来回答的,SYN报文用于同步。 但是关闭连接时,当Client端发送FIN报文只是说它不再发送数据,但也可以接收数据,Server端收到FIN报文时,很可能不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,你发的FIN我收到了报文。只有等到我Server所有的报纸都发完了,我才能发FIN所以报文不能一起发。所以需要四步握手。

二,HTTP HTTP–Hyper Text Transfer Protocol,超文本传输协议是基于它的TCP无状态连接,整个基本工作流程是客户端发送一个HTTP请求说明客户端要访问的资源和请求的动作。服务端收到请求后,服务端开始处理请求,并根据请求进行相应的动作访问服务器资源。最后通过发送HTTP响应将结果返回给客户端。从请求开始到响应结束的请求之一称为事务,当事物结束时,将在服务端添加日志。

2.1 HTTP请求 HTTP请求是客户端将请求动作发送到服务端,告知服务器自己的要求。 HTTP请求由状态行、请求头、请求文本三部分组成: 状态:包括请求方式:Method、资源路径URL、协议版本Version; 请求头:包括一些访问域名、用户代理、Cookie等信息; 请求正文:是的HTTP请求数据。 注:请求方式Method一般有GET、POST、PUT、DELETE,含义分别是获取、修改、上传和删除GET方式仅仅为获取服务器资源,方式较为简单,因此在请求方式为GET的HTTP在请求数据中,可以省略请求文本部分,直接添加要获得的资源URL中。如下图所示GET请求,无请求正文。下面详细说明。

目前,大多数协议版本都是http/1.1 下图所示为POST请求格式包括状态行、请求头和请求文本。

2.2 HTTP响应 响应数据格式 服务器从客户端收到HTTP请求后,依据HTTP请求中的动作要求,服务端做出具体动作,将结果回应给客户端,称为HTTP响应。 HTTP响应由状态线、响应头、响应文本三部分组成; 状态行:包括协议版本Version、状态码Status Code、回应短语; 响应头:包括搭建服务器的软件,发送响应的时间,回应数据的格式等信息; 响应文本:是响应的具体数据。 注:我们主要关心并能在客户端浏览器中看到三位数状态码,不同的状态码代表不同的含义,其中

1XX 表示HTTP请求已被接受并继续处理 2XX 表示HTTP请求已完成 3XX 表示要求访问URL重定向到其他目录 4XX 说明客户端有错误 5XX 表示服务端有错误 具体HTTP如下图所示: 常见状态码

状态码 含义 200 请求已正常处理 301 请求永久重定向 302 临时重定向请求 304 请求重定向客户端本地缓存 400 客户端请求存在语法错误 401 未经授权,客户端请求未经授权 403 服务器拒绝了客户端的请求,通常客户端没有访问权限 404 请求客户端URL不存在于服务端 500 永久错误的服务端 503 临时错误发生在服务端 HTTP响应模型 服务器收到HTTP请求结束后,响应请求的方法有很多。HTTP四种响应模型: 单进程I/O模型 服务端打开一个过程,一个过程只能处理一个请求,并按顺序处理请求; 多进程I/O模型 多个过程并行打开,同一过程只能处理一个请求,使服务端同时处理多个请求; 复用I/O模型 服务端打开一个过程,但同时打开多个线程,一个线程响应一个请求,同时处理多个请求,并在线程之间执行; 复用多线程I/O模型 服务流程并行打开,每个流程打开多个线程,使服务端能够同时处理流程数M*每个过程的线程数N个请求。

2.3 HTTP报文格式 HTTP报文是HTTP应用程序之间传输的数据块,HTTP报文分为HTTP请求报文和HTTP回应报文,但无论哪种报文,他的整体格式都是相似的,大致由起始、第一、主三部分组成,开始说明报文的动作,第一部分描述了报纸的属性,主体是报纸的数据。接下来具体说明。

HTTP请求报文 请求报告的开始由请求银行组成(有些信息称为状态银行,名称不同,指的是一件事),用来解释请求想做什么, 注意每个字段之间的空间。 字段有不同的值: GET — 访问服务器资源

POST — 将要修改的数据发送给服务器

HEAD — 获取服务器文档的第一部分

PUT — 向服务器传递资源p

       DELETE— 删除服务器的资源

URL 字段表示服务器的资源目录定位 Version 字段表示使用的http协议版本 首部部分由多个请求头(也叫首部行)构成,那些首部字段名有如下,不全:        Accept 指定客户端能够接收的内容格式类型        Accept-Language 指定客户端能够接受的语言类型        Accept-Ecoding 指定客户端能够接受的编码类型        User-Agent 用户代理,向服务器说明自己的操作系统、浏览器等信息        Connection 是否开启持久连接(keepalive)         Host 服务器域名 主体部分就是报文的具体数据。

HTTP响应报文        响应报文的起始由状态行构成,用来说明服务器做了什么,由、、Phrase三个字段组成,同样的每个字段之间留有空格;        Status-Code 上边已经说明;        首部由多个响应头(也叫首部行)组成, 首部字段名如下,不全:        Server 服务器软件名,Apache/Nginx        Date 服务器发出响应报文的时间        Last-Modified 请求资源的最后的修改时间        主体部分是响应报文的具体数据。

2.4 HTTP协议版本更换 HTTP/0.9        HTTP协议的最初版本,功能简陋,仅支持请求方式GET,并且仅能请求访问HTML格式的资源。 HTTP/1.0        在0.9版本上做了进步,增加了请求方式POST和HEAD;不再局限于0.9版本的HTML格式,根据Content-Type可以支持多种数据格式,即MIME多用途互联网邮件扩展,例如text/html、image/jpeg等;同时也开始支持cache,就是当客户端在规定时间内访问统一网站,直接访问cache即可。        但是1.0版本的工作方式是每次TCP连接只能发送一个请求,当服务器响应后就会关闭这次连接,下一个请求需要再次建立TCP连接,就是不支持keepalive。 HTTP/1.1        解决了1.0版本的keepalive问题,1.1版本加入了持久连接,一个TCP连接可以允许多个HTTP请求; 加入了管道机制,一个TCP连接同时允许多个请求同时发送,增加了并发性;新增了请求方式PUT、PATCH、DELETE等。        但是还存在一些问题,服务端是按队列顺序处理请求的,假如一个请求处理时间很长,则会导致后边的请求无法处理,这样就造成了队头阻塞的问题;同时HTTP是无状态的连接,因此每次请求都需要添加重复的字段,降低了带宽的利用率。 HTTP/2.0        为了解决1.1版本利用率不高的问题,提出了HTTP/2.0版本。增加双工模式,即不仅客户端能够同时发送多个请求,服务端也能同时处理多个请求,解决了队头堵塞的问题;HTTP请求和响应中,状态行和请求/响应头都是些信息字段,并没有真正的数据,因此在2.0版本中将所有的信息字段建立一张表,为表中的每个字段建立索引,客户端和服务端共同使用这个表,他们之间就以索引号来表示信息字段,这样就避免了1.0旧版本的重复繁琐的字段,并以压缩的方式传输,提高利用率。        另外也增加服务器推送的功能,即不经请求服务端主动向客户端发送数据。 当前主流的协议版本还是HTTP/1.1版本。

2.5 HTTP网站访问量        IP IP访问量 相同的公网IP计算一次,就是同一个局域网内的所有用户访问一个网站,但是他们都是借助一个公网IP去访问那个网站的(NAT),因此这也只能算作一个IP访问量。换一次公网IP则会加1。         PV 网页访问量 用户访问的页面数就是PV访问量,同一个局域网的不同用户,而且就算是同一个用户,只要刷新一次网站页面,PV访问量就加1,三个访问量的值往往数PV的值最大。        UV 访客访问量 这里的访客不是用户,而是电脑,一台电脑算一个访客,即使是同一台电脑的不同用户,访问同一个网站UV也只能加1,只有更换电脑才会使UV加1,因为服务端会记录客户端电脑的信息。

三,SHELL 为你的面试准备选择了 70 个你可能遇到的 shell 脚本面试问题及解答。了解脚本或至少知道基础知识对系统管理员来说至关重要,它也有助于你在工作环境中自动完成很多任务。在过去的几年里,我们注意到所有的 linux 工作职位都要求脚本技能。

如何向脚本传递参数 ? ./script argument          例子: 显示文件名称脚本          ./show.sh file1.txt     cat show.sh     #!/bin/bash     echo $1     (LCTT 译注:谢谢某匿名访客的提醒,原题有误,修改之。) 1 2 3 4 5 6 7 8 9 如何在脚本中使用参数 ? 第一个参数 : $1,第二个参数 : $2 例子 : 脚本会复制文件(arg1) 到目标地址(arg2)   ./copy.sh file1.txt /tmp/ cat copy.sh #!/bin/bash cp $1 $2 1 2 3 4 5 6 7 如何计算传递进来的参数 ? $#

如何在脚本中获取脚本名称 ? $0

如何检查之前的命令是否运行成功 ? $?

如何获取文件的最后一行 ? tail-1

如何获取文件的第一行 ? head-1

如何获取一个文件每一行的第三个元素 ? awk'{print $3}'

假如文件中每行第一个元素是 FIND,如何获取第二个元素 awk'{ if ($1 == "FIND") print $2}'

如何调试 bash 脚本

将 -xv 参数加到 #!/bin/bash 后 例子: #!/bin/bash –xv 1 2 3 举例如何写一个函数 ? function example { echo "Hello world!" } 1 2 3 如何向连接两个字符串 ? V1="Hello" V2="World" V3=${V1}${V2} echo $V3 1 2 3 4 输出HelloWorld

如何进行两个整数相加 ? V1=1 V2=2 let V3=$V1+$V2 echo $V3 1 2 3 4 输出3

据 @kashu 的意见,本题的更佳回答为: 两个整数相加,还有若干种方法实现:

A=5 B=6 echo $(($A+$B)) # 方法 2 echo $[$A+$B]  # 方法 3 expr $A + $B   # 方法 4 echo $A+$B | bc # 方法 5 awk 'BEGIN{print '"$A"'+'"$B"'}'  # 方法 6 1 2 3 4 5 6 7 如何检查文件系统中是否存在某个文件 ? if [ -f /var/log/messages ] then echo "File exists" fi 1 2 3 4 写出 shell 脚本中所有循环语法 ? for 循环 : foriin$(ls);do echo item:$i done 1 2 3 while 循环 :

#!/bin/bash COUNTER=0 while [ $COUNTER -lt 10 ]; do echo The counter is $COUNTER let COUNTER=COUNTER+1 done 1 2 3 4 5 6 until 循环 :

#!/bin/bash COUNTER=20 until [ $COUNTER -lt 10 ]; do echo COUNTER $COUNTER let COUNTER-=1 done 1 2 3 4 5 6 每个脚本开始的 #!/bin/sh 或 #!/bin/bash 表示什么意思 ? 这一行说明要使用的 shell。#!/bin/bash 表示脚本使用 /bin/bash。对于 python 脚本,就是 #!/usr/bin/python。 如何获取文本文件的第 10 行 ? head -10 file|tail -1 bash 脚本文件的第一个符号是什么 # 命令:[ -z “” ] && echo 0 || echo 1 的输出是什么 0 命令 “export” 有什么用 ? 使变量在子 shell 中可用。 如何在后台运行脚本 ? 在脚本后面添加“&”。 据 @kashu 的意见,更好的答案是: nohup command& 大部分时间我们可能是远程使用Linux,我碰到过由于网络断线使得在后台运行的command &没了… “chmod 500 script” 做什么 ? 使脚本所有者拥有可执行权限。 1 “>” 做什么 ? 重定向输出流到文件或另一个流。 1 & 和 && 有什么区别 & - 希望脚本在后台运行的时候使用它 && - 当前一个脚本成功完成才执行后面的命令/脚本的时候使用它 1 2 什么时候要在 [ condition ] 之前使用 “if” ? 当条件满足时需要运行多条命令的时候。 命令: name=John && echo ‘My name is $name’ 的输出是什么 variable bash shell 脚本中哪个符号用于注释 ? # 命令: echo ${new:-variable} 的输出是什么 variable ’ 和 " 引号有什么区别 ? ' - 当我们不希望把变量转换为值的时候使用它。 "- 会计算所有变量的值并用值代替。 如何在脚本文件中重定向标准输出和标准错误流到 log.txt 文件 ? 在脚本文件中添加"exec >log.txt 2>&1"命令。 如何只用 echo 命令获取字符串变量的一部分 ? echo ${variable:x:y} x - 起始位置 y - 长度 例子: variable="My name is Petras, and I am developer." echo ${variable:11:6} # 会显示 Petras 1 2 3 4 5 6 如果给定字符串 variable=“User:123:321:/home/dir”,如何只用 echo 命令获取 home_dir ? echo ${variable#*:*:*:}或echo ${variable##*:}

如何从上面的字符串中获取 “User” ? echo ${variable%:*:*:*}或echo ${variable%%:*} 如何使用 awk 列出 UID 小于 100 的用户 ? awk -F: '$3<100' /etc/passwd 写程序为用户计算主组数目并显示次数和组名 cat /etc/passwd|cut -d: -f4|sort|uniq -c|while read c g do { echo $c; grep :$g: /etc/group|cut -d: -f1;}|xargs -n 2 done 1 2 3 4 如何在 bash shell 中更改标准的域分隔符为 “:” ? IFS=":" 如何获取变量长度 ? ${#variable} 如何打印变量的最后 5 个字符 ? echo ${variable: -5} ${variable:-10} 和 v a r i a b l e : − 10 有 什 么 区 别 ? ‘ {variable: -10} 有什么区别? `variable:−10有什么区别?‘{variable:-10} - 如果之前没有给 variable 赋值则输出 10;如果有赋值则输出该变量 ${variable: -10} - 输出 variable 的最后 10 个字符` 如何只用 echo 命令替换字符串的一部分 ? echo ${variable//pattern/replacement} 哪个命令将命令替换为大写 ? tr '[:lower:]' '[:upper:]' 如何计算本地用户数目 ? wc -l /etc/passwd|cut -d" " -f1 或者 cat /etc/passwd|wc -l 不用 wc 命令如何计算字符串中的单词数目 ? set ${string} echo $# 1 2 “export $variable” 或 “export variable” 哪个正确 ? export variable 如何列出第二个字母是 a 或 b 的文件 ? ls -d ?[ab]* 如何将整数 a 加到 b 并赋值给 c ? c=$((a+b))或c=expr $a + $b 或 c=echo "$a+$b"|bc 如何去除字符串中的所有空格 ? echo $string|tr -d " " 重写这个命令,将输出变量转换为复数: item=“car”; echo “I like $item” ? item="car"; echo "I like ${item}s" 写出输出数字 0 到 100 中 3 的倍数(0 3 6 9 …)的命令 ? for i in {0..100..3}; do echo $i; done 或 for (( i=0; i<=100; i=i+3 )); do echo "Welcome $i times"; done 如何打印传递给脚本的所有参数 ? echo $*或echo $@ [ $a == $b ] 和 [ $a -eq $b ] 有什么区别 [ $a == $b ] - 用于字符串比较 [ $a -eq $b ] - 用于数字比较 = 和 == 有什么区别 = - 用于为变量赋值 == - 用于字符串比较 写出测试 $a 是否大于 12 的命令 ? [ $a -gt 12 ] 写出测试 $b 是否小于等于 12 的命令 ? [ $b -le 12 ] 如何检查字符串是否以字母 “abc” 开头 ? [[ $string == abc* ]] [[ $string == abc* ]] 和 [[ $string == “abc*” ]] 有什么区别 [[ $string == abc* ]] - 检查字符串是否以字母 abc 开头 [[ $string == "abc" ]] - 检查字符串是否完全等于 abc 如何列出以 ab 或 xy 开头的用户名 ? egrep "^ab|^xy" /etc/passwd|cut -d: -f1 bash 中 $! 表示什么意思 ? 后台最近执行命令的 PID. $? 表示什么意思 ? 前台最近命令的结束状态。 如何输出当前 shell 的 PID ? echo $$ 如何获取传递给脚本的参数数目 ? echo $# (LCTT 译注:和第3题重复了。) 62) $ 和 @ 有 什 么 区 别 ∗ ‘ @ 有什么区别* `@有什么区别∗‘*- 以一个字符串形式输出所有传递到脚本的参数$@` - 以 $IFS 为分隔符列出所有传递到脚本中的参数 如何在 bash 中定义数组 ? array=("Hi" "my" "name" "is") 如何打印数组的第一个元素 ? echo ${array[0]} 如何打印数组的所有元素 ? echo ${array[@]} 如何输出所有数组索引 ? echo ${!array[@]} 如何移除数组中索引为 2 的元素 ? unset array[2] 如何在数组中添加 id 为 333 的元素 ? array[333]="New_element" shell 脚本如何获取输入的值 ? a) 通过参数 ./script param1 param2 b) 通过 read 命令 read -p "Destination backup Server : " desthost 在脚本中如何使用 “expect” ? /usr/bin/expect << EOD spawn rsync -ar ${line} ${desthost}:${destpath} expect "*?assword:*" send "${password}\r" expect eof EOD 1 2 3 4 5 6 四,命令 top(了解top每一个字段意思) grep,sed,awk

五,Apache 在这一节涵盖了25个有趣的Apache工作面试中会提出的问题,并附带有它们的答案,因此你可以方便的理解也许你之前从来没有见到过的一些有关于Apache的新事物.

在你开始阅读这篇文章之前,我们强烈建议你不要去死记硬背,万事首先都要尝试去放在实际场景中理解. 1. 什么是Apache web服务器? 答案:Apache web 服务器 HTTP 是一个非常流行、功能强大并且开源,用于管理web站点并向网络提供web文件服务. 它基于 HTTP 超文本传输协议运行, 这一协议提供了服务器和客户端web浏览器通信的标准. 它支持 SSL, CGI 文件, 虚拟主机还有许多其它的功能特性.

2. 如果检查 Apache 及其版本? 答案:首先,使用rpm命令来检查Apache是否已经安装. 如果已经安装好了,那就使用httpd -v 命令来检查它的版本.

[root@tecmint ~]# rpm -qa | grep httpd httpd-devel-2.2.15-29.el6.centos.i686 httpd-2.2.15-29.el6.centos.i686 httpd-tools-2.2.15-29.el6.centos.i686

[root@tecmint ~]# httpd -v Server version: Apache/2.2.15 (Unix) Server built:   Aug 13 2013 17:27:11 1 2 3 4 5 6 7 8 3.Apache 以那个用户运行? 主配置文件的位置在哪里?. 答案: Apache 以“nobody”用户和httpd守护进程运行. Apache 主要的配置文件在: /etc/httpd/conf/httpd.conf (CentOS/RHEL/Fedora) 还有 /etc/apache2.conf (Ubuntu/Debian).

4.Apache 侦听 http 和 https 请求? 答案:Apache 默认在80端口侦听http,在443端口侦听https(需要SSL整数). 你也可以使用 netstat 命令 来检查端口.

[root@tecmint ~]# netstat -antp | grep http

tcp        0      0 :::80       :::*        LISTEN     1076/httpd           tcp        0      0 :::443      :::*        LISTEN     1076/httpd 1 2 3 4 5. 如何在你的Linux机器上安装Apache服务器? 答案:很简单, 你可以使用任何诸如(RHEL/CentOS/Fedora)上的yum以及(Debian/Ubuntu)上的apt-get来在你的Linux上安装Apache服务器.

[root@tecmint ~]# yum install httpd   [root@tecmint ~]# apt-get install apache2 1 2 3 6. 你可以在哪里找到Apache Web服务器的所有配置路径? 答案:Apache默认的配置路径放在: (RHEL/CentOS/Fedora) 中是在 /etc/httpd/ on 而(Debian/Ubuntu) 是在/etc/apache2下 .

[root@tecmint ~]# cd /etc/httpd/ [root@tecmint httpd]# ls -l total 8 drwxr-xr-x. 2 root root 4096 Dec 24 21:44 conf drwxr-xr-x. 2 root root 4096 Dec 25 02:09 conf.d lrwxrwxrwx  1 root root   19 Oct 13 19:06 logs -> ../../var/log/httpd lrwxrwxrwx  1 root root   27 Oct 13 19:06 modules -> ../../usr/lib/httpd/modules lrwxrwxrwx  1 root root   19 Oct 13 19:06 run -> ../../var/run/httpd --------------------------------------------------------------------------- [root@tecmint ~]# cd /etc/apache2 [root@tecmint apache2]# ls -l total 84 -rw-r--r-- 1 root root  7113 Jul 24 16:15 apache2.conf drwxr-xr-x 2 root root  4096 Dec 16 11:48 conf-available drwxr-xr-x 2 root root  4096 Dec 16 11:45 conf.d drwxr-xr-x 2 root root  4096 Dec 16 11:48 conf-enabled -rw-r--r-- 1 root root  1782 Jul 21 02:14 envvars -rw-r--r-- 1 root root 31063 Jul 21 02:14 magic drwxr-xr-x 2 root root 12288 Dec 16 11:48 mods-available drwxr-xr-x 2 root root  4096 Dec 16 11:48 mods-enabled -rw-r--r-- 1 root root   315 Jul 21 02:14 ports.conf drwxr-xr-x 2 root root  4096 Dec 16 11:48 sites-available drwxr-xr-x 2 root root  4096 Dec  6 00:04 sites-enabled     1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 7.Apache 可以被TCP封装器固定吗? 答案:不可以,它不可以被TCP封装器固定下来,因为它不支持Linux的libwrap.a库.

8.如何在Apache中改变默认的端口,以及如何侦听其中的指令工作? 答案:在httpd.conf文件中有一个指令“Listen”可以让我们改变默认的Apache端口. 在Listen 指令的帮助下我们可以在不同的端口还有不同的接口进行Apache侦听.

       假设你拥有多个IP注册到了你的Linux机器,并且想要Apache在一个特殊的以太网端口或接口接收HTTP请求, 即使是这种要求也可以用Listen指令做到.

       为了改变Apache的默认端口,请使用打开你的Apache主配置文件 httpd.conf 或者 apache2.conf .

[root@tecmint ~]# vi /etc/httpd/conf/httpd.conf [root@tecmint ~]# vi /etc/apache2/apache2.conf 1 2 查找”Listen”这个单词, 注释原来的那一行并且在那一行下面写上你自己的指令.

# Listen 80 Listen 8080 OR Listen 172.16.16.1:8080 1 2 3 4 保存文件并重启web服务器.

[root@tecmint ~]# service httpd restart

[root@tecmint ~]# service apache2 restart 1 2 3 9.我们可以一台机器上放两个Apache Web服务器么? 答案:可以,我们在一台Linux机器上同时运行两个不同的Apache服务器, 但条件是它们应该在不同的端口上侦听,而我们可以使用Apache的Listen指令来改变端口.

10. 你知道Apache的DocumentRoot是啥意思么? 答案:DocumentRoot 的 Apache 意思是服务器上web文件的存储位置, 默认的DocumentRoot是 /var/www/html 或者 /var/www. 这是可以被修改的,只要修改主机中的虚拟主机配置 “DocumentRoot”就行了.

11. 如何在不同的文件夹下面管理文件,还有什么是 Alias 指令? 答案:是的,这可以借助于主Apache配置文件中的Alias指令做到. Alias 指令可以对文件系统中的资源按图索骥, 它使用一个URL 路径,并且使用重定向到系统上的一个文件或目录来替换它.

       使用Alias指令,它是Apache的 mod_alias 模块的一部分. Alias指令的默认语法是:

Alias /images /var/data/images/ 1        上面的示例中, 放在/var/data/images 前缀前面的 /images url的意思是客户端请求“http://www.example.com/images/sample-image.png” 会让Apache从服务器上的/var/data/images/sample-image.png 取 “sample-image.png” 文件. 它也被称为URL 映射. 12. 对于“DirectoryIndex”你是怎么理解的? 答案:DirectoryIndex 是当有一个来自主机的请求时Apache首先会去查找的文件. 例如: 客户端发送请求www.example.com, Apache 对此将到站点的文件根目录查找index文件 (首先要展示的文件).        DirectoryIndex 的默认设置是 .html index.html index.php, 如果不是这个名字, 你需要对 httpd.conf 或者 apache2.conf 中的 DirectoryIndex 值做出修改,以将其展示在你的客户端浏览器上.

# # DirectoryIndex: sets the file that Apache will serve if a directory # is requested. # # The index.html.var file (a type-map) is used to deliver content- # negotiated documents.  The MultiViews Option can be used for the # same purpose, but it is much slower. # DirectoryIndex index.html index.html.var index.cgi .exe 1 2 3 4 5 6 7 8 9 13. 当index文件丢失时如何使目录列表失效? 答案: 如果站点根目录中的主index文件失效, 那么Apache将会在浏览器上列出所有内容类似的文件,以替换站点主页.

       为了关闭Apache目录列表, 你可以在主配置文件中全局的设置,或者在.htaccess文件中部分的设置如下规则.

<Directory /var/www/html>    Options -Indexes </Directory> 1 2 3 14.Apache Web 服务器有些什么不同的日志文件? 答案:Apache Web 服务器的默认日志文件是访问日志 “/var/log/httpd/access_log” 和错误日志:/var/log/httpd/error_log”.

15. 你是怎样理解错误日志中的“connection reset by peer”的? 答案:当服务器正在向请求提供服务时终端用户中断连接, 我们就会在错误日志中看到“connection reset by peer“.

16. 什么是Apache的虚拟主机? 答案:虚拟主机部分包含的信息包括站点名称,文档根路径,目录索引,服务器管理员邮箱,错误日志文件路径等等。

       你可以随意为你的域添加你需要的指令,但是要运行一个站点,至少要配置量个参数服务器名称和文档根目录。 在Linux机器上,通常我们在httpd.conf文件的末尾来设定我们的虚拟主机部分的相关配置。

虚拟主机示例

<VirtualHost *:80>    ServerAdmin webmaster@dummy-host.example.com    DocumentRoot /www/docs/dummy-host.example.com    ServerName dummy-host.example.com    ErrorLog logs/dummy-host.example.com-error_log    CustomLog logs/dummy-host.example.com-access_log common </VirtualHost> 1 2 3 4 5 6 7 ServerAdmin : 通常是指站点拥有者的电子邮箱,错误和通知可以发到里面。 DocumentRoot : web文件在服务器上存放位置(必须配置). ServerName : 通过浏览器访问站点时的域名(必须配置). ErrorLog : 日志文件的位置,里面记录了所有与该站点相关的日志。 17. 和之间有什么区别? 答案:

<Location> 是用来设定和URL/ web服务器的地址栏相关的元素的。 <Directory> 是指服务器上某对象在文件系统中的位置 1 2 18. 什么是Apache虚拟托管? 答案:Apache虚拟托管是指,在单个web服务器上托管多个web站点。Apache 可以设定两种类型的虚拟主机:基于名称的虚拟托管和基于IP的虚拟主机托管。

更多相关信息,请参阅 如何在Apache中创建基于Name/IP的虚拟主机。

19. 你怎么理解Apache的MPM? 答案: MPM意思是Multi Processing Modules,实际上是指Apache遵循的一些机制,用来接受和完成对web服务器的请求。

20. Worker 和 Prefork MPM之间的区别是什么? 答案:它们都是MPM, Worker 和 prefork 有它们各自在Apache上的运行机制. 它们完全依赖于你想要以哪一种模式启动你的Apache.

Worker 和 MPM基本的区别在于它们产生子进程的处理过程. 在Prefork MPM中, 一个主httpd进行被启动,这个主进程会管理所有其它子进程为客户端请求提供服务. 而在worker MPM中一个httpd进程被激活,则会使用不同的线程来为客户端请求提供服务. Prefork MPM 使用多个子进程,每一个进程带有一个线程而 worker MPM 使用多个子进程,每一个进程带有多个线程. Prefork MPM中的连接处理, 每一个进程一次处理一个连接而在Worker mpm中每一个线程一次处理一个连接. 内存占用 Prefork MPM 占用庞大的内存, 而Worker占用更小的内存.

21. “LimitRequestBody”的应用是什么,还有如何在你的上传中加入限制? 答案:LimitRequestBody 指令被用来在上传大小上做一个限制. 22. mod_perl 和 mod _php 是什么? 答案:

mod_perl 是一个随同Apache一起编译的Apache模块,用来做Perl脚本的简单集成并提升其性能. mod_php 用来做web服务器PHP脚本的简单集成, 它在Apache进程中嵌入了PHP解释器. 它强制Apache子进程使用更多的内存,并且只能在Apache上使用,但是仍然很流行. 23. Mod_evasive是什么? 答案:它是一个保护你的web服务器不受像DDOS之类的web攻击的第三方模块,因为它一次只执行一个任务,所有执行得很不错. 更多信心,请阅读这篇文章, 它会指导你 如何在Apache中安装并配置mod_evasive.

24. httpd.conf文件中的Loglevel调试是什么? 答案: 在Loglevel Debug 选项的帮助下, 我们可以在错误日志中获取或者记录更多的信息,以帮助我们调试问题.

25. mod_ssl 有什么用以及SSL在Apache中如何工作? 答案:Mod_ssl 是一个Apache模块, 它使Apache可以在一个安全的加密环境中建立连接和传输数据。 使用SSL证书,所有的登录信息和其他重要的保密信息都会以加密的方式在Internet上进行传输,这会防止我们的数据被窃取或IP欺骗。

怎样在Apache中使用SSL 每当https请求到达,Apache都会执行以下三步: Apache生成它的私钥并且将私钥转换为.CSR 文件 (证书签发请求). 然后Apache发送 .csr 文件给 CA (证书管理中心). CA 收到.csr 文件 并转换为 .crt (证书) 然后再发回给Apache 来完成https连接请求. 六,Tomcat Tomcat是一个JSP/Servlet容器。其作为Servlet容器,有三种工作模式:独立的Servlet容器、进程内的Servlet容器和进程外的Servlet容器。

进入Tomcat的请求可以根据Tomcat的工作模式分为如下两类:

Tomcat作为应用程序服务器:请求来自于前端的web服务器,这可能是Apache, IIS, Nginx等;

Tomcat作为独立服务器:请求来自于web浏览器;

6.1Tomcat顶层架构 先上一张Tomcat的顶层结构图(图A),如下: Tomcat中最顶层的容器是Server,代表着整个服务器,从上图中可以看出,一个Server可以包含至少一个Service,用于具体提供服务。

Service主要包含两个部分:Connector和Container。从上图中可以看出 Tomcat 的心脏就是这两个组件,他们的作用如下:

1、Connector用于处理连接相关的事情,并提供Socket与Request和Response相关的转化; 2、Container用于封装和管理Servlet,以及具体处理Request请求; 1 2 一个Tomcat中只有一个Server,一个Server可以包含多个Service,一个Service只有一个Container,但是可以有多个Connectors,这是因为一个服务可以有多个连接,如同时提供Http和Https链接,也可以提供向相同协议不同端口的连接,示意图如下(Engine、Host、Context下边会说到):多个 Connector 和一个 Container 就形成了一个 Service,有了 Service 就可以对外提供服务了,但是 Service 还要一个生存的环境,必须要有人能够给她生命、掌握其生死大权,那就非 Server 莫属了!所以整个 Tomcat 的生命周期由 Server 控制。

另外,上述的包含关系或者说是父子关系,都可以在tomcat的conf目录下的server.xml配置文件中看出,下图是删除了注释内容之后的一个完整的server.xml配置文件(Tomcat版本为8.0)

详细的配置文件文件内容可以到Tomcat官网查看:http://tomcat.apache.org/tomcat-8.0-doc/index.html

上边的配置文件,还可以通过下边的一张结构图更清楚的理解: Server标签设置的端口号为8005,shutdown=”SHUTDOWN” ,表示在8005端口监听“SHUTDOWN”命令,如果接收到了就会关闭Tomcat。一个Server有一个Service,当然还可以进行配置,一个Service有多个,Service左边的内容都属于Container的,Service下边是Connector。

6.2Tomcat顶层架构小结: 1)Tomcat中只有一个Server,一个Server可以有多个Service,一个Service可以有多个Connector和一个Container; 2) Server掌管着整个Tomcat的生死大权; 4)Service 是对外提供服务的; 5)Connector用于接受请求并将请求封装成Request和Response来具体处理; 6)Container用于封装和管理Servlet,以及具体处理request请求;        知道了整个Tomcat顶层的分层架构和各个组件之间的关系以及作用,对于绝大多数的开发人员来说Server和Service对我们来说确实很远,而我们开发中绝大部分进行配置的内容是属于Connector和Container的,所以接下来介绍一下Connector和Container。

6.3Connector和Container的微妙关系        由上述内容我们大致可以知道一个请求发送到Tomcat之后,首先经过Service然后会交给我们的Connector,Connector用于接收请求并将接收的请求封装为Request和Response来具体处理,Request和Response封装完之后再交由Container进行处理,Container处理完请求之后再返回给Connector,最后在由Connector通过Socket将处理的结果返回给客户端,这样整个请求的就处理完了!

       Connector最底层使用的是Socket来进行连接的,Request和Response是按照HTTP协议来封装的,所以Connector同时需要实现TCP/IP协议和HTTP协议!

       Tomcat既然处理请求,那么肯定需要先接收到这个请求,接收请求这个东西我们首先就需要看一下Connector!

6.4Connector架构分析        Connector用于接受请求并将请求封装成Request和Response,然后交给Container进行处理,Container处理完之后在交给Connector返回给客户端。

因此,我们可以把Connector分为四个方面进行理解:

(1)Connector如何接受请求的? (2)如何将请求封装成Request和Response的? (3)封装完之后的Request和Response如何交给Container进行处理的? (4)Container处理完之后如何交给Connector并返回给客户端的?

首先看一下Connector的结构图(图B),如下所示: Connector就是使用ProtocolHandler来处理请求的,不同的ProtocolHandler代表不同的连接类型,比如:Http11Protocol使用的是普通Socket来连接的,Http11NioProtocol使用的是NioSocket来连接的。

其中ProtocolHandler由包含了三个部件:Endpoint、Processor、Adapter。

(1)Endpoint用来处理底层Socket的网络连接,Processor用于将Endpoint接收到的Socket封装成Request,Adapter用于将Request交给Container进行具体的处理。

(2)Endpoint由于是处理底层的Socket网络连接,因此Endpoint是用来实现TCP/IP协议的,而Processor用来实现HTTP协议的,Adapter将请求适配到Servlet容器进行具体的处理。

(3)Endpoint的抽象实现AbstractEndpoint里面定义的Acceptor和AsyncTimeout两个内部类和一个Handler接口。Acceptor用于监听请求,AsyncTimeout用于检查异步Request的超时,Handler用于处理接收到的Socket,在内部调用Processor进行处理。

至此,我们应该很轻松的回答(1)(2)(3)的问题了,但是(4)还是不知道,那么我们就来看一下Container是如何进行处理的以及处理完之后是如何将处理完的结果返回给Connector的?

6.5 Container架构分析 Container用于封装和管理Servlet,以及具体处理Request请求,在Connector内部包含了4个子容器,结构图如下(图C):

4个子容器的作用分别是:

(1)Engine:引擎,用来管理多个站点,一个Service最多只能有一个Engine; (2)Host:代表一个站点,也可以叫虚拟主机,通过配置Host就可以添加站点; (3)Context:代表一个应用程序,对应着平时开发的一套程序,或者一个WEB-INF目录以及下面的web.xml文件; (4)Wrapper:每一Wrapper封装着一个Servlet;

下面找一个Tomcat的文件目录对照一下,如下图所示:Context和Host的区别是Context表示一个应用,我们的Tomcat中默认的配置下webapps下的每一个文件夹目录都是一个Context,其中ROOT目录中存放着主应用,其他目录存放着子应用,而整个webapps就是一个Host站点。

我们访问应用Context的时候,如果是ROOT下的则直接使用域名就可以访问,例如:www.ledouit.com

看到这里我们知道Container是什么,但是还是不知道Container是如何进行处理的以及处理完之后是如何将处理完的结果返回给Connector的?别急!下边就开始探讨一下Container是如何进行处理的!

6.6 Container如何处理请求的 Container处理请求是使用Pipeline-Valve管道来处理的!(Valve是阀门之意)

Pipeline-Valve是责任链模式,责任链模式是指在一个请求处理的过程中有很多处理者依次对请求进行处理,每个处理者负责做自己相应的处理,处理完之后将处理后的请求返回,再让下一个处理着继续处理。 但是!Pipeline-Valve使用的责任链模式和普通的责任链模式有些不同!区别主要有以下两点:

(1)每个Pipeline都有特定的Valve,而且是在管道的最后一个执行,这个Valve叫做BaseValve,BaseValve是不可删除的;

(2)在上层容器的管道的BaseValve中会调用下层容器的管道。

我们知道Container包含四个子容器,而这四个子容器对应的BaseValve分别在:StandardEngineValve、StandardHostValve、StandardContextValve、StandardWrapperValve。

Pipeline的处理流程图如下(图D):(1)Connector在接收到请求后会首先调用最顶层容器的Pipeline来处理,这里的最顶层容器的Pipeline就是EnginePipeline(Engine的管道);

(2)在Engine的管道中依次会执行EngineValve1、EngineValve2等等,最后会执行StandardEngineValve,在StandardEngineValve中会调用Host管道,然后再依次执行Host的HostValve1、HostValve2等,最后在执行StandardHostValve,然后再依次调用Context的管道和Wrapper的管道,最后执行到StandardWrapperValve。

(3)当执行到StandardWrapperValve的时候,会在StandardWrapperValve中创建FilterChain,并调用其doFilter方法来处理请求,这个FilterChain包含着我们配置的与请求相匹配的Filter和Servlet,其doFilter方法会依次调用所有的Filter的doFilter方法和Servlet的service方法,这样请求就得到了处理!

(4)当所有的Pipeline-Valve都执行完之后,并且处理完了具体的请求,这个时候就可以将返回的结果交给Connector了,Connector在通过Socket的方式将结果返回给客户端。

6.7 总结 至此,我们已经对Tomcat的整体架构有了大致的了解,从图A、B、C、D可以看出来每一个组件的基本要素和作用。我们在脑海里应该有一个大概的轮廓了!如果你面试的时候,让你简单的聊一下Tomcat,上面的内容你能脱口而出吗?当你能够脱口而出的时候,这位面试官一定会对你刮目相看的!

七,负载均衡 7.1负载均衡算法 Haproxy有8种负载均衡算法(balance),分别如下:

1.balance roundrobin # 轮询,软负载均衡基本都具备这种算法 2.balance static-rr # 根据权重,建议使用 3.balance leastconn # 最少连接者先处理,建议使用 4.balance source # 根据请求源IP,建议使用 5.balance uri # 根据请求的URI 6.balance url_param,# 根据请求的URl参数’balance url_param’ requires an URL parameter name 7.balance hdr(name) # 根据HTTP请求头来定每一次HTTP请求 8.balance rdp-cookie(name) # 根据据cookie(name)来锁定并哈希每一次TCP请求 会话保持

由于负载请求分发到不同服务器,可能导致Session会话不同步的问题,若想实现会话共享或保持,可采用如下3种方式:

1.用户IP 识别 haroxy 将用户IP经过hash计算后 指定到固定的真实服务器上(类似于nginx 的IP hash 指令) 配置指令:balance source

2.Cookie 识别 haproxy 将WEB服务端发送给客户端的cookie中插入(或添加加前缀)haproxy定义的后端的服务器COOKIE ID。

配置指令例举:cookie SESSION_COOKIE insert indirect nocache

用firebug可以观察到用户的请求头的cookie里 有类似” Cookie jsessionid=0bc588656ca05ecf7588c65f9be214f5; SESSION_COOKIE=app1” SESSION_COOKIE=app1就是haproxy添加的内容

3.Session 识别 haproxy 将后端服务器产生的session和后端服务器标识存在haproxy中的一张表里。客户端请求时先查询这张表。 配置指令例举:appsession JSESSIONID len 64 timeout 5h request-learn

7.2什么是负载均衡 负载均衡(Load Balance)是分布式系统架构设计中必须考虑的因素之一,它通常是指,将请求/数据【均匀】分摊到多个操作单元上执行,负载均衡的关键在于【均匀】。 常见的负载均衡方案 常见互联网分布式架构如上,分为客户端层、反向代理nginx层、站点层、服务层、数据层。可以看到,每一个下游都有多个上游调用,只需要做到,每一个上游都均匀访问每一个下游,就能实现“将请求/数据【均匀】分摊到多个操作单元上执行”。 【客户端层】到【反向代理层】的负载均衡,是通过“DNS轮询”实现的:DNS-server对于一个域名配置了多个解析ip,每次DNS解析请求来访问DNS-server,会轮询返回这些ip,保证每个ip的解析概率是相同的。这些ip就是nginx的外网ip,以做到每台nginx的请求分配也是均衡的。 【反向代理层->站点层】的负载均衡

【反向代理层】到【站点层】的负载均衡,是通过“nginx”实现的。通过修改nginx.conf,可以实现多种负载均衡策略: 1.请求轮询: 和DNS轮询类似,请求依次路由到各个web-server 2.最少连接路由: 哪个web-server的连接少,路由到哪个web-server 3.ip哈希: 照访问用户的ip哈希值来路由web-server,只要用户的ip分布是均匀的,请求理论上也是均匀的,ip哈希均衡方法可以做到,同一个用户的请求固定落到同一台web-server上,此策略适合有状态服务,例如session(58沈剑备注:可以这么做,但强烈不建议这么做,站点层无状态是分布式架构设计的基本原则之一,session最好放到数据层存储) 【站点层】到【服务层】的负载均衡,是通过“服务连接池”实现的。 上游连接池会建立与下游服务多个连接,每次请求会“随机”选取连接来访问下游服务。

7.3《数据层》的负载均衡 在数据量很大的情况下,由于数据层(db,cache)涉及数据的水平切分,所以数据层的负载均衡更为复杂一些,它分为“数据的均衡”,与“请求的均衡”。

数据的均衡是指: 水平切分后的每个服务(db,cache),数据量是差不多的。 请求的均衡是指: 水平切分后的每个服务(db,cache),请求量是差不多的。 业内常见的水平切分方式有这么几种:

一、按照range水平切分

每一个数据服务,存储一定范围的数据,上图为例:

user0服务,存储uid范围1-1kw

user1服务,存储uid范围1kw-2kw

这个方案的好处是:

(1)规则简单,service只需判断一下uid范围就能路由到对应的存储服务 (2)数据均衡性较好

(3)比较容易扩展,可以随时加一个uid[2kw,3kw]的数据服务

不足是:

(1)请求的负载不一定均衡,一般来说,新注册的用户会比老用户更活跃,大range的服务请求压力会更大

二、按照id哈希水平切分

每一个数据服务,存储某个key值hash后的部分数据,上图为例:

user0服务,存储偶数uid数据

user1服务,存储奇数uid数据

这个方案的好处是: (1)规则简单,service只需对uid进行hash能路由到对应的存储服务 (2)数据均衡性较好 (3)请求均匀性较好 不足是: (1)不容易扩展,扩展一个数据服务,hash方法改变时候,可能需要进行数据迁移

7.4 总结 负载均衡(Load Balance)是分布式系统架构设计中必须考虑的因素之一,它通常是指,将请求/数据【均匀】分摊到多个操作单元上执行,负载均衡的关键在于【均匀】。 (1)【客户端层】到【反向代理层】的负载均衡,是通过“DNS轮询”实现的 (2)【反向代理层】到【站点层】的负载均衡,是通过“nginx”实现的 (3)【站点层】到【服务层】的负载均衡,是通过“服务连接池”实现的 (4)【数据层】的负载均衡,要考虑“数据的均衡”与“请求的均衡”两个点,常见的方式有“按照范围水平切分”与“hash水平切分”

八,Haproxy 简介

       HAproxy:HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上。

特点 1)HAProxy 也是支持虚拟主机的。 2)HAProxy 的优点能够补充 Nginx 的一些缺点,比如支持 Session 的保持,Cookie的引导;同时支持通过获取指定的 url 来检测后端服务器的状态。 3)HAProxy 跟 LVS 类似,本身就只是一款负载均衡软件;单纯从效率上来讲HAProxy 会比 Nginx 有更出色的负载均衡速度,在并发处理上也是优于 Nginx 的。 4)HAProxy 支持 TCP 协议的负载均衡转发,可以对 MySQL 读进行负载均衡,对后端的 MySQL 节点进行检测和负载均衡,大家可以用 LVS+Keepalived 对 MySQL主从做负载均衡。

九,Keepalived Keepalived:Keepalived是一个保证集群高可用的服务软件,用来防止单点故障,使用VRRP协议实现。在master和backup之间通过master主动降低自己的权值或者backup检测到master出现故障时,backup将会接管master的工作,继续服务。

9.1 keeplived 工作原理 什么是Keepalived呢,keepalived观其名可知,保持存活,在网络里面就是保持在线了,也就是所谓的高可用或热备,用来防止单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用)的发生,Keepalived通过请求一个vip来达到请求真是IP地址的功能,而VIP能够在一台机器发生故障时候,自动漂移到另外一台机器上,从来达到了高可用HA功能

Keepalived工作在TCP/IP 参考模型的 三层、四层、五层,也就是分别为:网络层,传输层和应用层,根据TCP、IP参数模型隔层所能实现的功能,Keepalived运行机制如下:

在网络层:我们知道运行这4个重要的协议,互联网络IP协议,互联网络可控制报文协议ICMP、地址转换协议ARP、反向地址转换协议RARP,在网络层Keepalived在网络层采用最常见的工作方式是通过ICMP协议向服务器集群中的每一个节点发送一个ICMP数据包(有点类似与Ping的功能),如果某个节点没有返回响应数据包,那么认为该节点发生了故障,Keepalived将报告这个节点失效,并从服务器集群中剔除故障节点。

在传输层:提供了两个主要的协议:传输控制协议TCP和用户数据协议UDP,传输控制协议TCP可以提供可靠的数据输出服务、IP地址和端口,代表TCP的一个连接端,要获得TCP服务,需要在发送机的一个端口和接收机的一个端口上建立连接,而Keepalived在传输层里利用了TCP协议的端口连接和扫描技术来判断集群节点的端口是否正常,比如对于常见的WEB服务器80端口。或者SSH服务22端口,Keepalived一旦在传输层探测到这些端口号没有数据响应和数据返回,就认为这些端口发生异常,然后强制将这些端口所对应的节点从服务器集群中剔除掉。

在应用层:可以运行FTP,TELNET,SMTP,DNS等各种不同类型的高层协议,Keepalived的运行方式也更加全面化和复杂化,用户可以通过自定义Keepalived工作方式,例如:可以通过编写程序或者脚本来运行Keepalived,而Keepalived将根据用户的设定参数检测各种程序或者服务是否允许正常,如果Keepalived的检测结果和用户设定的不一致时,Keepalived将把对应的服务器从服务器集群中剔除

9.2 keeplived 有哪些模块 keepalived主要有三个模块,分别是core、check和vrrp

9.3解释一下vrrp 协议 虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。

9.4keepalived作用 keepalived长和lvs搭配使用,进行负载均衡。

十,MySQL面试题 主从、主主、性能调优、数据备份恢复

详述MySQL主从复制原理及配置主从的完整步骤

主从复制的原理如下: 主库开启binlog功能并授权从库连接主库,从库通过change master得到主库的相关同步信息,然后连接主库进行验证,主库IO线程根据从库slave线程的请求,从master.info开始记录的位置点向下开始取信息,同时把取到的位置点和最新的位置与binlog信息一同发给从库IO线程,从库将相关的sql语句存放在relay-log里面,最终从库的sql线程将relay-log里的sql语句应用到从库上,至此整个同步过程完成,之后将是无限重复上述过程

完整步骤如下:

   1、主库开启binlog功能,并进行全备,将全备文件推送到从库服务器上    2、show master status\G 记录下当前的位置信息及二进制文件名    3、登陆从库恢复全备文件    4、执行change master to 语句    5、执行start slave and show slave status\G 1 2 3 4 5 10.1 基础笔试命令考察 1.开启MySQL服务

/etc/init.d/mysqld start service mysqld start systemctl start mysqld

2.检测端口是否运行

lsof -i :3306 netstat -lntup |grep 3306

3.为MySQL设置密码或者修改密码

设置密码 mysql -uroot -ppassword -e “set passowrd for root = passowrd(‘passowrd’)” mysqladmin -uroot passowrd “NEWPASSWORD”

更改密码 mysqladmin -uroot passowrd oldpassowrd “NEWPASSWORD” use mysql; update user set passowrd = PASSWORD(‘newpassword’) where user = ‘root’;flush privileges; msyql 5.7以上版本修改默认密码命令 alter user ‘root’@‘localhost’ identified by ‘root’

4.登陆MySQL数据库

mysql -uroot -ppassword

5.查看当前数据库的字符集

show create database DB_NAME;

6.查看当前数据库版本

mysql -V mysql -uroot -ppassowrd -e “use mysql;select version();”

7.查看当前登录的用户

select user();

8.创建GBK字符集的数据库mingongge,并查看已建库完整语句

create database mingongge DEFAULT CHARSET GBK COLLATE gbk_chinese_ci;

9.创建用户mingongge,使之可以管理数据库mingongge

grant all on mingongge.* to ‘mingongge’@‘localhost’ identified by ‘mingongge’;

10.查看创建的用户mingongge拥有哪些权限

show grants for mingongge@localhost

11.查看当前数据库里有哪些用户

select user from mysql.user;

12.进入mingongge数据库

use mingongge

13.创建一innodb GBK表test,字段id int(4)和name varchar(16)

create table test (      id int(4),      name varchar(16)      )ENGINE=innodb DEFAULT CHARSET=gbk; 1 2 3 4 14.查看建表结构及表结构的SQL语句

desc test; show create table test\G

15.插入一条数据“1,mingongge”

insert into test values(‘1’,‘mingongge’);

16.再批量插入2行数据 “2,民工哥”,“3,mingonggeedu”

insert into test values(‘2’,‘民工哥’),(‘3’,‘mingonggeedu’);

17.查询名字为mingongge的记录

select * from test where name = ‘mingongge’;

18.把数据id等于1的名字mingongge更改为mgg

update test set name = ‘mgg’ where id = ‘1’;

19.在字段name前插入age字段,类型tinyint(2)

alter table test add age tinyint(2) after id;

20.不退出数据库,完成备份mingongge数据库

system mysqldump -uroot -pMgg123.0. -B mingongge >/root/mingongge_bak.sql /root/mingongge_bak.sql

21.删除test表中的所有数据,并查看

delete from test; select * from test;

22.删除表test和mingongge数据库并查看

drop table test; show tables; drop database mingongge; show databases;

23.不退出数据库恢复以上删除的数据

system mysql -uroot -pMgg123.0. </root/mingongge_bak.sql

24.把库表的GBK字符集修改为UTF8

alter database mingongge default character set utf8;

alter table test default character set utf8;

25.把id列设置为主键,在Name字段上创建普通索引

alter table test add primary key(id);

create index mggindex on test(name(16));

26.在字段name后插入手机号字段(shouji),类型char(11)

alter table test add shouji char(11); #默认就是在最后一列后面插入新增列

27.所有字段上插入2条记录(自行设定数据)

insert into test values(‘4’,‘23’,‘li’,‘13700000001’),(‘5’,‘26’,‘zhao’,‘13710000001’);

28.在手机字段上对前8个字符创建普通索引

create index SJ on test(shouji(8));

29.查看创建的索引及索引类型等信息

show index from test; show create table test\G

#下面的命令也可以查看索引类型

show keys from test\G

30.删除Name,shouji列的索引

drop index SJ on test; drop index mggindex on test;

31.对Name列的前6个字符以及手机列的前8个字符组建联合索引

create index lianhe on test(name(6),shouji(8));

32.查询手机号以137开头的,名字为zhao的记录(提前插入)

select * from test where shouji like ‘137%’ and name = ‘zhao’;

33.查询上述语句的执行计划(是否使用联合索引等)

explain select * from test where name = ‘zhao’ and shouji like ‘137%’\G

34.把test表的引擎改成MyISAM

alter table test engine=MyISAM;

35.收回mingongge用户的select权限

revoke select on mingongge.* from mingongge@localhost;

36.删除mingongge用户

drop user migongge@localhost;

37.删除mingongge数据库

drop database mingongge

38.使用mysqladmin关闭数据库

mysqladmin -uroot -pMgg123.0. shutdown lsof -i :3306

39.MySQL密码丢了,请找回?

mysqld_safe --skip-grant-tables & #启动数据库服务

mysql -uroot -ppassowrd -e “use mysql;update user set passowrd = PASSWORD(‘newpassword’) where user = ‘root’;flush privileges;”

10.2MySQL运维基础知识面试问答题 面试题001:请解释关系型数据库概念及主要特点? 关系型数据库模型是把复杂的数据结构归结为简单的二元关系,对数据的操作都是建立一个或多个关系表格上,最大的特点就是二维的表格,通过SQL结构查询语句存取数据,保持数据一致性方面很强大

面试题002:请说出关系型数据库的典型产品、特点及应用场景?

1、mysql 互联网企业常用 2、oracle 大型传统企业应用软件 3、 如数据备份、复杂连接查询、一致性数据存储等,还是使用MySQL或者其他传

标签: 压力变送器mpm486mpm430压力变送器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台