陈日志 发布的文章

在上一篇文章中,我简单的介绍了 HAProxy 的功能,并且给出了两个配置示例。相信你对 HAProxy 已经有个大概的印象了。在这篇文章中,我会直接给出 HAProxy 高级一点的用法的配置示例,包含以下内容。

  • TLS/SSL 配置
  • 访问控制列表 ACL

    • 流量过滤,如禁止 TRACE 方法
    • ACL 的常见写法
    • 根据访问路径使用指定后端服务器
  • SESSION 绑定
  • 修改 HTTP 请求头
  • 修改 HTTP 响应头
  • URL 重定向
  • URL 重写
  • HTTP 服务器后端状态检查
  • 黑/白名单
  • 错误页面
  • 权重
  • 统计页面

- 阅读剩余部分 -

HAProxy 是一款高性能、免费、开源的反向代理软件,其提供高可用性、负载均衡,以及基于 TCP 和 HTTP 的应用程序代理,被广泛应用于各大互联网公司。

HAProxy 运行在现代常见硬件体系架构中,HAProxy 能支撑数以万计的并发连接,同时,HAProxy 的运行模式使得将其整合进当前架构中是一件非常简单且安全的事。通过 HAProxy 的代理,还可以避免后端服务器直接暴露在外部网络所带来的风险。

HAProxy具有以下功能:

  • 第4层(TCP)和第7层(HTTP)负载平衡
  • 支持多种调度算法
  • 会话保持
  • URL重写
  • 限速
  • 过滤
  • 流量整形
  • SSL / TLS 支持
  • Gzip压缩
  • 代理协议支持
  • 健康检查
  • 连接和 HTTP 访问日志记录
  • HTTP/2
  • 多线程
  • 无中断重载

HAProxy 使用模型:

haproxy-pmode.png

- 阅读剩余部分 -

此前,我们曾经介绍过文件同步常用的几种方案。

  • rsync + crontab
  • rsync + inotify
  • rsync + sersync

它们都有各自的应用场景,每一种方案都有其应用场景。

在 rsync + inotify 或 rsync + sersync 解决方案中,有一个共同的缺点,就是当文件修改的比较频繁时,会不断的产生同步操作。比如说程序的日志文件,日志文件的修改频率是非常频繁的,如果是用上述的两种方案,则会不断的触发同步操作。

lsyncd 有一个非常好的特性,它支持延时同步,即会把修改次数累积到一定的数量或时间后再触发同步操作,这样一来,使得同步不那么的频繁了。

- 阅读剩余部分 -

前面的文章中,我介绍到 rsync + inotify 可以实现文件实时同步功能,rsync + inotify 有优点,也有一些弊端。

  • 需要编写脚本调用 inotifywait来实现,所有的逻辑控制都要编写脚本来实现,使用门槛高
  • 单线程同步,效率低
  • 使用 vi 编辑文件时,将会触发非常多的冗余事件
  • 删除目录时,会同时产生删除文件夹里的文件的事件,这些都是冗余事件
  • 使用脚本也是其优点,使得运维人员可以轻易地编写出满足条件的同步逻辑
  • 可以灵活控制同步选项

sersync 介绍

sersync 是由金山所开源的一款基于 rsync + inotify 的实现,它使用 C++ 语言进行编写,提供了比原生 rsync + inotify 更为强大的功能。

  • 过滤临时文件和不需要的事件,比如在write的时候只产生一个事件,这样就之需要rsync一次
  • 删除文件夹的时候,inotify就会同事产生删除文件夹里的文件与删除文件夹的事件,通过过滤队列,当删除文件夹时间产生的时候,会将之前加入队列的删除文件的事件全部过滤掉,这样只产生一条删除文件夹事件
  • 当rsync失败的时候,会进行稍后重新执行,如果仍旧失败,10小时候再次执行,确保服务器同步准确
  • 对于本地没有的文件,我也会对远程文件路径进行删除,同时不会比较其他文件,那些使用 rsync --include=/ --include=xxx.php$ --exclude= 的用户注意了,那种执行方式,效率很低,会递归比较所有目录
  • 支持主机到多个分机的同步,别且使用多线程同时执行,使文件在所有服务器上保持一致。并且同时同步inotiy产生的多个文件
  • 自带crontab功能,只需在xml配置文件中开启,即可按您的要求,隔一段时间整体同步一次。无需再额外配置crontab功能
  • 多线程同步
  • 支持socket与http扩展插件

rsync.png

- 阅读剩余部分 -

此前的文章中,我介绍了 rsync 的工作原理及使用。而在此前的使用中,我是通过命令行的方式执行 rsync 客户端命令来同步数据的,在实际的应用中,更多的是配置定时任务,定时的执行客户端命令去同步数据。

一般而言,rsync 客户端命令大致都是这样:

rsync -avrz /data remote_host::data

意思是把本地 /data 目录推送到远端 rsync 服务的 data 模块对应的 path 目录中。然后,把这条命令添加到定时任务中去,就达到了定时同步的目的了。

虽然这样能实现我们的需求,但是当 /data 目录下有几千、几万、几十万甚至更多文件时,rsync 会遍历 /data 的所有文件,每一个文件都要计算摘要和校验和。这绝对是灾难性的,会损耗服务器的大量资源来处理同步的事情。

那么,我们就想,有没有一种机制,能实现当文件发生改变时才触发同步到远端服务器呢?答案是有的,它就是 inotify。

- 阅读剩余部分 -