作者文章

fwq

FWQ
Docker教程
Nginx、LVS、HAProxy负载均衡软件的优缺点详解
Nginx、LVS、HAProxy是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,参考了一些资料,结合自己的一些使用经验,总结一下。 一般对负载均衡的使用是随着网站规模的提升根据不同的阶段来使用不同的技术。具体的应用需求还得具体分析,如果是中小型的Web应用,比如日PV小于1000万,用Nginx就完全可以了;如果机器不少,可以用DNS轮询,LVS所耗费的机器还是比较多的;大型网站或重要的服务,且服务器比较多时,可以考虑用LVS。 一种是通过硬件来进行进行,常见的硬件有比较昂贵的F5和Array等商用的负载均衡器,它的优点就是有专业的维护团队来对这些服务进行维护、缺点就是花销太大,所以对于规模较小的网络服务来说暂时还没有需要使用;另外一种就是类似于Nginx、LVS、HAProxy的基于Linux的开源免费的负载均衡软件,这些都是通过软件级别来实现,所以费用非常低廉。 目前关于网站架构一般比较合理流行的架构方案:Web前端采用Nginx、HAProxy+Keepalived作负载均衡器;后端采用MySQL数据库一主多从和读写分离,采用LVS+Keepalived的架构。当然要根据项目具体需求制定方案。   下面说说各自的特点和适用场合。 一、Nginx Nginx的优点是: 工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构,它的正则规则比HAProxy更为强大和灵活,这也是它目前广泛流行的主要原因之一,Nginx单凭这点可利用的场合就远多于LVS了。 Nginx对网络稳定性的依赖非常小,理论上能ping通就就能进行负载功能,这个也是它的优势之一;相反LVS对网络稳定性依赖比较大,这点本人深有体会; Nginx安装和配置比较简单,测试起来比较方便,它基本能把错误用日志打印出来。LVS的配置、测试就要花比较长的时间了,LVS对网络依赖比较大。 可以承担高负载压力且稳定,在硬件不差的情况下一般能支撑几万次的并发量,负载度比LVS相对小些。 Nginx可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点,不过其中缺点就是不支持url来检测。比如用户正在上传一个文件,而处理该上传的节点刚好在上传过程中出现故障,Nginx会把上传切到另一台服务器重新处理,而LVS就直接断掉了,如果是上传一个很大的文件或者很重要的文件的话,用户可能会因此而不满。 Nginx不仅仅是一款优秀的负载均衡器/反向代理软件,它同时也是功能强大的Web应用服务器。LNMP也是近几年非常流行的web架构,在高流量的环境中稳定性也很好。 Nginx现在作为Web反向加速缓存越来越成熟了,速度比传统的Squid服务器更快,可以考虑用其作为反向代理加速器。 Nginx可作为中层反向代理使用,这一层面Nginx基本上无对手,唯一可以对比Nginx的就只有lighttpd了,不过lighttpd目前还没有做到Nginx完全的功能,配置也不那么清晰易读,社区资料也远远没Nginx活跃。 Nginx也可作为静态网页和图片服务器,这方面的性能也无对手。还有Nginx社区非常活跃,第三方模块也很多。 淘宝的前端使用的Tengine就是基于nginx做的二次开发定制版。 Nginx常规的HTTP请求和响应流程图: Nginx的缺点是: Nginx仅能支持http、https和Email协议,这样就在适用范围上面小些,这个是它的缺点。 对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测。 不支持Session的直接保持,但能通过ip_hash来解决。 二、LVS 使用Linux内核集群实现一个高性能、高可用的负载均衡服务器,它具有很好的可伸缩性(Scalability)、可靠性(Reliability)和可管理性(Manageability)。 LVS的优点是: 抗负载能力强、是工作在网络4层之上仅作分发之用,没有流量的产生,这个特点也决定了它在负载均衡软件里的性能最强的,对内存和cpu资源消耗比较低。 配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率。…
2024-11-17 阅读全文 →
FWQ
Docker教程
常见数据结构与算法整理总结(上)
数据结构是以某种形式将数据组织在一起的集合,它不仅存储数据,还支持访问和处理数据的操作。算法是为求解一个问题需要遵循的、被清楚指定的简单指令的集合。下面是自己整理的常用数据结构与算法相关内容,如有错误,欢迎指出。 为了便于描述,文中涉及到的代码部分都是用Java语言编写的,其实Java本身对常见的几种数据结构,线性表、栈、队列等都提供了较好的实现,就是我们经常用到的Java集合框架,有需要的可以阅读这篇文章。Java – 集合框架完全解析   一、线性表 1.数组实现 2.链表 二、栈与队列 三、树与二叉树 1.树 2.二叉树基本概念 3.二叉查找树 4.平衡二叉树 5.红黑树 四、图 五、总结 一、线性表 线性表是最常用且最简单的一种数据结构,它是n个数据元素的有限序列。 实现线性表的方式一般有两种,一种是使用数组存储线性表的元素,即用一组连续的存储单元依次存储线性表的数据元素。另一种是使用链表存储线性表的元素,即用一组任意的存储单元存储线性表的数据元素(存储单元可以是连续的,也可以是不连续的)。 数组实现 数组是一种大小固定的数据结构,对线性表的所有操作都可以通过数组来实现。虽然数组一旦创建之后,它的大小就无法改变了,但是当数组不能再存储线性表中的新元素时,我们可以创建一个新的大的数组来替换当前数组。这样就可以使用数组实现动态的数据结构。 代码1 创建一个更大的数组来替换当前数组   int[] oldArray =…
2024-11-17 阅读全文 →
FWQ
Docker教程
常见数据结构与算法整理总结(下)
这篇文章是常见数据结构与算法整理总结的下篇,上一篇主要是对常见的数据结构进行集中总结,这篇主要是总结一些常见的算法相关内容,文章中如有错误,欢迎指出。 一、概述 二、查找算法 三、排序算法 四、其它算法 五、常见算法题 六、总结   一、概述 以前看到这样一句话,语言只是工具,算法才是程序设计的灵魂。的确,算法在计算机科学中的地位真的很重要,在很多大公司的笔试面试中,算法掌握程度的考察都占据了很大一部分。不管是为了面试还是自身编程能力的提升,花时间去研究常见的算法还是很有必要的。下面是自己对于算法这部分的学习总结。 算法简介 算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。对于同一个问题的解决,可能会存在着不同的算法,为了衡量一个算法的优劣,提出了空间复杂度与时间复杂度这两个概念。 时间复杂度 一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数f(n),算法的时间度量记为 T(n) = O(f(n)) 它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称时间复杂度。这里需要重点理解这个增长率。 举个例子,看下面3个代码: 1、{++x;} 2、for(i = 1; i <= n; i++) {…
2024-11-17 阅读全文 →
FWQ
Docker教程
Yaf的安装
Yaf的下载地址:http://pecl.php.net/package/yaf Yaf的安装: # phpize # ./configure # make # make install 出现如下的提示信息,表示安装成功。 Installing shared extensions:     /usr/local/php7/lib/php/extensions/no-debug-non-zts-20151012/ 在 php.ini 的未尾增加: extension=yaf.so 到此yaf的扩展安装成功。
2024-11-17 阅读全文 →
FWQ
Docker教程
PHP配置指令作用域说明
PHP总共有4个配置指令作用域:(PHP中的每个指令都有自己的作用域,指令只能在其作用域中修改,不是任何地方都能修改配置指令的) PHP_INI_PERDIR:指令可以在php.ini、httpd.conf或.htaccess文件中修改 PHP_INI_SYSTEM:指令可以在php.ini 和 httpd.conf 文件中修改 PHP_INI_USER:指令可以在用户脚本中修改 PHP_INI_ALL:指令可以在任何地方修改 下面举例子说明: 1、在用户脚本中修改(即在php文件中修改) ini_set("yaf.library","/usr/local/php7/lib"); echo ini_get("yaf.library"); 2、在php.ini中修改 yaf.library="/usr/local/php7/lib"
2024-11-17 阅读全文 →
FWQ
Docker教程
Yaf运行时配置
Yaf运行时的环境配置:   名字 默认 可修改范围 使用说明 yaf.library PHP_INI_ALL 全局类库的目录路径,稍等介绍 yaf.action_prefer 0 PHP_INI_ALL yaf.lowcase_path 0 PHP_INI_ALL yaf.use_spl_autoload 0 PHP_INI_ALL 开启的情况下, Yaf在加载不成功的情况下, 会继续让PHP的自动加载函数加载, 从性能考虑, 除非特殊情况, 否则保持这个选项关闭 yaf.forward_limit 5 PHP_INI_ALL forward最大嵌套深度…
2024-11-17 阅读全文 →
FWQ
Docker教程
Yaf可选的配置项
Yaf和用户共用一个配置空间, 也就是在Yaf_Application初始化时刻给出的配置文件中的配置. 作为区别, Yaf的配置项都以ap开头. Yaf的核心必不可少的配置项只有一个(其实, 这个也可以有默认参数, 但是作者觉得完全没有配置, 显得太寒酸了). Yaf通过在不同的环境中, 选取不同的配置节, 再结合配置可继承, 来实现一套配置适应多种环境 (线上,测试,开发).   名称 值类型 默认值 说明 application.directory String 应用的绝对目录路径 application.ext String php PHP脚本的扩展名 application.bootstrap String Bootstrapplication.php…
2024-11-17 阅读全文 →
FWQ
计算机语言
C语言学习笔记(一)
一、2进制、8进制、10进制、16进制之间的转换 1)2进制、8进制、16进制 => 10进制 = 按权相加 2)10进制 => 2进制、8进制、16进制 = 除N取余 逆序排列 3)2进制、8进制、16进制间的转换 4)10进制小数 => 2进制小数 = 乘2取整、顺序排列   二、ASCII编码以及字符集的演进历史 三、学习数据结构、算法、内存、线程、进程、通信、操作系统等基本的概念 四、C和C++的区别和联系 五、C的编译过程 1)预处理 2)编译 3)汇编 4)链接 六、short、int、long、float、double的字节长度…
2024-11-17 阅读全文 →
FWQ
计算机语言
C语言学习笔记 – 编程基础
1、什么是编程语言? 通过“语言”来控制计算机,让计算机来为我们做事情,这样的语言叫编程语言(programming language)。 编程语言是用来控制计算机的一系列的指令(instruction),有固定的格式和词汇(不同语言的格式和词汇不一样),我们必须要遵守,否则会出错,达不到我们的目的。   2、二进制、八进制、十六进制、十进制之间的转换  二进制  八进制  十六进制  十进制  二进制  ----  一位,分成三位  一位,分成四位 整数部分: 除 N 取余,逆序排列,直到商为 0小数部分: 乘 N 取整,顺序排列 直到积中的小数部分为 0,或者达到所要求的精度为止  八进制 三位一组,不够三位,左补0  ----  转成二进制…
2024-11-17 阅读全文 →
FWQ
服务器教程
计算机组成与设计-计算机概要与技术
一、硬件和软件是如何影线性能的? 算法:决定了源码级语句的数量和I/O的操作数量 编程语言、编译器和体系结构:决定了每条源码对应的计算机指令数量 处理器和存储系统:决定了每条指令的执行速度 I/O系统:决定了I/O操作的执行速度    二、计算机系统结构中的8个伟大思想 面向摩尔定律设计 使用抽象简化设计 加速大概率事件 通过并行提高性能 通过流水线提高性能 通过预测提高性能 存储器层次 通过冗余设计提供稳定性 三、计算机硬件与软件层次图 应用程序(用户程序) -> 系统软件 -> 硬件; 系统软件包括:操作系统、编译程序、加载程序、链接程序等; 操作系统的定义:为了使程序能够更好的在计算机上运行,从而管理计算机资源的监控程序; 编译程序的定义:将高级语言翻译成计算机能够识别的语言的程序 指令的定义:计算机硬件所能理解并服从的命令;能够被计算机识别并执行的一串由0和1组成的数字串 四、计算机的五个组成部分 输入设备、输出设备、存储器、运算器、控制器;运算器和控制器又合称处理器;计算机的任何部件都可以归于这5种之一; 五、概念…
2024-11-17 阅读全文 →