存档

2015年8月 的存档

NAS对比磁盘阵列柜

2015年8月25日 没有评论

随着IT产品作为当前重要的信息工具大量的应用在我们日常生活、工作当中后,导致从个人到企业拥有电子数据成几何级增长,数据量的膨胀增长直接刺激各种形态的存储设备市场的蓬勃发展。近几年各存储设备生产厂商针对IT产品的消费大户之一的中小型企业对存储设备的需求研制生产出各式各样的存储设备,其中代表当前主流的两种存储设备NAS及磁盘阵列柜在各行各业得到大量的应用,近期在存储界针对NAS与磁盘阵列柜哪一种存储设备更适合在中小型企业当中应用成了他们的热门话题。事实又是如何呢?让我们一起来对这两种设备进行具体分析。

  一、NAS与磁盘阵列柜的概念介绍

  NAS 英文全称为Network Attached Storage,可译为网络附加存储,是一种专用网络数据存储\备份器。它以数据为中心,将存储设备与服务器彻底分离,集中管理数据,从而释放带宽、提高性能、降低总拥有成本、保护投资。其成本远远低于使用服务器存储,而效率却远远高于后者。NAS能够满足那些希望降低存储成本但又无法承受SAN昂贵价格的中小企业的需求,具有相当好的性价比。

  磁盘阵列柜

  磁盘阵列简称RAID(Redundant Arrays of Inexpensive Disks),有”价格便宜且多余的磁盘阵列”之意。其原理是利用数组方式来作磁盘组,配合数据分散排列的设计,提升数据的安全性。磁盘阵列主要针对硬盘,在容量及速度上,无法跟上CPU及内存的发展,提出改善方法。磁盘阵列是由很多便宜、容量较小、稳定性较高、速度较慢磁盘,组合成一个大型的磁盘组,利用个别磁盘提供数据所产生的加成效果来提升整个磁盘系统的效能。同时,在储存数据时,利用这项技术,将数据切割成许多区段,分别存放在各个硬盘上。磁盘阵列还能利用同位检查(Parity Check)的观念,在数组中任一颗硬盘故障时,仍可读出数据,在数据重构时,将故障硬盘内的数据,经计算后重新置入新硬盘中。而磁盘阵列柜就是装配了众多硬盘的外置的RAID

  二、NAS与磁盘阵列柜的特点比较:

  1)成本比较:

  磁盘阵列柜是一种很成熟的数据存储设备,对磁盘阵列应用的发展经历了纯软件、内置板卡和独立外设三个阶段,对现有的应用有两大类型:a、低成本的纯软件和内置板卡方式;b、高成本的独立外设方式。

  a、纯软件和内置板卡RAID成本较低,但占用主机资源,性能受限且难于优化,尤其是与应用系统没有解耦,当主机环境损毁时,若不能保证完全恢复配置,可能导致盘阵中的数据无法恢复。

  而NAS其本身就是一台独立的、外设的、功能强大的RAID,成本虽比纯软件和内置板卡方式略高,但不管从占用主机资源还是数据安全的角度来说,都是值得选择的。

  b、高成本的独立外设方式相对NAS而言,其成本差异就非常大,稳定性高磁盘阵列柜从几十万元到过百万元都有,磁盘阵列柜比较适合大型企业(集团)作为大、中型网络的中央存储、备份设备使用,NAS比较适合小型企业或个人工作室作为储存备份设备使用。

  2)设置和使用方便性比较:

  RAID 的设置和与服务器之间的配合需要对计算机网络非常熟悉的专业人员进行管理,但NAS的使用和操作界面(如加拿大著名存储设备生产厂商自由遁为开拓中国市场专门开发出带简体中文界面的控制管理软件,大大方便国内用户的使用习惯)都很容易,不需要专业性很强的人员就能很好地管理,因此网络日常管理的成本也有很大的差异;

  3)控制系统损坏后,恢复方式的比较:

  RAID卡损坏后,对该存储系统可以说是灾难性的,这时你需要将硬盘取出来,交给专业的数据恢复公司进行数据恢复。而NAS硬件损坏,你可以将硬盘安按原来的排列方式装到另一台同型号的NAS上,数据就可以正常使用。

  4)对操作系统的支持方面,磁盘阵列柜在异构平台的支持方面较弱,目前市面上大多数磁盘阵列柜产品通常仅仅只能支持一种操作系统,若企业内部存在两种操作系统时,如设计部门使用MAC的操作系统,而财务部门使用WINDOWS的操作系统,当发生这种状况磁盘阵列柜在存储两个部门的数据时较麻烦;而NAS在对于处理异构操作平台方面相对于磁盘阵列柜来说具有绝对的优势,因为它能支持当前绝大部分主流操作系统的同时在一种网络下的使用即你可以同时将WINDOW、 LINUX、MAC的数据存储在NAS里面,而不需要对相关的数据作特别的处理;

  5)数据备份功能方面,由于磁盘阵列柜一般采用台式机的CPU作为处理器,相对于NAS采用的嵌入式、低功耗的专用CPU来说,磁盘阵列柜在数据存储速度比NAS更快,而在数据备份方面,由于NAS采取的是专用的备份软件,数据备份采取的是更可靠、更精准的磁轨式的备份方式,这一点相对于磁盘阵列柜更具优势,同时由于NAS采取的是专门设计的备份软件,在功能方面相对于磁盘阵列柜采取的通用软件来说更为可靠,如自由遁NAS随机附带的备份软件具有易用、高效、可靠的特点;

  6)、从数据安全的角度来看,在正常的数据存储备份的状况下,两者均能达到较高的数据安全度,NAS是一台完全独立的设备,而磁盘阵列柜则是一台依赖服务器的设备。这意味着如果一旦服务器损坏,NAS中的数据依然可以通过其它计算机进行读取,而磁盘阵列柜中的数据则只可以在服务器修复以后才能读取。在数据安全的另一重点数据容灾方面,NAS由于不受地域的限制,更容易构建数据容灾系统,同时在灾后数据危机处理方面,NAS的应对能力更胜一筹,这也是为什么NAS在国外的中小型企业的数据容灾系统中得到大量应用的主要原因。

  三、NAS与磁盘阵列柜的适用场合

  1、磁盘阵列柜

  由于磁盘阵列柜具有数据存储速度快、存储容量大等优点,所以磁盘阵列柜通常比较适合在企业内部的中小型中央集群网存储区域进行海量数据存储;

  2、NAS

  由于NAS具有不受地域限制、高扩展性、低功耗、高度自动化、高可用性群集、数据备份安全精确等特点,因此NAS企业内部更适合用于重要部门如财务、人事、客户等部门的数据存储备份的场合因为这些部门的数据通常数据量不大但不宜公开,所以保密系数相对于其他部门来说更高,在数据容灾方面,也是NAS的一个重要施展的平台。

  四、小结

  通过以上对NAS与磁盘阵列柜的综合对比及应用场合的细分,相信各位对于NAS与磁盘阵列柜这两种在中小型企业中得到大量应用的存储设备会有一个清晰的认识,对于它们在企业内部的正式应用,笔者建议,可将两者结合在一起使用,这样可有效提升企业内外部的数据安全,如可将磁备阵列柜用于常规性大流量的数据存储,而将NAS用于重要部门的数据备份,也可将NAS采取异地放置的方式构成企业内部的数据容灾。

分类: 解决方案 标签: ,

Windows超强备份工具Robocopy备份方法使用详例

2015年8月24日 没有评论

Robocopy.exe 是微软在Windows server 2003 Resource Kit Tools里面提供的程序来做备份的Vista及win7开始,至Win2008以后都已经自带了。
  Microsoft Windows 中内置的传统的“复制和粘贴”功能有一些局限性。它在执行简单的任务(将一个文档从一个目录移动到另一个目录等)时处理得还好,但缺乏 IT 专业人员在工作场所所需的高级功能。例如,复制和粘贴操作不包括任何高级复原功能,所以不允许从短暂的网络中断后进行恢复。特别是当复制完整的目录时,它还是一个要么全有要么全无的问题。而使用 UI,您无法选择仅复制新文件还是复制更新过的文件。您可以复制单个的文件、整个目录或什么也不复制。
  启动 Robocopy,这个强大的工具包含在 Microsoft Windows Server 2003 Resource Kit Tools中,考虑到了上述所有高级功能以及更多功能。Robocopy 支持更多重要的文件复制任务,从而能够真正简化您的工作。我想您将发现最大的好处是,可以创建两个文件结构(可以根据您的选择包括所有子文件夹和文件)的完全的镜像副本而不复制任何不需要的文件。只复制源位置中的新文件或更新后的文件。Robocopy 还允许您保留所有相关文件信息,包括日期和时间戳、安全访问控制列表 (ACL) 及更多内容。

—————-【参数】——————-
robocopy /?
——————————————————————————-
ROBOCOPY :: Windows 的可靠文件复制
——————————————————————————-
启动时间: Fri May 08 17:10:13 2009
Usage :: ROBOCOPY source destination [file [file]…] [options]
源:: 源目录(驱动器:\路径或\\服务器\共享\路径)。
目录:: 目标目录(驱动器:\路径或\\服务器\共享\路径)。
文件:: 要复制的文件(名称/通配符: 默认为 “*.*”)。
::
:: 复制选项:
::
/S :: 复制子目录,但不复制空的子目录。
/E :: 复制子目录,包括空的子目录。
/LEV:n :: 仅复制源目录树的前 n 层。
/Z :: 在可重新启动模式下复制文件。
/B :: 在备份模式下复制文件。
/ZB :: 使用可重新启动模式;如果拒绝访问,请使用备份模式。
/EFSRAW :: 在 EFS RAW 模式下复制所有加密的文件。
/COPY:复制标记:: 要复制的文件内容(默认为 /COPY:DAT)。
(复制标记: D=数据,A=属性,T=时间戳)。
(S=安全=NTFS ACL,O=所有者信息,U=审核信息)。
/DCOPY:T :: 复制目录时间戳。
/SEC :: 复制具有安全性的文件(等同于 /COPY:DATS)。
/COPYALL :: 复制所有文件信息(等同于 /COPY:DATSOU)。
/NOCOPY :: 不复制任何文件信息(与 /PURGE 一起使用生效)。
/SECFIX :: 修复所有文件的文件安全性,即使是跳过的文件。
/TIMFIX :: 修复所有文件的文件时间,即使是跳过的文件。
/PURGE :: 删除源中不再存在的目标文件/目录。
/MIR :: 镜像目录树(等同于 /E 和 /PURGE)。
/MOV :: 移动文件(复制后从源中删除)。
/MOVE :: 移动文件和目录(复制后从源中删除)。
/A+:[RASHCNET] :: 将给定的属性添加到复制文件。
/A-:[RASHCNET] :: 从复制文件中删除给定的属性。
/CREATE :: 仅创建目录树和长度为零的文件。
/FAT :: 仅使用 8.3 FAT 文件名创建目标文件。
/256 :: 关闭超长路径(> 256 字符)支持。
/MON:n :: 监视源;发现多于 n 个更改时再次运行。
/MOT:m :: 监视源;如果更改,在 m 分钟时间内再次运行。
/RH:hhmm-hhmm :: 运行小时数 – 可以启动新副本的时间。
/PF :: 以每个文件(而不是每个步骤)为基础检查运行小时数。
/IPG:n :: 程序包间的间距(ms),以释放低速线路上的带宽。
/SL:: 对照目标复制符号链接。
::
:: 文件选择选项:
::
/A :: 仅复制具有存档属性集的文件。
/M :: 仅复制具有存档属性的文件并重置存档属性。
/IA:[RASHCNETO] :: 仅包含具有任意给定属性集的文件。
/XA:[RASHCNETO] :: 排除具有任意给定属性集的文件。
/XF 文件[文件]… :: 排除与给定名称/路径/通配符匹配的文件。
/XD 目录[目录]… :: 排除与给定名称/路径匹配的目录。
/XC :: 排除已更改的文件。
/XN :: 排除较新的文件。
/XO :: 排除较旧的文件。
/XX :: 排除多余的文件和目录。
/XL :: 排除孤立的文件和目录。
/IS :: 包含相同文件。
/IT :: 包含已调整的文件。
/MAX:n :: 最大的文件大小 – 排除大于 n 字节的文件。
/MIN:n :: 最小的文件大小 – 排除小于 n 字节的文件。
/MAXAGE:n :: 最长的文件存在时间 – 排除早于 n 天/日期的文件。
/MINAGE:n :: 最短的文件存在时间 – 排除晚于 n 天/日期的文件。
/MAXLAD:n :: 最大的最后访问日期 – 排除自 n 以来未使用的文件。
/MINLAD:n :: 最小的最后访问日期 – 排除自 n 以来使用的文件。
(If n < 1900 then n = n days, else n = YYYYMMDD date)。
/XJ :: 排除接合点。(默认情况下通常包括)。
/FFT :: 假设 FAT 文件时间(2 秒粒度)。
/DST :: 弥补 1 小时的 DST 时间差。
/XJD :: 排除目录的接合点。
/XJF :: 排除文件的接合点。
::
:: 重试选项:
::
/R:n :: 失败副本的重试次数: 默认为 1 百万。
/W:n :: 两次重试间的等待时间: 默认为 30 秒。
/REG :: 将注册表中的 /R:n 和 /W:n 保存为默认设置。
/TBD :: 等待定义共享名称(重试错误 67)。
::
:: 日志记录选项:
::
/L :: 仅列出 – 不复制、添加时间戳或删除任何文件。
/X :: 报告所有多余的文件,而不只是选中的文件。
/V :: 生成详细输出,同时显示跳过的文件。
/TS :: 在输出中包含源文件的时间戳。
/FP :: 在输出中包含文件的完整路径名称。
/BYTES :: 以字节打印大小。
/NS :: 无大小 – 不记录文件大小。
/NC :: 无类别 – 不记录文件类别。
/NFL :: 无文件列表 – 不记录文件名。
/NDL :: 无目录列表 – 不记录目录名称。
/NP :: 无进度 – 不显示已复制的百分比。
/ETA :: 显示复制文件的预期到达时间。
/LOG:文件:: 将状态输出到日志文件(覆盖现有日志)。
/LOG+:文件:: 将状态输出到日志文件(附加到现有日志中)。
/UNILOG:文件:: 以 UNICODE 方式将状态输出到日志文件(覆盖现有日志)。
/UNILOG+:文件:: 以 UNICODE 方式将状态输出到日志文件(附加到现有日志中)。
/TEE :: 输出到控制台窗口和日志文件。
/NJH :: 没有作业标头。
/NJS :: 没有作业摘要。
/UNICODE :: 以 UNICODE 方式输出状态。
::
:: 作业选项 :
::
/JOB:作业名称:: 从命名的作业文件中提取参数。
/SAVE:作业名称:: 将参数保存到命名的作业文件
/QUIT :: 处理命令行后退出(以查看参数)。
/NOSD :: 未指定源目录。
/NODD :: 未指定目标目录。
/IF :: 包含以下文件。
—————-【例子】——————-
实例一:文件,想怎么复制就怎么复制
  [实现效果]
  随时将源文件夹中的纯文本(TXT)、Word文档(DOC)还有BMP、TIF图像文件复制到目标文件夹中,这是在“资源管理器”中直接拖放所做不到的。
[简单命令]
robocopy d:\work e:\back *.txt *.doc *.bmp *.tif /s
  [参数讲解]
  将d:\work文件下的TXT、DOC、BMP、TIF复制到e:\back文件夹,其他文件则不复制。/s是表示包括除空文件下的所有子目录,如果没有则仅复制d:\work下的文件而不包括子目录。
  [举一反三]
  (1)如果要将文件夹下的所有文件包括空文件夹全部复制到目标文件夹,命令为:robocopy d:\work e:\back /e
  /e表示复制所有子目录包括空文件夹。
  (2)如果只想复制两个层级内的文件(再下的层级里的文件则不拷贝),输入命令:robocopy d:\work e:\back /e /lev:2
  /lev:2表示复制的层级,比如指定层级后d:\work\soft(二级)下的文件会被复制,而d:\work\soft\office(***)下的文件则不被复制。
实例二:垃圾文件不复制
  [实现效果]在备份数据时,不可避免会将类似于*.bak、*.tmp的垃圾文件也复制到目标文件夹,用Robocopy可以将我们经常碰到的垃圾文件在拷贝时就清理出家门,从而生成一个干干净净的文件夹。
  [简单命令]
  robocopy d:\work e:\back /e /xf *.tmp *.bak
  [参数讲解]
  /xf为指定不执行复制操作的文件类型,后面的文件名支持通配符。如果参数为/xd,则表示排除后面指定的文件夹。
  实例三:大文件 我不要
  [实现效果]
  复制的时候,为了节省时间,需要将一些大文件暂时不拷贝,等有空闲时间时,再执行复制操作不迟。
  [简单命令]
  robocopy d:\work e:\back /e /max:6000000
  [参数讲解]
  仅复制不大于6000000bytes的文件,/max:后直接接数值,数值单位为byte。如果是/min:1000,则复制不小于1000bytes的文件。两个参数可以同时使用,界定复制文件大小的范围。
  实例四:只要这一周修改的文件
  [实现效果]
  这一周处理了哪些文档?编辑了那些文件?将这些修改了的文档复制到一个文件夹下,再好好回味一下。本例就是要将d:\work中最近七天内新建或修改了的TXT、DOC、XLS、PPT等文档,复制到e:\look目录下。
  [简单命令]
  robocopy d:\work e:\look /s *.txt *.doc *.xls *.ppt /maxage:7
  [参数讲解]
  /maxage:表示最远修改时间的,修改时间比这个还要旧的文件将不会被复制。/maxage:后可接数字,也可以接日期,数字小于1900时表示天数,否则就得用YYYYMMDD来表示具体的日期如/maxage:20040210表示2004年2月10日后被修改的文件才允许复制。与之相对应的参数是/minage,表示最近修改时间,比这个时间新的文件将不被复制。
  [举一反三]
  robocopy d:\work e:\look /s *.txt *.doc *.xls *.ppt /maxage:7 /minage:1
  则表示近七天内除今天外修改的文件才允许被复制。
  与修改时间相对的还有最近访问时间,/maxage指最远访问时间,比这个时间老的文件将不被复制。/minage是指最近访问时间,比这个时间新的文件将不被复制。
  实例五:我的文档排排站
  [实现效果]
  上例中复制时,所有的文档都会带来本身的路径信息,文档是会将其所存放的文件夹也复制过来。这给我们的翻阅查看带来很多不便,得单击多层文件夹才能看到文件,能不能将所有的文档直接复制到一个文件夹下呢?这个需要用XXCOPY来实现。
 [简单命令] 
  xxcopy d:\work e:\look /s /in*.txt /in*.doc /sg /yy /da:2004-02-02 /DB:2004-02-10/DA:1997-01-01
  [参数讲解]
  此命令将d:\work中从2004年2月2日到2月10生成的 TXT、DOC文件全部直接复制到e:\look目录下,不新建子文件夹,打开e:\look就能看到所有文件。XXCOPY和Robocopy的语法参数还是有较大差异的,表示指定文件类型时,XXCOPY会用/in*.*,表示日期时/da为在指定时间后,/db为在指定时间前,日期的表示为 YYYY- MM-DD。
  另外,/sg表示复制文件到同一文件夹,/yy表示在所有要求用户应答的地方都自动认为是Yes,在执行过程中不需要用户干预。
  实例六:完全克隆
  [实现效果]
  我们一般采取的复制方式默认是增量复制,即根据文件的大小、修改时间将源文件夹里的内容向目标文件夹复制,久而久之,目标文件夹里就可能存在大量源件夹里早已经删除且无用的文件和文件夹。如果要让备份完全相同,即拷贝时删除在目标文件夹里存在但源文件夹里并没有的文件。
  [简单命令]
  robcopy d:\work e:\look /mir
  [参数讲解]
  /mir的作用等同于/purge /e,/purge表示清理目标文件夹有而源文件夹里没有的文件(夹)。通过这个命令,能保证源文件夹和目标文件夹结构与文件完全相同。这在创建镜像备份时,非常有用。
  实例七:移动文件
  [实现效果]
  我们前面讲的都是复制,如果我们要将文件夹移动到目标文件夹,如何操作呢?
  [简单命令]
  robocopy d:\work e:\look /move /e
  [参数讲解]
  其中,/move表示移动。
  实例八:我只要文件夹骨架
  [实现效果]
  笔者的工作需要周期性地新建和整理大量的文件夹,每次的文件夹结构一样,只是文件不尽相同。如果是以前,就得一个一个简单重复去制作,而现在就不需要了。Robocopy和XXCOPY可以让你轻松实现复制文件夹结构。
  [简单命令]
  xxcopy d:\work e:\mystruct /t /yy /dl3
  [参数讲解]
  将d:\work的三层文件夹结构复制到e:\mystruct中。其中/t表示创建文件夹结构,/dl3表示复制的文件夹结构为***,数字可以自行输入,如果没有此参数,默认建立整个文件夹结构。  Robocopy创建文件夹相对要麻烦一些,/create参数不仅要创建结构,还要创建文件夹下所有文件的0字节文件,并非真正的结构,我们只好剑走偏锋了。
  robocopy d:\work e:\mystruct /e /lev:3 /minage:19000101
  为Robocopy指定一个不可能创建文件的时间,因为有参数/e 的作用,虽然没有文件符合要求(你机器里没有早于1900年1月1日的文件),但Robocopy还是会忠实地创建文件夹,这样就达到了生成文件夹结构的目的。另外,/lev:3表示复制文件夹的层级,同样可以自行输入。
  实例九:隐藏文件我不要
  [实现效果]
  在默认状态下,隐藏文件是并不显示的,但在复制的过程中,它还会随着文件夹一起被复制。可不可以将这些隐藏文件排除在复制范围之外呢?
  [简单命令]
  robocopy d:\work e:\back /e /xa:h
  [参数讲解]
  Robocopy支持对属性进行操作。上面的命令将复制源文件夹中全部文件,但全部具有隐藏属性的文件将不会被复制。/xa:h,表示将具有隐藏属性的排除出复制范围,与之相对应的是/ia,表示包括只对拥有指定属性的执行操作。属性有R:只读,A:存档,S:系统,H:隐藏等几种供选择。
  [举一反三]
  (1)此外,Robocopy还有/a+、/a-等参数对文件属性进行操作,分别表示在文件被拷贝后为文件添加、去除某属性。
  robocopy d:\work e:\back /ia:rs  
  表示只复制具有只读和系统属性的文件。
  (2)robocopy c: d: /-a:rsh
  表示将文件拷贝到D盘后,将拷贝生成的文件的只读、系统、隐藏属性去掉,以方便查看和修改。
  实例十:NTFS权限跟着走
  [实现效果]
  在使用Windows 2000、Windows XP时,在多用户使用一台电脑时或管理服务器时,经常要为文件夹指定用户访问和修改的权限(如图1,需要分区为NTFS)。不过,用一般的复制方式无法保留我们设置的权限,这在服务器备份时意味着我们得重新设置用户权限。不过,Robocopy可以让我们在复制文件的时候,将属性、用户权限、所有者都可以一并复制到目标文件夹中。

备份双友邻精彩5例-Robocopy和xxcopy全掌握
  [简单命令]
  robocopy d:\work e:\back /e /copyall
  [参数讲解]
  /copyall等于/copy:datsou,表示将所有源文件夹的信息复制到目标文件夹中,其中D:文件数据,A:文件属性,T:时间信息,S:权限信息,O:所有者信息,U:审核信息。
  [举一反三]
  如果源文件夹的权限被修改,需要同样更新目标文件夹的权限时,我们不必再重复复制,只需输入robocopy d:\work e:\back /is /copy:sou  如果没有/copy参数,默认为/copy:dat,没有后面三项的信息。
  实例十一:集中备份到文件服务器
  [实现效果]
  希望每天能够把相应数据备份到文件服务器上,以免数据丢失。
  [简单命令]
  robocopy d:\work \ctips_serverarticlesshare /e /copyall
  [参数讲解]
  从中可以看出,robocopy完全支持文件服务器共享文件夹数据的拷贝。
  [举一反三]
  (1)如果我们创建了一个环境变量,如定义%databack%为\ctips_serverarticles\back,那只要输入相应的命令:robocopy d:\work %databack% /e /copyall 即可把d:\work下的文件全部备份到\ctips_serverarticles\back下。当然,如果 \ctips_serverarticles\back空间不够时,只要更换环境变量的值到其他文件夹,如\ctips_serverarticles ewback,上述命令无需更改就可以反数据拷贝到新的文件夹中。
  (2)如果你只想把数据备份到共享文件夹中以你的机器名为名字的共享文件夹中,使用xxcopy会更方便:xxcopy d:\work \ctips_serverarticles/$HOST$ /e /yy 其中/$HOST$表示你的机器名,如你的机器名为CTIPS_SYJ,那会把d:\work 文件夹下的文件拷贝到\ctips_serverarticles\CTIPS_SYJ文件夹下。如果你的机器名为CTIPS_MLB,那执行上述命令后就可以把d:\work 文件夹下的文件拷贝到\ctips_serverarticles\CTIPS_MLB文件夹下。由于同局域网内的机器名字不会相同,执行上述命令后就可以保证数据不会被拷贝到同一文件夹下。
  实例十二:一动就备份
  [实现效果]
  有些工作内容非常重要,需要时时刻刻注意备份,可是我们哪里有这么好记性和耐性呢?这事,还是交给 Robocopy来做吧。Robocopy能时时监视要备份的文件夹,只要文件夹修改到一定时间和程序,Robocopy就会立即开始备份。它会一直监视文件夹,除非用户自己终止。
  [简单命令]
  robocopy d:\work e:\back /e /copyall /mot:1 /mon:2
  [参数讲解]
  上述命令表示复制文件夹所有信息到目标文件夹并进行监视。执行此命令后,命令提示符窗口如图2所示。一旦时间过了一分钟,并且源文件夹至少有或2处以上的修改,Robocopy就会自动启动另一个进程,执行上述备份操作。Robocopy能监视源文件夹结构、文件和文件夹名称、大小、最后修改时间,在这里,甚至连属性和权限等信息被修改时,Robocopy也会记为修改次数。备份双友邻精彩5例-Robocopy和xxcopy全掌握
   /mot后接的是时间(分钟),是指Robocopy执行操作的最短时间;/mon后接的是最少文件修改个数。在监视过程中,会自动记录时间和修改的次数,只有同时符合以上两个条件时,Robocopy才开始执行,执行完成后,这两个数据会自动清零,并重新开始监视文件夹,除非用户关闭命令提示符窗口或按下Ctrl+Break键。
  [举一反三]
  如果你要开机就监视并备份相应文件夹,则可以把上述命令放到“启动”组中。
  实例十三:不到时间不备份
  [实现效果]
  复制的过程总会占用系统资源,如果能设置在自己不在电脑边上的时候开始复制备份,就会方便得多。比如,每天5:50下班,希望下班后,到达6点时,Robocopy自动开始备份相应数据。
  [简单命令]
  robocopy d:\work e:\back /e /rh:1800-1830
  [举一反三]
  运行后,复制操作将会等待至指定时间开始(如图3)。其中,RH格式为/RH:hhmm-hhmm,指定Robocopy开始的时间段,在这个时间段外,拷贝会被暂停。时间为24小时格式,4个数字长,从0000到2359,而且两个数字不能相同。备份双友邻精彩5例-Robocopy和xxcopy 全掌握
  实例十四:计划任务备份
  以上的到时间备份、监视文件夹备份方式,每次重启系统会都会要重新执行以上命令,还远远不够智能,如果能和Windows的计划任务配合,所有问题就迎刃而解了。以我们要在每天10:00自动调用Robocopy开始监视备份文件夹为例,说一说计划任务与Robocopy的携手。
  第一步:新建BAT文件新建一个批处理文件autobak.bat,输入如下命令robocopy d:\work e:\back /e /copyall /mot:1 /mon:2
  第二步:创建计划任务选择“开始→设置→控制面板”,双击“任务计划”图标。把autobak.bat批处理文件拖放到“任务计划”窗口,然后双击新生成的autobak.bat图标,在弹出窗口中设置其属性。
  第三步:设置开始时间切换到“日程安排”标签,单击“任务计划”下拉列表框,从中选择“每天”,“开始时间”设置为10:00,单击“高级”可以设置起止的日期(如图4)。
  通过上述设置后,到了设置的时间,机器就会自动备份执行批处理文件,自动备份并监视文件夹。备份双友邻精彩5例-Robocopy和xxcopy全掌握
  实例十五:清理文件也拿手
  除了一般的复制功能,XXCOPY还有文件清理功能,可以将不需要的文件快速清理出硬盘。以下命令会清除文件和文件夹,请先建立测试文件夹掌握其操作后再对文件夹进行操作。
1.清除所有无用文件
xxcopy d:\work*.tmp /s /h /yy /rs
/rs表示不复制而直接从源文件夹中删除指定文件,/h表示指定隐藏和系统文件。
2.清除文件夹
xxcopy c: emp /rmdir /db:2002-01-01 /yy
删除c: emp中在2002年1月1日前的修改的文件夹。
3.删除空文件夹
xxcopy c: emp /rmdir /sz:0 /yy
删除c: emp下所有空文件夹,/sz:0指定大小为0的文件(夹)。
4.删除0字节文件
xxcopy c: emp*.* /sz:0 /s /h /yy /rs
通过以上四种方式的组合,我们可以轻松实现对文件及文件夹的整理工作。
最后,还有一几个小技巧告诉你,希望能有利于你更好地使用XXCOPY和Robocopy。
★将命令变成任务在Robocopy加上“/save:任务名”可以将当前操作记录为任务文件,通过“/job:任务名”就可以方便调用,不需要再输入一长串的命令了。此任务文件可以用纯文本编辑器(如记事本)来编辑。
★将复制备份过程录下来默认情况下,Robocopy的操作过程只是在命令提示符中显示,我们可以让它把操作过程输出为TXT文件,加上“/log:文件名.txt”即可。

/s是表示包括除空文件下的所有子目录.
/e表示复制所有子目录包括空文件夹。
/xf为指定不执行复制操作的文件类型,后面的文件名支持通配符。
如果参数为/xd,则表示排除后面指定的文件夹。
仅复制不大于6000000bytes的文件,/max:后直接接数值,数值单位为byte。如果是/min:1000,则复制不小于1000bytes的文件。两个参数可以同时使用,界定复制文件大小的范围。
/mir的作用等同于/purge /e,/purge表示清理目标文件夹有而源文件夹里没有的文件(夹)。
/xa:h,表示将具有隐藏属性的排除出复制范围,与之相对应的是/ia,表示包括只对拥有指定属性的执行操作。属性有R:只读,A:存档,S:系统,H:隐藏等几种供选择。
/copyall等于/copy:datsou,表示将所有源文件夹的信息复制到目标文件夹中,其中D:文件数据,A:文件属性,T:时间信息,S:权限信息,O:所有者信息,U:审核信息。

Windows Server 2012 显示在桌面显示计算机图标

2015年8月11日 没有评论

打开Windows PowerShell(一个像是命令提示符的东西[蓝底白字],但不是命令提示符), 在Windows PowerShell内输入cmd回车,当返回如下信息: Microsoft Windows [版本 6.2.9200] (c) 2012 Microsoft Corporation。保留所有权利。 则表示已成功进入命令行环境,然后再输入: rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0 回车后,勾选所需要的桌面图标的名称,确定即可。

以上是网络上广为流传的方式 ,不过我在win2012r2下并没有成功。提示出错。按以上的命令行办法其实只能在运行用跑。具体办法:

光标移到右下角出现设置之类的直接搜出 “运行” 然后打开运行后。再行输入运行rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0

这样才可以把个性化调出来。

美国服务器丢包率比较高是什么原因分析

2015年8月10日 没有评论

美国服务器虽然与中国相隔比较远,但是美国服务器通常都是通过海底光缆与中国电信和中国网通直接相连,具有很高的稳定性,通常访问ping值在180ms到220ms之间,并且丢包率维持在5%以下,如美国服务器出现丢包率比较高时,可能是受到外界干扰因素而造成的,下面我们就详细分析一下美国服务器丢包率比较高是什么原因。

美国服务器丢包率比较高是什么原因
  一.人为因素的干扰
  由于美国服务器是与电信或者网通直接相连,因而在宽带国际出口处可能会受到人为性的干扰而导致美国服务器丢包率非常高,如果是这种情况,几乎所有美国服务器都会出现高丢包率的现象。

  如何检测是否受人为因素干扰
  1.通过咨询其他美国服务器租用商或许寻找相关的新闻,了解一下是否其他服务商的美国服务器是a否也出现高丢包率的现象。

  2.美国服务器出现高丢包率时,可能也会出现ping值不正常的情况,你可以到一些例如17ce等常用测速网站,用全球的服务器来对你的美国服务器IP进行测速,如果除开中国节点外,其他地区的ping值都正常,就说明宽带国际出口受到干扰。

  二.服务器受到攻击
  如果服务器被高流量型的DDoS攻击时,服务器资源了,带宽资源都会被占用而出现高频率丢包现象。通产高防服务器不会出现这种情况,因为高防服务器机房具有充足的带宽资源,并且能够对攻击流量进行有效识别,如果流量的攻击超过机房的保护范围时,美国服务器服务商通知用户并做出高防处理。

  三.共享带宽可能会出现这种情况
  如果用户选择的是共享代理的美国服务器,在网络带宽出现峰值时,就可能会出现高丢包率的现象,因而在租用美国服务器时尽量选择独享带宽,而共享带宽就必须要根据用户对网络业务的带宽需求来定。

  以上就是美国服务器丢包率比较高是什么原因的相关介绍,这几点是美国服务器出现高丢包率的最常见因素,当然监测出现高丢包率还与本地电脑是否中毒,监测时是否在下载东西等有关因而我们需要从多个方面进行考虑,然后在找服务商协助解决。

Squid代理服务器应用案例 多出口多用户认证上网(转)

2015年8月9日 没有评论

最近帮朋友接了个小项目,客户在他们的美国机房租了几台服务器,然后想在上面做上网用的代理服务器,供客户在国内使用。具体需求如下:

1、客户的这台服务器具有多个出口ip地址

2、客户希望使用认证的方式使用代理服务器上网

3、客户希望通过不同的认证用户实现从不同的出口ip访问网络

4、隐藏代理信息,隐藏真实上网ip

此客户需求相当明确,根据上面罗列,条理也很清晰。本文的目的就是向大家介绍笔者实现这个需求的思路和步骤。

作者简介:刘晗昭,网名蚊子(博客),某通信业国企系统工程师,熟悉各种主流开源软件的使用,部署和组合应用,以及主流网站架构。目前关注系统架构和系统优化。

笔者使用了Squid来实现这一需求。Squid是一种在Linux系统下使用的优秀的代理服务器软件,还可以用在AIX、Digital Unix、FreeBSD、HP-UX、Irix、NetBSD、Nextstep、SCO和Solaris等系统上。更多关于squid的介绍就不在这里多讲了,有需要的去官方网站上看吧,51CTO也有这方面的专题。

这里先看下我设计的逻辑图:

根据图中所示,红色的用户1会通过红色的出口ip1访问internet,绿色的用户2会通过绿色的出口ip2访问internet,用户3和用户4同样对应相应颜色的出口访问internet。

接下来根据上面的需求进行逐一的分解。

一、需求分析

1、服务器具有多个出口ip地址

这个没什么可说的,客户的出口ip为:

10.100.10.1
10.100.10.2
10.100.10.3
2、使用认证的方式使用代理服务器上网

这里要用到squid的认证功能。squid的认证功能大类包括basic_auth,digest_auth,external_acl,negotiate_auth,ntlm_auth这5种(注:squid-2.7.STABLE9版本),每个大类下面还有具体的认证方式,如NCSA,LDAP,DB等等,具体支持哪些可以去这些目录下面看。

笔者在这里主要介绍的是NCSA的方式,此种认证方式类似apache的auth认证方式,通过用户名密码来验证,密码文件也是通过htpasswd程序来创建。后面会给出具体配置。

3、通过不同的认证用户实现从不同的出口ip访问网络

先说实现不同出口ip访问网络,这个主要是依靠squid的tcp_outgoing_address配置实现的,此参数可以根据source ip或者用户名的不同,分配不同的出口ip出去。

如此一来,搭配第二个需求中的用户验证,正好就可以实现第三个需求了。后面会给出具体的配置。

4、隐藏代理信息,隐藏真实上网ip

这个需求很多人应该都想到使用什么配置文件了,对,就是squid的header_access这个参数。主要就是隐藏掉HTTP_VIA,VIA和X-forwarded-for。后面会给出具体配置。

二、安装配置

首先要做的就是下载一个squid安装包(下载地址)。笔者这里使用的是2.7 STABLE9,操作的当前目录是/tmp,下面所有涉及到目录的都是基于此目录。squid源文件路径是/tmp/squid-2.7.STABLE9.tar.gz

安装步骤如下:

tar zxvf squid-2.7.STABLE9.tar.gz
cd squid-2.7.STABLE9
./configure –prefix=/usr/local/squid –enable-async-io=320 –enable-icmp –enable-delay-pools –enable-kill-parent-hack –enable-snmp –enable-arp-acl –enable-htcp –enable-cache-digests –enable-removal-policies=heap,lru –enable-default-err-language=Simplify_Chinese –enable-x-accelerator-vary –enable-follow-x-forwarded-for –with-aufs-threads=320 –with-pthreads –with-dl –with-maxfd=65536 –enable-basic-auth-helpers=DB,NCSA –enable-digest-auth-helpers=password –enable-large-cache-files –with-large-files
make
make install
如果以上步骤中无报错,squid就被正确安装完毕了。

接下来执行:

cd /usr/local/squid/
#(之后的所有操作均在此目录下完成)
grep -v “^#” etc/squid.conf.default|uniq > etc/squid.conf
将创建一份未注释的配置文件。

接下来编辑此文件

vi etc/squid.conf
修改编辑的内容如下:

20 acl CONNECT method CONNECT
21
22 http_access allow manager localhost
这两行中间加入:include “/usr/local/squid/etc/auth.conf”。auth.conf文件的内容后面会有详细介绍。

32 icp_access deny all
33
34 http_port 3128
这两行中间加入:always_direct allow all,意思是对所有ip过来的请求都允许转发。

将49 broken_vary_encoding allow apache行后面的所有内容删除,加上如下内容

forwarded_for off
#隐藏x-forwarded-for头
header_access HTTP_VIA deny all
#隐藏HTTP_VIA头
header_access VIA deny all
#隐藏VIA头
cache_effective_group daemon
#设置squid执行的用户组,这里使用了系统自带的daemon用户组
cache_effective_user daemon
#设置squid执行的用户,这里使用了系统自带的daemon用户

visible_hostname test
#设置错误页面中出现的服务器名称,可自行更改
cache_dir aufs /usr/local/squid/cache 100 16 256
#设置squid的缓存,可自行调整
cache_store_log none
#关闭store.log
都修改添加完毕后,保存退出。

紧接着我们来创建auth.conf。

vi /usr/local/squid/etc/auth.conf
输入如下内容

# 设置验证相关的配置内容,指定密码文件
1 auth_param basic program /usr/local/squid/libexec/ncsa_auth /usr/local/squid/etc/passwd
2 auth_param basic children 10 #设置验证子进程数
3 auth_param basic credentialsttl 2 hours #设置验证有效期
4 auth_param basic casesensitive off #设置是否区分大小写
5
# 后面这三行分别定义了三个用户组。每个用户组指定了一个用户文件。
6 acl usergroup1 proxy_auth “/usr/local/squid/etc/ip1user”
7 acl usergroup2 proxy_auth “/usr/local/squid/etc/ip2user”
8 acl usergroup3 proxy_auth “/usr/local/squid/etc/ip3user”
9
# 后面三条允许这三个组的用户可以访问网络
10 http_access allow usergroup1
11 http_access allow usergroup2
12 http_access allow usergroup3
13
# 这三条用来分配哪个组的用户走哪个出口ip
14 tcp_outgoing_address10.100.10.1 usergroup1
15 tcp_outgoing_address10.100.10.2 usergroup2
16 tcp_outgoing_address 10.100.10.3 usergroup3
编辑完成后保存退出。

接下来是创建用户文件,vi /usr/local/squid/etc/ip1user,填入如下内容

user1
user2
保存退出。这里用户数量不限,每个用户名占用一行。

如果一开始没有那么多用户,建议使用touch命令将文件创建好,不然启动squid的时候会出错。

接下来创建用户的密码文件,第一次创建密码文件请使用下面的命令

htpasswd -cb /usr/local/squid/etc/passwd user1 111111
倒数第二个字段是用户名,最后一个字段是用户对应的密码

如果之前创建过了密码文件,使用下面的命令就可以了

htpasswd -b /usr/local/squid/etc/passwd user2 111111
命令解释同上。

到此为止,配置文件等相关工作就基本完成了。下面来说说squid的初始化工作。

首先,mkdir cache,创建cache目录

然后执行,chown -R daemon.daemon,变更当前目录及所有子目录的的属主与属组。笔者这里使用系统自有的daemon用户和组。

这些工作都做好之后呢,就来执行 sbin/squid -z对squid进行初始化,如果没有报错信息呢,初始化工作就算是做完了,下面启动squid服务即可了,启动命令为

sbin/squid -ND &
然后通过下面的命令查看一下3128端口是否启动

netstat -ln|grep 3128
如果出现下面的内容,说明squid服务已经正常运行了

tcp 0 0 0.0.0.0:3128 0.0.0.0:* LISTEN
到此为止,一个支持用户身份验证的多出口代理服务器就完全配置完毕了,赶快打开浏览器,配置好代理服务器,测试一下吧。看看浏览网页是否会弹出验证的提示。

另外还可以登录proxy checker工具网站查看使用不同的用户组的用户,是否上网ip不一样,同时这个页面还能查看当前上网方式是否使用了代理。

分类: Linux, 解决方案, 软件使用 标签:

如何用DNS+GeoIP+Nginx+Varnish做世界级的CDN(转)

2015年8月9日 没有评论

如何用BIND, GeoIP, Nginx, Varnish来创建你自己的高效的CDN网络?
CDN,意思是Content Distrubtion Network,意思是内容分发网络,简单的说,就是全地域范围内的负载均衡,全地域的概念可以是全国,也可以是全世界。由统一的DNS服务器进行地址转发,选择离用户最近的地区服务器进行负载均衡。本质上是从一个机房内的负载均衡扩展到了全世界范围内的负载均衡。同时可以将本地化的内容,由当地的服务器实现。做浏览器的地区自动选择。
比如在中国,被人为划分成两大区域,北方是网通,南方是电信。这两个网络之间互访是比较慢的。作为大型网站,一种解决办法是将全部服务器架设在双线或三线ISP处,由ISP来提供路由上的选择。这样做,线路的成本会比较高。另一种办法就是将服务器架设在两边,南方一台,北方一台,然后由服务器自己选择,如果IP在电信,就转发请求到南方的服务器,如果是网通就转发到北方的服务器。
再扩大范围,可以将美国来的请求交由美国服务器处理,这样也缩短了用户在路由上的等待时间。这就是内容分发网络。
而作为这个网络上的所有节点,都可以当成虚拟服务器来看待。至于在各地的服务器如何做负载均衡,可以由各节点之间完成。
准备工作如下:你需要下载如下软件以实现上述功能
Nginx,BIND,GeoIP,Varnish
接下来是编译和安装bind9和geoip
# tar -xzvf bind-9.2.4.tar.gz
# tar -xzvf GeoIP-1.4.6.tar.gz
# cd GeoIP-1.4.6
# ./configure –prefix=/usr/local/geoip
# make
# make install
# cd ..
# patch -p0 < bind-9.2.4-geodns-patch/patch.diff //给bind9打补丁,让bind9直接支持geoip库
# cd bind-9.2.4
# CFLAGS=”-I/usr/local/geoip/include” LDFLAGS=”-L/usr/local/geoip/lib -lGeoIP” ./configure –prefix=/usr/local/bind
# make
# make install
装好bind后我们来制作named.conf
view “us” {
// 匹配北美的客户端 US & Canada
match-clients { country_US; country_CA; };
// Provide recursive service to internal clients only.
recursion no;
zone “cdn.xianglei.com” {
type master;
file “pri/xianglei-us.db”;
};
zone “.” IN {
type hint;
file “named.ca”;
};
};
view “latin” {
// 匹配到南美国家
match-clients { country_AR; country_CL; country_BR; };
recursion no;
zone “cdn.xianglei.com” {
type master;
file “pri/xianglei-latin.db”;
};
zone “.” IN {
type hint;
file “named.ca”;
};
};
照此办理,你也可以匹配到欧洲,非洲等等,然后来开始制作nginx和varnish
注意,以上内容是你要在主节点服务器上做的,主节点服务器只负责对DNS请求进行转发。
约定一下,我们将Bind服务器叫做动态节点服务器,Nginx+Varnish叫做边界服务器。
以下内容是副节点服务器需要做的,也就是实际在某个地区放置的服务器
# ./configure –prefix=/usr/local/nginx –with-http_realip_module
# make
# make install
并配置Nginx
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream dynamic_node {
server 1.1.1.1:80; # 1.1.1.1 是主DNS节点的IP地址
}
server {
listen 8080;
server_name cdn.xianglei.net;
location ~* \.(gif|jpg|jpeg|png|wmv|avi|mpg|mpeg|mp4|htm|html|js|css|mp3|swf|ico|flv)$ {
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://dynamic_node;
proxy_store /var/www/cache$uri;
proxy_store_access user:rw group:rw all:r;
}
以上我们用nginx只对静态文件进行缓存,将静态文件缓存在/var/www/cache文件夹下,如果你没有的话,需要创建这个文件夹。并且nginx监听的是8080端口,这是因为,我们需要用varnish来监听80端口进行动态文件的转发。这里实际上是用nginx做了一个静态文件的反向代理和缓存的服务器,而真正让用户能够看到网页和动态文件的反向代理是varnish,而静态和动态文件的分开存放,能将效率提升不少。
最后我们来配置varnish服务。
# tar -xzvf varnish-2.1.2.tar.gz
# ./configure –prefix=/usr/local/varnish
# make
# make install
然后是varnish的选项
backend default {
.host = “127.0.0.1″;
.port = “8080″;
}
sub vcl_recv {
if (req.url ~ “\.(js|css|jpg|jpeg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf)$”) {
return (lookup);
}
}
sub vcl_fetch {
if (req.url ~ “\.(js|css|jpg|jpeg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf)$”) {
unset obj.http.set-cookie;
}
}
其他的配置内容可参看varnish的配置文章。
总结:
这样做的好处在于:
1.从根源上解决了DNS在轮询上的不确定性,能够做到在DNS上的快速响应。也避免了过去用Nginx+GeoIP时的负载高的问题。毕竟DNS的计算要比Nginx小多了。
2.降低大网站的服务器负载压力和运营成本,毕竟F5BigIP和双线路的价格和服务费都太高了。
3.易扩展性强,如某地区负载压力大,只需在该地区增加边界服务器组的web server即可完成,无需考虑跳转问题。

双机高可用、负载均衡、MySQL(读写分离、主从自动切换)架构设计(转)

2015年8月5日 没有评论

架构简介

前几天网友来信说帮忙实现这样一个架构:只有两台机器,需要实现其中一台死机之后另一台能接管这台机器的服务,并且在两台机器正常服务时,两台机器都能用上。于是设计了如下的架构。

此架构主要是由keepalived实现双机高可用,维护了一个外网VIP,一个内网VIP。正常情况时,外网VIP和内网VIP都绑定在server1服务器,web请求发送到server1的nginx,nginx对于静态资源请求就直接在本机检索并返回,对于php的动态请求,则负载均衡到server1和server2。对于SQL请求,会将此类请求发送到Atlas MySQL中间件,Atlas接收到请求之后,把涉及写操作的请求发送到内网VIP,读请求操作发送到mysql从,这样就实现了读写分离。

当主服务器server1宕机时,keepalived检测到后,立即把外网VIP和内网VIP绑定到server2,并把server2的mysql切换成主库。此时由于外网VIP已经转移到了server2,web请求将发送给server2的nginx。nginx检测到server1宕机,不再把请求转发到server1的php-fpm。之后的sql请求照常发送给本地的atlas,atlas把写操作发送给内网VIP,读操作发送给mysql从,由于内网VIP已经绑定到server2了,server2的mysql同时接受写操作和读操作。

当主服务器server1恢复后,server1的mysql自动设置为从,与server2的mysql主同步。keepalived不抢占server2的VIP,继续正常服务。

架构要求

要实现此架构,需要三个条件:
1、服务器可以设置内网IP,并且设置的内网IP互通;
2、服务器可以随意绑定IDC分配给我们使用的外网IP,即外网IP没有绑定MAC地址;
3、MySQL服务器支持GTID,即MySQL-5.6.5以上版本。

环境说明

server1
eth0: 10.96.153.110(对外IP)
eth1: 192.168.1.100(对内IP)
server2
eth0: 10.96.153.114(对外IP)
eth1: 192.168.1.101(对内IP)
系统都是CentOS-6。

对外VIP: 10.96.153.239
对内VIP: 192.168.1.150

hosts设置

/etc/hosts:
192.168.1.100 server1
192.168.1.101 server2

Nginx PHP MySQL Memcached安装

这几个软件的安装推荐使用EZHTTP来完成。

解决session共享问题

php默认的session存储是在/tmp目录下,现在我们是用两台服务器作php请求的负载,这样会造成session分布在两台服务器的/tmp目录下,导致依赖于session的功能不正常。我们可以使用memcached来解决此问题。
上一步我们已经安装好了memcached,现在只需要配置php.ini来使用memcached,配置如下,打开php.ini配置文件,修改为如下两行的值:
session.save_handler = memcache
session.save_path = “tcp://192.168.1.100:11211,tcp://192.168.1.101:11211″
之后重启php-fpm生效。

Nginx配置

Server1配置
http {
[...]
upstream php-server {
server 192.168.1.101:9000;
server 127.0.0.1:9000;
keepalive 100;
}
[...]
server {
[...]
location ~ \.php$ {
fastcgi_pass php-server;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
[...]
}
[...]
}

Server2配置
http {
[...]
upstream php-server {
server 192.168.1.100:9000;
server 127.0.0.1:9000;
keepalive 100;
}
[...]
server {
[...]
location ~ \.php$ {
fastcgi_pass php-server;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
[...]
}
[...]
}
这两个配置主要的作用是设置php请求的负载均衡。

MySQL配置

mysql util安装
我们需要安装mysql util里的主从配置工具来实现主从切换。
cd /tmp
wget http://dev.mysql.com/get/Downloads/MySQLGUITools/mysql-utilities-1.5.3.tar.gz
tar xzf mysql-utilities-1.5.3.tar.gz
cd mysql-utilities-1.5.3
python setup.py build
python setup.py install

mysql my.cnf配置
server1:
[mysql]
[...]
protocol=tcp
[...]
[...]
[mysqld]
[...]
# BINARY LOGGING #
log-bin = /usr/local/mysql/data/mysql-bin
expire-logs-days = 14
binlog-format= row
log-slave-updates=true
gtid-mode=on
enforce-gtid-consistency =true
master-info-repository=TABLE
relay-log-info-repository=TABLE
server-id=1
report-host=server1
report-port=3306
[...]
server2:
[mysql]
[...]
protocol=tcp
[...]
[mysqld]
[...]
# BINARY LOGGING #
log-bin = /usr/local/mysql/data/mysql-bin
expire-logs-days = 14
binlog-format= row
log-slave-updates=true
gtid-mode=on
enforce-gtid-consistency =true
master-info-repository=TABLE
relay-log-info-repository=TABLE
server-id=2
report-host=server2
report-port=3306
[...]
这两个配置主要是设置了binlog和启用gtid-mode,并且需要设置不同的server-id和report-host。

开放root帐号远程权限
我们需要在两台mysql服务器设置root帐号远程访问权限。
mysql> grant all on *.* to ‘root’@’192.168.1.%’ identified by ‘Xp29at5F37′ with grant option;
mysql> grant all on *.* to ‘root’@'server1′ identified by ‘Xp29at5F37′ with grant option;
mysql> grant all on *.* to ‘root’@'server2′ identified by ‘Xp29at5F37′ with grant option;
mysql> flush privileges;

设置mysql主从
在任意一台执行如下命令:
mysqlreplicate –master=root:Xp29at5F37@server1:3306 –slave=root:Xp29at5F37@server2:3306 –rpl-user=rpl:o67DhtaW
# master on server1: … connected.
# slave on server2: … connected.
# Checking for binary logging on master…
# Setting up replication…
# …done.

显示主从关系
mysqlrplshow –master=root:Xp29at5F37@server1 –discover-slaves-login=root:Xp29at5F37
# master on server1: … connected.
# Finding slaves for master: server1:3306
# Replication Topology Graph
server1:3306 (MASTER)
|
+— server2:3306 – (SLAVE)

检查主从状态
mysqlrplcheck –master=root:Xp29at5F37@server1 –slave=root:Xp29at5F37@server2
# master on server1: … connected.
# slave on server2: … connected.
Test Description Status
—————————————————————————
Checking for binary logging on master [pass]
Are there binlog exceptions? [pass]
Replication user exists? [pass]
Checking server_id values [pass]
Checking server_uuid values [pass]
Is slave connected to master? [pass]
Check master information file [pass]
Checking InnoDB compatibility [pass]
Checking storage engines compatibility [pass]
Checking lower_case_table_names settings [pass]
Checking slave delay (seconds behind master) [pass]
# …done.

Keepalived配置

keepalived安装(两台都装)
yum -y install keepalived
chkconfig keepalived on

keepalived配置(server1)
vi /etc/keepalived/keepalived.conf
vrrp_sync_group VG_1 {
group {
inside_network
outside_network
}
}

vrrp_instance inside_network {
state BACKUP
interface eth1
virtual_router_id 51
priority 101
advert_int 1
authentication {
auth_type PASS
auth_pass 3489
}
virtual_ipaddress {
192.168.1.150/24
}
nopreempt
notify /data/sh/mysqlfailover-server1.sh
}

vrrp_instance outside_network {
state BACKUP
interface eth0
virtual_router_id 50
priority 101
advert_int 1
authentication {
auth_type PASS
auth_pass 3489
}
virtual_ipaddress {
10.96.153.239/24
}
nopreempt
}

keepalived配置(server2)
vrrp_sync_group VG_1 {
group {
inside_network
outside_network
}
}

vrrp_instance inside_network {
state BACKUP
interface eth1
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 3489
}
virtual_ipaddress {
192.168.1.150
}
notify /data/sh/mysqlfailover-server2.sh
}

vrrp_instance outside_network {
state BACKUP
interface eth0
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 3489
}
virtual_ipaddress {
10.96.153.239/24
}
}
此keepalived配置需要注意的是:
1、两台server的state都设置为backup,server1增加nopreempt配置,并且server1 priority比server2高,这样用来实现当server1从宕机恢复时,不抢占VIP;
2、server1设置notify /data/sh/mysqlfailover-server1.sh,server2设置notify /data/sh/mysqlfailover-server2.sh,作用是自动切换主从
/data/sh/mysqlfailover-server1.sh脚本内容:
#!/bin/bash

sleep 10
state=$3
result=`mysql -h127.0.0.1 -P3308 -uroot -pXp29at5F37 -e ‘show slave status;’`
[[ "$result" == "" ]] && mysqlState=”master” || mysqlState=”slave”

if [[ "$state" == "MASTER" ]];then
if [[ "$mysqlState" == "slave" ]];then
mysqlrpladmin –slave=root:Xp29at5F37@server1:3308 failover
fi

elif [[ "$state" == "BACKUP" ]];then
if [[ "$mysqlState" == "master" ]];then
mysqlreplicate –master=root:Xp29at5F37@server2:3308 –slave=root:Xp29at5F37@server1:3308 –rpl-user=rpl:o67DhtaW
fi
fi

sed -i ‘s/proxy-read-only-backend-addresses.*/proxy-read-only-backend-addresses = 192.168.1.150:3308/’ /usr/local/mysql-proxy/conf/my.cnf
mysql -h127.0.0.1 -P2345 -uuser -ppwd -e “REMOVE BACKEND 2;”
/data/sh/mysqlfailover-server2.sh脚本内容:
#!/bin/bash

sleep 10
state=$3
result=`mysql -h127.0.0.1 -P3308 -uroot -pXp29at5F37 -e ‘show slave status;’`
[[ "$result" == "" ]] && mysqlState=”master” || mysqlState=”slave”

if [[ "$state" == "MASTER" ]];then
if [[ "$mysqlState" == "slave" ]];then
mysqlrpladmin –slave=root:Xp29at5F37@server2:3308 failover
fi

elif [[ "$state" == "BACKUP" ]];then
if [[ "$mysqlState" == "master" ]];then
mysqlreplicate –master=root:Xp29at5F37@server1:3308 –slave=root:Xp29at5F37@server2:3308 –rpl-user=rpl:o67DhtaW
fi
fi

sed -i ‘s/proxy-read-only-backend-addresses.*/proxy-read-only-backend-addresses = 192.168.1.150:3308/’ /usr/local/mysql-proxy/conf/my.cnf
mysql -h127.0.0.1 -P2345 -uuser -ppwd -e “REMOVE BACKEND 2;”

Atlas设置

atlas安装
到这里下载最新版本,https://github.com/Qihoo360/Atlas/releases
cd /tmp
wget https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm
rpm -i Atlas-2.2.1.el6.x86_64.rpm

atlas配置
cd /usr/local/mysql-proxy/conf
cp test.cnf my.cnf
vi my.cnf
调整如下参数,
proxy-backend-addresses = 192.168.1.150:3306
proxy-read-only-backend-addresses = 192.168.1.101:3306
pwds = root:qtyU1btXOo074Itvx0UR9Q==
event-threads = 8
注意:
proxy-backend-addresse设置为内网VIP
proxy-read-only-backend-addresses设置为server2的IP
root:qtyU1btXOo074Itvx0UR9Q==设置数据库的用户和密码,密码是通过/usr/local/mysql-proxy/bin/encrypt Xp29at5F37生成。
更详细参数解释请查看,Atlas配置详解。

启动atlas
/usr/local/mysql-proxy/bin/mysql-proxy –defaults-file=/usr/local/mysql-proxy/conf/my.cnf
之后程序里配置mysql就配置127.0.0.1:1234就好。

部署atlas自动维护脚本
在两台机器都部署此脚本,并添加定时任务(如每2分钟运行一次)我们把脚本放在/data/sh/auto_maintain_atlas.sh,脚本内容为:
#!/bin/bash

count=`mysql -N -h127.0.0.1 -P2345 -uuser -ppwd -e “select * from backends;” | wc -l`

if [[ "$count" == "1" ]];then
result=`mysql -hserver1 -P3308 -uroot -pXp29at5F37 -e ‘show slave status\G’`
if echo “$result” | grep Slave_IO_State;then
slaveIP=192.168.1.100
else
result=`mysql -hserver2 -P3308 -uroot -pXp29at5F37 -e ‘show slave status\G’`
slaveIP=192.168.1.101
fi

slaveIORunning=`echo “$result” | awk -F’:’ ‘/Slave_IO_Running:/{print $2}’`
slaveSQLRunning=`echo “$result” | awk -F’:’ ‘/Slave_SQL_Running:/{print $2}’`
SlaveSQLRunning_State=`echo “$result” | awk -F’:’ ‘/Slave_SQL_Running_State:/{print $2}’`
if [[ "$slaveIORunning" =~ "Yes" && "$slaveSQLRunning" =~ "Yes" && "$SlaveSQLRunning_State" =~ "Slave has read all relay log" ]];then
mysql -h127.0.0.1 -P2345 -uuser -ppwd -e “add slave ${slaveIP}:3308;”
fi
fi
为什么需要这个脚本呢?假设目前mysql主服务器在s1,s1宕机后,s2接管VIP,接着删除atlas中设置的slave backend,其mysql提升为主。过一段时间后,s1从宕机中恢复,这时候s1的mysql自动切换为从,接着删除atlas中设置的slave backend,开始连接s2的mysql主同步数据。到这个时候我们发现,已经不存在读写分离了,所有的sql都发送给了s2的mysql。auto_maintain_atlas.sh脚本就派上用场了,此脚本会定时的检查主从是否已经同步完成,如果完成就自动增加slave backend,这样读写分离又恢复了,完全不需要人工干预。

server1主宕机测试

测试keepalived是否工作正常
我们来模拟server1宕机。
在server1上执行shutdown关机命令。
此时我们登录server2,执行ip addr命令,输出如下:
1: lo: mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:81:9d:42 brd ff:ff:ff:ff:ff:ff
inet 10.96.153.114/24 brd 10.96.153.255 scope global eth0
inet 10.96.153.239/24 scope global secondary eth0
inet6 fe80::20c:29ff:fe81:9d42/64 scope link
valid_lft forever preferred_lft forever
3: eth1: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:81:9d:4c brd ff:ff:ff:ff:ff:ff
inet 192.168.1.101/24 brd 192.168.1.255 scope global eth1
inet 192.168.1.150/32 scope global eth1
inet6 fe80::20c:29ff:fe81:9d4c/64 scope link
valid_lft forever preferred_lft forever
我们看到对外VIP 10.96.153.239和对内IP 192.168.1.150已经转移到server2了,证明keepalived运行正常。

测试是否自动切换了主从
登录server2的mysql服务器,执行show slave status;命令,如下:
mysql> show slave status\G
Empty set (0.00 sec)
我们发现从状态已经为空,证明已经切换为主了。

测试server1是否抢占VIP
为什么要测试这个呢?如果server1恢复之后抢占了VIP,而我们的Atlas里后端设置的是VIP,这样server1启动之后,sql的写操作就会向server1的mysql发送,而server1的mysql数据是旧于server2的,所以这样会造成数据不一致,这个是非常重要的测试。
我们先来启动server1,之后执行ip addr,输出如下:
1: lo: mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:f1:4f:4e brd ff:ff:ff:ff:ff:ff
inet 10.96.153.110/24 brd 10.96.153.255 scope global eth0
inet6 fe80::20c:29ff:fef1:4f4e/64 scope link
valid_lft forever preferred_lft forever
3: eth1: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:f1:4f:58 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.100/24 brd 192.168.1.255 scope global eth1
inet6 fe80::20c:29ff:fef1:4f58/64 scope link
valid_lft forever preferred_lft forever
我们看到,server1并没有抢占VIP,测试正常。不过另人郁闷的是,在虚拟机的环境并没有测试成功,不知道为什么。

测试server2的atlas是否已经删除slave backend
我们测试这个是为了保证atlas已经没有slave backend,也就是没有从库的设置了,否则当server1恢复时,有可能会把读请求发送给server1的mysql,造成读取了旧数据的问题。

[root@server1 ~]# mysql -h127.0.0.1 -P2345 -uuser -ppwd
mysql> select * from backends;
+————-+——————–+——-+——+
| backend_ndx | address | state | type |
+————-+——————–+——-+——+
| 1 | 192.168.1.150:3308 | up | rw |
+————-+——————–+——-+——+
1 rows in set (0.00 sec)
如果看到只有一个后端,证明运作正常。

测试server1 mysql是否设置为从
serve1恢复后,登录server1的mysql服务器,执行show slave status;命令,如下:

mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Opening tables
Master_Host: server1
Master_User: rpl
Master_Port: 3308
Connect_Retry: 60
Master_Log_File: mysql-bin.000015
Read_Master_Log_Pos: 48405991
Relay_Log_File: mysql-relay-bin.000002
Relay_Log_Pos: 361
Relay_Master_Log_File: mysql-bin.000015
Slave_IO_Running: Yes
Slave_SQL_Running: yes

测试是否自动恢复读写分离
server1恢复后一段时间,我们可以看是读写分离是否已经恢复。

[root@server1 ~]# mysql -h127.0.0.1 -P2345 -uuser -ppwd
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.0.99-agent-admin
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.
mysql> select * from backends;
+————-+——————–+——-+——+
| backend_ndx | address | state | type |
+————-+——————–+——-+——+
| 1 | 192.168.1.150:3308 | up | rw |
| 2 | 192.168.1.100:3308 | up | ro |
+————-+——————–+——-+——+
2 rows in set (0.00 sec)

我们看到server1已经被添加为slave backend了。这表示已经成功恢复读写分离。

eAccelerator 参数详解

2015年8月5日 没有评论

eaccelerator.shm_size=”32″
eAccelerator 可以使用的共享内存的数量 (以兆为单位) . “0″ 是指操作系统的默认值. 默认值是 “0″.可根据服务器的实际情况来调整,16,32,64,128都是可以的。
eaccelerator.cache_dir=”/home/php/tmp”
这个目录是给磁盘缓存使用. eAccelerator 在这里储存预先编译好的代码, 进程数据, 内容以及用户的自定义内容. 同样的数据也能被储存在共享内存中 (这样可以提高访问速度). 默认的设置是 “/tmp/eaccelerator”.
eaccelerator.enable=”1″
开启或关闭 eAccelerator。”1″ 为开启,”0″ 为关闭。默认值为 “1″。
eaccelerator.optimizer=”1″
启或关闭内部优化器,可以提升代码执行速度。”1″ 为开启,”0″ 为关闭。默认值为 “1″。
eaccelerator.check_mtime=”1″
打开或者关闭 PHP 的文件修改检查. “1″ 是指打开, “0″ 是指关闭. 如果您在修改以后重新编译 PHP 的文件,那么您应当设置为 “1″. 默认值是 “1″.
eaccelerator.debug=”0″
开启或关闭调试日志记录。”1″ 为开启,”0″ 为关闭。默认值为 “0″。会将缓存命中得记录写入日志。
eaccelerator.filter=”"
判断哪些 PHP 文件必须缓存。您可以指定缓存和不缓存的文件类型(如 “*.php *.phtml”等)
如果参数以 “!” 开头,则匹配这些参数的文件被忽略缓存。默认值为 “”,即,所有 PHP 文件
都将被缓存。
eaccelerator.shm_max=”0″
当使用 ” eaccelerator_put() ” 函数时禁止其向共享内存中存储过大的文件。该参数指定允许
存储的最大值,单位:字节 (10240, 10K, 1M)。”0″ 为不限制。默认值为 “0″。
eaccelerator.shm_ttl=”0″
当 eAccelerator 获取新脚本的共享内存大小失败时,它将从共享内存中删除所有在
最后 “shm_ttl” 秒内没有存取的脚本缓存。默认值为 “0″,即:不从共享内春中删除
任何缓存文件。
eaccelerator.shm_prune_period=”0″
当 eAccelerator 获取新脚本的共享内存大小失败时,他将试图从共享内存中删除早于
“shm_prune_period” 秒的缓存脚本。默认值为 “0″,即:不从共享内春中删除
任何缓存文件。
eaccelerator.shm_only=”0″
允许或禁止将已编译脚本缓存在磁盘上。该选项对 session 数据和内容缓存无效。默认
值为 “0″,即:使用磁盘和共享内存进行缓存。
eaccelerator.compress=”1″
允许或禁止压缩内容缓存。默认值为 “1″,即:允许压缩。
eaccelerator.compress_level=”9″
指定内容缓存的压缩等级。默认值为 “9″,为最高等级。

nginx 限速

2015年8月4日 没有评论

注意:
nginx 1.1.8 之后的版本的语法改为limit_conn_zone $binary_remote_addr zone=NAME:10m;
NAME 就是 zone 的名字详情请看这里 http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html

限制连接数:
要限制连接,必须先有一个容器对连接进行计数,在http段加入如下代码:
“zone=” 给它一个名字,可以随便叫,这个名字要跟下面的 limit_conn 一致
$binary_remote_addr = 用二进制来储存客户端的地址,1m 可以储存 32000 个并发会话

… 省掉 N 字
http
{
limit_conn_zone $binary_remote_addr zone=addr:10m;

接下来需要对server不同的位置(location段)进行限速,比如限制每个IP并发连接数为1,则
server
{
listen 80;
server_name 192.168.11.128;
index index.html index.htm index.php;
limit_conn addr 1; #是限制每个IP只能发起1个连接 (addr 要跟 limit_conn_zone 的变量对应)
limit_rate 100k; #限速为 100KB/秒
root html;

注意事项:
limit_rate 100k; //是对每个连接限速100k。这里是对连接限速,而不是对IP限速!如果一个IP允许两个并发连接,那么这个IP就是限速limit_rate * 2

nginx配置limit_conn_zone来限制并发连接数以及下载带宽

2015年8月4日 没有评论

配置方法如下:

1、在nginx.conf里的http{}里加上如下代码:
#ip limit
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;

2、在需要限制并发数和下载带宽的网站配置server{}里加上如下代码:
limit_conn perip 2;
limit_conn perserver 20;
limit_rate 100k;

补充说明下参数:
$binary_remote_addr是限制同一客户端ip地址;
$server_name是限制同一server最大并发数;
limit_conn为限制并发连接数;
limit_rate为限制下载速度;

转另一篇文章:nginx 限速
注意:
nginx 1.1.8 之后的版本的语法改为limit_conn_zone $binary_remote_addr zone=NAME:10m;
NAME 就是 zone 的名字详情请看这里 http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html

限制连接数:
要限制连接,必须先有一个容器对连接进行计数,在http段加入如下代码:
“zone=” 给它一个名字,可以随便叫,这个名字要跟下面的 limit_conn 一致
$binary_remote_addr = 用二进制来储存客户端的地址,1m 可以储存 32000 个并发会话

… 省掉 N 字
http
{
limit_conn_zone $binary_remote_addr zone=addr:10m;

接下来需要对server不同的位置(location段)进行限速,比如限制每个IP并发连接数为1,则
server
{
listen 80;
server_name 192.168.11.128;
index index.html index.htm index.php;
limit_conn addr 1; #是限制每个IP只能发起1个连接 (addr 要跟 limit_conn_zone 的变量对应)
limit_rate 100k; #限速为 100KB/秒
root html;

注意事项:
limit_rate 100k; //是对每个连接限速100k。这里是对连接限速,而不是对IP限速!如果一个IP允许两个并发连接,那么这个IP就是限速limit_rate * 2