封版之夜战斗札记
Posted freephp
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了封版之夜战斗札记相关的知识,希望对你有一定的参考价值。
来公司也一年了,项目从早期不断迭代,到最近临近交付客户。有很多值得反思和记忆的故事,我明显感受到了自己的成长,也明白了产品、研发的重要。
昨晚是封版本的最后一晚,一直加班到了凌晨2点。从晚上开会到不断修复紧急bug,每个小伙伴们都绷紧了神经,全力以赴地验证所有的case。最终还是如期交付,但值得思考的问题不少。如果我不写下这些,我怕忙碌会把这些经验湮没。
1. 需求是产品之源,必须深刻理解。
如果有不清楚的地方,在开发之初就应该提出疑问,通过一次一次产品研讨,弄清楚所有逻辑。
打个比方,一款银行理财产品,用户下单购买该产品后,进行作废订单,到底如何处理库存和销量等等。这些看起来简单的问题,对不同的用户可能选择不同。有的银行认为销量是需要计算真正成交的订单数,如果作废,则需要从总销量里面去掉被作废的。有的银行则认为只要成交过,那么就持续累积。
对于研发工程师,对于这些可以有自己的见解,但不能直接替客户做选择。倾听客户的真正的心声,才能实现真正有价值且符合需求的功能和产品。
2. 全局检查,深入所有逻辑分支
不得不相信一句话:任何可能出现的问题的地方,都有可能出现问题。所以每次修复bug的时候,一定要从全局去思考,是否有关联性的逻辑已经检查了,确保算无遗策。
3. 学会跳出常规思路去用产品
在使用产品进行测试的时候,我们不能只想着怎么正常用这个产品,而是要尽量从各种情况去玩整个系统。摆脱一种产品标准使用方式的思维定势,像折腾手办一样,把它扭成一个意想不到的形状和方向,然后看它还能否正常还原。如果只是顺着期待的结果去准备数据,去测试常规的case,我们很难真正了解一个产品的潜在问题。就像如果一直不敢下水,虽然不会被淹死,但是很难真正学会拥有。
4. debug也是需要准备的
之前老板就提醒过几次,准备好一些query和一些排查工具,方便在最终测试里面遇到问题的时候能快速排查数据。我对我们开发的系统过于自信了,并没有专门准备query。在连续发现一些异常数据的时候,临时再去写sql,有些慌忙。提前准备能让自己更从容,也能更快定位问题,减少不必要的debug时间。
现在已经走出了一百步,也要走向真正的世界,希望轻舟一过,山也向后,我更向前。
基础必学,挑灯夜战KVM虚拟化技术
前言:什么是虚拟化?
在计算机技术中,虚拟化(技术)或虚拟技术(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等),予以抽象、转换后呈现出来并可供分区、组合为一个或多个电脑配置环境。
由此,打破实体结构间的不可切割的障碍,使用户可以比原本的配置更好的方式来应用这些电脑硬件资源。这些资源的新虚拟部分是不受现有资源的架设方式,地域或物理配置所限制。
一般所指的虚拟化资源包括计算能力和数据存储。
由于目前信息技术领域的很多企业都曾在宣传中将该企业的某种技术称为虚拟化技术,这些技术涵盖的范围可以从Java虚拟机技术到系统管理软件,这就使得准确的界定虚拟技术变得困难。因此各种相关学术论文在谈到虚拟技术时常常提到的便是如前面所提到的那个不严格的定义。
一、虚拟化的概述
1.1、虚拟化产生的背景
美国环境保护EPA报告中曾经统计过一组数据,EPA研究服务器和数据中心的能源效率时发现,实际上服务器只有5%的时间在工作,其他时间一直处于休眠状态。
ps:软件资源是没有硬件资源的性能高(稳定和效率)的(相同功能)
1.2、虚拟化技术
通过虚拟化技术将一台计算机虚拟为多台逻辑计算机,在一台计算机上同时运行多个逻辑计算机,同时每个逻辑计算机可运行不同的操作系统,应用程序都可以在独立的空间内运行二互不影响,从而提高计算机的工作效率。
例:1、在一个操作系统中(win10)模拟多个操作系统(centos、win10、sure),同时每个操作系统可以跑不同的服务(Nginx+Tomcat),从而实现一台宿主机搭建一个集群(从整体)
2、通过软件、应用程序的方式,来实现物理硬件功能 。ensp( 以软件形式实现物理设备的功能 (二层交换机、三层路由器、三层交换机等))
1.3、虚拟化技术的发展
1.3.1雏形:
1961年 ,IBM709机器实现了分时系统,将CPU占用切分为多个极短的时间片(1/100sec)每个时间片执行不同的工作,通过对这些时间片进行轮询,从而将一个CPU伪装成多个CPU
1972年,IBM正式将system370机的分时系统命名为虚拟机。
1990年,IBM推出的system390机支持逻辑分区(将一个CPU分为多份,相互独立,也就是逻辑分割)
Xen:2003年问世,是一个外部的hypervisor/VMM程序(虚拟机管理程序),能够独立宿主机和给多个客户机分配资源
KVM:2007年问世,现已内置在kernel内核中的
Xen:支持的虚拟化技术:全虚拟化,半虚拟化
KVM:支持的虚拟化技术:全虚拟化
1.3.2、虚拟化类型
全虚拟化:将物理硬件资源全部通过软件的方式抽象化,最后进行调用
使用的方法:使用hypervisor(VMM)软件,其原理是在底层硬件和服务器之间建立一个抽象层,而基于核心的虚拟机是面向Linux系统的开源产品hypervisor(VMM)可以捕捉CPU的指令,为指令访问硬件控制器和外设充当中介。
半虚拟化:需要修改操作系统
直通:直接使用物理硬件资源(需要支持,还不完善)
1.3.3、特性
优势:
①集中化管理(远程管理、维护)
②提高硬件利用率(虚拟化特性)(物理资源利用率低-例如峰值,虚拟化解决了“空闲”容量)
③动态调整机器/资源配置(虚拟化把系统的应用程序和服务硬件分离、提高了灵活性)
④高可靠(可部署额外的功能和方案,可提高透明负载均衡、迁移、恢复复制等应用环境)
劣势:
①前期高额费用(初期的硬件支持)
②降低硬件利用率(特定场景-例如极度吃资源的应用不一定适合虚拟化)
③更大的错误影响面(本地物理机down机会导致虚拟机不可用,同时可能虚拟机中文件全部破坏)
④实施配置复杂、管理复杂(管理人员运维、排障困难)
⑤一定的限制性(虚拟化技术涉及各种限制,必须与支持/兼容虚拟化的服务器、应用程序及供应商结合使用)
⑥安全性(虚拟化技术自身的安全隐患)
二、KVM简介
2.1、广义KVM
KVM (Kernel-based vritual Machine)--基于内核的虚拟机
KVM是基于虚拟化扩展的x86硬件的开源Linux原生的全虚拟化方案(要求cpu支持Intel-VT-x或AMD-V)
KVM内嵌于内核模块中,模拟处理器和内存以支持虚拟机运行
虚拟机被实现为常规的 Linux进程,由标准Linux调度程序进行调度;
虚拟机的每个虚拟CPU_被实现为一个常规的 Linux进程。这使得KMV能够使用Linux内核的已有功能 但KVM本身不执行任何模拟。需要客户空间程序(虚拟机)通过/dev/'kvm(此虚拟设备需要开起硬件辅助虚拟化才能看到)接口设置一个客户机虚拟服务器的地址空间, 并且由Qemu模拟I/o (ioctl)进行调度资源和维护管理
Libvirt: KVM的管理工具,除了可以管理KVwM这类vVwMM4,还可以管理Xen,VirtualBox,甚至openStack底层
Libvirt包含3个组件:后台daemon程序libvirtd、API库、命令行工具virsh
2.2、KVM原理
1、Guest:客户机系统,包括CPU(vcpu)、内存、驱动(Console、网卡、I/O、设备驱动等),被kvm置于一种受限制的CPU模式下运行
2、KVM内核模块模拟处理器和内存以支持虚拟机运行
3、Qemu主要处理I/o以及为客户提供一个用户空间/dev/kvm 工具libvirt 来进行虚拟机管理
ioctl(定义)专用于设备输入输出操作的系统调用 l
ibvirt: KVM管理工具
简单理解:
- KVM驱动提供处理器、内存的虚拟化,以及客户机I/o的拦截(拦截敏感指令),guest的I/o被拦截后,交由Qemu处理
- Qemu利用接口libkvm调用((ioctl)虚拟机设备接口/dev/kvm来分配资源、管理、维护虚拟机
2.3、KVM虚拟化架构/三种模式
1、客户模式(guestos) : VM中的os为Guestos 客户机在操作系统中运行的模式,客户机分为内核模式和用户模式。
2、用户模式: 为用户提供虚拟机管理的用户空间工具以及代表用户执行I/o,gemu工作在此模式下(Qgemu的主要功能)
3、linux内核模式 模拟CPU、内存,实现客户模式切换,处理从客户模式的退出,KVM即运行在此模式下
2.4、KVM工作流程
用户模式的Qemu 利用接口libkvm 通过 ioctl系统调用进入内核模式。
KW驱动为虚拟机创建虚拟CPU和虚拟内存,然后执行VMLAU ·NCH 指令进入客户模式,装载Guest OS 并运行。
Guest OS运行过程中如果发生异常,则暂停Guest OS的运行并保存当前状态同时退出到内核模式来处理这些异常.
内核模式处理这些异常时如果不需要I/O则处理完成后重新进入客户模式。如果需要Ⅰ/O则进入到用户模式则由Qemu来处理I/O,处理完成后进入内核模式,再进入客户模式
2.5、虚拟化前与虚拟化后的对比
虚拟化前:
- 每台主机拥有一个操作系统
- 软硬件紧密结合
- 在同一个主机上运行多个应用程序常会产生冲突
- 系统资源利用率低(例如:5%)
- 硬件成本高昂并且不够灵活.
虚拟化后:
- 打破了操作系统和硬件的互相依赖
- 通过封装到虚拟机技术,管理操作系统和应用程序为单一的个体
- 强大的安全和故障隔离
- 虚拟机时独立于硬件的,他们可以再任何硬件上运行
对比:
操作系统方面(虚拟化前):
LAMP架构中(以一台主机实现)
Linux+Apache+MySQL+PHP
其中Apache与MySQL资源是共享的
如果架构要求服务间的安全性隔离比较高的话,Apache的页面和MySQL数据库的目录一定是不能相互碰面,如果Apache漏洞暴露出来,攻击者就可以Apache的进程访问到MySQL中的数据,这种就是严重的安全隐患
而想解决这种潜在危险,可以通过实现内核级别的隔离(使用虚拟化技术)
软硬件结合:
因为硬件和操作系统不兼容或者不支持,导致有些软、硬件功能无法正常使用(也是最难的问题)使用虚拟化,软硬件之间是会通过虚拟化层驱动进行隔离(调配)的, 只要虚拟化层可以识别软/硬件应用,就可以将软硬件结合使用
在同一个主机上运行多个应用程序通常会产生冲突
Apache和Nginx定位相同(80端口)
只能使用反向代理的方式进行分离,而同时如果在同一台机器使用这种方式,Apache和Nginx中重要的数据文件如果同时被泄露出去....而虚拟化可以隔离服务
三、部署KVM
3.1、实验准备
服务器名 | IP地址 |
KVM | 192.168.48.128 |
添加一块足够大的硬盘资源
3.2、开始配置
3.2.1、修改主机名
systemctl stop firewalld
hostnamectl set-hostname kvm
setenforce 0
vim /etc/resolv.conf
nameserver 114.114.114.114
3.2.2、挂载光盘
mkdir /mount
vim /etc/fstab
/dev/cdrom /mount iso9660 defaults 0 0
mount -a
df -hT
3.2.3、设置DNS反向解析
vim /etc/ssh/sshd_config
定位到#UseDNS yes 取消注释改为no
UseDNS no
3.2.4、配置本地yum
cd /etc/yum.repos.d/
mkdir bak
mv CentOS-* bak
vim local.repo
[local]
name=kvm
baseurl=file:///mount ##
gpgcheck=0
enable=1
yum clean all
yum makecache
3.3、安装KVM
3.3.1、安装组件
yum groupinstall -y "GNOME Desktop" ##安装GNOME桌面环境,若装了图形界面可以不需要安装
yum -y install qemu-kvm ##安装KVM模块
yum -y install qemu-kvm-tools ##安装KVM调试工具,可不安装
yum -y install virt-install ##构建虚拟机的命令行工具
yum -y install qemu-img ##qemu组件,创建磁盘、启动虚拟机等
yum -y install bridge-utils ##网络支持工具
yum -y install libvirt ##虚拟机管理工具
yum -y install virt-manager ##图形界面管理虚拟机
cat /proc/cpuinfo | grep vmx ##检测cpu是否支持虚拟化
lsmod | grep kvm ##查看kvm模块是否已安装;lsmod:显示已载入的系统模块
3.3.2、设置开启启动界面的显示模式
ln -sf /lib/systemd/system/graphical.target /etc/systemd/system/default.target
3.4、设置kvm网络(桥接模式)
vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none //修改为none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
DEVICE=ens33
ONBOOT=yes
#IPADDR=192.168.48.128
#NETMASK=255.255.255.0
#GATEWAY=192.168.48.2
BRIDGE=br0 //设置为桥接模式
创建、编辑桥接网卡
vim /etc/sysconfig/network-scripts/ifcfg-br0
TYPE=Bridge
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6PEERDNS=yes
IPV6PEERROUTES=yes
IPV6_ADDR_GEN_MODE=no
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.48.128
NETMASK=255.255.255.0
GATEWAY=192.168.48.128
3.5、KVM部署与管理
3.5.1、创建KVM存储和镜像数据的目录、上传centos7 镜像
mkdir -p /data_kvm/iso ##创建KVM存储镜像的目录
mkdir -p /data_kvm/store ##创建存储池的目录
systemctl restart network ##重启服务
这时因为网卡文件被更改,无法连接xshell,需要虚拟机操作
3.5.2、使用虚拟机系统管理器管理虚拟机
virt-manager
创建存储池klj_store
双击 QEMU/KVM
创建存储卷store_01
创建存储池store_01默认的格式是qcow2,虚拟化的格式,支持KVM虚拟化的格式,也是支持qemu组件的格式
创建镜像池lc_iso
创建虚拟机
QEMU/KVM右击新建
后面就跟虚拟机安装是一样的步骤。
以上是关于封版之夜战斗札记的主要内容,如果未能解决你的问题,请参考以下文章