如何优化 Linux 系统(可以不说太具体)?
1,root, 添加普通用户, 通过 sudo 授权管理; 2, 更改默认的远程连接 SSH 服务端口及禁止 root 用户远程连接; 3, 自动更新服务器时间; 4, 配置国内 yum 源; 5, 关闭 selinux 及 iptables(iptables 工作场景如果有外网 IP 一定要打开, 高并发除外); 6, 调整文件描述符的数量; 7, 精简开机启动服务(crond rsyslog network sshd);8, 内核参数优化(/etc/sysctl.conf);9, 更改字符集, 支持中文, 但建议还是用英文字符集, 防止乱码; 10, 锁定关键系统文件; 11, 清空 / etc/issue, 去除系统及内核版本登录前的屏幕显示
请列举出 web 服务器的负载架构:
答: Nginx,Haproxy,LVS
用 tcpdump 嗅探 80 端口的访问看看谁最高:
tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}'| sort | uniq -c | sort -nr |head -20
统计 / var/log/httpd/access.log 日志访问频繁前十的地址, 并从大到小排序.
cat access.log |cut -d" " -f1 |sort |uniq -c |sort -nr|head -n10
软硬:{共性}: 修改软硬链接文件, 所有的文件都是同步修改的.
硬链接: 本质: 同一个文件多个名字, 链接数: 有一个以上的链接, 不可跨分区, 只允许对文件创建链接, 不依赖原始文件, 删除硬链接文件的源文件, 硬链接文件仍然存在, 不占用空间, 格式: ln 目标文件 链接名?
软连接: 本质: 一个文件对应快捷方式, 是不同文件, 链接数: 只有一个链接, 可以跨分区, 可以对目录和文件夹进行链接, 依赖于原始文件, 删除源文件, 软连接则指向一个空文件, 它具有依赖性, 占用磁盘空间, 格式: ln -s 目标文件 源文件
取 IPV4 地址: ifconfig ens33| grep -Eo "([0-9]{1,3}.){3}[0-9]{1,3}" head -1
取分区利用率: df | grep "/dev/sd" | grep -o "[0-9]{1,3}%" | grep -o "[0-9]+" | sort -nr | head - n1
取分区利用率: sed -rn 's/^([^[:space:]]+).([0-9]+)%./\2/p'
用户: sed -rn 's/^([^[:space:]]+).([0-9]+)%./\1/p'
查看版本型号: cut -d "." -f1 /etc/RedHat-release |egrep -o "[0-9]+"
查看版本型号: grep -o "[0-9]+." /etc/RedHat-release | grep -o "[0-9]+"
查看版本型号: sed -rn "s/.([0-9]+)../\1/p" /etc/RedHat-release
匹配手机号码: egrep -o "1[0-9]{10}" tel.txt
匹配 email 邮箱: egrep -o "([[:alnum:]]|_)[email protected][[:alnum:]]+.com$" mail.txt
使用 sed 命令取 IPV4 地址:
1,|sed -n '2p' |sed -r 's/inet//' |sed -r 's/netmask.//' |tr -d "" 2,|sed -n'2p'sed -e's/^.inet//'-e's/.//'3,|sed -n -e'2s/^.inet//'-e'2s/ .//p'4,|sed -nr'[email protected] (.) [email protected]\[email protected]'5,|sed -nr'2s/[^0-9]+([0-9.]+)./\1/p'
快速查找 / root 目录中大于 2M 的文本, 并将文件中的 magedu, 换成 www.magedu.com :
find /root --size +2M -type f -exec sed -i 's/magedu/www.magedu.com/g' {} \;
三个私有地址网络: A:10.0.0.0/8~10.255.255.255/8 B,172.16.0.0/16 ~ 172.31.255.255/16 16 个地址用于内部 C,192.168.0.0/24 ~ 192.168.255.255/24 256 个地址用于内部
阐述 iptables 的工作原理, 四表五链:
iptables 是工作在 TCP/IP 的 2,3,4 层, 当主机收到一个数据包后, 数据包先在内核空间处理, 若发现目标地址是自身, 则传到用户空间中交给对应的应用程序处理, 若发现目标不是自身, 则会将包丢弃或进行转发, 4 表: raw 表, mangle 表, net 表, filter 表, 5 链: input,output,forward,prerouting,postrouting.
流入本机: PREROUTING --> INPUT-->用户空间进程
流出本机: 用户空间进程 -->OUTPUT--> POSTROUTING
转发: PREROUTING --> FORWARD --> POSTROUTING
MySQL 部分: 四种隔离级别:
A,READ UNCOMMITTED(未提交读), 事务中的修改, 即使没有提交, 对其他事务也都是可见的, 事务可以读取未提交的数据, 也被称为脏读(Dirty Read), 这个级别会导致很多问题
B,READ COMMITTED(提交读), 大多数数据库系统的默认隔离级别, 一个事务开始时, 只能 "看见" 已经提交的事务所做的修改, 一个事务从开始直到提交之前, 所做的任何修改对其他事务都是不可见的, 也叫不可重复读(nonrepeatable read), 有可能出现幻读(Phantom Read), 指的是当某个事务在读取某个范围内的记录时, 另外一个事务又在该范围内插入了新的记录, 当之前的事务再次读取该范围的记录时, 会产生幻行(Phantom Row)
C,REPEATABLE READ(可重复读), 通过 InnoDB 和 XtraDB 存储引擎, 是 MySQL 的默认事务隔离级别
D,SERIALIZABLE(可串行化)最高级别, 通过强制事务串行执行, 避免了幻读问题, 会在读取的每一行数据上都加锁, 可能导致大量的超时和锁争用的问题.
MySQL 事务 ACID:
原子性(atomicity): 一个事务必须被视为一个不可分割的最小工作单元, 整个事务中所有操作要么全部提交成功, 要么全部失败回滚, 对于一个事务来说, 不可能只执行其中的一部分操作
一致性(consistency): 数据库总是从一个一致性的状态转换到另外一个一致性的状态
隔离性(isolation): 一个事务所做的修改在最终提交以前, 对其他事务是不可见的
持久性(durability): 一旦事务提交, 则其所做的修改就会永久保存到数据库中
MySQL 索引的优点:
三个优点: 1, 索引大大减少了服务器需要扫描的数据量 ;2, 索引可以帮助服务器避免排序和临时表; 3, 索引可以将随机 I/O 变为顺序 I/O
什么情况下应不建或少建索引:
1, 表记录太少; 2, 经常插入, 删除, 修改的表; 3, 数据重复且分布平均的表字段, 假如一个表有 10 万行记录, 有一个字段 A 只有 T 和 F 两种值, 且每个值的分布概率大约为 50%, 那么对这种表 A 字段建索引一般不会提高数据库的查询速度. 4, 经常和主字段一块查询但主字段索引值比较多的表字段
行级锁定的优缺点:
优点: 1, 当在许多线程中访问不同的行时只存在少量锁定冲突; 2, 回滚时只有少量的更改 3, 可以长时间锁定单一的行
缺点: 1, 比页级或表级锁定占用更多的内存; 2, 当在表的大部分中使用时, 比页级或表级锁定速度慢, 因为你必须获取更多的锁; 3, 如果你在大部分数据上经常进行 GROUP BY 操作或者必须经常扫描整个表, 比其它锁定明显慢很多; 4, 用高级别锁定, 通过支持不同的类型锁定, 你也可以很容易地调节应用程序, 因为其锁成本小于行级锁定
key 和 index 的区别:
1,key 是数据库的物理结构, 它包含两层意义和作用, 一是约束(偏重于约束和规范数据库的结构完整性), 二是索引(辅助查询用的). 包括 primary key,unique key,foregin key 等
2,index 是数据库的物理结构, 它只是辅助查询的, 它创建时会在另外的表空间 (MySQL 中的 innodb 表空间) 以一个类似目录的结构存储. 索引要分类的话, 分为前缀索引, 全文本索引等
MySQL 主从配置: 1,master 开启二进制日志; 2,master 和 slave 配置不同的 server_id;3,slave 配置中继日志; 4,master 做账户授权; 5,slave 开启同步.
MySQL 主从同步过程:
1:Slave 端的 IO 线程连接上 Master, 并向 Master 请求指定日志文件的指定位置 (新部署的 Master 和 Slave 从最开始的日志) 之后的日志. 2:Master 接收到来自 Slave 的 IO 线程请求, 负责 IO 复制的 IO 线程根据 Slave 的请求信息读取相应的日志内容, 然后将本地读取的 bin-log 的文件名, 位置及指定位置之后的内容一起返回给 Slave 的 IO 线程处理. 3:Slave 的 IO 线程将接收到的信息依次添加到 Slave 端的 relay-log 文件的最末端, 并将读取到的 Master 端的 bin-log 的文件名和位置记录到 Master-info 文件中, 以便在下一次读取的时候能够清楚的告诉 Master"我需要从哪个 bin-log 的哪个位置开始往后的日志内容请发给我".
4:Slave 的 sql 线程检查到 relay-log 中新增了内容后, 会马上将 relay-log 中的内容解析为在 Master 端真实执行时候的可执行命令, 并顺序执行, 从而保证对 Slave 的 MySQL 进行响应的增加或删除等操作, 最终实现和 Master 数据保持一致.
MySQL 主从复制原理以及流程:
1. 主: binlog 线程 -- 记录下所有改变了数据库数据的语句, 放进 master 上的 binlog 中;
2. 从: io 线程 -- 在使用 start slave 之后, 负责从 master 上拉取 binlog 内容, 放进 自己的 relay log 中;
3. 从: sql 执行线程 -- 执行 relay log 中的语句;
MySQL 数据库自身提供的主从复制功能可以方便的实现数据的多处自动备份, 实现数据库的拓展. 多个数据备份不仅可以加强数据的安全性, 通过实现读写分离还能进一步提升数据库的负载性能.
下图就描述了一个多个数据库间主从复制与读写分离的模型
在一主多从的数据库体系中, 多个从服务器采用异步的方式更新主数据库的变化, 业务服务器在执行写或者相关修改数据库的操作是在主服务器上进行的, 读操作则是在各从服务器上进行. 如果配置了多个从服务器或者多个主服务器又涉及到相应的负载均衡问题, 关于负载均衡具体的技术细节还没有研究过, 今天就先简单的实现一主一从的主从复制功能.
MySQL 之间数据复制的基础是二进制日志文件(binary log file). 一台 MySQL 数据库一旦启用二进制日志后, 其作为 master, 它的数据库中所有操作都会以 "事件" 的方式记录在二进制日志中, 其他数据库作为 slave 通过一个 I/O 线程与主服务器保持通信, 并监控 master 的二进制日志文件的变化, 如果发现 master 二进制日志文件发生变化, 则会把变化复制到自己的中继日志中, 然后 slave 的一个 SQL 线程会把相关的 "事件" 执行到自己的数据库中, 以此实现从数据库和主数据库的一致性, 也就实现了主从复制.
MySQL 中的 myisam 与 innodb 的区别:
1,InooDB 支持事务, 而 MyISAM 不支持事务; 2,InnoDB 支持行级锁, 而 MyISAM 支持表级锁; 3,InnoDB 支持 MVCC, 而 MyISAM 不支持; 4,InnoDB 支持外键, 而 MyISAM 不支持; 5,InnoDB 不支持全文索引, 而 MyISAM 支持
B 树和 B + 树的区别
1,B 树, 每个节点都存储 key 和 data, 所有的节点组成这可树, 并且叶子节点指针为 null, 叶子节点不包含任何关键字信息
2,B + 树, 所有的叶子节点中包含全部关键字的信息, 及指向含有这些关键字记录的指针, 且叶子节点本身依关键字的大小自小到大的顺序链接, 所有的非终端节点可以看成是索引部分, 节点中仅含有其子树根节点中最大 (或最小) 关键字
HTTP 和 Nginx 的状态码解析:
1XX 它表示请求已经被接受, 正在继续处理, 这种响应是临时响应, 不会返回响应体.
2XX 成功处理并返回, 它表示在服务器内已经被接收, 被知晓, 并处理完成.
3XX 重定向功能, 告知客户端需要继续执行操作才可以完成请求.
4XX 出现问题, 和客户端有关系, 比如 401 表示权限问题, 404 表示访问了一个不存在的 URL.
5XX 出现问题, 和服务端有关, 比如 500 表示内部错误, 504 表示请求超时.
在 Linux 系统中, 一般都会有 swap 内存, 你觉得使用 swap 内存有什么好处, 在什么情况下 swap 内存才会被使用? 你觉得在生产环境中要不要用 swap 内存?
答: 好处: 在内存不够用的时候, 将部分内存上的数据交换到 swap 空间上, 以便让系统不会因为内存不够用而导致紧急情况出现.
什么情况下会用 swap: 当系统的物理内存不够用的时候, 就需要将物理内存中的一部分空间释放出来, 以供当前运行的程序使用. 那些被释放的空间可能来自一些很长时间没有什么操作的程序, 这些被释放的空间被临时保存到 swap 空间中, 等到那些程序要运行时, 再从 swap 中恢复保存的数据到内存中. 这样, 系统总是在物理内存不够时, 才进行 swap 交换.
简述进程的启动, 终止的方式以及如何进行进程的查看:
答: 在 Linux 中启动一个进程有手工启动和调度启动两种方式:
(1)手工启动: 用户在输入端发出命令, 直接启动一个进程的启动方式. 可以分为:1前台启动: 直接在 SHELL 中输入命令进行启动.2后台启动: 启动一个目前并不紧急的进程, 如打印进程.
(2)调度启动: 系统管理员根据系统资源和进程占用资源的情况, 事先进行调度安排, 指定任务运行的时间和场合, 到时候系统会自动完成该任务. 经常使用的进程调度命令为: at,batch,crontab.
什么是静态路由, 其特点是什么? 什么是动态路由, 其特点是什么?
答: 静态路由是由系统管理员设计与构建的路由表规定的路由. 适用于网关数量有限的场合, 且网络拓朴结构不经常变化的网络. 其缺点是不能动态地适用网络状况的变化, 当网络状况变化后必须由网络管理员修改路由表.
动态路由是由路由选择协议而动态构建的, 路由协议之间通过交换各自所拥有的路由信息实时更新路由表的内容. 动态路由可以自动学习网络的拓朴结构, 并更新路由表. 其缺点是路由广播更新信息将占据大量的网络带宽.
简述网络文件系统 NFS, 并说明其作用:
答: 网络文件系统是应用层的一种应用服务, 它主要应用于 Linux 和 Linux 系统, Linux 和 Unix 系统之间的文件或目录的共享. 对于用户而言可以通过 NFS 方便的访问远地的文件系统, 使之成为本地文件系统的一部分. 采用 NFS 之后省去了登录的过程, 方便了用户访问系统资源.
有状态和无状态的服务区别:
答: 无状态的 HTTP 协议: http(超文本传输协议)是一个基于请求与响应模式的, 无状态的, 应用层的协议, 常基于 TCP 的连接方式, 绝大多数的 Web 开发, 都是构建在 HTTP 协议之上的 Web 应用. 协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则, 超文本传输协议 (HTTP) 是一种通信协议, 它允许将超文本标记语言 (html) 文档从 Web 服务器传送到客户端的浏览器. 一旦数据交换完毕, 客户端与服务器端的连接就会关闭, 再次交换数据需要建立新的连接. 这就意味着服务器无法从连接上跟踪会话.
有状态就是多次访问之间有关联关系, 需要记录多次之间的访问关系.
Redis 集群的原理, Redis 分片是怎么实现的, 公司 Redis 用在了哪些环境?
答: redis3.0 版本之前是不支持集群的, 官方推荐最大的节点数量为 1000, 至少需要 3(Master)+3(Slave)才能建立集群, 是无中心的分布式存储架构, 可以在多个节点之间进行数据共享, 解决了 Redis 高可用, 可扩展等问题. 集群可以将数据自动切分 (split) 到多个节点, 当集群中的某一个节点故障时, Redis 还可以继续处理客户端的请求.
Redis 分片: 分片 (partitioning) 就是将你的数据拆分到多个 Redis 实例的过程, 这样每个实例将只包含所有键的子集. 当数据量大的时候, 把数据分散存入多个数据库中, 减少单节点的连接压力, 实现海量数据存储. 分片部署方式一般分为以下三种:
(1)在客户端做分片; 这种方式在客户端确定要连接的 Redis 实例, 然后直接访问相应的 Redis 实例;
(2)在代理中做分片; 这种方式中, 客户端并不直接访问 Redis 实例, 它也不知道自己要访问的具体是哪个 Redis 实例, 而是由代理转发请求和结果; 其工作过程为: 客户端先将请求发送给代理, 代理通过分片算法确定要访问的是哪个 Redis 实例, 然后将请求发送给相应的 Redis 实例, Redis 实例将结果返回给代理, 代理最后将结果返回给客户端.
(3)在 Redis 服务器端做分片; 这种方式被称为 "查询路由", 在这种方式中客户端随机选择一个 Redis 实例发送请求, 如果所请求的内容不再当前 Redis 实例中它会负责将请求转交给正确的 Redis 实例, 也有的实现中, Redis 实例不会转发请求, 而是将正确 Redis 的信息发给客户端, 由客户端再去向正确的 Redis 实例发送请求.
Redis 用在: java,PHP 环境用到 Redis, 主要缓存有登录用户信息数据, 设备详情数据, 会员签到数据等.
你会使用哪些虚拟化技术?
答: vmware vsphere 及 kvm, 我用得比较多的是 vmware vsphere 虚拟化, 几本上生产环境都用的 vmware vsphere,kvm 我是用在测试环境中使用. vmware 是属于原生架构虚拟化技术, 也就是可直接在硬件上运行. kvm 属于寄居架构的虚拟化技术, 它是依托在系统之上运行. vmware vcenter 管理上比较方便, 图形管理界面功能很强大, 稳定性强, 一般比较适合企业使用. KVM 管理界面稍差点, 需要管理人员花费点时间学习它的维护管理技术.
nginx 中 rewrite 有哪几个 flag 标志位(last,break,redirect,permanent), 说一下都什么意思? 常用的 Nginx 模块, 用来做什么的?
答: last : 相当于 Apache 的 [L] 标记, 表示完成当前的 rewrite 规则
break : 停止执行当前虚拟主机的后续 rewrite 指令集
redirect : 返回 302 临时重定向, 地址栏会显示跳转后的地址
permanent : 返回 301 永久重定向, 地址栏会显示跳转后的地址,
301 和 302 不能简单的只返回状态码, 还必须有重定向的 URL, 这就是 return 指令无法返回 301,302 的原因了. 这里 last 和 break 区别有点难以理解:
last 一般写在 server 和 if 中, 而 break 一般使用在 location 中
last 不终止重写后的 url 匹配, 即新的 url 会再从 server 走一遍匹配流程, 而 break 终止重写后匹配
break 和 last 都能组织继续执行后面的 rewrite 指令
1,rewrite 模块, 实现重写功能 2,access 模块: 来源控制 3,ssl 模块: 安全加密 4,ngx_http_gzip_module: 网络传输压缩模块 5,ngx_http_proxy_module 模块实现代理 6,ngx_http_upstream_module 模块实现定义后端服务器列表 7,ngx_cache_purge 实现缓存清除功能
什么是运维:
运维是指大型组织已经建立好的网络软硬件的维护, 就是要保证业务的上线与运作的正常,
在他运转的过程中, 对他进行维护, 他集合了网络, 系统, 数据库, 开发, 安全, 监控于一身的技术
运维又包括很多种, 有 DBA 运维, 网站运维, 虚拟化运维, 监控运维, 游戏运维等等.
现在给你三百台服务器, 你怎么对他们进行管理?
管理 3 百台服务器的方式:
1)设定跳板机, 使用统一账号登录, 便于安全与登录的考量.
2)使用 salt,ansiable,Puppet 进行系统的统一调度与配置的统一管理.
3)建立简单的服务器的系统, 配置, 应用的 cmdb 信息管理. 便于查阅每台服务器上的各种信息记录.
简述 raid0 raid1 raid5 三种工作模式的工作原理及特点:
RAID, 可以把硬盘整合成一个大磁盘, 还可以在大磁盘上再分区, 放数据, 还有一个大功能, 多块盘放在一起可以有冗余(备份)
RAID 整合方式有很多, 常用的: 0 1 5 10
RAID 0, 可以是一块盘和 N 个盘组合
优点: 读写快, 是 RAID 中最好的 缺点: 没有冗余, 一块坏了数据就全没有了
RAID 1, 只能 2 块盘, 盘的大小可以不一样, 以小的为准; 10G+10G 只有 10G, 另一个做备份. 它有 100% 的冗余, 缺点: 浪费资源, 成本高
RAID 5,3 块盘, 容量计算 10*(n-1), 允许损失一块盘特点, 读写性能一般, 读还好一点, 写不好
冗余从好到坏: RAID1 RAID10 RAID 5 RAID0
性能从好到坏: RAID0 RAID10 RAID5 RAID1
成本从低到高: RAID0 RAID5 RAID1 RAID10
单台服务器: 很重要盘不多, 系统盘, RAID1
数据库服务器: 主库: RAID10 从库 RAID5RAID0(为了维护成本, RAID10)
Web 服务器, 如果没有太多的数据的话, RAID5,RAID0(单盘)
有多台, 监控, 应用服务器, RAID0 RAID5
LVS,Nginx,HAproxy 有什么区别? 工作中你怎么选择?
答: LVS: 是基于四层的转发; HAproxy: 是基于四层和七层的转发, 是专业的代理服务器; Nginx: 是 Web 服务器, 缓存服务器, 又是反向代理服务器, 可以做七层的转发
区别: LVS 由于是基于四层的转发所以只能做端口的转发; 而基于 URL 的, 基于目录的这种转发 LVS 就不行
工作选择: HAproxy 和 Nginx 由于可以做七层的转发, 所以 URL 和目录的转发都可以做; 在很大并发量的时候我们就要选择 LVS, 像中小型公司的话并发量没那么大; 选择 HAproxy 或者 Nginx 足已, 由于 HAproxy 由是专业的代理服务器; 配置简单, 所以中小型企业推荐使用 HAproxy.
什么是中间件? 什么是 jdk?
中间件: 是一种独立的系统软件或服务程序, 分布式应用软件借助这种软件在不同的技术之间共享资源; 中间件位于客户机 / 服务器的操作系统之上, 管理计算机资源和网络通讯; 是连接两个独立应用程序或独立系统的软件. 相连接的系统即使它们具有不同的接口; 但通过中间件相互之间仍能交换信息. 执行中间件的一个关键途径是信息传递; 通过中间件, 应用程序可以工作于多平台或 OS 环境.
jdk:jdk 是 Java 的开发工具包; 它是一种用于构建在 Java 平台上发布的应用程序, applet 和组件的开发环境.
Tomcat8005,8009,8080 三个端口的含义?
8005: 闭时使用; 8009: 为 AJP 端口; 即容器使用, 如 Apache 能通过 AJP 协议访问 Tomcat 的 8009 端口; 8080: 一般应用使用.
什么叫 CDN?
答: 即内容分发网络; 其目的是通过在现有的 Internet 中增加一层新的网络架构, 将网站的内容发布到最接近用户的网络边缘. 使用户可就近取得所需的内容, 提高用户访问网站的速度.
什么叫网站灰度发布?
答: 灰度发布是指在黑与白之间, 能够平滑过渡的一种发布方式; AB test 就是一种灰度发布方式, 让一部用户继续用 A, 一部分用户开始用 B; 如果用户对 B 没有什么反对意见, 那么逐步扩大范围, 把所有用户都迁移到 B 上面 来; 灰度发布可以保证整体系统的稳定, 在初始灰度的时候就可以发现, 调整问题, 以保证其影响度.
简述 DNS 进行域名解析的过程?
答: 用户要访问 www.baidu.com, 会先找本机的 host 文件, 再找本地设置的 DNS 服务器, 如果也没有的话, 就去网络中找根服务器, 根服务器反馈结果, 说只能提供一级域名服务器. cn, 就去找一级域名服务器, 一级域名服务器说只能提供二级域名服务器. com.cn, 就去找二级域名服务器, 二级域服务器只能提供三级域名服务器. baidu.com.cn, 就去找三级域名服务器, 三级域名服务器正好有这个网站 www.baidu.com, 然后发给请求的服务器, 保存一份之后, 再发给客户端.
RabbitMQ 是什么东西?
答: RabbitMQ 也就是消息队列中间件, 消息中间件是在消息的传息过程中保存消息的容器; 消息中间件再将消息从它的源中到它的目标中标时充当中间人的作用; 队列的主要目的是提供路由并保证消息的传递; 如果发送消息时接收者不可用; 消息队列不会保留消息, 直到可以成功地传递为止, 当然, 消息队列保存消息也是有期限地.
Keepalived 的工作原理? 如何做健康检查
答: 在一个虚拟路由器中, 只有作为 MASTER 的 VRRP 路由器会一直发送 VRRP 通告信息, BACKUP 不会抢占 MASTER, 除非它的优先级更高. 当 MASTER 不可用时(BACKUP 收不到通告信息), 多台 BACKUP 中优先级最高的这台会被抢占为 MASTER. 这种抢占是非常快速的(<1s), 以保证服务的连续性; 由于安全性考虑, VRRP 包使用了加密协议进行加密. BACKUP 不会发送通告信息, 只会接收通告信息.
keepalived 主要有三个模块, 分别是 core,check 和 vrrp.core 模块为 keepalived 的核心, 负责主进程的启动, 维护及全局配置文件的加载和解析. check 负责健康检查, 包括常见的各种检查方式, vrrp 模块是来实现 VRRP 协议的;
Keepalived 健康检查方式配置
- HTTP_GET|SSL_GET
- HTTP_GET | SSL_GET
- {
- url {
- path /# HTTP/SSL 检查的 url 可以是多个
- digest <STRING> # HTTP/SSL 检查后的摘要信息用工具 genhash 生成
- status_code 200# HTTP/SSL 检查返回的状态码
- }
- connect_port 80 # 连接端口
- bindto<IPADD>
- connect_timeout 3 # 连接超时时间
- nb_get_retry 3 # 重连次数
- delay_before_retry 2 #连接间隔时间
- }
讲述一下 LVS 三种模式的工作过程?
LVS 有三种负载均衡的模式, 分别是 VS/NAT(nat 模式) VS/DR(路由模式) VS/TUN(隧道模式)
一, NAT 模式(VS-NAT):
原理: 就是把客户端发来的数据包的 IP 头的目的地址, 在负载均衡器上换成其中一台 RS 的 IP 地址; 并发至此 RS 来处理, RS 处理完后把数据交给负载均衡器, 负载均衡器再把数据包原 IP 地址改为自己的 IP; 将目的地址改为客户端 IP 地址即可期间, 无论是进来的流量, 还是出去的流量, 都必须经过负载均衡器.
优点: 集群中的物理服务器可以使用任何支持 TCP/IP 操作系统, 只有负载均衡器需要一个合法的 IP 地址.
缺点: 扩展性有限. 当服务器节点 (普通 PC 服务器) 增长过多时, 负载均衡器将成为整个系统的瓶颈; 因为所有的请求包和应答包的流向都经过负载均衡器. 当服务器节点过多时; 大量的数据包都交汇在负载均衡器那, 速度就会变慢!
二, IP 隧道模式(VS-TUN)
原理: 首先要知道, 互联网上的大多 Internet 服务的请求包很短小, 而应答包通常很大; 那么隧道模式就是, 把客户端发来的数据包, 封装一个新的 IP 头标记 (仅目的 IP) 发给 RS;RS 收到后, 先把数据包的头解开, 还原数据包, 处理后, 直接返回给客户端, 不需要再经过负载均衡器. 注意, 由于 RS 需要对负载均衡器发过来的数据包进行还原, 所以说必须支持 IP TUNNEL 协议, 所以, 在 RS 的内核中, 必须编译支持 IPTUNNEL 这个选项.
优点: 负载均衡器只负责将请求包分发给后端节点服务器, 而 RS 将应答包直接发给用户; 所以, 减少了负载均衡器的大量数据流动, 负载均衡器不再是系统的瓶颈, 就能处理很巨大的请求量; 这种方式, 一台负载均衡器能够为很多 RS 进行分发. 而且跑在公网上就能进行不同地域的分发.
缺点: 隧道模式的 RS 节点需要合法 IP, 这种方式需要所有的服务器支持 "IP Tunneling" (IP Encapsulation)协议, 服务器可能只局限在部分 Linux 系统上.
三, 直接路由模式(VS-DR)
原理: 负载均衡器和 RS 都使用同一个 IP 对外服务但只有 DR 对 ARP 请求进行响应; 所有 RS 对本身这个 IP 的 ARP 请求保持静默也就是说, 网关会把对这个服务 IP 的请求全部定向给 DR; 而 DR 收到数据包后根据调度算法, 找出对应的 RS, 把目的 Mac 地址改为 RS 的 Mac(因为 IP 一致); 并将请求分发给这台 RS 这时 RS 收到这个数据包, 处理完成之后, 由于 IP 一致, 可以直接将数据返给客户; 则等于直接从客户端收到这个数据包无异, 处理后直接返回给客户端; 由于负载均衡器要对二层包头进行改换, 所以负载均衡器和 RS 之间必须在一个广播域; 也可以简单的理解为在同一台交换机上.
优点: 和 TUN(隧道模式)一样, 负载均衡器也只是分发请求, 应答包通过单独的路由方法返回给客户端; 与 VS-TUN 相比, VS-DR 这种实现方式不需要隧道结构, 因此可以使用大多数操作系统做为物理服务器.
缺点:(不能说缺点, 只能说是不足)要求负载均衡器的网卡必须与物理网卡在一个物理段上.
MySQL 的 innodb 如何定位锁问题, MySQL 如何减少主从复制延迟?
MySQL 的 innodb 如何定位锁问题:
在使用 show engine innodb status 检查引擎状态时, 发现了死锁问题; 在 5.5 中, information_schema 库中增加了三个关于锁的表(MEMORY 引擎)
innodb_trx ## 当前运行的所有事务 innodb_locks ## 当前出现的锁 innodb_lock_waits ## 锁等待的对应关系
MySQL 如何减少主从复制延迟:
如果延迟比较大, 就先确认以下几个因素:
1, 从库硬件比主库差, 导致复制延迟; 2, 主从复制单线程, 如果主库写并发太大, 来不及传送到从库就会导致延迟. 更高版本的 MySQL 可以支持多线程复制; 3, 慢 SQL 语句过多; 4, 网络延迟; 5,master 负载: 主库读写压力大, 导致复制延迟, 架构的前端要加 buffer 及缓存层; 6,slave 负载: 一般的做法是, 使用多台 slave 来分摊读请求, 再从这些 slave 中取一台专用的服务器.
MySQL 数据库主从同步延迟解决方案
最简单的减少 slave 同步延时的方案就是在架构上做优化, 尽量让主库的 DDL 快速执行; 还有就是主库是写, 对数据安全性较高, 比如 sync_binlog=1,innodb_flush_log_at_trx_commit= 1 之类的设置, 而 slave 则不需要这么高的数据安全, 完全可以讲 sync_binlog 设置为 0 或者关闭 binlog.innodb_flushlog 也可以设置为 0 来提高 sql 的执行效率. 另外就是使用比主库更好的硬件设备作为 slave.
如何重置 MySQL root 密码?
答: 一, 在已知 MySQL 数据库的 ROOT 用户密码的情况下, 修改密码的方法:
1, 在 SHELL 环境下, 使用 mysqladmin 命令设置: mysqladmin -u root -p password "新密码" 回车后要求输入旧密码
2, 在 MySQL > 环境中, 使用 update 命令, 直接更新 MySQL 库 user 表的数据: Update MySQL.user set password=password('新密码') where user='root'; / flush privileges; 注意: MySQL 语句要以分号 ";" 结束
3, 在 MySQL > 环境中, 使用 grant 命令, 修改 root 用户的授权权限.
grant all on . to [email protected]'localhost' identified by '新密码';
忘记了 MySQL 数据库的 ROOT 用户的密码, 又如何做呢? 方法如下:
1, 关闭当前运行的 mysqld 服务程序: service mysqld stop(要先将 mysqld 添加为系统服务)
2, 使用 mysqld_safe 脚本以安全模式 (不加载授权表) 启动 mysqld 服务 /usr/local/MySQL/bin/mysqld_safe --skip-grant-table &
3, 使用空密码的 root 用户登录数据库, 重新设置 ROOT 用户的密码 #MySQL -u root / MySQL> Update MySQL.user set password=password('新密码') where user='root';
MySQL> flush privileges;
lvs/nginx/haproxy 优缺点
Nginx 的优点是:
1, 工作在网络的 7 层之上, 可以针对 http 应用做一些分流的策略, 比如针对域名, 目录结构; 它的正则规则比 HAProxy 更为强大和灵活, 这也是它目前广泛流行的主要原因之一; Nginx 单凭这点可利用的场合就远多于 LVS 了.
2,Nginx 对网络稳定性的依赖非常小, 理论上能 ping 通就就能进行负载功能, 这个也是它的优势之一; 相反 LVS 对网络稳定性依赖比较大, 这点本人深有体会;
3,Nginx 安装和配置比较简单, 测试起来比较方便, 它基本能把错误用日志打印出来; LVS 的配置, 测试就要花比较长的时间了, LVS 对网络依赖比较大.
4, 可以承担高负载压力且稳定, 在硬件不差的情况下一般能支撑几万次的并发量, 负载度比 LVS 相对小些.
5,Nginx 可以通过端口检测到服务器内部的故障, 比如根据服务器处理网页返回的状态码, 超时等等, 并且会把返回错误的请求重新提交到另一个节点, 不过其中缺点就是不支持 url 来检测. 比如用户正在上传一个文件, 而处理该上传的节点刚好在上传过程中出现故障, Nginx 会把上传切到另一台服务器重新处理, 而 LVS 就直接断掉了; 如果是上传一个很大的文件或者很重要的文件的话, 用户可能会因此而不满.
6,Nginx 不仅仅是一款优秀的负载均衡器 / 反向代理软件, 它同时也是功能强大的 Web 应用服务器; LNMP 也是近几年非常流行的 Web 架构, 在高流量的环境中稳定性也很好.
7,Nginx 现在作为 Web 反向加速缓存越来越成熟了, 速度比传统的 Squid 服务器更快, 可考虑用其作为反向代理加速器
8,Nginx 可作为中层反向代理使用, 这一层面 Nginx 基本上无对手, 唯一可以对比 Nginx 的就只有 lighttpd 了; 不过 lighttpd 目前还没有做到 Nginx 完全的功能, 配置也不那么清晰易读, 社区资料也远远没 Nginx 活跃.
9,Nginx 也可作为静态网页和图片服务器, 这方面的性能也无对手. 还有 Nginx 社区非常活跃, 第三方模块也很多.
Nginx 的缺点是:
1,Nginx 仅能支持 http,https 和 Email 协议, 这样就在适用范围上面小些, 这个是它的缺点.
2, 对后端服务器的健康检查, 只支持通过端口来检测, 不支持通过 url 来检测; 不支持 Session 的直接保持, 但能通过 ip_hash 来解决;
LVS: 使用 Linux 内核集群实现一个高性能, 高可用的负载均衡服务器; 它具有很好的可伸缩性 (Scalability), 可靠性(Reliability) 和可管理性(Manageability)
LVS 的优点是:
1, 抗负载能力强, 是工作在网络 4 层之上仅作分发之用, 没有流量的产生; 这个特点也决定了它在负载均衡软件里的性能最强的, 对内存和 CPU 资源消耗比较低;
2, 配置性比较低, 这是一个缺点也是一个优点, 因为没有可太多配置的东西; 所以并不需要太多接触, 大大减少了人为出错的几率
3, 工作稳定, 因为其本身抗负载能力很强, 自身有完整的双机热备方案: 如 LVS+Keepalived, 不过我们在项目实施中用得最多的还是 LVS/DR+Keepalived,
4, 无流量, LVS 只分发请求, 而流量并不从它本身出去, 这点保证了均衡器 IO 的性能不会收到大流量的影响.
5, 应用范围较广, 因为 LVS 工作在 4 层, 所以它几乎可对所有应用做负载均衡, 包括 http, 数据库, 在线聊天室等
LVS 的缺点是:
1, 软件本身不支持正则表达式处理, 不能做动静分离; 而现在许多网站在这方面都有较强的需求, 这个是 Nginx/HAProxy+Keepalived 的优势所在;
2, 如果是网站应用比较庞大的话, LVS/DR+Keepalived 实施起来就比较复杂了; 后面有 Windows Server 的机器的话, 如果实施及配置还有维护过程就比较复杂了相对而言, Nginx/HAProxy+Keepalived 就简单多了.
HAProxy 的特点是:
1,HAProxy 也是支持虚拟主机的.
2,HAProxy 的优点能够补充 Nginx 的一些缺点, 比如支持 Session 的保持, Cookie 的引导; 同时支持通过获取指定的 url 来检测后端服务器的状态.
3,HAProxy 跟 LVS 类似, 本身就只是一款负载均衡软件; 单纯从效率上来讲 HAProxy 会比 Nginx 有更出色的负载均衡速度, 在并发处理上也是优于 Nginx 的.
4,HAProxy 支持 TCP 协议的负载均衡转发, 可以对 MySQL 读进行负载均衡; 对后端的 MySQL 节点进行检测和负载均衡, 大家可以用 LVS+Keepalived 对 MySQL 主从做负载均衡.
5,HAProxy 负载均衡策略非常多, HAProxy 的负载均衡算法现在具体有如下 8 种:
1roundrobin, 表示简单的轮询, 这个不多说, 这个是负载均衡基本都具备的;
2 static-rr, 表示根据权重, 建议关注;
3leastconn, 表示最少连接者先处理, 建议关注;
4 source, 表示根据请求源 IP, 这个跟 Nginx 的 IP_hash 机制类似; 我们用其作为解决 session 问题的一种方法, 建议关注;
5ri, 表示根据请求的 URI;
6rl_param, 表示根据请求的 URl 参数'balance url_param';requires an URL parameter name;
7hdr(name), 表示根据 HTTP 请求头来锁定每一次 HTTP 请求;
8rdp-cookie(name), 表示根据据 cookie(name)来锁定并哈希每一次 TCP 请求.
MySQL 数据备份工具
mysqldump 工具:
mysqldump 是 MySQL 自带的备份工具, 目录在 bin 目录下面:/usr/local/MySQL/bin/mysqldump; 支持基于 innodb 的热备份, 但是由于是逻辑备份, 所以速度不是很快, 适合备份数据比较小的场景, Mysqldump 完全备份 + 二进制日志可以实现基于时间点的恢复.
基于 LVM 快照备份:
在物理备份中, 有基于文件系统的物理备份(LVM 的快照), 也可以直接用 tar 之类的命令对整个数据库目录进行打包备份, 但是这些只能进行泠备份, 不同的存储引擎备份的也不一样, myisam 自动备份到表级别; 而 innodb 不开启独立表空间的话只能备份整个数据库.
tar 包备份:
percona 提供的 xtrabackup 工具: 支持 innodb 的物理热备份, 支持完全备份, 增量备份, 而且速度非常快, 支持 innodb 存储引起的数据在不同数据库之间迁移, 支持复制模式下的从机备份恢复备份恢复, 为了让 xtrabackup 支持更多的功能扩展; 可以设立独立表空间, 打开 innodb_file_per_table 功能, 启用之后可以支持单独的表备份.
简述 raid0 raid1 raid5 三种工作模式的工作原理及特点
RAID 0: 带区卷, 连续以位或字节为单位分割数据, 并行读 / 写于多个磁盘上, 因此具有很高的数据传输率; 但它没有数据冗余, RAID 0 只是单纯地提高性能, 并没有为数据的可靠性提供保证; 而且其中的一个磁盘失效将影响到所有数据. 因此, RAID 0 不能应用于数据安全性要求高的场合.
RAID 1: 镜像卷, 它是通过磁盘数据镜像实现数据冗余, 在成对的独立磁盘上产生互为备份的数据; 不能提升写数据效率. 当原始数据繁忙时, 可直接从镜像拷贝中读取数据, 因此 RAID1 可以提高读取性能; RAID 1 是磁盘阵列中单位成本最高的, 镜像卷可用容量为总容量的 1/2, 但提供了很高的数据安全性和可用性; 当一个磁盘失效时, 系统可以自动切换到镜像磁盘上读写, 而不需要重组失效的数据.
RAID5: 至少由 3 块硬盘组成, 分布式奇偶校验的独立磁盘结构, 它的奇偶校验码存在于所有磁盘上; 任何一个硬盘损坏, 都可以根据其它硬盘上的校验位来重建损坏的数据(最多允许 1 块硬盘损坏); 所以 raid5 可以实现数据冗余, 确保数据的安全性, 同时 raid5 也可以提升数据的读写性能.
说说 TCP/IP 的七层模型:
应用层 (Application): 网络服务与最终用户的一个接口.
协议有: HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP
表示层(Presentation Layer): 数据的表示, 安全, 压缩.(在五层模型里面已经合并到了应用层)
格式有, JPEG,ASCll,DECOIC, 加密格式等.
会话层(Session Layer): 建立, 管理, 终止会话.(在五层模型里面已经合并到了应用层); 对应主机进程, 指本地主机与远程主机正在进行的会话.
传输层 (Transport): 定义传输数据的协议端口号, 以及流控和差错校验. 协议有: TCP UDP, 数据包一旦离开网卡即进入网络传输层.
网络层 (Network): 进行逻辑地址寻址, 实现不同网络之间的路径选择.
协议有: ICMP IGMP IP(IPV4 IPV6) ARP RARP
数据链路层 (Link): 建立逻辑连接, 进行硬件地址寻址, 差错校验等功能.(由底层网络定义协议); 将比特组合成字节进而组合成帧, 用 Mac 地址访问介质, 错误发现但不能纠正.
物理层(Physical Layer): 是计算机网络 OSI 模型中最低的一层; 物理层规定: 为传输数据所需要的物理链路创建, 维持, 拆除而提供具有机械的, 电子的, 功能的和规范的特性; 简单的说, 物理层确保原始的数据可在各种物理媒体上传输. 局域网与广域网皆属第 1,2 层; 物理层是 OSI 的第一层, 它虽然处于最底层, 却是整个开放系统的基础; 物理层为设备之间的数据通信提供传输媒体及互连设备, 为数据传输提供可靠的环境; 如果您想要用尽量少的词来记住这个第一层, 那就是 "信号和介质".
正向代理: 是一个位于客户端和原始服务器 (origin server) 之间的服务器, 为了从原始服务器取得内容, 客户端向代理发送一个请求并指定目标(原始服务器), 然后代理向原始服务器转交请求并将获得的内容返回给客户端. 客户端必须要进行一些特别的设置才能使用正向代理.
正向代理的用途: 1, 访问原来无法访问的资源, 如 google;2, 可以做缓存, 加速访问资源; 3, 对客户端访问授权, 上网进行认证; 4, 代理可以记录用户访问记录(上网行为管理), 对外隐藏用户信息.
反向代理: 实际运行方式是指以代理服务器来接受 internet 上的连接请求, 然后将请求转发给内部网络上的服务器, 并将从服务器上得到的结果返回给 internet 上请求连接的客户端, 此时代理服务器对外就表现为一个服务器.
反向代理的用途: 1, 保证内网的安全, 可以使用反向代理提供 WAF 功能, 阻止 Web*;2, 大型网站, 通常将反向代理作为公网访问地址, Web 服务器是内网.
所谓四层负载均衡, 也就是主要通过报文中的目标地址和端口, 再加上负载均衡设备设置的服务器选择方式, 决定最终选择的内部服务器.
所谓七层负载均衡, 也称为 "内容交换", 也就是主要通过报文中的真正有意义的应用层内容, 再加上负载均衡设备设置的服务器选择方式, 决定最终选择的内部服务器.
三次握手 and 四次挥手:
第一次握手: 客户端发送 SYN 标志位为 1 的请求到服务端, 并随机生成一个 seq 序列号 x, 其中 seq 是随机产生的数据包的序列号.
第二次握手: 服务器收到客户端请求并返回 SYN=1,ACK=1,seq=y,ack=x+1, 其中 ACK=1 表示是响应报文, seq=y 是服务器随机产生的数据包序列号, ack=x+1 是确认客户端序列号有效并返回给客户端确认.
第三次握手 **: 客户端收到服务器的确认 ack=x+1 有效的验证信息, 即在自己发送的序列号基础之上加了 1 表示服务器收到并返回, 表示第二次连接有效, 然后客户端恢回复 ACK=1,seq=x+1,ack=y+1, 这是讲服务器发来 + 1 后的序列号当做自己的 seq 序列号, 确认号 ack 使用服务器的随机号 y 再加 1 即 ack=y+1, 这样客户端就完成了第三次的验证在讲数据包发给服务器, 服务器收到后验证确认号是在自己的 seq 之上加了 1, 表示没有问题就开始传输数据.
来源: http://www.bubuko.com/infodetail-3077561.html