赞
踩
1.系统常识系列
1.若一台计算机的内存为128M,则交换分区的大小通常是RAM的1.5到2倍 256M。
随机存取存储器(英语:Random Access Memory,缩写:RAM),也叫主存,是与CPU直接交换数据的内部存储器。它与ROM的最大区别是数据的易失性,即一旦断电所存储的数据将随之丢失。RAM在计算机和数字系统中用来暂时存储程序、数据和中间结果。
2.简述raid0、raid1、raid5三种工作模式的工作原理及特点
------------------------------------------------------------------------
raid0: 条带卷,利用率100%,相对读写速率最快,
相对安全性差。数据随机存入到阵列中的一个磁盘上。
同时从2块磁盘读数据;读速度与raid1相差不多;
容量:n
raid1: 镜像卷,使用率50%,相对读写速率一般,
相对安全性高。最少2块磁盘组成,数据同时存入到两块磁盘上。
同时从2块磁盘读数据;写速度会比raid0慢;
容量:1/n
raid5: 带奇偶校验的镜像卷,相对读写速率较快,
相对安全性高可以添加热被磁盘作为冗余。
容量:(n-1)/n
IOPS(Input/Output Operations Per Second)是一个用于计算机存储设备(如硬盘(HDD)、固态硬盘(SSD)或存储区域网络(SAN))性能测试的量测方式,可以视为是每秒的读写次数。
可用的 IOPS=(物理磁盘总的IOPS × 写百分比 ÷ RAID写惩罚) + (物理磁盘总的IOPS × 读百分比)
假设组成RAID-5的物理磁盘总共可以提供500 IOPS,
使用该存储的应用程序读写比例是50%/50%,那么对于前端主机而言,实际可用的IOPS是:
(500 ×50% ÷ 4)+ ( 500 * 50%) = 312.5 IOPS
RAID-0:
直接的条带,数据每次写入对应物理磁盘上的一次写入
RAID-1和10:
RAID-1 和RAID-10的写惩罚很容易理解,因为数据的镜像存在的,一次写入会有两次
所以RAID-1、10的写惩罚值是2
RAID-5:
RAID-5由于要计算校验位的机制存在,
需要读数据、读校验位、写数据、写校验位四个步骤,
所以RAID-5的写惩罚值是4。
RAID-6:
RAID-6由于有两个校验位的存在,与RAID-5相比,需要读取两次校验位和写入两次校验位,
所以RAID-6的写惩罚值是6。
写惩罚指闪存设备需要将一个单元(cell)清空后才能将数据写入,当单元中还有数据时,清空单元的程序必须在新数据写入之前执行。因此,写入的时间就变慢了。
------------------------------------------------------------------------
3.软链接和硬链接的区别
------------------------------------------------------------------------
硬链接:
不会创建新的inode,只是给源文件多加了一个文件名
不能跨分区
删除源文件后,另一个文件还能用
软链接:
创建新的inode,相当于重新创建了一个文件
可以跨分区
删除源文件后,链接文件不能再使用
------------------------------------------------------------------------
4. ps -aux 中的 VSZ 代表什么意思?RSS 代表什么意思
VSZ:虚拟内存集,进程占用的虚拟内存空间
RSS:物理内存集,进程占用实际物理内存空间.
5.关闭swap分区
swapoff -a 关闭所有的交换分区
swapoff /dev/sde 关闭sde交换分区
6.kernel 调参
linux内核参数调整说明:
# 所有的TCP/IP调优参数都位于/proc/sys/net/目录。
# 下面是最重要的一些调优参数,后面是它们的含义:
------------------------------------------------------------------------------
1./proc/sys/net/core/rmem_max 最大的TCP数据接收缓冲。
2./proc/sys/net/core/wmem_max 最大的TCP数据发送缓冲。
3./proc/sys/net/ipv4/tcp_timestamps 时间戳在(请参考RFC1323)TCP的包头增加12个字节。
4./proc/sys/net/ipv4/tcp_sack 有选择的应答。
5./proc/sys/net/ipv4/tcp_window_scaling 如果TCP窗口超过65535(64KB),须设置该值为1
6.rmem_default 默认的接收窗口大小。
7.rmem_max 接收窗口的最大大小。
8.wmem_default 默认的发送窗口大小。
9.wmem_max 发送窗口的最大大小。
------------------------------------------------------------------------------
# /proc目录下的所有内容都是临时性的,所以重启动系统后任何修改都会丢失
# 建议在系统启动时自动修改TCP/IP参数
# 把下面代码增加到/etc/rc.local文件,然后保存文件,
# 系统重新引导的时候会自动修改下面的TCP/IP参数:
------------------------------------------------------------------------------
echo 256960 > /proc/sys/net/core/rmem_default
echo 256960 > /proc/sys/net/core/rmem_max
echo 256960 > /proc/sys/net/core/wmem_default
echo 256960 > /proc/sys/net/core/wmem_max
echo 0 > /proc/sys/net/ipv4/tcp_timestamps
echo 1 > /proc/sys/net/ipv4/tcp_sack
echo 1 > /proc/sys/net/ipv4/tcp_window_scaling
------------------------------------------------------------------------------
TCP/IP参数都是自解释的,
TCP窗口大小设置为256960,
禁止TCP的时间戳(取消在每个数据包的头中增加12字节),
支持更大的TCP窗口TCP有选择的应答。
1、临时调整内核参数
------------------------------------------------------------------------------
echo "1" > /proc/sys/net/ipv4/ip_forward
# 开启内核路由转发功能,通过01设置开关
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all
# 禁止所有的icmp回包(禁止其他主机ping本机)
echo "108248" > /proc/sys/fs/file-max
# 调整所有进程可以打开的文件总数
ps:如果大量用户访问时,可以因为该数字太小而导致错误
------------------------------------------------------------------------------
2、永久调整内核参数
vim /etc/sysctl.conf
------------------------------------------------------------------------------
net.ipv4.ip_forward=1 # 开启内核路由转发功能,通过01设置开关
net.ipv4.icmp_echo_ignnore_all=1 # 禁止所有的icmp回包(禁止其他主机ping本机)
fs.file-max=108248 # 调整所有进程可以打开的文件总
------------------------------------------------------------------------------
7.系统安全加固
------------------------------------------------------------------------------
1.密码策略 # 修改系统的密码策略
1)经常修改密码
2)使用一些特殊的字符和密码的长度增加密码的难度
3)不要随便告诉他人密码
2.权限ugo锁定系统中不必要的系统用户和组
1)锁定下列用户,锁定之前备份/etc/passwd和/etc/shadow文件
2)禁用无关的组
3)禁止root用户远程登录
3.预防flood攻击linux中预防SYNflood. (DDOS 洪水攻击)
在/etc/sysctl.conf文件中添加net.ipv4.tcp_syncookies=1
cookie源认证:
原理是syn报文首先由DDOS防护系统来响应syn_ack。
带上特定的sequence number (记为cookie)。
真实的客户端会返回一个ack 并且Acknowledgment number 为cookie+1。
而伪造的客户端,将不会作出响应。
这样我们就可以知道那些IP对应的客户端是真实的,将真实客户端IP加入白名单。
下次访问直接通过,而其他伪造的syn报文就被拦截。
4.加固TCP/IP协议设置/etc/sysctl.conf文件相应权限
5.默认权限与umask不要修改正确的umask值022
6.做任何修改文件的动作先备份再做操作
------------------------------------------------------------------------------
8.查看当前linux系统的状态,如CPU使用,内存使用,负载情况,系统版本
sar 综合命令
mpstat 监测
free -m 内存使用
top 负载
查看系统版本的命令:cat /etc/redhat-release 或 uname-a
9.Linux中的服务自启动添加方法有哪些
centos6:
1.chkconfig <service_name> on
2.vim /etc/rc.d/rc.local/usr/sbin/<service_name> start
centos7:
1.systemctl enable <service_name>
2.vim /etc/rc.local
systemctl start <service_name>
3.vim /etc/fstab
systemctl start <service_name>
10.从本机复制文件、文件夹到服务器并替换同名文件的写法有哪几种
scp -r <源文件路径目标文件> <ipaddr>:<目标文件路径>
rsync -avr <源文件路径目标文件> <ipaddr>:<目标文件路径>
# 只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快
11.Linux记录log的服务叫什么名字
Rsyslog
12.设置系统当前运行级别中test服务状态为启动时自动加载,请写出完整操作命令
chkconfig --level5 test on
----------------------------------------------------------------------------
CentOS 6 CentOS 7
init level systemctl target
0 shutdown.target
1 emergency.target
2 rescure.target
3 multi-user.target
4 预留
5 graphical.target
6 reboot.target
----------------------------------------------------------------------------
systemctl get-default:
获取当前的运行级别;
systemctl set-default multi-user.target:
将默认运行级别设置为mulit-user;
systemctl isolate multi-user.target:
不重启系统的情况下,将运行级别切换至mulit-user;
systemctl isolate graphical.target:
不重启系统的情况下,将运行级别切换至图形模式。
----------------------------------------------------------------------------
13.检查服务是否正常工作的最好办法是
1.ping <service_ipaddr>
2.ss -antul | grep <service_prot>
3.ps -aux | grep <service_name>
4.systemctl status <service_name>
14.请简要描述Linux系统下源代码编译方式安装软件的大致步骤
1、部署基础环境:关闭防火墙;关闭selinux;安装编译器
2、下载、解压软件包
3、配置安装路径
4、编译
5、安装
15.硬件性能测试
1.对IO进行简单测试dd if=/dev/zero of=/tmp/test bs=1M count=4096
2.用top和iostat查看wa%及写硬盘速度top -n1每秒钟的cpu
3.通过df -h命令查看磁盘情况
4.通过hdparm测试读取速率hdparm -t /dev/sda
# linux中几块盘求平均值就是磁盘的平均读取速率
16.保存当前磁盘分区的分区表,dd命令是个强大的命令,在复制的同时进行转换,请写出具体命令
dd if=/dev/sda of=./mbr.txt bs=1M count=512
快速生成一个10G的文件
dd if=/dev/zero of=test bs=10M count=1024
17.文件查找:将/usr/local/test目录下大于100k小于500k的文件转移到/tmp目录下
find /usr/local/test -size +100k -a -size -500k -exec mv {}/tmp\;
找出/home下所有7天以前,以.ok结尾的文件列
find /home -name "*.ok" -mtime +7
18.进程和线程的区别
进程是资源分配的最小单位,线程是CPU调度的最小单位
线程:线程来源与进程 线程模式需要事先开启进程 线程模式并发量高
进程:进程稳定性高;线程稳定性低 进程独占内存;线程共享进程的内存
一个进程可以有多个线程;
19.共享文件怎么做的,用的什么技术,碰到了什么问题
用nfs做nas存储
当访问的过多时;会比较卡
提升交换机的配置原来是百兆的话要提升到千兆或者万兆
server:
yum install -y nfs-utils rpcblnd
mkdir /nfs-dir
vim /etc/exports
/nfs-dir 102.168.1.0/24(rw,no_root_squash,sync)
systemctl start nfs-server rpcbind
exportfs -v
client:
yum install -y nfs-utils rpcblnd
mkdir /nfs
mount -t nfs <server_ip_addr>:/nfs-dir /nfs
vim /etc/fstab
<server_ip_addr>:/nfs-dir /nfs nfs defaults,_netdev 0 0
20.修改ssh服务端端口
vim /etc/ssh/sshd_config
/Port查找端口行,删除#,将22修改为目标端口
systemctl restart sshd
21.Linux系统层面有哪些常见的安全防护方法
1,防火墙只开放对外的服务端口 2,禁止ROOT远程登录 3,修改/etc/passwd访问权限
4,修改sshd的服务端口 5,只允许公司出口IP连接sshd服务端口
6,还有修改执行命令历史记录数 7,禁用不用的服务和应用 8,检查系统日志
22.怎么理解存储
存储就是根据不同的应用环境通过采取合理、安全、有效的方式
将数据保存到某些介质上并能保证有效的访问,总的来讲可以包含两个方面的含义:
它是数据临时或长期驻留的物理媒介; 它是保证数据完整安全存放的方式或行为。
23.请描述你是怎么优化Linux系统的
-----------------------------------------------------------------------------------
1、不用root,添加普通用户,通过sudo授权管理。
2、更改默认的远程连接SSH服务端口及禁止root用户远程连接。
3、定时自动更新服务器时间。
4、配置yum更新源,从国内更新源下载安装rpm包。
5、关闭selinux及iptable。
6、调整文件描述符的数量。进程及文件的打开都会消耗文件描述符。
7、定时自动清理/var/spool/clientmquene/目录垃圾文件,防止inodes节点被占满。
8、精简开机自启动服务(crond,sshd,network,rsyslog)。
9、linux内核参数优化/etc/sysctl.conf,执行sysctl -p生效。
10、更改字符集,支持中文,但建议还是使用英文字符集,防止乱码问题,不要使用中文。
11、锁定关键系统文件。
12、清空/etc/issue,去除系统及内核版本登陆前的屏幕显示。
24.rsync+inotify是做什么的?
加什么参数才能实现实时同步?
--delete参数又是什么意思?
-----------------------------------------------------------------------------------
1)Linux内核从2.6.13版本开始提供了inotify通知接口,
用来监控文件系统的各种变化情况,
如文件存取、删除、移动等。
利用这一机制,可以方便地实现文件异动告警、增量备份,并针对目录或文件的变化及时作出响应。
使用rsync工具与inotify机制相结合,可以实现触发式备份(实时同步)
2)inotifywait-m
3) --delete:文件或目录被删除在监控目录中
25.Linux系统下,如何修改test用户,最大的打开文件数量为10240,最大的进程数为20480?
-----------------------------------------------------------------------------------
[root@wing~]# vim /etc/security/limits.conf
test soft fsize 9000
test hard fsize 10240
[root@wing~]# vim /etc/security/limits.d/20-nproc.conf
root soft nproc unlimited
test hard nproc 20480
26.什么是磁盘碎片
其实磁盘碎片应该称为文件碎片.磁盘碎片指的是硬盘读写过程中产生的不连续文件.
硬盘上非连续写入的档案会产生磁盘碎片,磁盘碎片会加长硬盘的寻道时间,
影响系统效能.比如虚拟内存使用了硬盘,硬盘上便会产生磁盘碎片.
27.什么是内存碎片
内存碎片分为:内部碎片和外部碎片。
内部碎片就是已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间;
外部碎片指的是还没有被分配出去(不属于任何进程),
但由于太小了无法分配给申请内存空间的新进程的内存空闲区域。
28.swap分区是做什么的
如果linux系统物理内存不够用了,系统会用swap分区来模拟内存。
系统会把物理内存里的访问频率低的内存对象移动到swap里,
再在物理内存里产生新的连接指向swap里的那个对象;
27.简单介绍一下linux的文件系统
-----------------------------------------------------------------------------------
Linux操作系统支持很多不同的文件系统,比如ext2、ext3、ext4,XFS、FAT等等
linux以文件的形式对计算机中的数据和硬件资源进行管理,
也就是彻底的一切皆文件,
反映在Linux的文件类型上就是:普通文件、目录文件、链接文件、管道文件、套接字文件、设备文件等
EXT家族支持度最广:
但创建文件系统(格式化)慢!
修复慢!
文件系统存储容量有限!
xfs同样是一种日志式文件系統:
高容量,支持大存储
高性能,创建/修复文件系统快
inode与block都是系統需要用到時,才动态配置产生
28.简述一下linux系统性能优化?
系统级别的调优考虑的是怎么让应用程序在我们系统上运行的更合理规范,
或者说在硬件不变动的情况下,对系统优化提高性能和效率。
29.你熟悉的服务器压测工具有哪些
四款Web服务器压力测试工具
http_load、webbench、ab、siege
ab是apache自带的一款功能强大的测试工具
数据库测试工具mysqlslap benchmark
30.centos6.X版本系统和centos7.X版本有啥区别
系统 项目 | CentOS 6 | CentOS 7 |
---|---|---|
内核版本 | 2.6.x-x | 3.10.x-x |
桌面系统 | GNOME2.x | GNOME3.x |
启动加载器 | GRUBLegacy(+efibootmgr) | GRUB2 |
防火墙 | iptables | firewalld |
默认数据库 | MySQL | MariaDB |
/bin, /sbin, /lib, /lib64 | 在 / 下 | 移到 /usr 下 |
主机名 | /etc/sysconfig/network | /etc/hostname |
文件系统 | ext4 | xfs |
时间同步 | ntpq -p | chronyc sources -v |
修改时间 | vim /etc/sysconfig/clock ZONE="Asia/Tokyo" UTC=fales | timedatect list-timezone set-timezone 'Asia/Shanghai' |
修改地区 | vim/etc/sysconfig/i18n LANG="ja_JP.utf8" | localectl localectl status set-localeLANG=ja_JP.utf8 |
服务启动停止 | service <name> start|stop | systemctl start|stop <name> |
自启动 | chkconfig <name> on|off | systemctl enable|disable <name> |
服务一览 | chkconfig--list | systemctllist-unit-files |
网络信息 | netstat | ip n ss -tunlp |
路由 | route -n | ip route show |
单用户模式 | init 1 | systemctl rescue |
31.Linux开机启动流程详细步骤是什么?系统安装完,忘记密码如何破解
-----------------------------------------------------------------------------------
centos6: centos7:
1、post加电自检 1、uefi或BIOS初始化,开始post开机自检
2、MBR引导 2、加载mbr到内存
3、GRUB引导 3、GRUB阶段
4、读取grub.conf文件 4、加载内核和inintamfs模块
5、启动内核 5、内核开始初始化,使用systemd来代替centos6以前的init程序
6、加载伪文件系统(ramdisk) 6、Systemd执行multi-user.target下的getty.target及登录服务
7、启动init进程 7、systemd执行graphical需要的服务
8、执行/bin/login
centos6:忘记密码
a、重启系统,在GRUB界面,选取忘记密码的系统,按e键进入编辑模式
b、选项Kernel.....按e键进行编辑
c、在编辑界面rhgbquiet后加空格,然后输入"single"或"1"回车
d、按b启动进入单用户模式
e、进入系统后passwd回车输入新密码(如果有selinux,先暂时关闭setenforce0)
32.企业中Linux服务器系统分区标准是什么?(硬盘为300G,内存16G)
-----------------------------------------------------------------------------------
/boot200M /swap16G /70G /data剩下的全部空间
方案1:针对网站集群架构中的某个节点服务器分区
该服务器上的数据有多份(其他节点也有)且数据不太重要,建议分区方案如下:
•/boot:200MB
•swap:物理内存的1.5倍,当内存大于或等于8GB时,配置为8-16GB即可
•/:剩余硬盘空间大小
方案2:针对数据库及存储角色的服务器分区
该服务器的业务有大量重要的数据,建议分区方案如下:
•/boot:200MB
•/:大小设置为50-200GB,只存放系统相关文件,网站等业务数据不放在这里。
•swap:物理内存的1.5倍,当内存大于或等于8GB时,配置为8-16GB即可
•/data:剩余硬盘空间大小,放数据库及存储服务等重要数据。当然,data的名称可以换成别的名字
注:本方案就是把重要数据单独分区,便于备份和管理
方案3:针对大网站或门户级别企业的服务器进行分区
此分区方案更灵活,比较适合业务线比较多、需求不确定的大企业使用,建议分区如下:
•/boot:200MB
•/:大小设置为50-200GB,只存放系统相关文件,网站等业务数据不放在这里。
•swap:物理内存的1.5倍,当内存大于或等于8GB时,配置为8-16GB即可
•剩余的磁盘空间保留,不再进行分区,将来分配给不同的使用部门,由他们自己根据需求在进行分配
33.某一天突然发现Linux系统文件只读,该怎么办呢?完整操作步骤
1. 重启系统看是否可以自动修复。
2. fsck -y -C -t ext3 /dev/sda1
(-C 显示进度条 -t 指定文件系统类型 -y 默认自动yes修复)
3. mount # 查看ro挂载的分区,如果发现有ro,就重新mount
umount /dev/sda1
mount /dev/sda1 /boot
4. 如果发现有提示“device is busy”,找到是什么进程使得他busy
fuser -m /boot # 将会显示使用这个模块的pid
fuser -mk /boot # 将会直接kill那个pid
34.ps -aux 会列出进程的以下属性,请解释每个属性的含义
USER PID% CPU% MEM VSZ RSS TTY STAT START TIME COMMAND
USER: 运行进程的用户
PID: 进程ID
%CPU: CPU占用率
%MEM: 内存占用率
VSZ: 占用虚拟内存
RSS: 占用实际内存驻留内存
TTY: 进程运行的终端?是不依赖任何终端
STAT: 进程状态
START: 进程的启动时间
TIME: 进程占用CPU的总时间
COMMAND:进程文件,进程名
35.Linux如何挂载windows下的共享目录
1. 首先安装cifs协议.
apt-get install cifs-utils
2. 创建挂载目录windows
mkdir /windows
3. 挂载
mount -t cifs -o username='Bob',password='123456' \
//10.18.41.203/workspace /windows
4. 查看是否成功挂载
df -h
5. 开机自启
vim /etc/fstab
//<server_ip_addr>/workspace /windows cifs defaults,username='Bob',password='123456' 0 0
参数说明 :
username : Window 系统登录用户名
password : Window 系统登录密码
//192.168.0.102/Share : 设置Window共享目录的路径 地址格式是 \\你的IP\你的共享文件夹
/usr/local/bin/code : 挂载到 Linux 下的那个目录
36./proc/sys子目录的作用
/proc/sys包括所有的内核参数信息,可以暂时修改参数(重启后就无效),优化性能
37.磁盘空间满了,删除一部分nginx日志后,但是磁盘空间还是满的,为什么
未释放磁盘空间原因:在Linux或者Unix系统中,
通过rm或者文件管理器删除文件将会从文件系统的目录结构上解除链接(unlink).
然而如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,
磁盘空间也一直被占用。
而我删除的是nginx的log文件删除的时候文件应该正在被使用
解决方法:重启nginx服务,或者用>/opt/nginx/logs/nginx.log清空日志文件,而不是直接删除。
38.CPU利用率和CPU负载的区别
CPU利用率:显示的是程序在运行期间实时占用的CPU百分比
CPU负载:显示的是一段时间内正在使用和等待使用CPU的平均任务数。
CPU利用率高,并不意味着负载就一定大。
举例来说:
如果我有一个程序它需要一直使用CPU的运算功能,那么此时CPU的使用率可能达到100%,
但是CPU的工作负载则是趋近于“1”,因为CPU仅负责一个工作嘛!
如果同时执行这样的程序两个呢?CPU的使用率还是100%,但是工作负载则变成2了。
所以也就是说,当CPU的工作负载越大,代表CPU必须要在不同的工作之间进行频繁的工作切换。
39.MBR是什么?有什么用?
1.MBR,全称为 Master Boot Record,即硬盘的 主引导记录。
为了便于理解,一般将MBR分为广义和狭义两种:
1.广义的MBR包含整个扇区( 引导程序、分区表及分隔标识),也就是上面所说的 主引导记录;
2.狭义的MBR仅指 引导程序而言。
硬盘的0柱面、0磁头、1扇区称为主引导扇区(也叫主引导记录MBR)。它由三个部分组成,
1.主引导程序、硬盘分区表DPT(Disk Partition table)和硬盘有效标志(55AA)。
在总共512字节的主引导扇区里 主引导程序(boot loader)占446个字节,
2.第二部分是Partition table区(分区表),即DPT,
占64个字节,硬盘中分区有多少以及每一分区的大小都记在其中。
3. 第三部分是magic number,占2个字节,固定为55AA。
2.MBR的作用
计算机在进行主板BIOS检测之后,就会将MBR扇区整个读取到内存中,
然后执行权交给内存中MBR扇区的引导程序。
系统下一步就会判断读入内存的MBR扇区的最后两个字节是否为“55 AA”,不是则报错。
如果是“55 AA”接下来引导程序会到分区表中查找是有活动分区,
若有活动分区,则判断活动分区的引导扇区在磁盘中的地址,
如信息正确,引导权就交给这个扇区去引导操作系统了,引导程序开始加载系统内核
MBR引导程序的使命就光荣完成。
40.在linux系统中如何备份
1)使用fdisk -l 确定MBR位置
2)备份MBR dd if=/dev/sda1 of=/root/mbr bs=512 count=1
3)恢复MBR dd if=/root/mbr of=/dev/sda1 bs=512 count=1
4)恢复分区表 dd if=/root/mbr of=/dev/sda1 bs=512 skip=446 count=66
注:
MBR 共占用了一个扇区,也就是 512 Byte。
其中 446 Byte 安装了启动引导程序,其后 64 Byte 描述分区表,
最后的 2 Byte 是结束标记。
mbr大小512所以bs=512 count=1 bs=512 skip=446 count=66
用来确定分区表在备份文件中的位置
41.如何让nfs服务在运行状态5下开启而在其他运行级下关闭
chkconfig -level 5 nfs on
42.打包压缩
压缩打包命令:
tar -czf filename.tar dirname
zip filename.zip dirname
gzip filename
bzip2 -z filename
解压包命令:
tar -xf filename.tar
unzip filename.zip
gzip -d filename.gz
bzip2 -d filename.bz2
2.网络系列
1.Http的错误代码含义
(404、410、504、502)
404(未找到)服务器找不到请求的网页。
410(已删除)如果请求的资源已永久删除,服务器就会返回此响应。
504(网关超时)服务器作为网关或代理,但是没有及时从上游服务器收到请求。
502(错误网关)服务器作为网关或代理,从上游服务器收到无效响应。
2.linuxA机器提供了80端口服务,但是用户反馈访问慢,如何排查问题
-----------------------------------------------------------------------
1、当网站访问较慢时,首先先查看本地网络是否正常
2、本地网络速率正常时,再检查下所访问的网站是否正常
总时间:网站的响应时间,可了解网站的性能瓶颈或者是利用谷歌或IE浏览器的F12开发者工具查看下网站的大小和网站的打开速度成不成正比。
3、网站出现无法访问时,使用故障诊断命令定位故障点。
命令分析:ping:检测IP或域名的连通性dig/nslookup:查看DNS解
析情况traceroute:显示从访问者到网站的路由连接状态,如果有节点无法连接,只需针对该故障点进行修复便可快速恢复网络。
4、利用浏览器开发者模式检查下图片、js、css是否做过压缩处理
5、数据库(连接数等)、服务器(cpu、内存等)
6、从网站本身找问题,网站的问题包括网站程序设计,网页设计结构,网页内容三个部分。
3.tcp链接状态有哪些,分别代表什么意思
-----------------------------------------------------------------------
LISTEN:侦听来自远方的TCP端口的连接请求
SYN-SENT:再发送连接请求后等待匹配的连接请求
SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认
ESTABLISHED:代表一个打开的连接
FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认
FIN-WAIT-2:从远程TCP等待连接中断请求
CLOSE-WAIT:等待从本地用户发来的连接中断请求
CLOSING:等待远程TCP对连接中断的确认
LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认
TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认
CLOSED:没有任何连接状态
4.icmp协议属于tcp/ip协议或者OSI模型的那一层
-----------------------------------------------------------------------
icmp===Internet控制消息协议
该协议是TCP/IP协议集中的一个子协议,
属于网络层协议,主要用于在主机与路由器之间传递控制信息,
包括报告错误、交换受限控制和状态信息等。
当遇到IP数据无法访问目标、IP路由器无法按当前的传输速率转发数据包等情况时,
会自动发送ICMP消息。
我们可以通过Ping命令发送ICMP回应请求消息并记录收到ICMP回应回复消息,
通过这些消息来对网络或主机的故障提供参考依据。
5.请简述非对称加密算法工作过程
-----------------------------------------------------------------------
1.乙方生成两把密钥(公钥和私钥)
2.甲方获取乙方的公钥,然后用它对信息加密。
3.乙方得到加密后的信息,用私钥解密,乙方也可用私钥加密字符串
4.甲方获取乙方私钥加密数据,用公钥解密
6.简单说一下tcp/ip协议中的tcp和ip
-----------------------------------------------------------------------
TCP/IP是一个协议族,
是因为TCP/IP协议包括TCP、IP、UDP、ICMP、RIP、TELNETFTP、SMTP、ARP、TFTP等许多协议,
这些协议一起称为TCP/IP协议。
7.请解释下Telnet和SSH的区别
Telnet: 不安全,没有对传输的数据进行加密,
容易被监听还有遭受中间人攻击,
telnet不能压缩传输数据,所以传输慢;
ssh: 对数据进行了RSA加密,安全性高,
ssh传输数据是经过压缩的,所以数据传输速度比较快
8.301和302的区别
-----------------------------------------------------------------------
301会直接跳转到指定的url,
302会选择那个好看跳转那个,会发生url地址劫持现象。
301永久移动请求的网页已被永久移动到新位置。
服务器返回此响应(作为对GET或HEAD请求的响应)时,
会自动将请求者转到新位置。
您应使用此代码通知Googlebot某个网页或网站已被永久移动到新位置。
302临时移动服务器目前正从不同位置的网页响应请求,
但请求者应继续使用原有位置来进行以后的请求。
此代码与响应GET和HEAD请求的301代码类似,
会自动将请求者转到不同的位置。
但由于Googlebot会继续抓取原有位置并将其编入索引,
因此您不应使用此代码来通知Googlebot某个页面或网站已被移动。
9.我的带宽是固定的,怎么提升用户的访问速度
-----------------------------------------------------------------------
1使用CDN网络加速
2服务器开启gzip压缩
3网站实现纯静态
4设置缓存
5减少重定向
6代码优化
10.简述二层交换机和三层交换机的区别
二层交换机 | 三层交换机 |
---|---|
工作在数据链路层 | 工作在网络层,同时具备二层交换机的功能 |
基于端口转发数据 | 基于IP地址转发数据包 |
只有一个管理IP | 每个端口都可以配IP地址 |
不同Vlan之间通信需要借助第三层的设备 | 不同Vlan之间通信不需要借助设备 |
11.请写出568A与568B的线序
(1)568A线序排列:白绿、绿、白橙、蓝、白蓝、橙、白棕、棕。
(2)568B线序排列:白橙、橙、白绿、蓝、白蓝、绿、白棕、棕。
12.标准端口的范围是
1 - 65535
13.ping命令通过什么协议实现
icmp: internet控制信息协议
14.请写出ip10.0.14.70mask255.255.255.192的网络地址和广播地址。
并写下命令,在linux系统上配置10.0.14.65作为默认网关
网络地址:10.0.14.64
广播地址:10.0.14.127
sudo route add default gw 10.0.14.65
15.服务的常用端口
ftp、http、dns、smtp、pop3、dhcp、tftp、redis、mysql、ssh、telnet、https
ftp(21)
ftp(69文件传输协议)
http(80)
https(443)
dns(53)
smtp(25“简单邮件传输协议”)
pop3(110“邮局协议版本3”)
dhcp(客户端是以UDP68服务器是以UDP67)
mysql(3306)
redis(6379)
ssh(22)
telnet(23)
16.CDN 内容分发网络
更加用户的活跃区域,部署多个边缘镜像站,
缓存主站的静态资源,降低主站负载,
提升用户的访问资源的响应速度,提升用户的体验
3.网络相关命令
1.查看当前网络设备命令为:
ip a
2.将当前计算机的IP地址设为192.168.1.10,子网掩码为255.255.255.0
ifconfig eth0 192.168.1.10 netmask 255.255.255.0
3.查看当前主机TCP协议连接情况的命令为:
ss-antpl
4.查看/etc/passwd文件前10行的命令为:
head-10 /etc/passwd;
5.将前10行追加到/etc/passwd_new文件结尾的命令是:
head-10 /etc/passwd >> /etc/passwd_new
6.Linux操作系统启动服务名为kstoredb_NODEDBd的命令为:
systemctl start kstoredb_NODEDBd;
7.Windows系统启动服务名为kstoredb_NODEDBd的命令为:
net start kstoredb_NODEDBd
8.列出当前系统中所有的网络连接(包含进程名)
netstat -anputl
-t TCP -l listen -a all -u UDP -n 显示端口号和IPppid
9.如何查看当前系统每个ip的连接数
netstat -n |awk'/^tcp/{print$5}'|awk -F: ‘{print$1}'|sort| uniq-c
10.使用tcpdump监听TCP80端口来自192.168.0.1的所有流量,请写出命令
tcpdump -i ens33 -nn tcp port 80 and src 192.168.0.1
11.通过tcpdump查看网卡的Ping包
tcpdump -i ens33 icmp
12.实时抓取并显示当前系统中tcp80端口的网络数据信息
tcpdump -n tcp port 80
tcpdump -i ens33 'tcp port 80'
13.网卡历史流量:
sar -n DEV -f/var/log/sa/saxx # 查看xx日的网卡流量历史
实时查看网卡流量:
sar -n DEV 15 # (每间隔1秒刷新一次,共5次)
14.linux下如何添加路由
使用 route -n 查看网关信息,
或者 netstat -rn 查看路由
永久生效
vim /etc/sysconfig/network-scripts/ifcfg-ens33
GATEWAY=10.18.41.1
临时生效
route add default gw 10.18.41.2
删除路由表:
route del default gw 10.18.41.1
15.修改dns
vim /etc/resolv.conf # 修改后即时生效,重启同样有效
4.NAT
1.NAT使用的几种情况
---------------------------------------------------------------------------
1.连接到INTERNET,但却没有足够的合法地址分配给内部主机
2.更改到一个需要重新分配地址的ISP
3.有相同的IP地址的两个INTRANET合并
4.想支持负载均衡(主机)
2.NAT有4种用法
---------------------------------------------------------------------------
1)TRANSLATION INSIDE LOCAL ADDRESS:
将内部地址一对一的翻译成外部地址;
2)OVER LOADING INSIDE GLOBAL ADDRESS:
将内部地址多对一的翻译成外部地址,
通过地址加端口号的方式区别不同的本地地址。这种方式就是所谓的PAT
3)TCP LOAD DISTRIBUTING:
提供在多个、利用率高的主机之间进行负载分担的方法;
4)HANDLING OVER LAPPING NETWORK:
这种方法主要用于两个INTRANET的互联.
NAT地址转换是指每个内网地址都被转换成ip地址+源端口的方式,
这需要公网ip地址为多个。
而PAT由于ip地址不足够,就会出现内网地址被转换成ip地址+端口段的形式,
这样的公网ip地址通常只是一个。
3.PAT和NAT分别代表什么
---------------------------------------------------------------------------
NAT:
网络地址翻译在内部网络中使用内部地址,
通过NAT把内部地址翻译成合法的IP地址,在Internet上使用。
其具体的做法是把IP包内的地址域用合法的IP地址来替换
PAT:
属于Nat的一种,是把内部地址映射到外部网络的一个IP地址的不同端口上。
5.DHCP
1.解释
--------------------------------------------------------------------------
DHCP(动态主机设置协定)
主要目的是为了方便我们的主机IP地址的配置,如果网络中存在大量的主机时,
可通过部署DHCP协议,由DHCP服务器分配可用地址给主机。
客户端启用了DHCP,开机后,它会发布一个的广播报文,
广播报文经过网关时会带上相应标记,要使路由可达,
当DHCP服务器收到这个报文后,DHCP服务器会根据报文标记,
分配一个网关所在网段IP地址给客户端,
如果所有客户端未划分网关,DHCP会在地址池内随机分配IP给客户端
地址池:在用户定义了DHCP范围及排除范围后,剩余的地址构成了一个地址池,
地址池中的地址可以动态的分配给网络中的客户机使用。
地址池仅对自动获取IP的方式有效,手动设置IP只要符合规则可无视此项。
2.dhcp客户端是哪个地址来申请一个新的ip地址的
--------------------------------------------------------------------------
dhcp客户端是使用广播地址来向全网发送广播包来寻找dhcp服务器的
源地址是0.0.0.0
广播地址是:255.255.255.255
客户端没有IP地址才需要申请,所以它只能用0.0.0.0来代替它的ip,向服务器端申请ip地址。
1、客户发现阶段
客户端在没有IP地址等信息时,会发送discover的广播报文,
局域网内所有主机均会收到此报文,但只有DHCP服务器进行响应;
2、服务器响应阶段
DHCP服务器收到discover报文后,会对其进行解析,然后从地址池查看是否有可用的IP地址,
若能找到,那么服务器会发送offer报文来告知客户端,该服务器有资源,可用提供DHCP服务;
3、客户请求使用阶段
当客户端收到offer报文后,会发送request请求报文给服务器端,
以获取IP地址、子网掩码、网关、DNS服务器地址等信息;
4、服务器确认使用阶段
服务器端收到客户端的请求报文后,对其进行确认,
并将该IP地址与客户端的MAC地址绑定,然后将IP地址等信息发送给客户端;
5、客户重新登陆网络阶段
在客户重新接入网络后,会发送一个之前服务器端分配的IP地址信息的请求报文给DHCP服务器,
当服务器收到此报文后,若可以使用此地址,那么回应ACK报文;
若无法分配此地址,那么回应NAK报文,
客户端收到NAK报文后,会重新发送discover报文重新申请新的IP地址等信息;
6、客户续约阶段
当客户获取的IP地址租约过期后,服务器端会将其IP地址进行收回,
若客户端想要继续使用此地址,那么在租约期过一半后,客户端会发送renew报文来进行续约;
DHCP Client DHCP Server
| --------discover--------> |
| <---------offer---------- |
| ---------request--------> |
| <----------ack----------- |
| -----request(renew)-----> | 3 chance
| <-------ack(renew)------- |
6.DNS
# dns既采用了tcp协议,又采用了udp协议,
# 什么时候采用tcp协议?什么时候采用udp协议?
# 为什么要这么设计?
----------------------------------------------------------------------------
1.区域传输时,一个区中主DNS服务器从自己本机的数据文件中读取该区的DNS数据信息,而辅助DNS服务器则从区的主DNS服务器中读取该区的DNS数据信息,传输协议是tcp。
2.域名解析时,首选的通讯协议是udp
使用udp传输,不用经过TCP三次握手,这样DNS服务器负载更低,响应更快
但是当域名解析的反馈报文的长度超过512字节时,将不能使用udp协议进行解析,此时必须使用tcp
----------------------------------------------------------------------------
# 当用户在浏览器当中输入一个网站,说说计算机对dns解释结果哪些流程?
# 注:本机跟本地DNS还没有缓存
----------------------------------------------------------------------------
1.用户输入网址到浏览器;
2.浏览器发出DNS请求信息;
3.计算机首先查询本机HOST文件,不存在,继续下一步;
4.计算机按照本地DNS的顺序,向区域dns服务器查询IP结果;
区域dns服务器查询不到时会从根域开始,
按照DNS层次结构向下搜索,直至对于信息具有权威性;
5.将返回dns结果给本地dns和本机,本机和本地dns并缓存本结果,
直到TTL过期,才再次查询此结果;
6.返回IP结果给浏览器;并给本地的DNS一份结果;
7.浏览器根据IP信息,获取页面;
8.常见 DNS 记录的类型
类型 目的
A 用来指定域名的 IPv4 地址,如果需要将域名指向一个 IP 地址,就需要添加 A 记录。
AAAA 用来指定主机名(或域名)对应的 IPv6 地址记录。
CNAME 如果需要将域名指向另一个域名,再由另一个域名提供 ip 地址,就需要添加 CNAME 记录。
MX 如果需要设置邮箱,让邮箱能够收到邮件,需要添加 MX 记录。
NS 域名服务器记录,如果需要把子域名交给其他 DNS 服务器解析,就需要添加 NS 记录。
SOA SOA 这种记录是所有区域性文件中的强制性记录。它必须是一个文件中的第一个记录。
TXT 可以写任何东西,长度限制为 255。绝大多数的 TXT记录是用来做 SPF 记录(反垃圾邮件)。
7.crontab系列
# 计划任务在11月份,每天早上6点到12点中,每隔2小时执行一次/usr/bin/httpd.sh怎么实现?
crontab -e 00 6-12/2 * 11 * bash/usr/bin/httpd.sh
# 每天07至23点,每隔半小时执行apache重启,并禁用系统邮件通知
crontab -e */30 7-23 * * * systemctl restart httpd &> /dev/null1
# 以下字段可能和哪个服务有关?表示什么意思
# */5 * * * * ping -c 100 www.wanmel.com > /root/network.log 2 >& 1
答:(计划任务)每五分钟ping www.wanmel.com 100次
将错误和正确的输出覆盖 到/root/network.log
# /var/www/html/是网站的发布目录,如何每天凌晨0点30分对其进行自动备份,每次备份成按时间生成不同的备份包,写出操作步骤
crontab -e 30 0 * * * tar-zcf `date+%Y%m%d`.html.tar.gz/var/www/html
# 计划每星期天早8点服务器定时重启,如何实现
crontab -e 0 8 * * 7 reboot
# 每天中午12点用tcpdump命令抓取目的端口为tcp80的1000个包输出到当前目录,以当前时间命名
crontab -e 0 12 * * * bash tcpdump.sh
Vim tcpdump.sh
tcpdump -c 1000 tcp dstport80 -w./`date+%Y%m%d`
8.apache 系列
1.如何改变Apache端口
-----------------------------------------------------------------------
Vim /etc/httpd/conf/httpd.conf
1.找到Apache安装目录下conf目录下的httpd.conf文件。
2.打开它,找到“Listen”,紧接着Listen的数字就是端口号,默认状态下为“Listen 80”。
3.在之前的PHP专题中提到过关于在安装配置Apache时会遇到端口与IIS HTTP端口冲突的问题,
4.因为IIS HTTP端口默认也为80。那么我们就可以在这里改变Apache的端口,从而避免冲突,
5.比如可以改成:Listen 8011。改好之后别忘重起Apache服务使得配置生效。
2.apache有几种工作模式,分别介绍下其特点,并说明什么情况下采用不同的工作模式
-----------------------------------------------------------------------
1.prefork:是一种进程、与派生的工作模式,用的是进程去处理请求,
所以比较容易消耗内存,但是稳定性好,
某个进程出现问题不会影响到其他请求。要求稳定的时候使用
2.worker:是使用多个子进程、每个子进程有多个线程、由于使用的是线程去处理请求,
消耗内存小,适合高流量的请求,但是如果某个进程出现问题,
那么这个进程下的线程都会出现问题,即稳定性不是很好。
这种模式不能php要测试一下在访问量多的时候使用
3.event: 是为解决keep-alive保持长连接出现的一种工作模式,
使用keep-alive长连接的时候,某个线程会一直被占用,
即使中间没有请求,需要等到超时才会被释放,
所以这个时候就出现了event的工作模式就出现了。
在event工作模式中,会有一些专门的线程用来管理这些keep-alive类型的线程,
当有真实请求过来的时候,将请求传递给服务器的线程,
执行完毕后,又允许它释放。
这增强了在高并发场景下的请求处理。
另外,event模式是不支持用在https上的。
3.apache如何执行php代码
1.安装apache的php模块libphp5.so
2.apache做代理----后端服务器安装php-fpm
4.apache进程和线程的区别
线程: 线程来源与进程,线程模式需要事先开启
线程模式并发量高 相对与进程模式来说没有进程模式稳定 共享内存 不支持php
进程: 进程稳定性高;线程稳定性低
进程独占内存;线程共享进程的内存一个进程可以有多个线程;
5.在nslookup使用中请问如何查询test.com域中的MX记录**
nslookup -query type=MX test.com
Host dig nslookup settype=mx test.com
6.统计出yum安装的apache的访问日志access_log中访问量最多的5个IP**
cat /var/log/httpd/access_log \
| awk '{ips[$1]++} END{for(i in ips){print $i ips[i]}}' \
| sort -rn -k2 \
| head -5
9.shell系列
1.Linux shell中 单引号,双引号 及 不加引号 的简单区别
单引: 强引,取消引号内特殊字符的意义
双引: 弱引,取消部分引号内特殊字符的意义让多个以空格为分隔符的字符串形成一个整体字符串
2.写一个脚本,实现tomcat的web服务监控
----------------------------------------------------------------
监控tomcat的开启和关闭;或是端口8005,8009;
http与tomcat连接是8080端口;与nginx是不需要端口
1.可以写脚本+计划任务
2.可以使用nagios
3.可以使用zabbix在agent的配置文件内定义key:
----------------------------------------------------------------
vim /etc/zabbix/zabbix_agentd.conf
UserParameter=tomcat_port[*]:/tomcat_monitor.sh $1
----------------------------------------------------------------
vim/tomcat_monitor.sh
if [ $1 -eq 8080 ];then
lsof -i:8080
return $?
elif [ $1 -eq 8005 ];then
lsof -i:8005
return $?
else
return 8
fi
----------------------------------------------------------------
3.写一个脚本实现nginx服务的管理
----------------------------------------------------------------
文件锁:
编译安装时需要写此脚本;
笔记上有答案5nginx安装7小步设置开机启动
----------------------------------------------------------------
vi /etc/init.d/nginx
----------------------------------------------------------------
#!/bin/bash
# chkconfig:-9920
# description:nginx_startup_script
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"
case "$1" in
start)
$PROG
;;
stop)
kill -s QUIT $(cat $PIDF)
;;
restart)
$0 stop
$0 start
;;
reload)
kill -s HUP $(cat $PIDF)
;;
*)
echo "Usage:$0{start|stop|restart|reload}"
exit1
esac
exit0
----------------------------------------------------------------
chmod +x /etc/init.d/nginx
chkconfig --add nginx
----------------------------------------------------------------
4.编写shell脚本,清理/var/logs/目录下的一个持续增长的conn.log文件,
以日为单位形成一个新的压/缩文件,并删除30天前的日志压缩文件
----------------------------------------------------------------
vim cleanlog.sh
# 清理日志脚本
tar -czf /log_backup/conn_`date+%y年%m月%d号-%H:%M:%S`.log.tar.gz /var/logs/conn.log
wait $$
rm -rf /var/logs/conn.log
find /log_backup/ -m time+30 -exec rm{}\;
5.请使用awk、sed、grep三个命令,请举写出命令语句
grep 'root' /etc/passwd
sed -ri '/SELINUX=/cSELINUX=disabled /etc/selinux/conf'
cat /etc/passwd | awk 'NR==1{print$1}'
6.请说出以下符号在shell中的意义
$0、$n、$#、$?、$*、
7.批量添加5个用户,用户名为:user1-5,密码为:user名+3个随机字符
-----------------------------------------------------------------------
#!/bin/bash
for i in {1..5}
do
# random_str=`openssl rand -hex 2 \
# | sed -r "s/(...)(.)/\1:\2/g" \
# | awk -F: '{print$1}'`
# sed -r "s/(...)(.)/\1:\2/g" : 在第三个和第四个str之间加上 ‘:’
useradd user$i
random_str=`openssl rand -hex 2`
password=user$i${random_str:1} | passwd --stdin user$i
done
-----------------------------------------------------------------------
8.查找linux系统下以txt结尾,30天没有修改的文件,大小大于20K,同时具有执行权限的文件
并备份到/data/backup/目录下,某一天没有文件在/data/backup下,生产一个当时日志的文件,
内容为"缺失文件".
-----------------------------------------------------------------------
#!/bin/bash
find / -name '*.txt' -a -type f -a -mtime + 30 -a size +20K -a -perm 755 -exec cp {} /data/backup/\;
check=`ls /data/backup/ | wc -l`
if [ $check -eq 0 ];then
do
echo "`date +%F`: 缺失文件" >> /var/log/test.log
done
-----------------------------------------------------------------------
9.实现用用户输入入用用户名和密码,当用用户名为ye或sk且密码为123时,显示登陆成功,否则登陆失败,失败时允许重复输入入三次
-----------------------------------------------------------------------
for i in {1..3}
do
u=input("user>:")
p=input("pwd>:")
if [ u == 'yg' ] || [ u == 'sk' ];then
if [ p == "123" ];then
print("登陆成功")
Break
else
print("登陆失败")
fi
else
print("登陆失败")
fi
done
-----------------------------------------------------------------------
10.
# 请用至少两种语言实现提取下面日志中的电话号码和内容,
# 并将提取结果(mobile=xxxx&content=xxx)
# 发post请求到http://api.leju.com/sms/send接口
格式:IP---时间电话内容
157.55.35.42---\23/Apr/2014:12:02:51+0800\18666668888"Missingargument2forgetstr()"
python
-----------------------------------------------------------------------
import subprocess
import requests
send_url = 'http://api.leju.com/sms/send'
phone_num = subprocess.getoutput(
"awk -F'\' '{print $NF}' | awk -F'"' '{print $1}' data.txt")
content_str = subprocess.getoutput (
""awk -F'\' '{print $NF}' | awk -F'"' '{print $2}' data.txt"")
context = {"mobile": "phone_num", "content": "content_str"}
requests.post(send_url, json.dumps(context)).content)
-----------------------------------------------------------------------
10.mysql系列
1.如何用mysql命令进行备份和恢复?以test库为例,创建一个备份,并再用此备份恢复备份:
-----------------------------------------------------------------------
# 备份
mysqldump -u<account> -p<password> <db_name> > /mysql_dump/<db_name>.sql
# 查看
mysqlbinlog /mysql_dump/<db_name>.sql
# 恢复
mysql -u<account> -p<password> < /mysql_dump/<db_name>.sql
-----------------------------------------------------------------------
2.Mysql备份命令是什么?Mysql如何让给用户daxiang对库daxiang授权网段为192.168.96.0/24远程访问权限,密码为daxiang@123,请写出命令
-----------------------------------------------------------------------
1)物理备份:
innobackupex --user=<account> --password'daxiang@123' /xtrabackup/full
2)逻辑备份:
mysqldump -p'daxiang@123' -A > /mysql_backup/`date+%F-%H`-mysql.sql
3)授权:
grant all on <database_name>.<table_name> to <account>@'192.168.96.0/24' identified by 'daxiang@123' with <grant option>;
-----------------------------------------------------------------------
4.数据库用于事务回滚和提交的SQL语句分别是
-----------------------------------------------------------------------
ROLLBACK,COMMIT。
-----------------------------------------------------------------------
5.关系型数据库原则:ACID(事务四特性)
-----------------------------------------------------------------------
1)A(Atomicity)原子性
事务里的所有操作要么全部做完,要么都不做,
事务成功的条件是事务里的所有操作都成功,
只要有一个操作失败,整个事务就失败,需要回滚。
2)C(Consistency)一致性
数据库要一直处于一致的状态,事务的运行不会改变数据库原本的一致性约束。
如完整性约束a存款+b存款=2000。
3)I(Isolation)隔离性
并发的事务之间不会互相影响,如果一个事务要访问的数据正在被另外一个事务修改,
只要另外一个事务未提交,它所访问的数据就不受未提交事务的影响。
4)D(Durability)持久性
一旦事务提交后,它所做的修改将会永久的保存在数据库上,即使出现宕机也不会丢失。
-----------------------------------------------------------------------
6.一些概念:
-----------------------------------------------------------------------
1)分库:
1、垂直拆分:按照业务垂直划分,
将系统中不存在关联关系或者需要join的表可以放在不同的数据库不同的服务器中
2、水平拆分:按照规则划分,一般水平分库是在垂直分库之后的。
比如每天处理的订单数量是海量的,可以按照一定的规则水平划分
2)分表:指将一张表按一定的规则分解成N个具有独立存储空间的实体表
常见的分表策略:
1、Range(范围)
2、Hash(哈希)
3、按照时间拆分
4、Hash之后按照分表个数取模
5、在认证库中保存数据库配置,就是建立一个DB,这个DB单独保存user_id到DB的映射关系
3)读写分离:对于时效性不高的数据,可以通过读写分离缓解数据库压力
4)锁机制:用于保护数据的完整性,当并发事务同时访问一个资源时,
有可能导致数据不一致,因此需要一种机制来将数据访问顺序化,
以保证数据库数据的一致性,锁是其中的一种。
-----------------------------------------------------------------------
分库分表说明 (阿里推荐:单表2GB or 500w条记录)
1、IO瓶颈
第一种:磁盘读IO瓶颈,热点数据太多,数据库缓存放不下,每次查询时会产生大量的IO,
降低查询速度 -> 分库和垂直分表。
第二种:网络IO瓶颈,请求的数据太多,网络带宽不够 -> 分库。
2、CPU瓶颈
第一种:SQL问题,如SQL中包含join,group by,order by,非索引字段条件查询等,
增加CPU运算的操作 -> SQL优化,建立合适的索引,在业务Service层进行业务计算。
第二种:单表数据量太大,查询时扫描的行太多,SQL效率低,CPU率先出现瓶颈 -> 水平分表。
1、水平分库
概念:以字段为依据,按照一定策略(hash、range等),将一个库中的数据拆分到多个库中。
结果:
每个库的结构都一样;
每个库的数据都不一样,没有交集;
所有库的并集是全量数据;
场景:系统绝对并发量上来了,分表难以根本上解决问题,并且还没有明显的业务归属来垂直分库。
分析:库多了,io和cpu的压力自然可以成倍缓解。
2、水平分表
概念:以字段为依据,按照一定策略(hash、range等),将一个表中的数据拆分到多个表中。
结果:
每个表的结构都一样;
每个表的数据都不一样,没有交集;
所有表的并集是全量数据;
场景:系统绝对并发量并没有上来,只是单表的数据量太多,影响了SQL效率,
加重了CPU负担,以至于成为瓶颈。
分析:表的数据量少了,单次SQL执行效率高,自然减轻了CPU的负担。
3、垂直分库
概念:以表为依据,按照业务归属不同,将不同的表拆分到不同的库中。
结果:
每个库的结构都不一样;
每个库的数据也不一样,没有交集;
所有库的并集是全量数据;
场景:
系统绝对并发量上来了,并且可以抽象出单独的业务模块。
分析:
到这一步,基本上就可以服务化了。
例如,随着业务的发展一些公用的配置表、字典表等越来越多,
这时可以将这些表拆到单独的库中,甚至可以服务化。
再有,随着业务的发展孵化出了一套业务模式,
这时可以将相关的表拆到单独的库中,甚至可以服务化。
4、垂直分表
概念:以字段为依据,按照字段的活跃性,将表中字段拆到不同的表(主表和扩展表)中。
结果:
每个表的结构都不一样;
每个表的数据也不一样,一般来说,每个表的字段至少有一列交集,一般是主键,用于关联数据;
所有表的并集是全量数据;
场景:
系统绝对并发量并没有上来,表的记录并不多,
但是字段多,并且热点数据和非热点数据在一起,单行数据所需的存储空间较大。
以至于数据库缓存的数据行减少,查询时会去读磁盘数据产生大量的随机读IO,产生IO瓶颈。
分析:
可以用列表页和详情页来帮助理解。
垂直分表的拆分原则是将热点数据(可能会冗余经常一起查询的数据)放在一起作为主表,
非热点数据放在一起作为扩展表。这样更多的热点数据就能被缓存下来,进而减少了随机读IO。
拆了之后,要想获得全部数据就需要关联两个表来取数据。
但记住,千万别用join,因为join不仅会增加CPU负担并且会讲两个表耦合在一起
(必须在一个数据库实例上)。关联数据,应该在业务Service层做文章,
分别获取主表和扩展表数据然后用关联字段关联得到全部数据。
-----------------------------------------------------------------------
7.使用sql语句创建、删除数据库db_test?查询数据库列表的sql语句
-----------------------------------------------------------------------
# 创建
create database db_test;
create table db_test.t1;
# 查找
select * from db_test.t1;
# 删除
drop database db_test;
-----------------------------------------------------------------------
8.创建表空间neuspace,数据文件命名为neudata.dbf,
存放在d:\data目录下,文件大小为200MB设为自动增长,
增量5MB,文件最大为500MB的SQL为
-----------------------------------------------------------------------
create table space neuspace data file 'd:\data\neudata.dbf' size 200m auto extend on next 5m max size 500m
-----------------------------------------------------------------------
9.数据库的三级模式结构
-----------------------------------------------------------------------
1.外模式---视图和部分基本表---用户级,
2.模式---基本表---概念级,
3.内模式---存储文件---物理级
-----------------------------------------------------------------------
10.简述数据库中索引的用法及原理
-----------------------------------------------------------------------
索引在 mysql中也叫键,是存储引擎用于快速找到记录的一种数据结构
用法: 与查阅图书是一个道理:先定位到章,然后定位到章下的一个小节,再定位到页。
原理: 通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,
同时把随机的事件变成顺序的事件。
-----------------------------------------------------------------------
11.简述唯一(UNIQUE)约束和主键(PRIMARYKEY)约束的异同点
-----------------------------------------------------------------------
每个表可以有多个UNIQUE约束,而只能有一个PRIMARYKEY
主键:PRIMARYKEY
约束唯一标识数据库表中的每条记录
主键必须包含唯一的值;主键不能包含NULL值
每个表都应该有一个主键,并且每个表只能有一个主键
唯一:UNIQUE
约束唯一标识数据库表中的每条记录
UNIQUE和PRIMARYKEY约束均为列或列集合提供了唯一性的保证。
PRIMARYKEY约束拥有自动定义的UNIQUE约束。
1、当一个属性声明为主键时,它将不接受NULL值。另一方面,当声明为Unique的属性时,它可以接受一个NULL值。
2、表中只能有一个主键,但可以有多个唯一键。
3、定义主键时自动创建聚簇索引。相反,Unique键生成非聚集索引。
-----------------------------------------------------------------------
12.解释冷备份和热备份的不同点以及各自的优点
-----------------------------------------------------------------------
热备份针对归档模式的数据库,在数据库仍旧处于工作状态时进行备份。
而冷备份指数据库关闭后进行备份,适用于所有数据库。
不同点:
热备份:备份时数据库仍旧处于运行状态
冷备份:备份时数据处于关闭状态
优点:
热备份:在备份时,数据库仍可以使用并且可以将数据库恢复到任意一个时间点
冷备份:它的备份和恢复操作相当简单,并且冷备份可以工作在非归档模式下,
数据库性能会比归档模式稍好
-----------------------------------------------------------------------
13.列举三种表连接算法以及各自高性能的场景
-----------------------------------------------------------------------
1、嵌套循环连接:通常在小数据量并且语句比较简单的场景中使用
2、合并连接:在SQL数据库中,如果查询优化器,发现要连接的两张对象表,
在连接上都已经排序并包含索引,那么优化器很可能选择“合并”连接策略。
条件是:两个表都是排序的,并且两个表连接条件中至少有一个等号连接,
查询分析器会去选择合并连接
3、Hash连接:当我们尝试将两张数据量较大,没有排序和索引的两张表进行连接时,
SQLServer的查询优化器会尝试使用HashJoin
-----------------------------------------------------------------------
14.Mysql客户端工具中,请问如何让查询当前所有的连接进程信息
-----------------------------------------------------------------------
show processlist;
-----------------------------------------------------------------------
15.mysql主从,主库宕机,主从切换步骤
-----------------------------------------------------------------------
主机故障或者宕机:
在slave执行:
Stop slave;
Reset master;
查看是否只读模式:show variables like 'read_only';
只读模式需要修改my.cnf文件,注释read-only=1并重启mysql服务。
或者不重启使用命令关闭只读,但下次重启后失效:set global read_only=off;
查看show slave status\G;
查看show master status\G;
将从库IP地址改为主库IP地址,测试应用连接是否正常。
-----------------------------------------------------------------------
16.如何让校验主从数据不一致?出现不一致时如何处理?
-----------------------------------------------------------------------
pt-table-check # 监测主从一致
pt-table-sync # 同步
-----------------------------------------------------------------------
17.数据库不支持emoji表情,如何操作让数据库支持?
-----------------------------------------------------------------------
更换字符集utf8-->utf8mb4
utf8与utf8mb4说明:
UTF-8:UnicodeTransformationFormat-8bit,允许含BOM,但通常不含BOM。
是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),
中文使用24为(三个字节)来编码。UTF-8包含全世界所有国家需要用到的字符,
是国际编码,通用性强。UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显示。
如果是UTF8编码,则在外国人的英文IE上也能显示中文,他们无需下载IE的中文语言支持包。
UTF8MB4:MySQL在5.5.3之后增加了utf8mb4的编码,mb4就是mostbytes4的意思,
专门用来兼容四字节的unicode。
-----------------------------------------------------------------------
18.表中有大字段X(例如:text类型),且字段X不会经常更新,以读写为主,请问:
-----------------------------------------------------------------------
(1)您是选择拆成子表,还是继续放在一起;
(2)写出您这样选择的理由
拆成子表
理由:避免大数据被频繁的从buffer中换进换出,影响其他数据的缓存;
-----------------------------------------------------------------------
19.MySQLbinlog的几种日志录入格式以及区别
-----------------------------------------------------------------------
(1)binlog的日志格式的种类和分别
(2)适用场景
(3)结合第一个问题,每一种日志格式在复制中的优劣
三种日志格式:Statement MiXED ROW
1、Statement:每一条会修改数据的sql都会记录在binlog中。
优点:不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。
缺点:由于记录的只是执行语句,为了这些语句能在slave上正确运行,
因此还必须记录每条语句在执行的时候的一些相关信息,
以保证所有语句能在slave得到和在master端执行时候相同的结果。
另外mysql的复制,像一些特定函数功能,
slave可与master上要保持一致会有很多相关问题
(如sleep()函数,last_insert_id(),
以及user-definedfunctions(udf)会出现问题).
2、Row:不记录sql语句上下文相关信息,仅保存哪条记录被修改。
优点:binlog中可以不记录执行的sql语句的上下文相关的信息,
仅需要记录那一条记录被修改成什么了。
所以rowlevel的日志内容会非常清楚的记录下每一行数据修改的细节。
而且不会出现某些特定情况下的存储过程,或function,
以及trigger的调用和触发无法被正确复制的问题
缺点:所有的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,
这样可能会产生大量的日志内容,比如一条update语句,
修改多条记录,则binlog中每一条修改都会有记录,
这样造成binlog日志量会很大,
特别是当执行alter table之类的语句的时候,
由于表结构修改,每条记录都发生改变,
那么该表每一条记录都会记录到日志中。
3、Mixedlevel:
是以上两种level的混合使用,
一般的语句修改使用statment格式保存binlog,如一些函数,
statement无法完成主从复制的操作,则采用row格式保存binlog,
MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,
也就是在Statement和Row之间选择一种.
新版本的MySQL中队rowlevel模式也被做了优化,
并不是所有的修改都会以rowlevel来记录,
像遇到表结构变更的时候就会以statement模式来记录。
至于update或者delete等修改数据的语句,还是会记录所有行的变更。
-----------------------------------------------------------------------
20.MySQL数据库cpu飙升到500%的话他怎么处理?
-----------------------------------------------------------------------
(1)多实例的服务器,先top查看是那一个进程,哪个端口占用CPU多;
(2)show processes list;查看是否由于大量并发,锁引起的负载问题;
(3)否则,查看慢查询,找出执行时间长的sql;explain分析sql是否走索引,sql优化;
(4)再查看是否缓存失效引起,需要查看buffer命中率;
(5)查语句是否有大量的update,查qps
-----------------------------------------------------------------------
21.SQL优化中explain各字段的含义
-----------------------------------------------------------------------
table:显示这一行的数据是关于哪张表
type:这是重要的列,显示连接使用了何种类型。
possible_keys:显示可能应用在这张表的索引
key:实际使用的索引
key_len:使用的索引的长度
ref:显示索引的哪一列被使用了
rows:mysql认为必须检查的用来返回请求数据的行数
extra:关于mysql如何解析查询的额外信息
# Distinct:
一旦mysql找到了与行相匹配的行,就不再搜索
# Notexists:
MYSQL优化了LEFTJOIN,
一旦它找到了匹配LEFTJOIN标准的行,就不再搜索了
# RangecheckedforeachRecord(indexmap:#):
没有找到理想的索引,因此对于从前面表中来的每一个行组合,
MYSQL检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一
# Usingfilesort:
看到这个的时候,查询就需要优化了
# Usingindex:
列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,
这发生在对表的全部的请求列都是同一个索引的部分的时候
# Usingtemporary:
看到这个的时候,查询需要优化了
# const:
表中的一个记录的最大值能够匹配这个查询
# range:
这个连接类型使用索引返回一个范围中的行,比如使用>或<查找东西时发生的情况
# index:
这个连接类型对前面的表中的每一个记录联合进行完全扫描
# ALL:
这个连接类型对于前面的每一个记录联合进行完全扫描
-----------------------------------------------------------------------
22.请写下命令在MYSQL数据库中检查当前从库的同步状态,然后将同步配置修改为binlog文
件"mysql-bin.000001",偏移量为"4"。
-----------------------------------------------------------------------
mysql> show slave status;
Slave_IO_RunningI/O 线程是否被启动并成功地连接到主服务器上。(状态信息为YesNo)
Slave_SQL_RunningSQL 线程是否被启动(状态信息为YesNo)
Seconds_Behind_Master 测量SQL线程和I/O线程的时间差(即延迟,单位为秒)
mysql> change master to
MASTER_HOST='master', # 主服务器的主机名(也可以是 IP)
MASTER_USER='slaver', # 连接到主服务器的用户
MASTER_PASSWORD='Slaver@123'; # 到主服务器的密码
MASTER_LOG_FILE='mysql-bin.000001', # 从主服务器的哪个binlog日志读取
MASTER_LOG_POS=4;
-----------------------------------------------------------------------
23.mysql通过mysqldump命令如何做全量和增量备份
-----------------------------------------------------------------------
全量备份:
mysqldump-u<account>-p<pwd> <db_name> > backup.sql
增量备份:
每日定时使用 mysqladmin flush-logs 来创建新日志,
恢复增量备份时恢复全量备份之后的binlog
--------------------------------------------------------
备份:
mysqldump --lock-all-tables --flush-logs \
--master-data=2 -u root -p test > backup_sunday_1_PM.sql
# 对于InnoDB将--lock-all-tables替换为--single-transaction
--------------------------------------------------------
恢复:
mysql -u root -p < backup_sunday_1_PM.sql # 完全备份
mysqlbinlog MySQL-bin.000002 … | MySQL -uroot -p… # 增量
--------------------------------------------------------
-----------------------------------------------------------------------
24.对于数据库备份正确的做法是什么
-----------------------------------------------------------------------
同时使用多个备份设备,使得备份可以同时写入所有设备。
同样,也可以同时从多个设备还原备份。
使用数据库备份、差异数据库备份和事务日志备份的组合,
使得将数据库恢复到故障点所用的备份数量减到最少
使用文件和文件组备份以及事务日志备份,
使得可以只备份或还原那些包含相关数据的文件,而不用备份整个数据库。
使用快照备份将备份和还原时间减到最少.
-----------------------------------------------------------------------
25.事务的四种隔离级别
-----------------------------------------------------------------------
ReadUncommitted(读未提交)、ReadCommitted(读提交)、
RepeatableRead(可以重复读)、Serializable(序列化)
-----------------------------------------------------------------------
26.事务是如何让通过日志来实现的(Redo)?
-----------------------------------------------------------------------
在Innodb存储引擎中,事务日志是通过redo和innodb的存储引擎日志缓冲
(Innodblogbuffer)来实现的,
当开始一个事务的时候,会记录该事务的lsn(logsequencenumber)号;
当事务执行时,会往InnoDB存储引擎的日志的日志缓存里面插入事务日志;
当事务提交时,必须将存储引擎的日志缓冲写入磁盘(
通过innodb_flush_log_at_trx_commit来控制),也就是写数据前,需要先写日志。
这种方式称为“预写日志方式”,
innodb通过此方式来保证事务的完整性。
也就意味着磁盘上存储的数据页和内存缓冲池上面的页是不同步的,
是先写入redolog,然后写入datafile,因此是一种异步的方式。
通过show engine innodb status\G来观察之间的差距
-----------------------------------------------------------------------
27.备份恢复失败如何处理
-----------------------------------------------------------------------
首先在恢复之前就应该做足准备工作,避免恢复的时候出错。
比如说备份之后的有效性检查、权限检查、空间检查等。
如果万一报错,再根据报错的提示来进行相应的调整。
-----------------------------------------------------------------------
28.Mysql的复制原理以及流程,简述基本原理流程,3个线程以及之间的关联
-----------------------------------------------------------------------
mysql主从复制原理:
从库有两个线程IO线程和SQL线程
1.从库的IO线程向主库的主进程发送请求,主库验证从库,交给主库IO线程负责数据传输;
2.主库IO线程对比从库发送过来的master.info里的信息,
将binlog文件信息,偏移量和binlog文件名等发送给从库
3.从库接收到信息后,将binlog信息保存到relay-bin中,
同时更新master.info的偏移量和binlog文件名
4.从库的SQL线程不断的读取relay-bin的信息,
同时将读到的偏移量和文件名写道relay-log.info文件,
binlog信息写进自己的数据库,一次同步操作完成。
5.完成上次同步后,从库IO线程不断的向主库IO线程要binlog信息
6.从库如果也要做主库,也要打开log_bin和log-slave-update参数
-----------------------------------------------------------------------
29.配置读写mysql主从复制的步骤
-----------------------------------------------------------------------
1.在主库与从库都安装mysql数据库
2.在主库的配置文件(/etc/my.cnf)中配置server-id和log-bin
3.在登陆主库后创建认证用户并做授权。
4.在从库的配置文件(/etc/my.cnf)中配置server-id
5.登陆从库后,指定master并开启同步开关。
需要注意的是server-id主从库的配置是不一样的。
-----------------------------------------------------------------------
30.Server-id存在作用
-----------------------------------------------------------------------
mysql同步的数据中是包含server-id的,
而server-id用于标识该语句最初是从哪个server写入的。因此server-id一定要有的
Server-id不能相同的原因:
每一个同步中的slave在master上都对应一个master线程,
该线程就是通过slave的server-id来标识的;
每个slave在master端最多有一个master线程,
如果两个slave的server-id相同,
则后一个连接成功时,slave主动连接master之后,如果slave上面执行了slave stop;
则连接断开,但是master上对应的线程并没有退出;当slave start之后,
master不能再创建一个线程,而保留原来的线程,那样同步就可能有问题;
-----------------------------------------------------------------------
31.MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义
-----------------------------------------------------------------------
(1)varchar与char的区别
CHAR(char):固定长度,最多255个字符
VARCHAR(varchar):可变长度,最多65535个字符
固定与可变是针对存储介质(硬盘)来说的
(2)varchar(50)中50的涵义 ----- 设置表里的最多字符是50
(3)int(9)中9的涵义 ----- 设置表里整数的最多数字是9个字节
-----------------------------------------------------------------------
32.mysqldump中备份出来的sql,如果我想sql文件中,一行只有一个insert...value()的话,怎么办?如果备份需要带上master的复制点信息怎么办?
-----------------------------------------------------------------------
1).--skip-extended-insert
2).--master-date=1
-----------------------------------------------------------------------
33.mysql的架构,怎么保证它的安全性
-----------------------------------------------------------------------
1、避免从互联网访问MySQL数据库,确保特定主机才拥有访问特权
2、禁用或限制远程访问
3、定期备份数据库
4、设置root用户的口令并改变其登录名
5、移除测试(test)数据库
6、禁用LOCALINFILE
7、移除匿名账户和废弃的账户
8、降低系统特权
9、降低用户的数据库特权
10、移除和禁用.mysql_history文件
11、保持数据库为最新稳定版本,攻击者可以利用上一个版本的已知漏洞来访问企业的数据库。
12、启用日志
13、改变root目录
14、禁用LOCALINFILE命令
-----------------------------------------------------------------------
34.mysql主从延迟的各种原因
-----------------------------------------------------------------------
1、从库太多导致复制延迟 优化:建议从库数量3-5个为宜
2、从库的硬件比主库差 优化:提升硬件性能
3、慢SQL语句过多 优化:SQL语句执行时间太长,需要优化SQL,
包括建立索引或者采用分库分表等。
4、主从复制的设计问题 优化:主从复制单线程,可以通过多线程IO方案解决;
另外mysql5.6.3支持多线程的IO复制。
5、主从之间的网络延迟 优化:尽量采用短的链路,提升端口的带宽
6、主库读写压力大 优化:前端加buffer和缓存。主从延迟不同步
-----------------------------------------------------------------------
35.如何让校验主从数据不一致?出现不一致时如何处理?
-----------------------------------------------------------------------
1.人为原因导致从库与主库数据不一致(从库写入)
2.主从复制过程中,主库异常宕机
3.设置了ignore/do/rewrite等replication等规则
4.binlog非row格式
5.异步复制本身不保证,半同步存在提交读的问题,增强半同步起来比较完美。
但对于异常重启 (Replication Crash Safe),
从库写数据(GTID)的防范,还需要策略来保证。
6.从库中断很久,binlog应用不连续,监控并及时修复主从
7.从库启用了诸如存储过程,从库禁用存储过程等
8.数据库大小版本/分支版本导致数据不一致。主从版本统一
9.备份的时候没有指定参数 例如mysqldump --master-data=2 等
10.主从sql_mode 不一致
11.一主二从环境,二从的server id一致。
12.MySQL自增列 主从不一致
13.主从信息保存在文件里面,文件本身的刷新是非事务的,
导致从库重启后开始执行点大于实际执行点
-----------------------------------------------------------------------
36.mysql优化
一.数据库同步(复制)的机制(方式)有几种?
复制类型:
异步复制(默认):
主库执行完DDL/DML操作后发送给从库,此时主库认为此次操作成功,无论从库是否完成复制。
需要注意:主库写完binlog后从库还没有开始或完成复制,导致主从数据暂时不一致。
若此时主库宕机则从库将丢失部分数据;若此时从库被升为新的主库则整个数据库将永久丢失部分数据。
半同步复制:
主库执行完DDL/DML操作后发送给从库,当其中一个从库完成复制并返回成功信息后,主库才认为此次操作成功。
需要注意:主库只需等待一个从库的回应,且超时时间可以设置,超时后自动降级为异步复制。
同步复制:
主库执行完DDL/DML操作后发送给从库,当所有从库都完成复制并返回成功信息后,主库才认为此次操作成功。
需要注意:主库必须等待所有从库,延迟较大。
延迟复制:
从库延迟一段时间再从主库复制。
当连接数的数值过小会经常出现ERROR 1040: Too many connections错误。
这是是查询数据库当前设置的最大连接数
mysql> show variables like '%max_connections%';
强制限制mysql资源设置:
# vim /etc/my.cnf
max_connections = 1024 并发连接数,根据实际情况设置连接数。
connect_timeout= 5 单位秒 ----超时时间,默认30秒
wait_timeout=10 终止空闲时间超过10秒的链接,避免长连接
max_connect_errors=10 10次连接失败就锁定,使用flush hosts 解锁,或mysqladmin flush-hosts -uroot -p'密码'解锁
慢查询
创建索引
修改数据库连接数 默认151
字符集
11.Redis系列
-----------------------------------------------------------------------
1.redis有几种高可用方案,每个方案的优缺点
Redis多副本(主从)
1、高可靠性,一方面,采用双机主备架构,
能够在主库出现故障时自动进行主备切换,
从库提升为主库提供服务,保证服务平稳运行。
另一方面,开启数据持久化功能和配置合理的备份策略,
能有效的解决数据误操作和数据异常丢失的问题。
2、读写分离策略,从节点可以扩展主库节点的读能力,有效应对大并发量的读操作。
RedisSentinel:
1、RedisSentinel集群部署简单
2、能够解决Redis主从模式下的高可用切换问题
3、很方便实现Redis数据节点的线形扩展,轻松突破Redis自身单线程瓶颈,
可极大满足对Redis大容量或高性能的业务需求。
4、可以实现一套Sentinel监控一组Redis数据节点或多组数据节点
RedisCluster:
1、无中心架构
2、数据按照slot存储分布在多个节点,节点间数据共享,可动态调整数据分布。
3、可扩展性,可线性扩展到1000多个节点,节点可动态添加或删除。
4、高可用性,部分节点不可用时,集群仍可用。
通过增加Slave做standby数据副本,能够实现故障自动failover,
节点之间通过gossip协议交换状态信息,用投票机制完成Slave到Master的角色提升。
5、降低运维成本,提高系统的扩展性和可用性。
-----------------------------------------------------------------------
2.redis有几种持久化存储化的方式?工作原理?两者是否能够共存?
RDB方式原理:
当redis需要做持久化时
(执行SAVA或者BGSAVA命令,或者是达到配置条件时执行),
redis会fork一个子进程,子进程将数据写到磁盘上一个临时RDB文件中,
当子进程完成写临时文件后,将原来的RDB替换掉(默认文件名为dump.rdb)
AOF方式原理:
AOF可以做到全程持久化,Redis每执行一个修改数据的命令,
都会把这个命令添加到AOF文件中,当Redis重启时,
将会读取AOF文件进行“重放”以恢复到Redis关闭前的最后时刻。
由于os会在内核中缓存write做的修改,所以可能不是立即写到磁盘上。
这样aof方式的持久化也还是有可能会丢失部分修改。
不过我们可以通过配置文件告诉redis我们想要通过fsync函数强制os写入到磁盘的时机。
可以共存
redis两种存储的文件格式 rdb /aof
redis主从集群的配置 AB / mysql-cluster / galera
主从配置
master:
bind 0.0.0.0 //监控本地所有网卡IP
protected-mode no
slave1:
bind 0.0.0.0
slaveof master_ipmaster_port //修改master_ip和port
protected-mode no
slave2:
bind 0.0.0.0
slaveof master_ipmaster_port
protected-mode no
客户端连到服务器查看复制信息:
>info replication
-----------------------------------------------------------------------
一、如何解决Redis,mysql双写一致性?
1.最经典的缓存+数据库读写的模式:
读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。
更新的时候,先更新数据库,然后再删除缓存。删redis,更新mysql,再删redis
2.给缓存设置过期时间,这种方案下,可以对存入缓存的数据设置过期时间,
所有的写操作以数据库为准,也就是说如果数据库写成功,
缓存更新失败,那么只要到达过期时间,则后面的读请求自然会从数据库中读取新值然后回填缓存。
-----------------------------------------------------------------------
二、缓存雪崩
数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,
导致数据库CPU和内存负载过高,甚至宕机。
产生雪崩的简单过程:
1、redis集群大面积故障
2、缓存失效,但依然大量请求访问缓存服务redis
3、redis大量失效后,大量请求转向到mysql数据库,mysql的调用量暴增,很快就扛不住了,甚至直接宕机
4、由于大量的应用服务依赖mysql和redis的服务,这个时候很快会演变成各服务器集群的雪崩,最后网站彻底崩溃。
#解决:
1.缓存的高可用性
缓存层设计成高可用,防止缓存大面积故障。即使个别节点、个别机器、甚至是机房宕掉,依然可以提供服务,
例如 Redis Sentinel 和 Redis Cluster 都实现了高可用。
2.缓存降级
可以利用ehcache等本地缓存(暂时支持),主要还是对源服务访问进行限流、资源隔离(熔断)、降级等。
当访问量剧增、服务出现问题仍然需要保证服务还是可用的。系统可以根据一些关键数据进行自动降级,也
可以配置开关实现人工降级,这里会涉及到运维的配合。
降级的最终目的是保证核心服务可用,即使是有损的。
在进行降级之前要对系统进行梳理,比如:哪些业务是核心(必须保证),
哪些业务可以容许暂时不提供服务(利用静态页面替换)等,以及配合服务器核心指标,来后设置整体。
3.Redis备份和快速预热
1)Redis数据备份和恢复
2)快速缓存预热
4.提前演练
最后,建议还是在项目上线前,演练缓存层宕掉后,
应用以及后端的负载情况以及可能出现的问题,对高可用提前预演,提前发现问题。
-----------------------------------------------------------------------
三、缓存穿透
缓存穿透是指查询一个一不存在的数据。例如:从缓存redis没有命中,需要从mysql数据库查询,
查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。
解决:
如果查询数据库也为空,直接设置一个默认值存放到缓存,这样第二次到缓冲中获取就有值了,
而不会继续访问数据库。设置一个过期时间或者当有值的时候将缓存中的值替换掉即可。
-----------------------------------------------------------------------
四、缓存并发
这里的并发指的是多个redis的client同时set key引起的并发问题。其实redis自身就是单线程操作,
多个client并发操作,按照先到先执行的原则,先到的先执行,其余的阻塞。
-----------------------------------------------------------------------
五、缓存预热
缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。
这样就可以避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据!
解决:
1、直接写个缓存刷新页面,上线时手工操作下;
2、数据量不大,可以在项目启动的时候自动进行加载;
目的就是在系统上线前,将数据加载到缓存中。
-----------------------------------------------------------------------
其他面试:
1.Redis官方为什么不提供Windows版本?
因为目前Linux版本已经相当稳定,而且用户量很大,无需开发windows版本,反而会带来兼容性等问题。
2.一个字符串类型的值能存储最大容量是多少?
512M
3.Redis集群方案什么情况下会导致整个集群不可用?
有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,
那么整个集群就会以为缺少5501-11000这个范围的槽而不可用。
4.说说Redis哈希槽的概念?
Redis集群没有使用一致性hash,而是引入了哈希槽的概念,Redis集群有16384个哈希槽,
每个key通过CRC16校验后对16384取模来决定放置哪个槽,集群的每个节点负责一部分hash槽。
5.Redis集群之间是如何复制的?
异步复制
6.Redis集群最大节点个数是多少?
16384个。
7.Redis集群如何选择数据库?
Redis集群目前无法做数据库选择,默认在0数据库。
8.怎么测试Redis的连通性?
ping
9.如何与Redis互动?
安装服务器后,您可以运行redis安装提供的Redis客户端,也可以打开命令提示符并使用以下命令:
redis-cli
10.使用Redis有什么好处?
Redis非常快。
它支持服务器端锁定。
它有一个丰富的客户端库。
这是一个很好的反击。
它支持原子操作。
11.使用Redis有哪些缺点/限制?
它是单线程的。
它对一致哈希的客户端支持有限。
它具有很大的持久性开销。
它没有广泛部署。
12.Redis和RDBMS有什么区别?
Redis是NoSQL数据库,而RDBMS是SQL数据库。
Redis遵循键值结构,而RDBMS遵循表结构。
Redis非常快,而RDBMS相对较慢。
Redis将所有数据集存储在主存储器中,而RDBMS将其数据集存储在辅助存储器中。
Redis通常用于存储小型和常用文件,而RDBMS用于存储大文件。
Redis仅为Linux,BSD,Mac OS X,Solaris提供官方支持。
它目前没有为Windows提供官方支持,而RDBMS提供对两者的支持
13.什么是redis的事务?
a)事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。
事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
b)事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。
14.Redis单点吞吐量
单点TPS达到8万/秒,QPS达到10万/秒,补充下TPS和QPS的概念
1.QPS:
应用系统每秒钟最大能接受的用户访问量
每秒钟处理完请求的次数,注意这里是处理完,具体是指发出请求到服务器处理完成功返回结果。
可以理解在server中有个counter,每处理一个请求加1,1秒后counter=QPS。
2.TPS:
每秒钟最大能处理的请求数
每秒钟处理完的事务次数,一个应用系统1s能完成多少事务处理,一个事务在分布式处理中,
可能会对应多个请求,对于衡量单个接口服务的处理能力,用QPS比较合理。
问题2:Redis的多数据库机制,了解多少?
正常:Redis支持多个数据库,并且每个数据库的数据是隔离的不能共享,
单机下的redis可以支持16个数据库(db0 ~ db15)
集群: 在Redis Cluster集群架构下只有一个数据库空间,
即db0。因此,我们没有使用Redis的多数据库功能!
问题3:Redis集群机制中,你觉得有什么不足的地方吗?
假设我有一个key,对应的value是Hash类型的。
如果Hash对象非常大,是不支持映射到不同节点的!
只能映射到集群中的一个节点上!还有就是做批量操作比较麻烦!
问题4:懂Redis的批量操作么?
正常: 比如mset、mget操作等
集群: 我们在生产上采用的是Redis Cluster集群架构,不同的key会划分到不同的slot中,
因此直接使用mset或者mget等操作是行不通的。
问题6:你们有对Redis做读写分离么?
正常:没有做
集群:不做读写分离。我们用的是Redis Cluster的架构,是属于分片集群的架构。
而redis本身在内存上操作,不会涉及IO吞吐,即使读写分离也不会提升太多性能,
Redis在生产上的主要问题是考虑容量,单机最多10-20G,
key太多降低redis性能.因此采用分片集群结构,已经能保证了我们的性能。
其次,用上了读写分离后,还要考虑主从一致性,主从延迟等问题,徒增业务复杂度。
redis 缓存方式
数据缓存,页面缓存
redis 优化方式
1.Redis配置优化
1.设置maxmemory
设置Redis使用的最大物理内存,
即Redis在占用maxmemory大小的内存之后就开始拒绝后续的写入请求,
该参数可以确保Redis因为使用 了大量内存严重影响速度或者发生OOM
(out-of-memory,发现内存不足时,它会选择杀死一些进程(用户态进程,不是内核线程),以便释放内存)。
此外, 可以使用info命令查看Redis占用的内存及其它信息。
2.客户端timeout 设置一个超时时间,
防止无用的连接占用资源。设置如下命令:
timeout 150
tcp-keepalive 150 (定时向client发送tcp_ack包来探测client是否存活的。默认不探测)
3.检查数据持久化策略
数据落磁盘尽可能减少性能损坏,
以空间换时间。设置如下命令:
rdbcompression no :
默认值是yes。对于存储到磁盘中的快照,
可以设置是否进行压缩存储。
如果是的话,redis会采用LZF算法进行压缩。
如果你不想 消耗CPU来进行压缩的话,
可以设置为关闭此功能,但是存储在磁盘上的快照会比较大。
rdbchecksum no :
默认值是yes。在存储快照后,
我们还可以让redis使用CRC64算法来进行数据校验,
但是这样做会增加大约10%的性能消耗,
如果希 望获取到最大的性能提升,可以关闭此功能。
优化AOF和RDB,减少占用CPU时间 主库可以不进行dump操作或者降低dump频率。
取消AOF持久化。命令如下: appendonly no
4.限制客户端连接数:
在Redis-cli工具中输入info clients可以查看到当前实例的所有客户端连接信息
maxclients属性上修改客户端连接的最大数,
可以通过在Redis-cli工具上输入 config set maxclients 去设置最大连接数。
2.linux配置优化
1.vm.overcommit_memory
编辑/etc/sysctl.conf ,改vm.overcommit_memory=1,然后sysctl -p使配置文件生效
echo 1 > /proc/sys/vm/overcommit_memory
是为了让 fork 操作能够在低内存下也执行成功
Linux 操作系统对大部分申请内存的请 求都回复 yes,以便能运行更多的程序。
因为申请内存后,并不会马上使用内存,这种技术叫做 overcommit。
2.THP
Redis 建议修改 Transparent Huge Pages(THP)的相关配置,
Linux kernel 在2.6.38内核增加了 THP 特性,支持大内存页(2MB)分配,
默认开启。当开启 时可以降低 fork 子进程的速度,
但 fork 操作之后,每个内存页从原来 4KB 变为 2MB,会大幅增加重写期间父进程内存消耗。
同时每次写命令引起的复制内 存页单位放大了512倍,会拖慢写操作的执行时间,
导致大量写操作慢查询,例如简单的 incr 命令也会出现在慢查询中。
因此 Redis 日志中建议将此特性进 行禁用,禁用方法如下:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
为使机器重启后THP配置依然生效,可以在/etc/rc.local 中追加
3.swappiness
对于需要高并发、 高吞吐的应用来说,磁盘 IO 通常会成为系统瓶颈。
0:使用OOM killer,不用swap
1:使用swap,不用killer
60:默认值
100:主动使用swap
echo vm.swappiness={bestvalue} >> /etc/sysctl.conf
4.ulimit文件最大打开数
Redis 建议把 open files 至少设置成10032,
那么这个10032是如何来的呢?因为 maxclients 默认是10000,
这些是用来处理客户端连接的,
除此 之外,Redis 内部会使用最多32个文件描述符,
所以这里的10032=10000+32。
ulimit –Sn {max-open-files}
3.命令处理
1.尽量使用短的key
当然在精简的同时,不要为了key的“见名知意”。
对于value有些也可精简,比如性别使用0、1
键的长度越长,Redis需要存储的数据也就越多
2.避免使用keys *
keys *, 这个命令是阻塞的,即操作执行期间,其它任何命令在你的实例中都无法执行。
当redis中key数据量小时到无所谓,数据量大就很糟糕了。
所以我们应该避免去使用这个命令。可以去使用SCAN,来代替。
3.在存到Redis之前先把你的数据压缩下
redis为每种数据类型都提供了两种内部编码方式,
在不同的情况下redis会自动调整合适的编码方式。
12.Ansible系列
1.ansible都用来做什么
-----------------------------------------------------------------------
实现了批量系统配置;批量程序部署;批量运行命令;自动化运维工具
-----------------------------------------------------------------------
2.使用ansible-playbook创建一个abc用户并赋予644权限,host为all-hosts:all
-----------------------------------------------------------------------
-hosts: all-hosts,all
remote_user: root
tasks:
-name: useraddabc
user: name=abc password=1 group=root
-name: privileges
shell: chmod -R 644 /home/abc
-----------------------------------------------------------------------
3.请写出ansible中你常用的5个管理模块
-----------------------------------------------------------------------
文件模块: copy,file
包管理模块:yum
命令模块: command,shell,script
系统类模块:cron,service,user,group
收集模块: setup
-----------------------------------------------------------------------
4.Linux下使用ansible实现批量修改50台机器上面的test用户密码。请写出实现方法
-----------------------------------------------------------------------
-hosts:test
remote_user: root
gather_facts: false # 关闭收集facts功能,可以提升连接速度
tasks:
-name: changeuserpasswd
user: name={{item.name}} password={{item.chpass|password_hash('sha512')}} update_password=always creat on
with_items:
-{name: 'root', chpass: '123'}
-{name: 'rep', chpass: '123'}
-----------------------------------------------------------------------
5.Ansible的优缺点
优点:模块工作基于ssh连接,不需要服务器端,使用时直接运行命令即可。
轻量级不用安装客户端分布式的
缺点:二次开发难,ssh如果拷贝公钥不成功,无法实现批量管理。
如果控制的机器少不适合用ansible
13.Nginx优化
1)nginx运行工作进程个数,一般设置cpu的核心或者核心数x2
---------------------------------------------------------------------
[root@lx~]# vi /usr/local/nginx1.10/conf/nginx.conf
Nginx运行CPU亲和力
比如4核配置
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000
比如8核配置
worker_processes 8; # cpu核心数
worker_cpu_affinity 00000001 00000010 00000100 00001000 \
00010000 00100000 01000000 10000000;
# worker进程与核心绑定
worker_processes最多开启8个,
8个以上性能提升不会再提升了,而且稳定性变得更低,所以8个进程够用了。
Nginx最多可以打开文件数
worker_rlimit_nofile 65535;
这个指令是指当一个nginx进程打开的最多文件描述符数目,
理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,
但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。
注:文件资源限制的配置可以在/etc/security/limits.conf设置,
针对root/user等各个用户或者*代表所有用户来设置。
* soft nofile 65535 * hard nofile 65535
用户重新登录生效(ulimit -n)
---------------------------------------------------------------------
(2)Nginx事件处理模型
---------------------------------------------------------------------
events { use epoll; worker_connections 65535; multi_accept on; }
nginx采用epoll事件模型,处理效率高
work_connections
是单个worker进程允许客户端最大连接数,
这个数值一般根据服务器性能和内存来制定,
实际最大值就是worker进程数乘以work_connections
实际我们填入一个65535,足够了,这些都算并发值,
一个网站的并发达到这么大的数量,也算一个大站了!
multi_accept
告诉nginx收到一个新连接通知后接受尽可能多的连接,
默认是on,设置为on后,多个worker按串行方式来处理连接,
也就是一个连接只有一个worker被唤醒,其他的处于休眠状态,
设置为off后,多个worker按并行方式来处理连接,
也就是一个连接会唤醒所有的worker,直到连接分配完毕,
没有取得连接的继续休眠。当你的服务器连接数不多时,
开启这个参数会让负载有一定的降低,但是当服务器的吞吐量很大时,
为了效率,可以关闭这个参数。
---------------------------------------------------------------------
(3)开启高效传输模式
---------------------------------------------------------------------
http {
server_tokens off; # 隐藏nginx的版本号
include mime.types;
default_type application/octet-stream;
…… sendfile on;
tcp_nopush on; ……
//媒体类型,include 是一个在当前文件中包含另一个文件内容的指令
Include mime.types;
//默认媒体类型足够
default_type application/octet-stream;
//开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,
//对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,
//以平衡磁盘与网络I/O处理速度,降低系统的负载。
sendfile on;
//注意:如果图片显示不正常把这个改成off。
//必须在sendfile开启模式才有效,防止网路阻塞,
//积极的减少网络报文段的数量(将响应头和正文的开始部分一起发送,而不一个接一个的发送。)
tcp_nopush on;
---------------------------------------------------------------------
(4)连接超时时间
---------------------------------------------------------------------
# 主要目的是保护服务器资源,CPU,内存,控制连接数,因为建立连接也是需要消耗资源的
# 客户端连接保持会话超时时间,超过这个时间,服务器断开这个链接
keepalived_timeout
# 也是防止网络阻塞,不过要包涵在keepalived参数才有效
tcp_nodelay;
# 客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,
# 一般一个请求头的大小不会超过 1k,不过由于一般系统分页都要大于1k,
# 所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得。
client_header_buffer_size 4k;
# 这个将为打开文件指定缓存,默认是没有启用的,
# max指定缓存数量,建议和打开文件数一致,
# inactive 是指经过多长时间文件没被请求后删除缓存。
open_file_cache max=102400 inactive=20s;
# 这个是指多长时间检查一次缓存的有效信息。
open_file_cache_valid 30s;
# 指令中的inactive 参数时间内文件的最少使用次数,如果超过这个数字,
# 文件描述符一直是在缓存中打开的,
# 如上例,如果有一个文件在inactive 时间内一次没被使用,它将被移除。
open_file_cache_min_uses 1;open_file_cache
# 设置请求头的超时时间。我们也可以把这个设置低些,
# 如果超过这个时间没有发送任何数据,nginx将返回request time out的错误
client_header_timeout
# 设置请求体的超时时间。我们也可以把这个设置低些,超
# 过这个时间没有发送任何数据,和上面一样的错误提示
client_body_timeout
# 告诉nginx关闭不响应的客户端连接。这将会释放那个客户端所占有的内存空间。
reset_timeout_connection
# 响应客户端超时时间,这个超时时间仅限于两个活动之间的时间,
# 如果超过这个时间,客户端没有任何活动,nginx关闭连接
send_timeout
# 并不会让nginx执行的速度更快,
# 但它可以关闭在错误页面中的nginx版本数字,
# 这样对于安全性是有好处的。
server_tokens
# 上传文件大小限制
client_max_body_size
---------------------------------------------------------------------
(5)fastcgi调优
---------------------------------------------------------------------
# 指定连接到后端FastCGI的超时时间。
fastcgi_connect_timeout 600;
# 向FastCGI传送请求的超时时间。
fastcgi_send_timeout 600;
# 指定接收FastCGI应答的超时时间。
fastcgi_read_timeout 600;
# 指定读取FastCGI应答第一部分需要用多大的缓冲区,
# 默认的缓冲区大小为fastcgi_buffers指令中的每块大小,
# 可以将这个值设置更小。
fastcgi_buffer_size 64k;
# 指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答请求,
# 如果一个php脚本所产生的页面大小为256KB,
# 那么会分配4个64KB的缓冲区来缓存,如果页面大小大于256KB,
# 那么大于256KB的部分会缓存到fastcgi_temp_path指定的路径中,
# 但是这并不是好方法,因为内存中的数据处理速度要快于磁盘。
# 一般这个值应该为站点中php脚本所产生的页面大小的中间值,
# 如果站点大部分脚本所产生的页面大小为256KB,
# 那么可以把这个值设置为“8 32K”、“4 64k”等。
fastcgi_buffers 4 64k;
# 建议设置为fastcgi_buffers的两倍,繁忙时候的buffer
fastcgi_busy_buffers_size 128k;
# 在写入fastcgi_temp_path时将用多大的数据块,
# 默认值是fastcgi_buffers的两倍,
# 该数值设置小时若负载上来时可能报502BadGateway
fastcgi_temp_file_write_size 128k;
# 缓存临时目录
fastcgi_temp_path
# 这个指令指定是否传递4xx和5xx错误信息到客户端,或者允许
fastcgi_intercept_errors on;nginx使用error_page处理错误信息。
注:静态文件不存在会返回404页面,但是php页面则返回空白页!!
# fastcgi_cache缓存目录,可以设置目录层级,
# 比如1:2会生成16*256个子目录,cache_fastcgi是这个缓存空间的名字,
# cache是用多少内存(这样热门的内容nginx直接放内存,提高访问速度),
# inactive表示默认失效时间,如果缓存数据在失效时间内没有被访问,将被删除,
# max_size表示最多用多少硬盘空间。
fastcgi_cache_path /usr/local/nginx1.10/fastcgi_cachelevels=1:2
keys_zone=cache_fastcgi:128minactive=1d max_size=10g;
# 表示开启FastCGI缓存并为其指定一个名称。
# 开启缓存非常有用,可以有效降低CPU的负载,
# 并且防止502的错误放生。
# cache_fastcgi为proxy_cache_path指令创建的缓存区名称
fastcgi_cache cache_fastcgi;
# 用来指定应答代码的缓存时间,
# 实例中的值表示将200和302应答缓存一小时,
# 要和fastcgi_cache配合使用
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d; # 将301应答缓存一天
fastcgi_cache_valid any 1m; # 将其他应答缓存为1分钟
fastcgi_cache_min_uses 1; # 该指令用于设置经过多少次请求的相同URL将被缓存。
# 该指令用来设置web缓存的Key值,nginx根据Key值md5哈希存储.
# 一般根据$host(域名)、$request_uri(请求的路径)等变量组合成proxy_cache_key 。
fastcgi_cache_key http://$host$request_uri;
# 指定FastCGI服务器监听端口与地址,可以是本机或者其它
fastcgi_pass
---------------------------------------------------------------------
总结:
nginx的缓存功能有:
proxy_cache / fastcgi_cache
proxy_cache 的作用是缓存后端服务器的内容,可能是任何内容,包括静态的和动态。
fastcgi_cache 的作用是缓存fastcgi生成的内容,很多情况是php生成的动态的内容。
proxy_cache 缓存减少了nginx与后端通信的次数,节省了传输时间和后端宽带。
fastcgi_cache 缓存减少了nginx与php的通信的次数,更减轻了php和数据库(mysql)的压力。
CGI 是为了保证web server传递过来的数据是标准格式的,
方便CGI程序的编写者。
Fastcgi 是用来提高CGI程序性能的。
php-fpm 是fastcgi进程的管理器,用来管理fastcgi进程的
---------------------------------------------------------------------
(6)gzip调优
---------------------------------------------------------------------
使用gzip压缩功能,可能为我们节约带宽,加快传输速度,
有更好的体验,也为我们节约成本,所以说这是一个重点。
Nginx启用压缩功能需要ngx_http_gzip_module模块,
apache使用的是mod_deflate
一般我们需要压缩的内容有:文本,js,html,css,
对于图片,视频,flash什么的不压缩,
同时也要注意,我们使用gzip的功能是需要消耗CPU的!
gzip on; # 开启压缩功能
gzip_min_length 1k; # 设置允许压缩的页面最小字节数,
# 页面字节数从header头的Content-Length中获取,
# 默认值是0,不管页面多大都进行压缩,
# 建议设置成大于1K,如果小与1K可能会越压越大。
gzip_buffers 4 32k; # 压缩缓冲区大小,
# 表示申请4个单位为32K的内存作为压缩结果流缓存,
# 默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果。
gzip_http_version 1.1; # 压缩版本,用于设置识别HTTP协议版本,
# 默认是1.1,目前大部分浏览器已经支持GZIP解压,使用默认即可
gzip_comp_level 6; # 压缩比例,用来指定GZIP压缩比,
# 1压缩比最小,处理速度最快,
# 9压缩比最大,传输速度快,但是处理慢,也比较消耗CPU资源。
gzip_types text/css text/xml application/javascript;
# 用来指定压缩的类型,‘text/html’类型总是会被压缩。
默认值: gzip_types text/html (默认不对js/css文件进行压缩)
---------------------------------------------------------------------
(7)expires缓存调优
---------------------------------------------------------------------
缓存,主要针对于图片,css,js等元素更改机会比较少的情况下使用,
特别是图片,占用带宽大,我们完全可以设置图片在浏览器本地缓存365d,
css,js,html可以缓存个10来天,
这样用户第一次打开加载慢一点,第二次,就非常快了!
缓存的时候,我们需要将需要缓存的拓展名列出来,
Expires缓存配置在server字段里面
location ~* \.(ico|jpe?g|gif|png|bmp|swf|flv)$ {
expires 30d;
#log_not_found off;
access_log off;
}
location ~* \.(js|css)$ {
expires 7d;
log_not_found off;
access_log off;
}
注:log_not_found off;是否在error_log中记录不存在的错误。默认是。
总结:
expire功能优点:
(1)expires可以降低网站购买的带宽,节约成本
(2)同时提升用户访问体验
(3)减轻服务的压力,节约服务器成本,是web服务非常重要的功能。
expire功能缺点:
被缓存的页面或数据更新了,用户看到的可能还是旧的内容,反而影响用户体验。
解决办法:(1)缩短缓存时间,例如:1天,但不彻底,除非更新频率大于1天;
(1)对缓存的对象改名。
网站不希望被缓存的内容
1)网站流量统计工具
2)更新频繁的文件(google的logo)
---------------------------------------------------------------------
(8)防盗链
---------------------------------------------------------------------
防止别人直接从你网站引用图片等链接,消耗了你的资源和网络流量,
那么我们的解决办法由几种:
1:水印,品牌宣传,你的带宽,服务器足够
2:防火墙,直接控制,前提是你知道IP来源
3:防盗链策略下面的方法是直接给予404的错误提示
location ~*^.+\.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
valid_referers none blocked www.benet.com benet.com;
if($invalid_referer) {
#return 302 http://www.benet.com/img/nolink.jpg;
return 404;
break;
}
access_log off;
}
参数可以使如下形式:
none 意思是不存在的Referer头(表示空的,也就是直接访问,比如直接在浏览器打开一个图片)
blocked 意为根据防火墙伪装Referer头,如:“Referer:XXXXXXX”。
server_names 为一个或多个服务器的列表,0.5.33版本以后可以在名称中使用“*”通配符。
---------------------------------------------------------------------
(9)关于系统连接数的优化:
---------------------------------------------------------------------
linux 默认值 open files 为1024
说明server只允许同时打开1024个文件
使用ulimit -a 可以查看当前系统的所有限制值,
使用ulimit -n 可以查看当前的最大打开文件数。
新装的linux 默认只有1024 ,
当作负载较大的服务器时,
很容易遇到error: too many open files。因此,需要将其改大
在/etc/security/limits.conf最后增加:
* soft nofile 65535
* hard nofile 65535
* soft noproc 65535
* hard noproc 65535
---------------------------------------------------------------------
(10)修改版本号
编译安装前修改源码
vim src/core/nginx.h
line13: #define NGINX_VERSION "666666"
line14: #define NGINX_VER "lrs/"
vim src/http/ngx_http_header_filter_module.c
line49:static char ngx_http_server_string[] = "Server: lrs"
14.Nginx系列
1.请简单描述nginx与php-fpm的两种连接方式及其优缺点
-----------------------------------------------------------------------
nginx服务器和php-fpm可以通过tcp socket 和 unix Domain socket两种方式实现
1.unix Domain socket
是一种终端,可以使同一台操作系统上的两个或多个进程进行数据通信。
这种方式需要再nginx配置文件中填写php-fpm的pid文件位置,效率要比tcp socket高。
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
}
2.tcp socket
优点是可以跨服务器,当nginx和php-fpm不在同一台机器上时,只能使用这种方式
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
}
-----------------------------------------------------------------------
2.请写下命令检查nginx的当前配置文件,然后平滑重启
-----------------------------------------------------------------------
nginx -t -c 指定配置文件
1.nginx -s reload
2.kill -HUP 住进称号或进程号文件路径
kill -HUP: 如果想要更改配置而不需停止并重新启动服务,请使用该命令
eg: 重启httpd服务
ps -A | grep httpd | grep -v grep | awk '{print $1}' | xargs -L 1 kill -HUP
-----------------------------------------------------------------------
3.实现负载均衡和反向代理,503, 502, 504 报错从哪几个方面去考虑
-----------------------------------------------------------------------
使用nginx代理,而后端服务器发生故障;
或者php-cgi进程数不够用;php执行时间长,
或者是php-cgi进程死掉;已经执行fastCGI使用情况等都会导致502、504错误
502:
调整php-fpm.conf的相关设置
进程数不够: 增加max_children , request_terminate_timeout也可以相应增加
503:
用limit_conn_zone和limit_req指令配合使用来达到限制。
一旦并发连接超过指定数量,就会返回503错误
504:
客户端所发出的请求没有到达网关,请求没有到可以执行的php-fpm
与nginx.conf的配置也有关系
fastcgi_connect_timeout 60
fastcgi_send_timeout 60
fastcgi_read_timeout 60
设置更久的nginx连接超时时间
-----------------------------------------------------------------------
4.遇到盗链怎么解决的
-----------------------------------------------------------------------
使用的模块:ngx_http_referer_module
# valid_referers 使用方式 (1.语法 2.默认值 3.所属代码块)
1.valid_referers none | blocked | server_names | string ...;
2.null
3.server, location
# none : 允许没有http_refer的请求访问资源;
# blocked : 允许不是http://开头的,不带协议的请求访问资源;
# server_names : 只允许指定ip/域名来的请求访问资源(白名单);
-----------------------------------------------------------------------
5.Nginx的几种算法
-----------------------------------------------------------------------
1.轮询(加权) # 每个请求按时间顺序逐一分配到不同的后端服务器
2.ip_hash # 每个请求按访问IP的hash结果分配,同一个IP客户端固定访问一个后端服务器。
3.url_hash # 按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器。
-----------------------------------------------------------------------
6.nginx后端有2台PHP服务器A和B,
匹配url开头为login的请求转发到服务器A8080端口;
匹配以png和jpg结尾的请求转发到服务器B的80端口,
并指定的根目录为/appe/webroot/static/下,
请简单编写nginx匹配转发规则
-----------------------------------------------------------------------
location / {
root /appe/webroot/static/;
if( $request_uri ^~ /login) {
proxy_pass http://server_a:80
}
if( $request_uri ~ *\.(png|jpg)) {
proxy_pass http://server_b:80
}
}
-----------------------------------------------------------------------
7.nginx的工作原理:
-----------------------------------------------------------------------
# nginx作为web服务器:
nginx是基于http协议实现的web服务器,
通过epoll技术实现I/O口多路复用,
采用异步非阻塞实现高并发请求,高度的模块化设计。
异步非阻塞:1个master进程,2个work进程
每进来一个request,会有一个worker进程去处理。
但不是全程的处理,处理到什么程度呢?处理到可能发生阻塞的地方,
比如向上游(后端)服务器转发request,并等待请求返回。
那么,这个处理的worker不会这么一直等着,他会在发送完请求后,注册一个事件:“
如果upstream返回了,告诉我一声,我再接着干”。
于是他就休息去了。这就是异步。
此时,如果再有request进来,他就可以很快再按这种方式处理。
# nginx作为代理服务器:
代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,
并将从服务器上得到的结果返回给internet上请求连接的客户端,
此时代理服务器对外就表现为一个反向代理服务器。
# 作为内容服务器的负载均衡器:
当客户机向站点提出请求时,请求将转到负载均衡服务器。
然后,负载均衡服务器通过防火墙中的特定通路,
将客户机的请求按照一定的规则发送到后端内容服务器。
后端内容服务器再通过该通道将结果回传给负载均衡器。
负载均衡器服务器将检索到的信息发送给客户机,
好像负载均衡服务器就是实际的内容服务器
-----------------------------------------------------------------------
8.nginx负载均衡指定域名访问后端服务器怎么实现?
-----------------------------------------------------------------------
将ip换成域名 在负载均衡器上做好 域名解析 DNS域名服务器 本地host文件或:
[root@localhost~]# vim/etc/nginx/nginx.conf
location / {
root/usr/share/nginx/html;
indexindex.htmlindex.htm;
if($request_uri~*\.html$){
proxy_pass http://html_server;
}
if($request_uri~*\.php$){
proxy_pass http://php_server;
}
}
[root@localhost~]# vim/etc/nginx/conf.d/test.conf
upstream html_server {
server 192.168.122.10;
server 192.168.122.20;
}
upstream php_server {
server 192.168.122.30;
server 192.168.122.40;
}
-----------------------------------------------------------------------
9.Nginx的rewrite地址重写的四中模式与区别
-----------------------------------------------------------------------
last相当于Apache里的[L]标记,表示完成rewrite //如果不写标记默认为这个
break本条规则匹配完成后,终止匹配,不再匹配后面的规则
redirect返回302临时重定向,浏览器地址会显示跳转后的URL地址
permanent返回301永久重定向,浏览器地址会显示跳转后URL地址
Last表示匹配完成后会重新发起请求。
last和break用来实现URL重写,浏览器地址栏URL地址不变
10.如何查看nginx的连接满了
-----------------------------------------------------------------------
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a,S[a]}'
netstat -n | grep tcp | grep :80 | awk '{Stat[$NF]++} END{for (i in Stat) print i,Stat[i]}'
CLOSED 初始(无连接)状态。
LISTEN # 侦听状态,等待远程机器的连接请求。
SYN_SEND # 在TCP三次握手期间,主动连接端发送了SYN包后,
# 进入SYN_SEND状态,等待对方的ACK包。
SYN_RECV # 在TCP三次握手期间,主动连接端收到SYN包后,进入SYN_RECV状态。
ESTABLISHED # 完成TCP三次握手后,主动连接端进入ESTABLISHED状态。
# 此时,TCP连接已经建立,可以进行通信。
FIN_WAIT_1 # 在TCP四次挥手时,主动关闭端发送FIN包后,进入FIN_WAIT_1状态。
FIN_WAIT_2 # 在TCP四次挥手时,主动关闭端收到ACK包后,进入FIN_WAIT_2状态。
TIME_WAIT # 在TCP四次挥手时,主动关闭端发送了ACK包之后,进入TIME_WAIT状态,
# 等待最多MSL时间,让被动关闭端收到ACK包。
CLOSING # 在TCP四次挥手期间,主动关闭端发送了FIN包后,
# 没有收到对应的ACK包,却收到对方的FIN包,此时,进入CLOSING状态。
CLOSE_WAIT # 在TCP四次挥手期间,被动关闭端收到FIN包后,进入CLOSE_WAIT状态。
LAST_ACK # 在TCP四次挥手时,被动关闭端发送FIN包后,进入LAST_ACK状态,等待对方的ACK包。
# 主动连接端可能的状态有:
CLOSED SYN_SEND ESTABLISHED。
# 主动关闭端可能的状态有:
FIN_WAIT_1 FIN_WAIT_2 TIME_WAIT。
# 被动连接端可能的状态有:
LISTEN SYN_RECV ESTABLISHED。
# 被动关闭端可能的状态有:
CLOSE_WAIT LAST_ACK CLOSED。
或:通过界面查看通过web界面查看,
Nginx需要开启status模块,也就是安装Nginx时加上--with-http_stub_status_module,
然后配置Nginx.conf,在server里面加入如下内容:
location / Nginx status {
stub_statuson;
access_log /usr/local/nginx/logs/status.log;
auth_basic "NginxStatus";
}
配置完后重新加载Nginx后我们可以通过浏览器访问http://10.0.0.1/Nginxstatus
查看:Nginx加载命令
15.防火墙系列
1.禁止来自ip地址为 10.0.0.188 访问80端口的请求
-----------------------------------------------------------------------
#iptables -t filter -A INPUT -s 10.0.0.188 -p tcp --dport 80 -j REJECT
或者
#iptables -t filter -A INPUT -s 10.0.0.188 -p tcp --dport 80 -j DROP
用iptables添加一个规则允许192.168.0.123访问本机端口
#iptables -t filter -A INPUT -s 192.168.0.123 -j ACCEPT
-----------------------------------------------------------------------
2.iptables是否支持time时间控制用户行为,如有请写出其具体操作步骤
-----------------------------------------------------------------------
支持,需要增加相关支持的内核补丁,并且要重新编译内核。
或者使用crontab配合iptables:
首先:vi /deny.bat
输入 /sbin/iptables -A OUTPUT -p tcp -s 192.168.1.0/24 --dport 80-j DROP
保存退出
打开crontab -e
输入:0 21 * * * /bin/sh/deny.bat
-----------------------------------------------------------------------
3.包过滤防火墙与代理应用防火墙有什么区别,能列出几种相应的产品吗
-----------------------------------------------------------------------
包过滤防火墙:
工作在网络协议IP层,它只对IP包的源地址、目标地址及相应端口进行处理,
因此速度比较快,能够处理的并发连接比较多,缺点是对应用层的攻击无能为力。
代理服务器防火墙:
将收到的IP包还原成高层协议的通讯数据,
比如http连接信息,因此能够对基于高层协议的攻击进行拦截。
缺点是处理速度比较慢,能够处理的并发数比较少。
代理应用防火墙:天融信GFW4000
包过滤防火墙:华为NE16E
-----------------------------------------------------------------------
4.什么是NAT,常见分为哪几种,DNAT与SNAT有什么不同,应用事例有哪些?
-----------------------------------------------------------------------
NAT(NetworkAddressTranslation,网络地址转换)
是将IP数据包头中的IP地址转换为另一个IP地址的过程。
分为DNAT(目的网络地址转换)和SNAT(源网络地址转换)
SNAT主要是用于内网主机通过路由器或网关访问外网
DNAT将外部地址和端口的访问映射到内部地址和端口
-----------------------------------------------------------------------
5.如何将本地80端口的请求转发到8080端口,当前主机IP为192.168.16.1,其中本地网卡eth0
-----------------------------------------------------------------------
iptables -t nat -A PREROUTING -d 192.168.16.1 -p tcp \
--dport 80 -j DNAT --to 192.168.16.1:8080
或者:
iptables -t nat-A PREROUTING -i eth0 -d 192.168.16.1 -p tcp -m tcp \
--dport 80 -j REDIRECT --to-ports 8080
-----------------------------------------------------------------------
6.centos7默认防火墙允许80端口外网访问,写出相应安全策略
-----------------------------------------------------------------------
firewall -cmd --zone=public --add-port=80/tcp --permanent
-----------------------------------------------------------------------
7.service iptables stop 与 iptables-F 有何区别?
-----------------------------------------------------------------------
service iptables stop 停止iptables服务,
防火墙设定的所有规则都失效,但表和链中的规则还在
iptables-F,清空所有表所有链中的规则,
iptables服务是运行状态,链中的默认策略还生效
-----------------------------------------------------------------------
8.请问如何用iptables工具阻断来自192.168.0.1的所有网络连接
-----------------------------------------------------------------------
iptables -A INPUT -s 192.168.0.1 -j DROP
-----------------------------------------------------------------------
9.请写出iptables做NAT转发的步骤及iptables命令
-----------------------------------------------------------------------
DNAT目标地址转换
把从ppp0进来的要访问tcp/80的数据包的地址改为192.168.0.3
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport80 -j DNAT \
--to 192.168.0.3:80
SNAT网络地址转换
将内网192.168.0.0/24的源地址改为1.1.1.1
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT \
--to 1.1.1.1
-----------------------------------------------------------------------
10.诊断DNAT映射是否成功的最好方法(命令)是
-----------------------------------------------------------------------
elinks http://映射前的ip
配置iptables:
允许221.166.247.12访问本机
(eth1:221.100.247.10,eth0:172.20.46.254)的8080端口,
并将本机(eth1:221.100.247.10)的8080端口转发到172.20.46.30的80端口
(使用NAT)(无需考虑系统限制及路由,写出iptables的配置即可)
--------------------------------------------------------------
iptables -A INPUT -p tcp --dport8080 -s 221.166.247.12 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport8080 -d 221.100.247.10 \
-j DNAT --to 172.20.46.30:80
--------------------------------------------------------------
实现把访问10.0.0.3:80的请求转到172.16.1.17:80\
--------------------------------------------------------------
iptables -t nat -A PREROUTING -d 10.0.0.3 -p tcp --dport80 -j DNAT \
--to 172.16.1.17:80
--------------------------------------------------------------
-----------------------------------------------------------------------
11.写一个防火墙配置脚本,只允许远程主机访问本机的80端口
-----------------------------------------------------------------------
iptables -t filter -I INPUT -p tcp --dport80 -j ACCEPT
12.centos7默认防火墙允许80端口外网访问,写出相应安全策略
-----------------------------------------------------------------------
firewall-cmd --zone=public --add-port=80/tcp --permanent
14.写一个防火墙配置脚本,只允许远程主机访问本机的80端口
----------------------------------------------------------------
vim iptables.sh
Iptables -t filte -I INPUT -p tcp ! --dport80 -j DROP
16.Tomcat
1.您用过的几种中间件/Web应用服务器软件产品,各是什么
中间件:php:php-fpm php-mysql php-gd php-cli
jsp:Tomcat,Resin,JBOSS,WebSphere(IBM),Weblogic(Oracle)
Web应用服务器软件产品:
Apache,由于其跨平台和安全性被广泛使用,是最行流行的web服务器端软件之一;
tomcat服务器是一个免费的开放源代码的Web应用服务器
2.Tomcat调整JVM内存的大小需要修改哪些配置文件
-----------------------------------------------------------------------
在tomcat的启动脚本catalina.sh添加如下:
#OSspecificsupport.$var_must_besettoeithertrueorfalse.
JAVA_OPTS="-server-Xms800m-Xmx800m-XX:PermSize=64M-XX:MaxNewSize=256m-XX:MaxPermSize=128m-Djava.awt.headless=true"
常见的Java虚拟机有:J9VM、HotSpotVM、ZingVM。
3.Tomcat:调优、工作模式基于什么协议
并发优化:在TOMCAT_HOME/bin/catalina.sh增加如下语句,
JAVA_OPTS="-Xms1024m-Xmx1024m-Xss1024K-XX:PermSize=64m-XX:MaxPermSize=128m"
建议和注意事项:
-Xms和-Xmx选项设置为相同堆内存分配,
以避免在每次GC后调整堆的大小,
堆内存建议占内存的60%~80%,一般为50%;
非堆内存是不可回收内存,大小视项目而定;线程栈大小推荐256k.
tomcat 的运行模式有3种,即BIO、NIO和APR。
tomcat 基于HTTP协议
4.Tomcat服务的配置文件是哪个
server.xml
5.后端Java,客户端访问慢,从哪几点考虑
服务器内存java虚拟机内存分配问题并发设置进程设置
6.Tomcat调整JVM内存的大小需要修改哪些配置文件
-----------------------------------------------------------------------
在tomcat\bin\catalina.sh文件中,
JAVA_OPTS=-Xms1024m-Xmx1024m-XX:PermSize=256M- XX:MaxNewSize=512mXX:MaxPermSize=256m
1、Tomcat version
jmx["Catalina:type=Server",serverInfo] tomcat版本
2、th Thread Count
jmx["java.lang:type=Threading",ThreadCount] 线程数
报警:连续三次最小资大于1000报警
3、th Peak Thread Count
jmx["java.lang:type=Threading",PeakThreadCount] 峰值线程数
4、th Daemon Thread Count
jmx["java.lang:type=Threading",DaemonThreadCount] 后台进程数
5、jvm Uptime
jmx["java.lang:type=Runtime",Uptime] jvm正常运行时间
报警:连续2分钟nodata
6、os Open File Descriptor Count
jmx["java.lang:type=OperatingSystem",OpenFileDescriptorCount] 操作系统打开的文件描述符数量
报警:系统打开的文件描述符数量大于系统最大文件描述符数量的80%
7、os Max File Descriptor Count
jmx["java.lang:type=OperatingSystem",MaxFileDescriptorCount] 操作系统最大文件描述符数量
报警:系统打开的文件描述符数量大于系统最大文件描述符数量的80%
8、mem Non-Heap Memory used
jmx["java.lang:type=Memory",NonHeapMemoryUsage.used] 非堆内存使用值
报警:最大非堆内存使用值大于0,连续三次非堆内存使用最小值大于最大非堆内存最大值得80%
9、mem Non-Heap Memory max
jmx["java.lang:type=Memory",NonHeapMemoryUsage.max] 非堆内存最大值
报警:最大非堆内存使用值大于0,连续三次非堆内存使用最小值大于最大非堆内存最大值得80%
10、mem Non-Heap Memory committed
jmx["java.lang:type=Memory",NonHeapMemoryUsage.committed] 非堆内存
11、mem Heap Memory used
jmx["java.lang:type=Memory",HeapMemoryUsage.used] 堆内存使用值
报警:连续5次堆内存使用值最小值大于堆内存总大值得99%
12、mem Heap Memory max
jmx["java.lang:type=Memory",HeapMemoryUsage.max] 堆内存最大值
报警:连续5次堆内存使用值最小值大于堆内存总大值得99%
13、mem Heap Memory committed
jmx["java.lang:type=Memory",HeapMemoryUsage.committed] 堆内存
14、gc runtime of Scavenge per second
jmx["java.lang:type=GarbageCollector,name=PS Scavenge",CollectionTime]
gc新生内存每秒收集累计时间
报警:新生内存连续两次最小值大于200
15、gc times of Scavenge per second
jmx["java.lang:type=GarbageCollector,name=PS Scavenge",CollectionCount]
gc新生内存每秒收集数
16、gc runtime of MarkSweep per second
jmx["java.lang:type=GarbageCollector,name=PS MarkSweep",CollectionTime]
gc持久内存每秒收集累计时间
17、gc times of MarkSweep per second
jmx["java.lang:type=GarbageCollector,name=PS MarkSweep",CollectionCount]
gc持久内存每秒收集数
18、http-40077 threads max
jmx["Catalina:type=ThreadPool,name=\"http-apr-{$PORT}\"",maxThreads]
http -40077 最大线程数
报警:繁忙线程数超过最大线程数的80%
19、http-40077 threads busy
jmx["Catalina:type=ThreadPool,name=\"http-apr-{$PORT}\"",currentThreadsBusy]
http-40077 繁忙线程数
报警:繁忙线程数超过****
报警:繁忙线程数超过最大线程数的80%
报警:繁忙线程连续3次最小值大于5 & 繁忙线程数3次平均值大于每秒请求数大于***
报警:当前活动会话连续5分钟没有值 or 繁忙线程数连续5分钟没有值 or 每秒请求数连续3分钟没有值
20、http-40077 threads allocated
jmx["Catalina:type=ThreadPool,name=\"http-apr-{$PORT}\"",currentThreadCount]
已分配线程数
21、Maximum number of active sessions so far
jmx["Catalina:type=Manager,context={$PATH},host=localhost",maxActive]
历史最大活动会话数
22、The maximum number of active Sessions allowed, or -1 for no limit
jmx["Catalina:type=Manager,context={$PATH},host=localhost",maxActiveSessions]
最大允许会话数量,-1时为无限
23、Number of active sessions at this moment
jmx["Catalina:type=Manager,context={$PATH},host=localhost",activeSessions]
当前活动会话数量
报警:当前活动会话连续5分钟没有值 or 繁忙线程数连续5分钟没有值 or 每秒请求数连续3分钟没有值
24、http-40077 requests per second
jmx["Catalina:type=GlobalRequestProcessor,name=\"http-apr-{$PORT}\"",requestCount]
http-40077 每秒请求数
报警:繁忙线程连续3次最小值大于5 & 繁忙线程数3次平均值大于每秒请求数大于***
报警:连续10次失败次数最小值 大于 请求数十次平均值 60%
报警:当前活动会话连续5分钟没有值 or 繁忙线程数连续5分钟没有值 or 每秒请求数连续3分钟没有值
25、http-40077 request processing time
jmx["Catalina:type=GlobalRequestProcessor,name=\"http-apr-{$PORT}\"",processingTime]
http-40077 请求处理时间
26、http-40077 errors per second
jmx["Catalina:type=GlobalRequestProcessor,name=\"http-apr-{$PORT}\"",errorCount]
http-40077 每秒失败次数
报警:续10次失败次数最小值 大于 请求数十次平均值 60%
27、http-40077 bytes sent per second
jmx["Catalina:type=GlobalRequestProcessor,name=\"http-apr-{$PORT}\"",bytesSent]
http-40077 每秒发送字节数
28、http-40077 bytes received per second
jmx["Catalina:type=GlobalRequestProcessor,name=\"http-apr-{$PORT}\"",bytesReceived]
http-40077 每秒接收字节数
17.zabbix
1.写下之前工作中在生产环境配置使用过的监控系统?针对网络或服务配置过哪些监控项?使用什么方法进行报警通知
--------------------------------------------------------------------------------
zabbix监控:
服务器启动分区剩余空间;服务器网络接口进出流量;服务器服务状态;服务器进程数量;服务器CPU状态
;磁盘IO情况;文件修改;磁盘总和
报警方式:邮件报警,微信报警,
2.使用何种工具监控的数据库?监控哪些指标?
--------------------------------------------------------------------------------
zabbix
使用mysql自带的模板
监控:QPS(增删改查)、mysql请求流量带宽,mysql响应流量带宽,监控主从(showslavestatus\G);TPS(每秒事务的处理数量);
监控缓冲池使用情况;缓存碎片;慢查询数量;当前连接数;吞吐量;端口和服务状态;
mysql正常运行的时间;
3.zabbix监控的优缺点
--------------------------------------------------------------------------------
zabbix优点:
1、数据采集:可用性和性能检测,自动发现,支持agent、snmp、JMX、telnet等多种采集方式,
支持主动和被动模式数据传输、支持用户自定义插件,自定义间隔收集数据
2、高可用:server对设备性能要求低,支持proxy分布式监控,分布式集中管理,有自动发现功能,
可以实现自动化监控;开放式接口,扩展性强,插件编写容易
3、告警管理:支持多条件告警,支持多种告警方式,支持多组模板,模板继承。
4、告警设置:告警周期,告警级别,告警恢复通知、告警暂停,时段阈值、支持维护周期、支持单机停用
5、图形化展示:允许自定义创建多监控项视图,网络拓扑,自定义面板展示,自定义IT服务可用性
6、历史数据:历史数据查询可配置,内置housekeeping数据清理机制
7、安全审计:具备安全的用户审计日志,权限认证,用户可以限制允许维护的列表。
zabbix缺点:
1、性能瓶颈,监控系统没有低估高峰期,具有持续性和周期性,机器量越大,
数据的增大会使数据库的写入成为一定的瓶颈,官网给出的单机上限5000台,
届时就需要增加proxy,增加成本。
2、Zabbix采集数据有pull方式,也就是server主动模式,
当目标机器量大之后,pull任务会出现积压。采集数据会延迟
3、项目二次开发,需要分析MySQL表结构,表结构比较复杂,通过API开发对开发能力有要求。
4、内置housekeeping在执行过程中会对数据库增加压力,需要对数据库进行优化
4.zabbix界面出现字符乱码如何处理?
--------------------------------------------------------------------------------
备份zabbix原有字体文件
cd /usr/share/zabbix/fonts
mv graphfont graphfont.bak
win+r 输入 fonts,找到合适字体
上传到zabbix服务器的字体目录下 /usr/share/zabbix/fonts 并修改文件名为 graphfont
5.zabbix自定义的key值做过哪些
--------------------------------------------------------------------------------
服务器服务状态 磁盘I/O情况 服务器网络接口进出流量
服务器cpu状态等 自定义KEY的方法 zaxbix客户端
[root@hh22~]# mysqladmin -uroot -p'WZ123'status | grep'Opens' | awk-F:'{print$5}'
mysqladmin:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure.
0Opens
vim /etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf
UserParameter= mysql.questions, mysqladmin -uuser -p'密码' status | grep'Opens' | awk-F:'{print$5}'
zabbix服务器
zabbix_agentd-tmysql.questions
6.简述一下你知道的监控软件(有关键内容即可)
zabbix监控软件
Zabbix能监视各种网络参数,
保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位解决存在的各种问题。
是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。
zabbix分为主动模式和被动模式
主动:agent请求server获取主动的监控项列表,
并主动将监控项内需要检测的数据提交给server/proxy
被动:server向agent请求获取监控项的数据,agent返回数据。
314.
zabbix都监控什么,有自己添加的监控项吗?
监控哪些应用程序和服务,怎么监控nginx的日志,
nginx tomcat mysql redis
通过脚本将日志中的访问ip截取,实现站点访问量的展示
怎么监控Tomcat,具体是Tomcat调优的问题,
jmx接口监控jvm,防止内存溢出,监控tomcat进程端口,监控gc日志,full gc
还是后端Java报错socket的问题。
监控中具体用到哪些模块,当监控服务出现一些问题怎么处理,
server,agent,send,pull,将监控数据库独立出来,对监控服务做高可用
比如MySQL的复制状态或者是gps过高,nginx报错的一些日志
1).
vm.memory.size[available] 系统中已用内存量
vm.memory.size[total] 系统总共内存量
swap空间 {
system.swap.size[,free] system.swap.size[,pfree] system.swap.size[,total]
}
CPU {
system.cpu.switches 系统文件切换 (bps)
system.cpu.util[,user]
system.cpu.util[,nice]
system.cpu.util[,system]
system.cpu.util[,iowait]
system.cpu.util[,idle]
system.cpu.util[,interrupt]
system.cpu.util[,steal]
system.cpu.util[,softirq] 类似于对应系统中top命令查看CPU显示值
system.cpu.load[percpu,avg1] 系统CPU总负载/在线cpu个数平均1min的利用百分比
system.cpu.load[percpu,avg5] 系统CPU总负载/在线cpu个数平均5min的利用百分比
system.cpu.load[percpu,avg15] 系统CPU总负载/在线cpu个数平均15min的利用百分比
}
vfs.fs.size[{#FSNAME},free] 可用磁盘空间大小
vfs.fs.size[{#FSNAME},pfree] 可用磁盘空间大小占分区总磁盘空间的百分比
vfs.fs.size[{#FSNAME},total] 分区总磁盘空间大小
vfs.fs.size[{#FSNAME},used] 已使用磁盘空间大小
vfs.fs.inode[{#FSNAME},pfree] 可用磁盘节点数占总节点数的百分比
net.if.in[{#IFNAME}] 网络进接口流量 (bps)
net.if.out[{#IFNAME}] 网络出接口流量 (bps)
proc.num[] 系统中总进程数量,通过top查看
proc.num[,,run] 系统中处于running的进程,通过top查看
system.localtime 系统时间
vfs.file.cksum[/etc/passwd] 系统文件passwd的文件总数
system.boottime 系统启动的时间戳
system.hostname 系统名称
system.cpu.intr 设备中断
kernel.maxfiles 系统支持打开文件的最大数量
kernel.maxproc 系统支持打开进程的最大数量
system.users.num 登陆系统的用户数
agent.ping 检查客户端可用性
agent.version 检查客户端使用版本
system.uname 系统详细信息
system.uptime 系统开启持续时间
agent.hostname 客户端主机名
net.tcp.listen[port] 监控程序端口启用
2).
1、Zabbix Server和Zabbix Agent会追踪日志文件的大小和最后修改时间,
并且分别记录在字节计数器和最新的时间计数器中。
2、Agent会从上次读取日志的地方开始读取日志。
3、字节计数器和最新时间计数器的数据会被记录在Zabbix数据库,
并且发送给Agent,这样能够保证Agent从上次停止的地方开始读取日志。
4、当日志文件大小小于字节计数器中的数字时,字节计数器会变为0,从头开始读取文件。
5、所有符合配置的文件,都会被监控。
6、一个目录下的多个文件如果修改时间相同,会按照字母顺序来读取。
7、到每个Update interval的时间时,Agent会检查一次目录下的文件。
8、Zabbix Agent每秒发送日志量,有一个日志行数上限,防止网络和CPU负载过高,
这个数字在zabbix_agentd.conf中的MaxLinePerSecond。
9、在logtr中,正则表达式只对文件名有效,对文件目录无效。
Hostname设定为Server创建主机是填写的Host name,必须一致
ServerActive设定为Server的IP
type必须选择zabbix agent(active),
因为数据是zabbix被监控的主动提交给server
key:log[/var/log/message,error],我们这里是监控的系统日志,打印出带有error的行,
大家也可以去监控其他的日志,mysql、nginx等等都是可以的。
log time format:MMpddphh:mm:ss,对应日志的行头Sep 14 07:32:38,
y表示年、M表示月、d表示日、p和:一个占位符,h表示小时,m表示分钟,s表示秒。
18.keepalived
1.请简单阐述keepalived的故障切换工作原理
--------------------------------------------------------------------------------
keepalived是以VRRP协议为实现基础的VRRP,
全称VirtualRouterRedundancyProtocol,中文名为虚拟路由冗余协议,
VRRP的出现就是为了解决静态路由的单点故障问题,
VRRP是通过一种竞选机制来将路由的任务交给某台VRRP路由器的。
在两个负载均衡调度器上安装Keepalived以实现高可用的目的。
两个调度器之间通过VRRP协议来保证高可用性,
当一台调度器宕机时,另一台备用的立即接替原主机服务,当主机被修复之后又将服务返还给主机。
在主节点正常工作的时候,会不断地向备节点广播心跳消息,用以告诉备节点自己还活着,
当主节点发生故障的时候,备节点就无法收到主节点广播的消息,即可判定主节点发生故障,
进而调用自身的接管程序,接管主节点的IP资源及服务。
而当主节点被修复时,备节点会释放主节点故障时自己所接管的IP资源和服务,恢复到原来备用的角色。
2.Lvs和keepalived的区别
lvs用于负载均衡,分担服务器压力, keepalived实现高可用,通常会对负载均衡集群实现高可用
19.RabbitMQ
使用场景,为什么用它,原理。与其他消息队列对比
当商城网站下单量突然增大时,会对数据库造成巨大的压力,从而导致用户下单卡顿现象,
给用户造成不好的使用体验,对于这种突发性的压力,没有必要单独提升数据库的性能,
所以可以使用消息队列,作为数据写入数据库的缓冲层,
同时,也将数据库和后端代码服务器之间进行了解耦,
用户下单完毕后直接写入消息队列,再由数据库消费数据,
用户方面直接可以获得下单反馈,消息队列上主要了解的有rabbitmq和kafka,
kafka在性能方面要强于rabbitmq,但数据的可靠性方面相对rabbitmq而言不足,
而订单服务对于数据的可靠性方面要求很高,
rabbitmq可以配置硬盘节点,即便发生宕机事故,rabbitmq也能追回数据,减少损失
原理:`生产者`生产`消息`通过`路由键`到`交换器`上,
`交换器`通过`绑定键`将`消息`传输到指定的`队列`中,
`消费者`从`队列`中消费`消息`,若`交换器`没有绑定队列,则丢弃`消息`
交换器的调度策略:
广播模式:`交换器`会把`消息`发送到 所有与之绑定的 `队列`中
路由模式:`交换器`会把`消息`发送到 `路由键`和`绑定键`一致的 `队列`中
正则模式:`交换器`会把`消息`发送到 满足`路由键`和`绑定键`的模糊匹配的 `队列`中
消息确认:
为了避免消费者在拿到消息后进行处理,没处理完成就发生宕机,
所以,消费者在消费完消息后发送一个回执给RabbitMQ,
RabbitMQ,收到回执则将消息从队列中删除,
没收到回执并且和该消费者断开连接,则将该消息转发给其他消费者
20.负载均衡
1.描述Lvs、Nginx负载均衡的五种调度算法
--------------------------------------------------------------------------------
一,Lvs:
1、静态算法:
rr(轮询调度算法), wrr(权重调度算法),
sh(源地址散列), dh(目标地址散列,把同一个ip地址的请求,发送给同一个server)
2、动态调度算法:
LC(最少连接), wlc(加权最少连接),
sed(最短延迟调度), nq(永不排队,改进的sed)
二、nginx:
1、rr:轮询算法
依次将用户的访问请求,平均的分配到后端的web集群中每个节点,
此种算法不会考虑每个节点的性能,所以比较适用于所有节点的性能一致的情况
2、wrr:权重算法
根据设定的权重值,权重值越大,被配到的请求次数也就越多,有效的解决了rr算法的缺点
3、ip_hash算法
根据用户访问的真实ip生成一个hash表,此后,同一个ip地址的访问请求都将会分配到这个节点上,
可以解决session会话共享的问题
4、url_hash
根据用户访问的url的hash结果,使每个url定向到同一个后端服务器上
5、fair
更加智能的负载均衡算法,可以根据页面大小的和加载时间长短智能的进行负载均衡
2.采用四层负载均衡的可以用哪种方式?
lvs haproxy
硬件负载均衡器(F5-BigIpRedware)
REBBITMQ
3.Haproxy可以做web中间件吗?
不可以Haproxy可以作web负载均衡
4.ha-proxy相对LVS,Nginx等负载均衡软件的优点。
支持tcp/http两种协议层的负载均衡,使得其负载均衡功能非常丰富。
支持8种左右的负载均衡算法,
尤其是在http模式时,有许多非常实在的负载均衡算法,适用各种需求。
性能非常优秀,基于事件驱动的链接处理模式及单进程处理模式(和Nginx类似)让其性能卓越。
拥有一个功能出色的监控页面,实时了解系统的当前状况。
功能强大的ACL支持,给用户极大的方便。
5.介绍一下lvs具体在每一层都怎么实现的
lvs集群里:
LVS是(LinuxVirtualServer)的简写,意即Linux虚拟服务器.
是国人章文嵩发起的一个开源项目,是一个虚拟的服务器集群系统.可以做四层的负载均衡.
早期使用lvs需要修改内核才能使用。但是由于性能优异,现在已经被收入内核。
一般来说,LVS集群采用三层结构,其主要组成部分为:
A、负载调度器(loadbalancer),它是整个集群对外面的前端机,
负责将客户的请求发送到一组服务器上执行,
而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。
B、服务器池(serverpool)是一组真正执行客户请求的服务器,
执行的服务有WEB、MAIL、FTP和DNS等。
C、共享存储(sharedstorage),它为服务器池提供一个共享的存储区,
这样很容易使得服务器池拥有相同的内容,提供相同的服务。
调度器是服务器集群系统的唯一入口点(SingleEntryPoint),它可以采用IP负载均衡技术、
基于内容请求分发技术或者两者相结合
负载均衡层:处于整个集群的最前端,由一台或者多台调度器构成,
LVS模块部署在调度器上,调度器根据既定的算法来实现将网络请求调度到不同后端服务器,
完成对应的功能。
服务器集群层:由一组实际运行着应用服务的服务器构成,后端服务器支持的服务包括,
web服务,邮件服务,FTP服务,DNS服务等一个或者多个,
每个服务器之间可以通过LAN或者更大范围的WAN相连,
在实际的应用场景中,调取服务器也可以作为应用服务器提供服务。
共享数据层:向服务器集群中的所有realserver提供共享存储空间和内容一致性的存储区域。
一般是由磁盘阵列组成,提供数据的一致性。也可以由NFS提供。
目前来说磁盘阵列更为适合,NFS受网络影响较大,不太稳定。
6.简述一下你知道的负载均衡(有关键内容即可)
常用的负载均衡开源软件有nginx、lvs、haproxy,
商业的硬件负载均衡设备F5、Netscale。
lvs做四层负载均衡。有nat模式和dr模式。
nginx做七层负载均衡。
nginx负载均衡配置,主要是proxy_pass,upstream的使用。
7.简述一下lvs和Nginx的优缺点
nginx:
优点:
1.工作在网络7层之上,可针对http应用做一些分流的策略,正规规则比HAProxy更为强大和灵活
2.Nginx对网络稳定性的依赖非常小
3.Nginx安装与配置比较简单
4.可以承担高负载压力且稳定
5.Nginx可以通过端口检测到服务器内部的故障,并会把返回错误的请求重新提交到另一个节点。
缺点:
1.适应范围较小,仅能支持http、https、Email协议
2.对后端服务器的健康检查,只支持通过端口检测,不支持url,用户正在上传一个文件,
而处理该上传的节点刚好在上传过程中出现故障,
Nginx会把上传切到另一台服务器重新处理,而LVS就直接断掉了
lvs:
优点:
1.抗负载能力强,工作与四层,仅作分发,无流量产生,性能最强,系统资源消耗低
2.不需要进行太复杂的配置,人为配置出错率低
3.应用的范围广,工作在四层,可以给很多应用服务进行负载均衡
缺点:
1.不支持正则,无法实现动静分离
2.当网站规模庞大,且其中含有windows server时,配置实施维护比较麻烦
haproxy:
1.可以工作在4、7层(支持多网段);
2.Session的保持,Cookie的引导等工作;
3.支持url检测后端的服务器;
4.单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的;
5.HAProxy的算法较多,达到8种
8.lvs nginx haproxy 的选择
lvs:
工作在四层,应用范围广,本身不处理请求,性能三者内最高
对于有四层方面的负载均衡需求的场景推荐使用
nginx:
本身可以提供web服务,当业务场景需要使用到静态页面解析时
也只能使用nginx作为负载均衡器了,
同时,nginx的location匹配支持正则
可以提供更加灵活的负载均衡策略
haproxy:
本身是一个专业的负载均衡器,性能强于nginx,
同时拥有一个web管理页面,方便进行管理,
在不需要进行静态页面解析的场景下,推荐使用haproxy
21.cicd
1.jenkins上线流程
jenkins配置gitlab的URL,选定好响应的分支,上传凭证,
凭证一般是jenkins的密钥,公钥上传至gitlab上
jenkins所在服务器配置maven打包工具和JDK,配置ssh插件
研发人员将代码发布到gitlab中,合并至master分支
jenkins获取代码,在本地打包,通过ssh上传到指定发布的服务器上
通过发布脚本进行项目更新
2.参数化构建的方式
选择参数化构建的方式构建项目
配置参数(名称、选项、描述等等)
在构建配置项将设置好的参数通过
命令传参至代码操作脚本内,执行脚本
22.zookeeper
zookeeper以树的形式存放数据,与unix系统目录结构类似
一、有四种节点:
1.持久节点:创建后将一直存在,除非主动删除;
2.持久顺序节点:其持久性与持久节点一样,但是它具有顺序性,
节点名上加上一个数字后缀表示其创建的顺序,例如 1,2,3,4...;
3.临时节点:如果创建该节点的会话失效,那该节点也将被删除;
4.临时顺序结点:在临时节点上增加了顺序的概念
二、Watcher 机制:
一种监听机制,可以监听到某个节点的数据内容变化,若发生变化,zk会通知我们。
三、数据发布/订阅(配置文件管理)
将配置发布到 ZooKeeper 的节点上,
其他机器可通过监听 ZooKeeper 上节点的变化来实现配置的动态更新。
例如我们把数据库配置放在 “/configserver/app1/database_config” 节点上,
然后让每台机器在启动时从该节点上获取数据库配置信息,并且监听节点的内容变化,
发生配置变更时,重新获取配置。
四、命名服务
通过 ZooKeeper 的顺序节点生成全局唯一 ID。
例如一个分布式任务调度系统,为任务生产全局唯一 ID,如下图所示:
/jobs
|
|------type1
|
|----------job-0000001
|----------job-0000002
|----------job-0000003
|---------- ......
在创建完顺序节点后,通过节点名拼接可得到唯一 ID 的任务名,
例如 “type1-job-000000003”。
五、集群管理
通过 ZooKeeper 的临时节点 和 Watcher 机制,来监控集群的运行状态,如下图所示:
/machines
|
|---------host1
|---------host2
|---------host3
|--------- ......
当有新的机器加入集群时,就在 “machines” 下创建一个临时节点。
当有机器宕机时,临时节点将失效被删除。通过监控 “machines” 下的子节点变化,
就能得知集群机器的状态。
六、分布式锁
排它锁:
在事务对资源的加锁期间,不允许其他事务进行读写操作。
通过一个临时节点便能表示一个锁,如下图所示:
/resources
|
|------------resourceA
| |
| |----------exclusive_lock
| |
| |-----------------lock
|
|------------resourceB
共享锁:
/resources
|
|------------resourceA
| |
| |----------exclusive_lock
| |
| |-----------------lock-0000001 (R)
| |-----------------lock-0000001 (W)
| |-----------------lock-0000001 (R)
|
|------------resourceB
读写操作都是在 “shared_lock” 节点下创建一个名为 “lock” 的临时顺序节点,
只是数据内容不同。对于读操作,如果比自己序号小的子节点都是读请求,
则认为自己成功获得了锁,可以进行读操作,如果序号小的节点中包含写操作,需要进行等待,
监听 “shared_lock” 的子节点变化。对于写操作,如果自己不是序号最小的子节点,
则进入等待,监听 “shared_lock” 的子节点变化。
其他
1.列出作为完整邮件系统的软件,至少二类
-----------------------------------------------------------------------
Sendmail,(邮件传输代理程序)
postfix,(WietseVenema在IBM的GPL协议之下开发的MTA(邮件传输代理)软件)
qmail(qmail是一个因特网邮件传送代理(简写为MTA),它运行在linux/Unix兼容系统下,是一个直接代替UNIX下Sendmail软件的邮件传送程序。)
2.虚拟化vSphere,Hyper-V,kvm
-----------------------------------------------------------------------
1、VMwarevSphere集成容器(VIC)建立了一个在轻量级虚拟机内部署并管理容器的环境。
2、Hyper-V是微软提出的一种系统管理程序虚拟化技术,能够实现桌面虚拟化
3、KVM是一个开源的系统虚拟化模块,自Linux2.6.20之后集成在Linux的各个主要发行版本中。
它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。
KVM目前已成为学术界的主流VMM(虚拟机监控器)之一。
3.描述rabbitmq集群搭建步骤
-----------------------------------------------------------------------
通过Erlang的分布式特性(通过magiccookie认证节点)进行RabbitMQ集群,各RabbitMQ服务为对等节点,即每个节点都提供服务给客户端连接,进行消息发送与接收。
这些节点通过RabbitMQHA队列(镜像队列)进行消息队列结构复制。
本方案中搭建3个节点,并且都是磁盘节点(所有节点状态保持一致,节点完全对等),
只要有任何一个节点能够工作,RabbitMQ集群对外就能提供服务。
RabbitMQ集群安装在3个节点上:192.168.1.1、192.168.1.2、192.168.1.3;
HAProxy安装在192.168.1.1上,用于对外提供RabbitMQ均衡
4.zookeeper如何保证事务的一致性
数据一致性是靠Paxos算法(一种基于消息传递的一致性算法。)保证的,
Paxos可以说是分布式一致性算法的鼻祖,是ZooKeeper的基础
paxos的基本思路(深入解读zookeeper一致性原理)
5.你对运维工程师的理解和以及对其工作的认识
运维工程师在公司当中责任重大,需要保证时刻为公司及客户提供稳定、安全的服务。
保障公司正常对外提供服务。
运维工程师的一个小小的失误,可能会对公司及客户造成损失,因此运维工程师的工作需要严谨。
同时在工作中也要能及时发现问题,解决问题,记录问题。
在工作中以及工作之余不断充实完善自己,更好的服务公司。
6.请简述C/S、B/S的含义
C/S表示客户端/服务器的模式C是client,S是server。c/s中需要另外开发客户端程序
B/S表示浏览器/服务器的模式B是browser,S是server。b/s是基于浏览器来实现的。
7.电脑开机时主机内发出嘀嘀的鸣叫声,且显示器无任何信号,此对象可能是哪方面所导致,怎样处理?
-----------------------------------------------------------------------
可能是内存问题导致,一般是内存松动,灰尘较多.
可以做清扫灰尘处理,重新插好内存等操作.
各种主板的报警音有些差别,常见两种BIOS报警声音含义如下,
AwardBIOS的报警音:
1短:系统正常。
2短:需要更正CMOS设置,请进入CMOSSetup重新设置。
1长1短:RAM或主板出错。1长2短:显示卡错误,检查独立显卡是否插牢,或者显卡坏了。
1长3短:键盘控制器错误。检查主板。1长9短:主板BIOS损坏。
不断地响(长声):内存条未插好或损坏。
重复短响:电源故障。
无声音无显示:电源故障。
AMIBIOS的报警音:
1短:内存问题。
2短:内存ECC较验错误。在CMOSSetup中将内存关于ECC校验的选项设为Disabled就可以解决。
3短:系统基本内存(第1个64kB)检查失败。换内存。
4短:系统时钟出错。
5短:CPU损坏。
6短:键盘控制器故障。
7短:系统实模式错误,不能切换到保护状态。
8短:显存错误。更换显卡。
9短:ROMBIOS错误。
1长3短:内存错误。内存损坏,更换即可。
1长8短:显卡损坏或显示卡没插好。
8.有一个员工,说他的机器上不了网,请你描述一下,可能是哪些故障产生的,怎么解决这些故障?
ping网关和其他机器.ping不通,看看是不是网卡被禁了,
还是ip dns gateway有问题,再看看网卡驱动是不是有问题.
硬件方面: 看看是不是网线没插好,网卡的灯亮不亮.
9.Linux运维工程师都需要具备哪些技能和职业品质
-----------------------------------------------------------------------
熟练使用shell,最好也能掌握python的使用。
熟悉运维自动化工具和平台的使用,能整合、研发更好,通过自动化,实现运维数据可视化、生成报表;
能够独立进行运维的问题跟踪与管理,故障处理和隐患排查,定期给出业务运维状况和容量报告;
能够研究移动互联网应用服务架构及其依赖的软硬件环境,跟踪各个子系统的内部运行状况,
不断提高系统的健壮性与效率;能熟练应对协助开发完成日常变更,上下线等的维护事务;
能对系统和业务数据进行统一存储、备份和恢复,对网络设备、服务器设备、操作系统运行状况进行监控。
首先要有良好的品行需要有发现问题,解决问题的能力。
遇事沉着冷静。动动你的小脑袋夸夸自己,不过一定要积极向上,杜绝消极思想。
10.简述当用户输入login.lanxin.cn到这个页面显示在浏览器上,这个过程中都发生了啥
-----------------------------------------------------------------------
1.浏览器输入域名回车
2.查询本地的DNS缓存,以找到域名对应的主机IP地址,如果本地没有
3.查询远程域名根DNS,找到IP地址
4.查询到后,向远程IP地址的服务器发送请求
5.服务器响应请求,向用户发送数据
6.浏览器对返回的数据进行处理(浏览器渲染)
7.显示
11.如果接到客服反馈:A项目www.lanxinA.cn无法打开,作为一名运维人员需要怎么操作
-----------------------------------------------------------------------
1、先把服务切走,保证公司网站能正常对外提供服务
2、查看网络是否正常
3、本地网络速率正常时,再检查网站是否正常,域名是否能被正常解析到ip
使用故障诊断命令定位故障点。
命令分析:ping:检测IP或域名的连通性
dig/nslookup:查看DNS解析情况
traceroute:显示从访问者到网站的路由连接状态,如果有节点无法连接,只需针对该故障点进行修复便可快速恢复网络。
4、检查服务器本身是否故障
5、协调开发检查设计是否异常
12.在之前的运维工作中你遇到过哪些运维故障?是怎么解决的?请描述2个你发现并解决的故障案例
-----------------------------------------------------------------------
1、问题描述:
服务器tomcat重启之后,网站很长一段时间无法访问,然后过几分钟就可以访问了。
使用命令 netstat -tulnp|grep java发现是8005端口的问题,
起来很慢,日志里面又没有什么报错信息。
原因:Tomcat启动过程很慢,JVM上的随机数与熵池策略耗时:session引起的随机数问题导致的。
解决方案:
修改$JAVA_HOME/jre/lib/security/java.security文件中securerandom.source配置项:
#securerandom.source=file:/dev/random 改为
securerandom.source=file:/dev/urandom
最后重启tomcat发现速度快了。
2、Tomcat每周六重启失败
问题背景:生产环境上面的tomcat每周六重启,但是重启失败
原因:经过调查发现是因为一个tomcat产生了多个java进程,
所以执行自带脚本shutdown.sh的时候没有把tomcat进程完全杀死。
解决方案:将杀死tomcat进程的脚本放在重启脚本的前面执行
.../app/bin/kill.sh >> /app/log/backup/kill.log
.../app/bin/restart_tomcat.sh >> /app/log/backup/restart.log
13.假设网站结构为:Nginx→PHP-FPM→Mysql有部分链接打开缓慢,通过什么方式可以找到访问缓慢的链接
-----------------------------------------------------------------------
1、系统负载,磁盘IO
2、是否有php慢查询程序
打开php-fpm中php慢查询日志
request_slowlog_timeout=5
slowlog=var/log/slow.log
reload 访问之后无慢查询日志,判断无执行时间比较慢的php程序
检查该配置文件
pm=static pm.max_children=300 pm.start_servers=15 pm.min_spare_servers=8 pm.max_spare_servers=48
request_terminate_timeout=200 排除是pm.max_children设置过小引起的问题。
3、mysql可能有慢查询
14.请写出5个你常用的系统或网络维护工具的名称
-----------------------------------------------------------------------
配置部署自动化:ansible(puppet,saltstart)
日志采集、分析、报警:ELK
网络质量监控:smokeping、zabbix
监控(报警)自动化:nagios(监控系统),ganglia(集群监控),cacti(流量监控)、ipmonitor(ping监控)等
指标收集:collectd+statsd(statsite)
指标绘图:graphite、nrpe、pnp4nagios
15.公司的架构服务器什么配置,怎么上传代码,怎么发布
戴尔710/720 scp jenkins nfs
PowerEdge R740 英特尔® 至强® 银牌 4216 处理器 * 2 (16c32t 128G ecc)3.5w
16.远程管理卡作用。怎么通过命令看硬盘,内存等硬件故障
-----------------------------------------------------------------------
1、远程安装操作系统
登录 监控电池、风扇、CPU、内存、磁盘等硬件设备的状态远程管理卡管理界面,
用控制卡上的虚拟介质映射功能把自己电脑上的ISO文件或者物理光驱投递给机房里服务器。
2、电源控制功能
远程登录管理界面,进行开机、关机、重启
3.检查服务器硬件状态
监控电池、风扇、CPU、内存、磁盘等硬件设备的状态
17.平时在公司都干些什么
-----------------------------------------------------------------------
1.处理报警,查看报警的原因,和开发一起解决,
并且尽量找出避免再次发生的方法,例如添加一些定时清理脚本
2.处理发布,基本都是自动化,但是总有发布不成功或者需要回滚的时候,
这时候就需要手工介入,找到原因,并跟开发一起讨论最后是否撤销还是重上
3.日常一起能够自动化的工作尽量找到自动化的方法
4.会启动一些和运维相关的项目,所以有时候也兼职项目开发
5.参与例会
6.学习,看看新闻,学习资料等等。
或者
1,等待监控系统报警
2,核心系统巡检,备份系统备份任务完成情况巡检
3,等待用户报障
4,例行任务计划攥写,例行任务执行,比如新开用户,存储扩容等;
5,项目性的工作,比如新购存储,新的监控系统,新的操作系统,应用系统验证
6,学习新知识,看技术文档或者公司的各种通知
7,和不同供应商(工程师),内部人员开会
18.java报错socket
-----------------------------------------------------------------------
1.java.net.SocketTimeoutException.这个异常比较常见,socket超时。
一般有2个地方会抛出这个,
connect:
这个超时参数由connect(SocketAddressendpoint,inttimeout)中的后者来决定,
setSoTimeout(inttimeout):
这个是设定读取的超时时间。
它们设置成0均表示无限大。
2.java.net.BindException:Addressalreadyinuse:JVM_Bind。
该异常发生在服务器端进行newServerSocket(port)或者
socket.bind(SocketAddressbindpoint)操作时。
原因:与port一样的一个端口已经被启动,并进行监听。
此时用netstat–an命令,可以看到一个Listending状态的端口。
只需要找一个没有被占用的端口就能解决这个问题。
status模块监控nginx等。
19.写下之前工作中在生产环境中对何种角色的服务器上的哪些内容配置过备份,
使用什么备份方法及备份策略,使用了什么方法检查备份的可用性?
-----------------------------------------------------------------------
1、每天晚上00点整在Web服务器上打包备份系统配置文件、
网站程序目录及访问日志并通过rsync命令推送备份服务器backup上备份保留
2.内核备份
数据库备份
备份方案:
1.设置数据库自动备份脚本文件,计划任务
2.每个星期天做全库备份
3.每日(星期天除外)做级增量备份
4.在主服务器保留一个礼拜内的全库备份、增量备份
5.将一个礼拜前的全库备份,增量备份数据FTP到其他环境
6.还可以加入差异备份,多种备份形式。
20.公司的架构,服务器的数量,之前公司运维部的人员数量,之前工作流程
-----------------------------------------------------------------------
服务器数量五六十台,运维人数2人,
运维人员对公司互联网业务所依赖的基础设施、基础服务、线上业务进行稳定性加强,
进行日常巡检发现服务可能存在的隐患,
对整体架构进行优化以屏蔽常见的运行故障,多数据中接入提高业务的容灾能力。
通过监控、日志分析等技术手段,及时发现和响应服务故障,
减少服务中断的时间,使公司的互联网业务符合预期的可用性要求,持续稳定地为用户提供务。
21.Python的类模块
模块分为三类:内置模块;第三方;自定义;
22.Docker的网络
-----------------------------------------------------------------------
1.openvswitch
果要在生产和测试环境大规模采用docker技术,
首先就需要解决不同物理机建的docker容器互联问题。
可以采用openvswitch实现不同物理服务器上的docker容器互联
2.路由模式:
Docker默认的内部ip为172.17.42.0网段,
所以必须要修改其中一台的默认网段以免ip冲突。
宿主机开路由:echo1>/proc/sys/net/ipv4/ipf_forward
现在两台宿主机里的容器就可以通信了。
3.host模式:
dockerrun使用--net=host指定,
docker使用的网络实际上和宿主机一样
2.container模式:
使用--net=container:container_id/container_name,
多个容器使用共同的网络,
看到的ip是一样的。
3.none模式
使用--net=none指定,这种模式下,不会配置任何网络。
4.bridge模式
使用--net=bridge指定,默认模式,不会指定,
此模式会为每个容器分配一个独立的networknamespace
23.了解docker和别的虚拟化技术的区别吗
-----------------------------------------------------------------------
1)标准化应用发布,docker容器包含了运行环境和可执行程序,可以跨平台和主机使用;
2)节约时间,快速部署和启动,VM启动一般是分钟级,docker容器启动是秒级;
3)方便构建基于SOA架构或微服务架构的系统,通过服务编排,更好的松耦合;
4)节约成本,以前一个虚拟机至少需要几个G的磁盘空间,docker容器可以减少到MB级;
5)方便持续集成,通过与代码进行关联使持续集成非常方便;
6)可以作为集群系统的轻量主机或节点,在IaaS平台上,已经出现了CaaS,通过容器替代原来的主机。
7)应用隔离
24.从数据结构角度看,堆栈和队列都是线性表,堆栈的特性
队列是先进先出, 堆栈是先进后出
25.面向对象的主要特征:
封装 、继承、多态
26.
名字
籍贯
上家公司叫啥
做啥
离职原因
为何来深圳
问题:
用户反馈有页面但内容加载不出来,或者很慢,
mysql服务负载很高,扛不住并发,大量的请求绕过了redis
联系开发,将mysql查询不到的数据的key设置了个空置,缓存在了redis中
nginx
简述Nginx和Apache的差异?
简述Nginx负载均衡主要的均衡机制(策略)?
简述Nginx动静分离及其原理?
简述Nginx重定向及其使用的场景?
简述Nginx对于HTTP请求采用哪两种机制进行处理?
mysql
简述MySQL InnoDB引擎和MyISAM引擎的差异?
简述MySQL主从复制
简述MySQL常见的读写分离方案?
简述MySQL常见的高可用方案?
简述MySQL常见的优化措施?
简述MySQL常见备份方式和工具?
简述什么是ACID理论?
简述MySQL事务之间的隔离?
基础
简述Linux启动过程?
简述Linux运行级别?
TCP和UDP优点和缺点?差别?
简述RAID0、RAID1、RAID5
简述Zabbix及其优势?
Ansible
1、Ansible是什么?
2、Ansible常用模块
ELK
1.ELK是什么?
写过什么脚本
处理过什么问题
临时调整和永久生效系统内核参数在哪里调
线上访问的WEB页面出现504,如何处理?
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。