集群| 负载均衡| 高并发——————
LVS
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。
HAProxy
提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
HAProxy可以作为MySQL、邮件或其它的非web的负载均衡,我们常用于它作为MySQL(读)负载均衡;
Keepalived
http://www.cnblogs.com/dkblog/archive/2011/07/06/2098949.html(可细致地参考)
1.1 可提供vrrp以及health-check功能,可以只用它提供双机浮动的vip(vrrp虚拟路由功能),这样可以简单实现一个双机热备高可用功能。
keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived的作用是检测web 服务器的状态。 Layer3,4&5工作在IP/TCP协议栈的IP层,TCP层,及应用层,原理分别如下:
Layer3:Keepalived使用Layer3的方式工作式时,Keepalived会定期向服务器群中的服务器发送一个ICMP的数据包(既我们平时用的Ping程序),如果发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。Layer3的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。在本文中将采用这种方式。
Layer4:如果您理解了Layer3的方式,Layer4就容易了。Layer4主要以TCP端口的状态来决定服务器工作正常与否。如web server的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除。
Layer5:Layer5就是工作在具体的应用层了,比Layer3,Layer4要复杂一点,在网络上占用的带宽也要大一些。Keepalived将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则Keepalived将把服务器从服务器群中剔除。
vip即虚拟ip,是附在主机网卡上的,即对主机网卡进行虚拟,此IP仍然是占用了此网段的某个IP。
随着你的网站业务量的增长你网站的服务器压力越来越大?需要负载均衡方案!商业的硬件如F5又太贵,你们又是创业型互联公司如何有效节约成本,节省不必要的浪费?同时实现商业硬件一样的高性能高可用的功能?有什么好的负载均衡可伸张可扩展的方案吗?答案是肯定的!有!我们利用 LVS+Keepalived基于完整开源软件的架构可以为你提供一个负载均衡及高可用的服务器。
1.2 LVS+Keepalived 介绍
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一.目前有三种IP负载均衡技术(VS/NAT、VS/TUN和VS/DR)八种调度算法(rr,wrr,lc,wlc,lblc,lblcr,dh,sh)。
Keepalived在这里主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现。keepalived简介 keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。
自动化管理工具——————
Ansible
是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
(1)、连接插件connection plugins:负责和被监控端实现通信;
(2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
(3)、各种模块核心模块、command模块、自定义模块;
(4)、借助于插件完成记录日志邮件等功能;
(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
Saltstack
是一个具备puppet 与func 功能为一身的集中化管理平台,saltstack 基于python实现,功能十分强大,各模块融合度及复用性极高,官方极力推荐作为云计算平台的基础架构。
PXE+Kickstart无人值守安装操作系统
Kickstart+HTTP+DHCP+TFTP全自动批量安装部署Linux系统
http://www.osyunwei.com/archives/7577.html(实践可参考)
http://www.cnblogs.com/mchina/p/centos-pxe-kickstart-auto-install-os.html(可详参)
PXE,Pre-boot Execution Environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站通过网络从远端服务器下载映像,并由此支持通过网络启动操作系统,在启动过程中,终端要求服务器分配IP地址,再用TFTP(trivial file transfer protocol)或MTFTP(multicast trivial file transfer protocol)协议下载一个启动软件包到本机内存中执行,由这个启动软件包完成终端基本软件设置,从而引导预先安装在服务器中的终端操作系统。
严格来说,PXE 并不是一种安装方式,而是一种引导方式。进行 PXE 安装的必要条件是在要安装的计算机中必须包含一个 PXE 支持的网卡(NIC),即网卡中必须要有 PXE Client。PXE 协议可以使计算机通过网络启动。此协议分为 Client端和 Server 端,而PXE Client则在网卡的 ROM 中。当计算机引导时,BIOS 把 PXE Client 调入内存中执行,然后由 PXE Client 将放置在远端的文件通过网络下载到本地运行。运行 PXE 协议需要设置 DHCP 服务器和 TFTP 服务器。DHCP 服务器会给 PXE Client(将要安装系统的主机)分配一个 IP 地址,由于是给 PXE Client 分配 IP 地址,所以在配置 DHCP 服务器时需要增加相应的 PXE 设置。此外,在 PXE Client 的 ROM 中,已经存在了 TFTP Client,那么它就可以通过 TFTP 协议到 TFTP Server 上下载所需的文件了。
Kickstart,是一种无人值守的安装方式。它的工作原理是在安装过程中记录典型的需要人工干预填写的各种参数,并生成一个名为ks.cfg的文件。如果在安装过程中(不只局限于生成Kickstart安装文件的机器)出现要填写参数的情况,安装程序首先会去查找Kickstart生成的文件,如果找到合适的参数,就采用所找到的参数;如果没有找到合适的参数,便需要安装者手工干预了。所以,如果Kickstart文件涵盖了安装过程中可能出现的所有需要填写的参数,那么安装者完全可以只告诉安装程序从何处取ks.cfg文件,然后就去忙自己的事情。等安装完毕,安装程序会根据ks.cfg中的设置重启系统,并结束安装。
虚拟化技术——————
KVM
Kernel-based Virtual Machine的简称,是一个开源的系统虚拟化模块
http://baike.baidu.com/link?url=fpZEiquKbftupzoeYz6N0l2UnPiRJopuo_xGtB6EcJJnMdE01Fe7gE1nw-LaLZFCfx2o9Bhor7b3J-CQBqDCwfG7biMHO_uiXLRd4yKjneL-emhcvtJf1WZL-6z-puWG
(1) Kernel-based Virtual Machine的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。KVM目前已成为学术界的主流VMM之一。
KVM的虚拟化需要硬件支持(如Intel VT技术或者AMD V技术)。是基于硬件的完全虚拟化。而Xen早期则是基于软件模拟的Para-Virtualization,新版本则是基于硬件支持的完全虚拟化。但Xen本身有自己的进程调度器,存储管理模块等,所以代码较为庞大。广为流传的商业系统虚拟化软件VMware ESX系列是基于软件模拟的Full-Virtualization。
在x86服务器虚拟化方法上主要有三种技术:Para-Virtualization, Full-Virtualization和Hardware-Assisted-Virtualization。
(1.1)完全以软件模拟硬件的形式虽然功能强大,但是性能难以满足用户的需要。模拟出的硬件的性能和物理硬件的性能相比,必然会大打折扣。为了提高虚拟机软件的性能,开发者们各显神通。其中,最常用的办法就是在主操作系统中通过内核模块开一个洞,通过这个洞将虚拟机中的操作直接映射到物理硬件上,从而提高虚拟机中运行的操作系统的性能。
其中KVM就是这种加速模式的典型代表。在社区中,大家常把KVM和Xen相提并论,但是它们其实完全不一样。从上图可以看出,使用内核模块加速这种模式,主操作系统仍然占主导地位,内核模块只是在主操作系统中开一个洞,用来连接虚拟机和物理硬件,给虚拟机加速,但是虚拟机中的客户操作系统仍然受到很大的限制。这种模式比较适合桌面用户使用,主操作系统仍然是他们的主战场,不管是办公还是打游戏,都通过主操作系统完成,客户操作系统只是按需使用。至于Xen,则完全使用不同的理念,比较适合企业级用户使用,桌面用户就不要轻易去碰了,具体内容下一篇我再讲。
其实VirtualBox也是采取的这种内核模块加速的模式。我之所以这么说,是因为在安装VirtualBox时,它会要求安装DKMS。
http://blog.chinaunix.net/uid-12306154-id-2239335.html
(2) KVM是一个全虚拟化的解决方案。可以在x86架构的计算机上实现虚拟化功能。但KVM需要CPU中虚拟化功能的支持,只可在具有虚拟化支持的CPU上运行,即具有VT功能的Intel CPU和具有AMD-V功能的AMD CPU。
Xen与KVM的比较
Xen是Linux下的一个虚拟化解决方案,但由于被Citrix收购后,变成了和红帽企业版一样了,卖服务收取费用,Redhat从rhel6.0开始已经从内核中把XEN踢出去了,全心投入开发免费的KVM,虽然市场上老用户还在用Xen,但相信kvm会逐步占领大面积的市场,必竟有redhat做为强大支持源。
Xen的实现方法是运行支持Xen功能的kernel,这个kernel是工作在Xen的控制之下,叫做Domain0,使用这个kernel启动机器后,你可以在这个机器上使用qemu软件,虚拟出多个系统。Xen的缺点是如果你需要更新Xen的版本,你需要重新编译整个内核,而且,稍有设置不慎,系统就无法启动。
相比较,KVM就简化的多了。它不需要重新编译内核,也不需要对当前kernel做任何修改,它只是几个可以动态加载的.ko模块。它结构更加精简、代码量更小。所以,出错的可能性更小。并且在某些方面,性能比Xen更胜一筹。
http://hazt1011.blog.51cto.com/1072107/1102327/
(3) Para-Virtualization(Citrix的Xen和Microsoft的Hyper-V为典型代表)直译成中文是“在旁边的虚拟化”:形象地说就是在虚拟化软体hypervisor上面跑着的诸多客户虚拟机(下称guest VMs或guest OSes,客户作业系统),在它们“旁边”还跑着一个特别OS,叫做“管理OS”或“管理VM”(the Administrative OS/VM,用Citrix Xen的术语叫做Dom0,用Microsoft Hyper-V的术语:the Parent Partition)。 这个“管理VM”是让系统管理员用来管理hypervisor的。 客户所使用的是那些在它旁边跑的guest VMs(Citrix Xen叫做DomU,Microsoft Hyper-V叫做Child Partitions)。 另外这个“管理OS”还采用native OS的方法管理整个硬体平台上的所有输入输出设备驱动器(IO device drivers),它里面包含了平台上所有输入输出设备驱动器。 也就是说Para-Virtualization方法在hypervisor里不对设备驱动器做虚拟(emulation),而仅对CPU和内存做虚拟,所以Para-Virtualization又被翻译作“半虚拟化”。 Para-Virtualization还有一个叫法:OS-Assisted-Virtualization,就是因为guest VMs需要“管理OS”协助。 这可以形象地看作是guest OS自身不带有设备驱动器而“向旁寻找”帮助。 另外guest OS还会发出一小部分由于硬体不支援而无法被虚拟化的OS指令。 在虚拟化理论中,这种不能被虚拟化的guest OS指令属于“低特权态部件发出的敏感指令”:处于低特权态(用户态)的guest OS如果对硬体发出这样的指令,则处于高特权态(内核态)的hypervisor必须先对这些指令进行检查作“无害化”处理后方能交给硬体机器做计算或处理服务。 由于以前x86硬体设计上存在缺陷,这一类指令不能自动被hypervisor截获(trap)。 对于这些不能自动被hypervisor截获的指令,Para-Virtualization技术采用了在guest OS中人为植入hypercalls的方法使程式流程主动进入hypervisor以获得“无害化”处理。 由于需要在guest OS中植入这些hypercalls, 所以Para-Virtualization技术需要对guest OS内核作修改后方能使用于VM内。 这一点被认为是Para-Virtualization技术的一个缺点:比如对于非开放源代码OS(如Windows 2000/XP)那就只有OS厂商才能制做guest OS。
Full-Virtualization(VMware的ESX)全虚拟化:对于前面提到的guest OS作为“低特权态部件发出的敏感指令”,VMware找到了一个“可执行代码翻译”(binary translation)方法将这些指令的可执行代码转变为一系列新的指令顺序,翻译得到的新指令顺序不仅与原指令具有等价的语义,而且可以得到硬体虚拟化支援。 这样一来就无需再人为在guest OS中植入hypercalls了,所以未经修改的guest OS内核可以直接跑在VM里面。 而且guest OS更本无法分辨出自己到底是直接跑在机器硬体上还是在一个虚拟硬体的hypervisor上。 作为一个全虚拟化的hypervisor,ESX将硬体平台上的所有的输入输出设备也都虚拟化了,所以ESX里面含有所有这些设备驱动器,guest OS无须从一个“管理OS”来获得设备驱动器服务。 ESX仍然有“管理OS”,叫做the Management Console,其作用是让系统管理员管理ESX hypervisor,仅此而已。
Hardware-Assisted-Virtualization硬体协助的虚拟化:Intel VT-x与AMD-V。 这两家x86处理器厂商最近对处理器硬体作了修改,使前面提到的guest OS“低特权态部件发出的敏感指令”能够自动被hypervisor截获。 所以在这种新机器上,Para-Virtualization就没有必要再对guest OS内核作修改,Full-Virtualization也无必要对guest OS做可执行代码翻译。 所以我们也可以说,如果不考虑Para-Virtualization与Full-Virtualization在IO设备处理上还有不同之处,那么硬体协助的虚拟化技术已经取消了前两种虚拟化技术之间的差别:两者都可以被看作是全虚拟化技术。
Intel和AMD在对X86伺服器硬体协助的虚拟化技术上还做了如下重要工作:统一管理了平台上输入输出设备对内存的直接访问(Direct Memory Access, DMA)。 这改变了以前机器上输入输出设备可以自由任意对内存进行直接访问,这种“无政府主义”的危险状态(非常危险!)。 用硬体协助的虚拟化技术对DMA作统一管理,这对于x86平台伺服器虚拟化技术运用到云计算加强云计算安全方面有很重要的意义。 前面我们提到硬体协助的虚拟化技术取消了Para-Virtualization与Full-Virtualization之间的差别,这样的说法没有考虑到两者在IO设备管理上的不同之处。 其实正是在对IO设备DMA的统一管理方面,Citrix Xen或MS Hyper-V与VMware ESX有很不同的性质,在系统服务安全上有明显的差异。
OTHERS——————
Docker
https://www.zhihu.com/question/22969309(知乎)
http://www.docker.org.cn/book/docker/what-is-docker-16.html
Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应用平台。
Docker通常用于如下场景:
•web应用的自动化打包和发布;
•自动化测试和持续集成、发布;
•在服务型环境中部署和调整数据库或其他的后台应用;
•从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。
github
https://www.zhihu.com/question/20070065
说白了就是一个公网在线「版本控制工具」
Redis
是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。
AWS
Amazon Web Services - Cloud Computing Services,Amazon Web Services offers reliable, scalable, and inexpensive cloud computing services.
AWK
是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。
Hadoop
是一个能够对大量数据进行分布式处理的软件框架。 Hadoop 以一种可靠、高效、可伸缩的方式进行数据处理。