第一章
大数据的概念:海量数据的规模巨大到无法通过目前主流的计算机系统在合理时间内获取、存储、管理、处理并提炼以帮助使用者决策
大数据的特点:①数据量大,存储的数据量巨大,PB级别是常态;②多样,数据的来源及格式多样,数据格式除了传统的结构化数据外,还包括半结构化和非结构化数据;③快速,数据的增长速度快,而且越新的数据价值要求对数据的处理也要快;④价值密度低,要求设计一种在成本可接受的条件下,快速采集,发现和分析,从大量多种类别的数据提取价值的体系架构;⑤复杂度,对数据分析处理的难度大
云计算的概念:云计算是一种商业计算模型,将计算任务分布在大量计算机构成的资源池上,使各种应用系统能够根据需要获取计算力,存储空间等服务
短定义:云计算是通过网络按需提供可动态伸缩的廉价计算服务
云计算的特点:①超大规模②虚拟化,支持用户在任意位置在各种终端获取服务,但实际上不需要了解应用运行的具体位置③高可靠性,采用数据多副本容错,节点同构可互换的措施来保障服务的高可靠性④通用性,云的特殊容错措施使得可以采用及其廉价的节点来构成云⑤高可伸缩,云的规模可以伸缩⑥按需服务⑥极其廉价,云的特殊容错措施可以使得用极其廉价的节点来构成云
云计算的分类:
按照服务类型分类:
①将基础设施作为服务IaaS,给用户提供对所有设施的利用服务,弹性云计算ECS、AWS
②将平台作为服务PaaS,将软件研发的平台作为一种服务,百度BAE,新浪SAE,阿里ACE,京东JAE
③将软件作为服务SaaS,协同OA,CRM,财务系统,企业智能系统和企业邮箱
按照部署模式分类:
①公有云,向公众开放,任何人都能够租赁
②私有云,只向一个企业或单位内的人员使用;分为本地私有云(部署在企业内部,适合运行关键和机密业务),托管私有云(托管在第三方机房)
③混合云,只供两个或以上的特定企业或者单位内的人员使用,其他人无权租赁和使用
④社区云,由两个或者以上不同类型的云组成,但用户使用感觉是一个云端资源
第二章
NAT | 虚拟机可以访问外网,外网不能访问虚拟机,网段不可以调整 |
NAT Network | 虚拟机可以访问外网,外网不能访问虚拟机,网段可调整 |
Bridged | 虚拟机可以访问外网,外网可以访问虚拟机,网段和主机相同 |
Host-Only | 虚拟机不可以访问外网,外网不可以访问虚拟机,网段和主机相同 |
系统环境配置的步骤:①下载安装VirtualBox,下载系统镜像
②最小化安装CentOS,出现安装引导页面时点击Tab键,打开kernel启动选项,增加选项:net.ifnames=0 biosdevname=0,进入后网卡名会按照eth0,eth1的规则命名,同时进入安装页面之后选择最小化安装
③配置虚拟网络,①设置Nat Network网段(192.168.56.0/24)和 Host-only网段(10.0.0.0/24),网卡一用于Nat网段,网卡二用于Host-only网段。②在/etc/sysconfig/network-script/中设置主机网络,自举协议为static,启动开机自启,设置IPADDR、NETMASK、GATEWAY、DNS1和DNS2;③/etc/hostname修改本主机名称;/etc/hosts修改其他主机名称解析,然后测试网络连接
④禁用防火墙和SELinux,关闭防火墙(临时关闭)systemctl stop firewalld ,防止自动启动systemctl disable firewalld ;关闭SELinux:修改配置文件/etc/sysconfig/selinux,设置SELINUX=disabled,检查关闭是否成功(systemctl status firewalld)
⑤配置EPEL,安装wget,然后使用淘宝等镜像源
⑥安装基础软件,安装工具软件包,服务器软件包,和开发工具(JAVA、node.js、gcc)
⑦创建快照并克隆虚拟机,克隆完成后需要进行网络连通性测试,随后对宿主机配置对所有虚拟机的免密登录
第三章
集群:一组相互独立的,通过高速网络互联的计算机,构成了一个组,并以单一系统的模式进行管理
集群的特性:一个用户与集群相互作用时,集群就像是一个独立的服务器
使用集群的目的:①提高性能;②降低成本;③提高可扩展性;④增强可靠性
集群的组织方式:①主从结构,将备份服务器连接到主服务器上,备份服务器一般不主动提供服务
②多级结构,多个服务器组成的集群服务器,对外都有一个统一的地址,每个集群服务器上都装有相同的应用程序
常用的命令:
取消开机启动systemctl disable nginx;
重启systemctl restart nginx ;
检查nginx进程ps aux | grep nginx;
检查端口netstat intp | grep 80或netstat intp | grep nginx
负载均衡的配置搭建
常见的负载均衡方案,分为硬件方案和软件方案;硬件方案采用F5等设备,但是比较贵。软件方案采用在四层使用LVS和在七层使用NginX实现负载均衡
Nginx仅仅是作为Nginx Proxy反向代理使用的,但我们称这个反向代理表现的效果是负载均衡的效果。所以可以称之为负载均衡;真正的负载均衡是转发用户请求的数据包,真正负载均衡是转发用户请求的数据包,而NginX反向代理是接收用户的请求然后重新发起请求去请求其后面的节点。
三个虚拟机都打开nginx服务,并检查nginx的状态
在第三台虚拟机中(NginX服务器)中需要在/etc/nginx/nginx.conf文件中进行配置,在upstream模块中需要添加模块配置
upstream www_servers_pool{
server 192.168.0.11;#可以设置weight=10或20来增加访问节点的权重
server 192.168.0.12;
}
在server段中配置
server{
...
location / {
proxy_pass http://www_servers_pool;
}
}
重启第三台虚拟机的NginX服务,访问10.0.0.13测试,是否能够把流量分布到节点1和节点2中
高可用技术
高可用方案:Keepalived,Heartbeat
VRRP通过竞选机制来将路由的任务交给某台VRRP路由器,工作时主节点发包,备节点接包。当备节点接收不到主节点发送的数据包的时候,就启动接管程序接管主节点中的资源
Keepalived高可用对之间通过VRRP进行通信,在Keepalived服务对之间,只有作为主服务器的一方会一直发送VRRP广播包。
①打开每台虚拟机的NginX服务
②开启第四台虚拟机的NginX服务,配置第四台虚拟主机的/etc/nginx/nginx.conf中的server字段和upstream字段,然后验证访问10.0.0.14是否能够将流量分配到节点1和节点2中
③设置第三个虚拟机/etc/keepalived/keepalived.conf,添加邮箱,router_id,优先级,以及vrrp的虚拟IP地址
notification_defs {
rainsa@163.com
···
}
priority 101
router_id lb01
vrrp_instance VI_1 {
virtual_ipaddress {
10.0.0.200/8 dev eth1
}
}
systemctl start keepalived开启keepalived服务,验证访问10.0.0.200时能否将流量分配至节点1和节点2中
④同理在第四个交换机中配置keepalived,只需要修改优先级为99,并且state为BACKUP即可
如何验证节点3和节点4之间keepalived是否配置成功:在虚拟机3中关闭keepalived服务,然后检查虚拟机的eth1中是否会出现10.0.0.200这个网段,且能负载分担;节点三关机后,访问10.0.0.200仍然能实现负载分担;节点三重新开机后又能成为主设备实现负载分担
NginX即使失效,Keepalived仍然有效,虚拟IP地址并不会自动迁移。只有当Keepalived服务关闭后迁移虚拟IP地址。
#!/bin/bash
if [ `netstat -lntp | grep nginx | wc -l` -lt 1 ];
then
systemctl stop keepalived
fi
#赋予权限chmod 777 check_status.sh
#./check_status.sh
但是存在一定的问题,当NginX恢复时,Keepalived并不会自动恢复。Keepalived可以根据返回的状态修改服务状态,例如降低实例的优先级
#check_nginx.sh
#!/bin/bash
if [ `netstat -lntp | grep nginx | wc -l` -lt 1 ];
then
exit 2#代表非正常退出
else
exit 0
fi
vrrp_script check_nginx {
script "/root/bin/check_nginx.sh"
interval 2 #执行时间间隔
weight -50 #设置脚本的权重为-50
fall 3 #连续执行失败的阈值次数为3,连续三次执行中,执行失败就返回失败
rise 3 #连续三次执行中,执行成功就返回成功
timeout 2 #超时内没有得到执行结果就返回执行失败
}
vrrp_instance VI_1 {
...
track_script {
check_nginx#跟踪脚本的执行状态
}
}
网站动静分离
动静分离的拓扑:动态网站+静态网站+负载均衡器,采用NginX实现
动态网站:配置开发环境(Eclipse/IDEA,Gradle/Maven),建立springBoot项目,springBoot项目打包,jar包部署,为网站建立服务,开机自动启动
注意:NginX默认的负载均衡机制无法支持动态网站,必须修改请求头的内容才能在动态网站之间进行负载均衡
server{
···
location / {
proxy_pass http://www.servers_pool;
proxy_set_header Host $host;
proxy_set_header X-Forward-For $remote_addr
}
}
静态网站:Html、css、js文件;静态网站与动态网站之间通过Ajax技术或WebSocket技术相互通信完成前后端对接
最后,在NginX处实现动态网站和静态网站的分离,主要依靠配置不同的路径对应的网址。首先为动态和静态部分配置不同的uptream
upstream static_servers_pool {
server 192.16.56.14;
}
upstream dynamic_servers_pool {
server 192.168.56.11
server 192.168.56.12
}
然后为不同的路径配置不同的upstream:
location /static/ {
proxy_passs http://static_servers_pool;
}
location / {
proxy_pass http://dynamic_servers_pool;
}
session保持
session问题的出现是由于负载均衡会将同一个用户的请求往不同的服务器转发,而服务器之间无法共享其他服务器的session数据
主要的解决方案:①服务器之间共享session②使用session集群③使得同一个用户的请求永远转发到同一个服务器
ip-hash的原理:根据用户请求包中的五元组来判断是不是同一个用户的请求
文件上传
文件上传只能上传到单个服务器,不同的用户将负载均衡器分配到不同的服务器节点,则访问的文件可能完全不同
解决的策略:设置一个(或多个)文件共享节点,然后用户的文件主要上传到这些共享文件节点,不同的用户都能从这个共享文件节点获取;常用的技术是NFS
磁盘阵列
RAID0 | 使用条带化,适用于不需要容错环境中的大型文件 |
RAID1 | 使用镜像,写入到一个硬盘的数据同时写入到另一个硬盘 |
RAID5 | 在所有硬盘上使用硬盘条带化和分布式奇偶校验 |
RAID6 | 分布式奇偶校验(每个带区有两个独立奇偶校验块) |
条带:将数据分割成离散的数据块,并分布到硬盘阵列中的每个物理硬盘上
RAID0:提供高带宽,但是不提供任何的冗余,硬盘发生故障会导致整个阵列数据丢失
RAID1:能提供双倍的读速度,一个硬件发生故障其它硬盘的内容也能运行系统,硬盘要求最少2块硬盘,且必须是偶数;有效容量小,存储空间利用率低
RAID5:适用于读取请求率高但是写入请求率低,需要数据冗余的情况。以最低的容量损失提供数据冗余,高性能读取;缺点是不适合大量的写入工作;最少需要三块硬盘,允许阵列中的1块硬盘发生故障
RAID6:适用于读取请求率高但写入率低,且需要较高的数据冗余的情况;较高的数据冗余和数据读取率;缺点是双奇偶校验会导致写入性能下降,需要损失两块硬盘的容量来存放奇偶校验块
RAID10:最多支持8个阵列跨接,有较高的读取性能和数据冗余。缺点是有效容量小,且存储空间利用率较低;每个RAID1阵列允许1块硬盘发生故障
RAID50:最多支持8个阵列跨接每个RAID5阵列允许1个硬盘发生故障,适用于高可靠性,高速率,高速读写的中大型容量环境;需要浪费部分存储空间做奇偶校验
RAID60:每个RAID阵列允许2个硬盘发生错误,最多支持8个硬盘阵列跨接;提供较高的读取性能和数据冗余;不适合大量的写入工作
第四章
分布式的概念:一组独立的计算机展现给用户的是一个系统来完成一个统一的工作,但是系统内可以动态地分配任务。分散的物理和逻辑资源通过计算机网络实现信息的交换
分布式的特点:计算速度加快,对等性(没有主从之分)、并发性、缺乏全局时钟、故障总会发生
分布式与集群的区别:①原理上,集群中每台服务器执行的任务都是一样的。本质上是将几台服务器集合到一起来实现同一业务。分布式是按照一定的算法将任务分配给多台服务器,提高的是执行任务的时间,业务被分配到不同的地方
②容错能力上,集群服务器中如果有故障的服务器,可以自动隔离,问题解决后再自动恢复;而分布式服务器一旦出现问题,任务就无法正常执行
Reidis的基本操作
Redis不区分命令大小写,但是区分键名的大小写
help @获取组中的所有命令
help获取命令帮助
quit退出
获得符号规则的键名称
keys 表达式 (?,*,[],\?)
判断一个键是否存在
exists key
删除键
del key
del key1 key2
批量删除
redis-cli del `redis-cli keys "key*"`
redis-cli keys "key*": 这是在 redis-cli内部再次执行keys 命令,以匹配所有以 "key" 开头的键。keys` 命令用于获取匹配指定模式的所有键的列表。
获得键值的数据类型
type key
返回的值可能是string,hash,list,set,zset
使用config set 可以动态地设置参数信息,服务器重启后就失效了
config set appendonly yes
config set save "90 1 30 10 60 100"
使用config get可以查看所有可以使用config set命令设置的参数
config get *
使用config rewrite命令对启动Redis服务器时所指定的redis.conf文件进行改写。该指令对文件的重写是原子性的,并且是一致的。如果重写失败或出错那么这个文件就不会被修改
IP Hash实现session保持的缺点解决办法:
①持续化session到数据库
②使用Redis共享session
③使用memcache同步session
④通过脚本或守护进程在多台服务器之间同步session
⑤使用NFS共享session
⑥使用cookie共享session
HDFS
两类节点:①namnode,管理文件系统的命名空间,维护系统文件树及整棵树内所有的文件和目录关系
②datanode,以数据块的形式存储具体的数据
缓存与一致性哈希
缓存是存储在计算机上的一个原始数据复制集,介于数据访问者与数据源之间的一种高速存储。当数据读取的时候,直接从高速存储中获取,如果可以获取到结果就无需访问数据库直接返回缓存的内容
如果缓存未命中,就从数据库中获取,一方面可以提高数据的读取速度,另一方面还能降低数据库的性能消耗。没有缓存阻挡,大量的请求直接落到系统的底层,系统很难撑住高并发的冲击
缓存穿透:查询一个根本不存在的数据,大量的缓存穿透直接落到存储层,后端系统容易被压垮
缓存雪崩:缓存层由于某些原因不等你提供服务,导致所有的请求直接到达存储层
预防和解决缓存穿透与缓存雪崩的方案:
①取模法,对键值取节点数的余。存在一定问题:扩展能力差,容错能力不佳
②一致性哈希,首先构建一个哈希环,然后计算缓存集群中服务器的IP或主机名来计算得到Hash值,计算得到的Hash值就是服务节点在环上的位置
然后对每个需要存储的数据key也同样计算一次哈希值,计算之后的哈希值也映射到环上,然后沿着环的顺时针方向寻找到第一个服务器节点,就是存储节点
一致性哈希能把节点宕机造成的影响控制在顺时针相邻节点之间,避免对整个集群造成影响
一致性哈希存在的问题:当服务器节点聚集在一起,容易造成数据倾斜问题,给单个节点造成很大的压力。解决办法是采用虚拟节点,将虚拟节点分散在哈希环的各个部分,打在虚拟节点上的数据实际也是映射到物理节点上
虚拟化
虚拟机迁移:将虚拟机实例从原宿主机迁移到目标宿主机中,并且在目标宿主机上能够将虚拟机运行状态恢复到其在迁移之前相同的状态,以便继续完成应用程序的任务
虚拟机迁移的分类:①从源和目的角度分:物理机到虚拟机,虚拟机到物理机,虚拟机到虚拟机
②按照迁移的状态:虚拟机停机迁移(冷迁移)、虚拟机在线迁移(热迁移、实时迁移)
实时迁移的步骤:①预迁移;②预定资源;③预复制;④停机复制;⑤提交启动
虚拟机和虚拟化容器的区别
Docker
Docker是一个开源的应用容器引擎,基于GO语言并可以让开发者打包他们的应用及依赖包到一个轻量级,可移植的容器中,然后发行到任何流行的Linux机器上
Docker包含三个基本概念:镜像(相当于一个root文件系统)、容器(镜像运行时的实体)、仓库(一个代码中心,可以用来保存镜像)
Docker使用客户-服务器(C/S)的架构模式,使用远程API来管理和创建Docker容器
常见命令:
在容器内运行应用程序
docker run ubuntu:15.10 /bin/echo "Hello world"
-t指定一个伪终端,-i允许对容器内的输入进行交互
docker run -i -t ubuntu:15.10 /bin/bash
以进程的方式运行容器
docker run -d ubuntu:15.10 /bin/sh -c "命令"
查看运行中的容器
docker ps
查看容器内的标准输出
docker logs [容器ID或容器名]
停止容器
docker stop [容器ID或容器名]
从远程仓库载入ubuntu镜像
docker pull ubuntu
进入交互模式
docker attach:退出会导致容器停止
docker exec:退出容器终端并不会导致容器停止
删除容器
docker rm -f [容器ID或容器名]
docker rmi [ID或镜像名]
查看网络端口
docker ps
docker port [容器ID] 将内部的TCP端口映射到外部端口 5000 tcp -> 0.0.0.0:5000
查看容器内部运行的进行
docker top
列出本地主机上的镜像
docker images
搜索镜像
docker search httpd
提交容器副本
docker commit -m="has update" -a="镜像作者" [容器ID] [创建的目标镜像名]
镜像标签
docker tag [镜像ID] [用户名字] [镜像源名称] [新的标签名]
端口映射,让外部也能访问这些应用
docker run -d -p 5000:5000 training/webapp python app.py //先是主机端口,再是容器端口
-p是容器内部端口绑定到指定的主机端口
-P是内部端口随机映射到主机的高端口
OpenStack
OpenStack的核心服务(组件):①计算服务Nova;②存储服务Swift;③镜像服务Glance;
其余主要服务(组件):④身份认证服务keystone;⑤网络管理服务Quantum;⑥存储管理服务Cinder;⑦仪表盘Horizon
计算服务:Nova
是OpenStack云中的计算组织控制器,处理OpenStack云中实例生命周期内的所有活动,不具备虚拟化能力
组件:API Server:向外提供与云基础设施交互的接口
Message Queue:OpenStack节点之间通过消息队列完成通信
computer worker:管理实例生命周期
Network Controller:处理主机的网络配置
Volume Workers:管理基于LVM的实例卷
Scheduler:调度器作为一个守护进程运行,并通过恰当的调度算法从资源池获得计算服务
LibVirt的主要支持功能:
①虚拟机管理
②远程机器支持
③存储管理
④网络接口管理
⑤虚拟NAT和基于路由的网络
OpenStack的版本
采用顺序命名法,用完了再回来重新命名
第五章
数据中心网络与传统Internet网络的区别:高设备利用率,采用虚拟化技术进行系统和数据中心整合,优化资源利用率,简化管理
绿色节能,通过先进的供电和散热技术,降低数据中心的能耗
高可用性,提供大量同质化设备和替代恢复机制,确保资源的可用性和数据的持久性
自动化管理
FatTree
相对于传统层次结构而言,FatTree的特点:①消除了树形结构上层链路对吞吐量的限制,所有交换机配置均相同;②为内部节点间通信提供多条并行链路;③横向扩展的尝试降低了构建数据中心网络的成本;④与现有数据中心网络使用的以太网结构和IP配置的服务器兼容
FatTree的计算
核心层交换机有k个出口,能够建立k个Pod吗,每个pod有k个交换机。接入层与汇聚层有一半的端口是完全关联的。
汇聚层交换机数目=接入层交换机数 = (k/2)* k
核心层交换机数目 = (k/2) * (k/2) 因为一个pod中一个汇聚层交换机向上有k/2个接口
主机数 = (k/2) * (k/2) * k
从终端到接入层的网络容量 = (k/2) * (k/2) * k
接入层到汇聚层的网络流量 = (k/2) * k * (k/2)
汇聚层到核心层的网络流量 = (k/2)*k*(k/2)
改进型树结构:采用VL2架构,将流量统一地分配到网络路径
递归层次数据中心:构建高层次网络时,需要的低层网络的个数等于每个低层网络中的服务器个数加1
光交换数据中心
无线数据中心