a. Zabbix
Zabbix 是一个基于 WEB 界面的提供分布式系统监控以及网络监控功能的企业级开源运维平台,也是目前国内互联网用户中使用最广的监控软件。
b. prometheus
Prometheus 是由 SoundCloud 开发的开源监控报警系统和时序列数据库( TSDB )。
Prometheus 目前在开源社区相当活跃。
Prometheus 和 Heapster ( Heapster 是 K8S 的一个子项目,用于获取集群的性能数据。)相比功能更完善、更全面。
Prometheus 性能也足够支撑上万台规模的集群。
c. Nagios
Nagios 原名 NetSaint ,是一款开源的企业级监控系统,于1999年推出,由 Ethan Galstad 开发并维护至今。
Nagios 能够实现对系统 CPU、磁盘、网络等方面参数的基本系统监控,而且还能监控包括SMTP,POP3,HTTP,NNTP 等各种基本的服务类型。
另外通过安装插件和编写监控脚本,用户可以实现应用监控,并针对大量的监控主机和多个对象部署层次化监控架构。
d. Cacti
Cacti 是一套完整的网络流量监测图形分析解决方案,基于 RRDTool 的数据存储和图形功能实现网络监控。
创建主机组
创建主机并加入主机组
创建监控项
告警触发器配置
配置告警动作
a. 基本概念
zabbix 最重要的五个组成部分:Item、Trigger、Action、Media、User(其实应该还有个Event,不过这个表现的不直观),翻译一下就是监控元素、触发器、动作、报警介质、用户,接下来一个一个的详谈,最后在梳理他们之间的关系。
Item:监控项,你需要监控的内容
Trigger: 触发器,你监控的内容满足什么条件时报警
Action: 动作,触发器出发时怎么告警
Media: 告警媒介,告警采用什么方式
User: 用户是什么用户
b. 流程图
Zabbix 监控过程是这样的:安装在主机上的 zabbix_agentd 负责监控主机(具体的监控任务是由 agentd端的 Item来完成的),并收集数据,然后将数据发送到 zabbix server 端。如果是分布式系统,需要监控的机器较多,为了减轻 server 端的压力,可能中间还会再搭建一个 proxy 端,用来暂时接收监控数据,然后将数据转发到 server 端。Server 端将数据存储到数据库中,zabbix web 再将数据在前端以图表或者文字的形式展现出来。
触发器
表达式,如果内存不足** 300M** ,用户超过 30 个等
当出发条件发生后,会导致一个触发条件
触发事件会执行某个动作
动作
触发器的条件被触发后的行为
可以是发送邮件,也可以是重启某个服务
事前及时预警发现故障,事后提供详实的数据用于追查定位问题
ELK 是 **Elasticsearch、Logstash、Kibana ** 三大开源框架首字母大写简称。
其中 Elasticsearch 是一个基于 ** Lucene**、分布式、通过 ** Restful ** 方式进行交互的近实时搜索平台框架。
像类似百度、谷歌这种大数据全文搜索引擎的场景都可以使用 Elasticsearch 作为底层支持框架,可见 Elasticsearch 提供的搜索能力确实强大,市面上很多时候我们简称 Elasticsearch 为 es 。
Logstash 是 ELK的中央数据流引擎,用于从不同目标(文件/数据存储/ MQ )收集的不同格式数据,经过过滤后支持输出到不同目的地(文件/MQ / redis / elasticsearch / kafka 等)。
Kibana 可以将 elasticsearch 的数据通过友好的页面展示出来,提供实时分析的功能
使用 zabbix 监控磁盘容量,在容量 80% 的时候设置个阈值。
当容量达到阈值就自动报警,可以通过发送短信或邮件进行通知。
Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。
Docker 和传统虚拟化方式的不同之处。传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
Docker 主要有如下几个概念:
引擎:创建和管理容器的工具,通过读取镜像来生成容器,并负责从仓库拉取镜像或提交镜像到仓库中;
镜像:类似于虚拟机镜像,一般由一个基本操作系统环境和多个应用程序打包而成,是创建容器的模板;
容器:可看作一个简易版的 ** Linux ** 系统环境(包括 root 用户权限、进程空间、用户空间和网络空间等)以及运行在其中的应用程序打包而成的盒子;
仓库:集中存放镜像文件的场所,分为公共仓库和私有仓库,目前最大的公共仓库是官方提供的 **Docker Hub ** ,此外国内的阿里云、腾讯云等也提供了公共仓库;
宿主机:运行引擎的操作系统所在服务器。
它是一个工业级的容器编排平台。它负责应用的部署、应用的弹性以及应用的管理,这些都是基于容器的。
Kubernetes 有如下几个核心的功能:
服务的发现与负载的均衡;
容器的自动装箱,就是“调度”,把一个容器放到一个集群的某一个机器上,**Kubernetes **会帮助我们去做存储的编排,让存储的声明周期与容器的生命周期能有一个连接;
**Kubernetes **会帮助我们去做自动化的容器的恢复。在一个集群中,经常会出现宿主机的问题或者说是 OS 的问题,导致容器本身的不可用,Kubernetes 会自动地对这些不可用的容器进行恢复;
Kubernetes 会帮助我们去做应用的自动发布与应用的回滚,以及与应用相关的配置密文的管理;
对于 job 类型任务,**Kubernetes **可以去做批量的执行;
为了让这个集群、这个应用更富有弹性,Kubernetes 也支持水平的伸缩。
Kubernetes 架构是一个比较典型的 二层架构和 server-client 架构。
Master 作为中央的管控节点,会去与Node 进行一个连接。
所有 U I 、clients这些user侧的组件,只会和 Master 进行连接,把希望的状态或者想执行的命令下发给Master,Master 会把这些命令或者状态下发给相应的节点,进行最终的执行。
核心概念
第一个概念:Pod
Pod是 Kubernetes的一个最小调度以及资源单元。用户可以通过Kubernetes 的Pod API 生产一个Pod,让Kubernetes 对这个 Pod 进行调度,也就是把它放在某一个 Kubernetes 管理的节点上运行起来。一个** Pod** 简单来说是对一组容器的抽象,它里面会包含一个或多个容器。
第二个概念:Volume
Volume就是卷的概念,它是用来管理 Kubernetes 存储的,是用来声明在 Pod 中的容器可以访问文件目录的,一个卷可以被挂载在 Pod 中一个或者多个容器的指定路径下面。
第三个概念:Deployment
Deployment 是在 Pod 这个抽象上更为上层的一个抽象,它可以定义一组Pod 的副本数目、以及这个Pod 的版本。一般大家用Deployment 这个抽象来做应用的真正的管理,而 Pod 是组成Deployment 最小的单元。
第四个概念:Service
Service 提供了一个或者多个 Pod 实例的稳定访问地址。
第五个概念:Namespace
Namespace 是用来做一个集群内部的逻辑隔离的,它包括鉴权、资源管理等。
docker inspect 看到容器的源数据、容器名、环境变量、运行命令、主机配置、网络配置和数据卷配置
装饰器: 给函数增加新功能,不修改被装饰对象的源代码和调用方法
生成器: 生成器其实是一种特殊的迭代器,它不需要__iter__() 和__next__() 方法,只需要一个yiled 关键字
迭代器: 任何实现了__iter__() 和__next__() 方法的对象都是迭代器,iter() 返回迭代器自身, next() 返回容器中的下一个值
def bin_search(data_list, val):
low = 0 # 最小数下标
high = len(data_list) - 1 # 最大数下标
while low <= high:
mid = (low +high) //2 # 中间数下标
if data_list[mid] == val: # 如果中间数下标等于val, 返回
return mid
elif data_list[mid] > val: # 如果val在中间数左边, 移动high下标
high = mid - 1
else: # 如果val在中间数右边, 移动low下标
low = mid + 1
return # val不存在, 返回None
ret =bin_search(list(range(1, 10)), 3)
print(ret)
使用 **ProcessPoolExecutor **进程池,使用 ThreadPoolExecutor 线程池,都提供异步调用。
进程池是由服务器预先创建的一组子进程,一般来说这些子进程的数目在** 3~10** 个之间。
线程池中的线程数量应该和 ** CPU** 数量差不多。
线程池主要用于
应用场景:WEB 服务器完成网页请求这样的任务,使用线程池技术是非常合适的。因为单个任务小,而任务数量巨大,一个热门网站的点击次数会很多。但对于长时间的任务,比如一个Telnet 连接请求,线程池的优点就不明显了。因为 Telnet 会话时间比线程的创建时间大多了。
进程池中的所有子进程都运行着相同的代码,并具体相同的属性·,比如优先级、**PGID **等。
当有新的任务到来时,调用过程如下:
主进程使用某种算法(比如随机算法、轮流算法)来主动选择子进程。
主进程和所有子进程通过一个共享的工作队列来同步,子进程睡眠在工作队列上,当有新任务到来时,会唤醒一个正在等待任务的拥有接管权的子进程,它从工作队列中取出任务并执行,而其他子进程将继续睡眠。
服务器创建和销毁工作线程的开销很大,如果服务器与很多客户端通信,并且与每个客户端通信的时间很短,那么就会在创建和销毁线程的时候造成很大的开销。
线程池中预先创建了一些工作线程,他们不断的从工作队列中取出任务,然后执行,当执行完之后,会继续执行工作队列中的下一个任务,减少了创建和销毁线程的次数,每个线程都可以一直被重用,避免了创建和销毁的开销。另外,可以根据系统的实际承载能力,方便的调节线程池中线程的数目,防止因为消耗过量的系统资源而导致系统崩溃的问题。
线程池在系统启动时会创建大量空闲的线程,当线程对象传递给线程池之后,线程池就会启动其中一个线程来执行该对象的 ** run ** 或者 call 方法。执行完毕后,该线程并不会消亡,而是返回线程池,变成空闲状态。等待执行下一个 ** run **或者 **call ** 方法。
减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。
运用线程池能有效的控制线程最大并发数,可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约 **1MB ** 内存,线程开的越多,消耗的内存也就越大,最后死机)。
对线程进行一些简单的管理,比如:延时执行、定时循环执行的策略等,运用线程池都能进行很好的实现
像 C、**java ** 等编译型语言,程序输入到编译器后,编译器会根据语法进行解析,翻译成机器码,编译器可以深层次的对代码进行优化;而 ** python ** 是解释性语言,程序输入到解释器,解释器在执行程序之前对程序并不了解,因此对 ** python ** 程序的优化其实是对解释器的优化。在 ** python **多线程编程时,解释器需要避免不同的线程操作的内部共享数据,同时要保持计算资源的最大化,这样就需要全局锁,也叫全局解释锁,简单来说就是一个互斥锁,这样只允许一个线程控制 ** python ** 解释器。
实际上对于 ** python 的多线程编程,在程序运行时 ** python 解释器只会运行一个线程,无论**CPU ** 是多少核,多少线程,只会有一个线程去控制解释器
对于 CPU 密集型操作适合使用多进程编程,对于 **IO ** 密集型操作适合使用多线程编程
CommonMiddleware
限制 settings.DISALLOWED_USER_AGENTS 中指定的请求头来访问本网站XFrameOptionsMiddleware
做了clickjacking攻击的保护。clickjacking 保护是攻击者在自己的病毒网站上,写一个诱惑用户点击的按钮,然后使用iframe的方式将受攻击的网站(比如银行网站)加载到自己的网站上去,并将其设置为透明的,用户就看不到,然后再把受攻击的网站(比如银行网站)的转账按钮定位到病毒网站的按钮上,这样用户在点击病毒网站上按钮的时候,实际上点击的是受攻击的网站(比如银行网站)上的按钮,从而实现了在不知不觉中给攻击者转账的功能。
假设一个在线商店拥有一个页面,已登录的用户可以点击“现在购买”来购买一个商品。用户为了方便,可以选择一直保持商店的登录状态。一个攻击者的站点可能在他们自己的页面上会创建一个“我喜欢Ponies”的按钮,并且在一个透明的iframe中加载商店的页面,把“现在购买”的按钮隐藏起来覆盖在“我喜欢Ponies”上。如果用户访问了攻击者的站点,点击“我喜欢Ponies”按钮会触发对“现在购买”按钮的无意识的点击,不知不觉中购买了商品。
类AuthenticationMiddleware
将user代表当前登录用户的属性添加到每个传入HttpRequest对象
类PersistentRemoteUserMiddleware
仅在登录页面上启用时,用于利用Web服务器的中间件提供了身份验证
CSRF保护中间件
CsrfViewMiddleware
通过向POST表单添加隐藏的表单字段并检查请求的正确值来增强对跨站点请求伪造的保护
SessionAuthentication
session中间件。会给request添加一个处理好的session对象。
处理跨域请求
corsheaders.middleware.CorsMiddleware
https://github.com/adamchainz/django-cors-headers
后端 之前用的模板语言 现在用的 **drf **
前端 之前只是普通的 ** h5 ** 页面 现在用的 **vue **
前后端使用 ** drf api** 接口用过 Vue ajax 将数据拿回来
所谓的 MTV (** Model–Template–View** ),翻译一下就是模型、模板、视图。
一般是用户通过浏览器向我们的服务器发起一个请求**(request)**,
这个请求回去访问视图函数,(如果不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户),视图函数调用模型,模型去数据库查找数据,然后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。
Django 的 ** MTV **模式的本质和 ** MVC ** 是一样的,也是为了各组件间保持松耦合关系,只是定义有些不同,
M 代表模型 (Model) 负责业务对象和数据库的关系映射 (ORM)
**T ** 代表模板 (Template) 负责如何把页面展示给用户 (html)
V 代表视图 (View) 负责业务逻辑 并在适当时候调用 Model 和 ** Template **
除了以上三层外,还需要一个** URL** 分发器、他的作用是将一个个 **URL ** 的页面请求分发给不同的 **View **处理,**web **服务器(中间件)收到一个 ** http ** 请求
一个简单的博客平台,可以在该系统上实现简单的登录注册注销动作,可以在平台上发布自己的文章并且有热度排行,还可以对自己的文章进行增删改查的功能
一个简单的资产管理系统,将公司的服务器,内存,硬盘网卡等固定资产信息统一放在一个平台内,可以通过点点点的方式查看资产信息
具体如下
前端框架用过 ** react** 和 ** vue **。
vue概述(可以从以下几点说):
**TCP ** 和 **UDP **是 **OSI **模型中的传输层中的协议。**TCP ** 提供可靠的通信传输,而 ** UDP ** 则常被用于让广播和细节控制交给应用的通信传输。
**TCP **与 **UDP ** 区别总结:
四次挥手时,服务器收到释放报文,发出确认报文** ACK=1**,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态 。
TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
当客户端收到服务器的确认请求后,客户端进入** FIN-WAIT-2** (终止等待2)状态,等待服务器发送连接释放报文,等待过程中还要接受服务器发送的最后数据
数据发送完毕后,服务器就会向客户端发送连接释放报文,**FIN=1,ack=u+1**, 此时,服务器就进入了**LAST-ACK**(最后确认)状态,等待客户端的确认。
在客户端发送第四次挥手后,等待** 2MSL** ,进入** CLOSE ** 状态
Jenkins 的主要目标是:监控软件开发流程,快速显示问题,保证开发人员以及相关人员省时省力提高开发效率。**CI **系统在整个开发过程中的主要作用是控制:当系统在代码存储库中探测到修改时,它将运行构建的任务委托给构建过程本身。如果构建失败了,那么 CI 系统将通知相关人员,然后继续监视存储库。它的角色看起来是被动的;但它确能快速反映问题。
CI 从远程仓库拉取代码到jenkins中集成,CD 将集成好的代码部署到生产环境
监控项目 | 详细内容 |
---|---|
主机监控 | ** CPU**,内存,磁盘的剩余空寂按/利用率和I/O,swap使用率。系统up时间,进程数,负载 |
网卡监控 | ping的往返时间及包成功率,网卡流量,包括流入、流出量和错误的数据包数 |
文件监控 | 监控文件大小,hash值,匹配查询,字符串存在否 |
url监控 | 检测指定url访问过程中的返回码,下载时间及文件大小,支持内容匹配 |
应用程序 | 端口和内存使用率,cpu使用率,服务状态,请求数,并发连接数,消息队列的字节数,client事务处理数,service状态 |
数据库 | 检测数据库中指定表空间,数据库的游标数,session数,事务数,死锁数,缓冲池命中率,库擦车命中率,当前连接数,进程的内存利用率等性能参数 |
日志 | 错误日志匹配,特定字符串匹配 |
硬件 | 温度,风扇转速,电压 |