Below you will find pages that utilize the taxonomy term “系统架构”
July 24, 2023
分布式存储 Ceph 介绍
"\u003cp\u003e\u003ca href=\"https://ceph.io/\"\u003eCeph\u003c/a\u003e 是一个分布式存储系统,其广泛用于云平台,最常见的就是在 k8s 平台中,目前大部分云厂商都会选择 \u003ccode\u003eceph\u003c/code\u003e 做为基础设施中的后端存储。\u003c/p\u003e\n\u003cp\u003eCeph是高度可靠、易于管理和免费的。\u003ccode\u003eCeph\u003c/code\u003e 的力量可以改变您公司的IT基础设施和管理大量数据的能力。Ceph提供了非凡的可扩展性——成千上万的客户端访问PB到EB的数据。Ceph节点利用商品硬件和智能守护进程,Ceph存储集群容纳大量节点,这些节点相互通信以动态复制和重新分发数据。\u003c/p\u003e\n\u003ch1 id=\"简介\"\u003e简介\u003c/h1\u003e\n\u003cp\u003e对于一个 Ceph 集群至少需要一个 \u003ccode\u003eCeph Monitor\u003c/code\u003e、一个 \u003ccode\u003eCeph Manager\u003c/code\u003e 和 一个 \u003ccode\u003eCeph OSDs\u003c/code\u003e(其个数决定了对象副本的个数)。\u003c/p\u003e\n\u003cp\u003eCeph Metadata Server 是运行 Ceph 文件系统客户端所必需的。\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2023/07/7cf9b586bd67922a1ebbde8e01ad433a.png\" alt=\"ditaa-a05e8639fc0d9031e9903a52a15a18e182d673ff\"\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e最好的做法是为每个监视器配备一个Ceph管理器,但这不是必须的\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch2 id=\"monitors\"\u003eMonitors\u003c/h2\u003e\n\u003cp\u003eCeph Monitor ( \u003ccode\u003eceph-mon\u003c/code\u003e) 维护集群状态的映射,包括监视器映射、管理器映射、OSD 映射、MDS 映射和 CRUSH 映射。这些映射是 Ceph 守护进程相互协调所需的关键集群状态。监视器还负责管理守护进程和客 …\u003c/p\u003e"
May 21, 2023
树莓派安装 kubernetes v1.27.2
"\u003cp\u003eUbuntu 22.04.2 LTS\nARM64位系统\nkubernetes v1.27.2\u003c/p\u003e\n\u003cp\u003e以前写过一篇安装教程 \u003ca href=\"https://blog.haohtml.com/archives/30924\"\u003ehttps://blog.haohtml.com/archives/30924\u003c/a\u003e ,当时安装的版本是 \u003ccode\u003e\u0026lt; v1.24.0\u003c/code\u003e 版本,由于k8s 从 \u003ccode\u003ev1.24.0\u003c/code\u003e 版本开始,弃用了 \u003ccode\u003eDockershim\u003c/code\u003e 因此没有办法继续使用 \u003ccode\u003eDocker Engine\u003c/code\u003e 作为运行时,因此如果还想继续使用旧的运行时的话,则需要安装一个 \u003ccode\u003ecri-docker\u003c/code\u003e 的软件, 本文主要是介绍(版本 \u003ccode\u003e\u0026gt;=v1.24.0\u003c/code\u003e )继续使用 \u003ccode\u003eDocker Engine\u003c/code\u003e 的安装方法,这里以最新版本 \u003ccode\u003ev1.27.1\u003c/code\u003e 为例。\u003c/p\u003e\n\u003ch2 id=\"安装环境初始化\"\u003e安装环境初始化\u003c/h2\u003e\n\u003cp\u003e以下内容来自: \u003ca href=\"https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/\"\u003ehttps://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e执行下述指令:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecat \u003cspan style=\"color:#e6db74\"\u003e\u0026lt;\u0026lt;EOF | sudo tee /etc/modules-load.d/k8s.conf\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003eoverlay\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003ebr_netfilter\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#e6db74\"\u003eEOF\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esudo …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
April 4, 2023
GBP工作原理
"\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://zhuanlan.zhihu.com/p/305982159\"\u003ehttps://zhuanlan.zhihu.com/p/305982159\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.cnblogs.com/wushuai2018/p/16450239.html\"\u003ehttps://www.cnblogs.com/wushuai2018/p/16450239.html\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e"
December 28, 2022
Envoy中的 gRPC限流服务
"\u003cp\u003e\u003ca href=\"https://blog.haohtml.com/archives/32108\"\u003e上一节\u003c/a\u003e 我们大概介绍了一下Envoy中有关速率限制(限流)的一些内容,这一节我们看一下对于外部的 gRPC限流服务它又是如何工作和配置的。\u003c/p\u003e\n\u003cp\u003e在 Envoy 中对服务限流的配置除了可以在 Envoy 本身中实现外,还可以在通过外部服务实现,此时 Envoy 将通过 gRPC 协议调用外部限流服务,官方对此实现有一套现成的解决方案,主要是redis数据库+令牌桶算法实现,可参考官方\u003c/p\u003e\n\u003cp\u003e本文中的限制器或限流器均是同一个意思。\u003c/p\u003e\n\u003ch1 id=\"envoy-实现限流\"\u003eEnvoy 实现限流\u003c/h1\u003e\n\u003cp\u003e此实现是基于令牌桶算法实现,本身比较的简单,比较适合一般的使用场景。\u003c/p\u003e\n\u003cp\u003e这里是官方提供的一个配置\u003ca href=\"https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/local_rate_limit_filter#example-configuration\"\u003e示例\u003c/a\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e13 http_filters:\n14 - name: envoy.filters.http.local_ratelimit\n15 typed_config:\n16 \u0026#34;@type\u0026#34;: type.googleapis.com/envoy.extensions.filters.http.local_ratelimit.v3.LocalRateLimit\n17 …\u003c/code\u003e\u003c/pre\u003e"
December 20, 2022
Envoy 中的速率限制 ratelimit
"\u003cp\u003e在 Envoy 架构中 \u003ca href=\"https://www.envoyproxy.io/docs/envoy/latest/configuration/other_features/rate_limit#config-rate-limit-service\"\u003eRate limit service\u003c/a\u003e 共支持 \u003ca href=\"https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/other_features/global_rate_limiting#arch-overview-global-rate-limit\"\u003eglobal rate limiting\u003c/a\u003e 和 \u003ca href=\"https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/other_features/local_rate_limiting#arch-overview-local-rate-limit\"\u003elocal rate limit filter\u003c/a\u003e 两种速率限制。推荐使用 \u003ca href=\"https://github.com/envoyproxy/ratelimit\"\u003ehttps://github.com/envoyproxy/ratelimit\u003c/a\u003e 库。\u003c/p\u003e\n\u003ch1 id=\"global-rate-limiting\"\u003eGlobal rate limiting\u003c/h1\u003e\n\u003cp\u003eEnvoy 提供了两种全局限速实现\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e每个连接 或 每个HTTP请求 速率限制检查。\u003c/li\u003e\n\u003cli\u003e基于配额,具有定期负载报告,允许在多个 Envoy 实例之间公平共享全局速率限制。此实现适用于每秒请求负载较高的大型 Envoy 部署,这些负载可能无法在所有 Envoy 实例之间均匀平衡。\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"per-connection-or-per-http-request-rate-limiting\"\u003ePer connection or per HTTP request rate limiting\u003c/h2\u003e\n\u003cp\u003eEnvoy 直接与全局 gRPC rate limiting service 集成, …\u003c/p\u003e"
January 8, 2022
了解eBPF技术
"\u003cp\u003eeBPF 的全称“扩展的伯克利数据包过滤器 (Extended Berkeley Packet Filter)” 来看,它是一种数据包过滤技术,是从 BPF (Berkeley Packet Filter) 技术扩展而来的。\u003c/p\u003e\n\u003cp\u003eBPF 提供了一种在 内核事件 和 用户程序 事件发生时安全注入代码的机制,这就让非内核开发人员也可以对内核进行控制。随着内核的发展,BPF 逐步从最初的数据包过滤扩展到了网络、内核、安全、跟踪等,而且它的功能特性还在快速发展中,这种扩展后的 BPF 被简称为 eBPF(早期的 BPF 被称为经典 BPF,简称 cBPF)。实际上,现代内核所运行的都是 eBPF,如果没有特殊说明,内核和开源社区中提到的 BPF 等同于 eBPF 。\u003c/p\u003e\n\u003ch1 id=\"使用场景及分类\"\u003e使用场景及分类\u003c/h1\u003e\n\u003cp\u003e根据 eBPF 的功能和使用场景,主要分类三类:\u003c/p\u003e\n\u003ch2 id=\"跟踪\"\u003e跟踪\u003c/h2\u003e\n\u003cp\u003e从内核和程序的运行状态中提取跟踪信息,来了解当前系统正在发生什么。\u003c/p\u003e\n\u003cp\u003e跟踪类 eBPF 程序主要用于从系统中提取跟踪信息,进而为监控、排错、性能优化等提供数据支撑。\u003c/p\u003e\n\u003cp\u003e其中 \u003ca href=\"https://github.com/iovisor/bcc/blob/master/docs/tutorial.md\"\u003eBCC\u003c/a\u003e 工具集中包含的绝大部分工具也都属于这个类型。\u003c/p\u003e\n\u003ch2 id=\"网络\"\u003e网络\u003c/h2\u003e\n\u003cp\u003e对网络数据包进行过滤和处理,以便了 …\u003c/p\u003e"
October 9, 2021
k8s解决证书过期问题
"\u003cp\u003e在k8s中的时间会提示证书过期问题,如\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# kubectl get nodes\nUnable to connect to the server: x509: certificate has expired or is not yet valid\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这里我们介绍一下续期方法。\u003c/p\u003e\n\u003cp\u003e注意:当前集群通过 kubeadm 命令创建。\u003c/p\u003e\n\u003cp\u003ekubeadm 安装得证书默认为 1 年,\u003cstrong\u003e注意原证书文件必须保留在服务器上才能做延期操作,否则就会重新生成,集群可能无法恢复\u003c/strong\u003e。\u003c/p\u003e\n\u003ch1 id=\"准备\"\u003e准备\u003c/h1\u003e\n\u003cp\u003e这里先查看一下测试集群的证书过期时间\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# kubeadm certs check-expiration\n[check-expiration] Reading configuration from the cluster...\n[check-expiration] FYI: You can look at this config file with \u0026#39;kubectl -n kube-system get cm kubeadm-config -o yaml\u0026#39;\n\nCERTIFICATE …\u003c/code\u003e\u003c/pre\u003e"
September 13, 2021
istio在虚拟机vm下的安装方法
"\u003cp\u003e建议参考官方文档 https://istio.io/latest/zh/docs/setup/install/virtual-machine/ ,这里提醒大家对于命令中文版部分命令与英文版不一致,请以 \u003cstrong\u003e英文版\u003c/strong\u003e 为准。\u003c/p\u003e\n\u003cp\u003e对于istio在vm上的安装教程主要分为三部分。首先是在k8s的master节点生成vm连接主节点的一些配置信息,其实是在vm上应用这些配置信息,最后也就是验证连接是否成功。\u003c/p\u003e\n\u003cp\u003e本篇主要介绍“单网络”的情况, 对于”多网络“请自行参考官方文档。\u003c/p\u003e\n\u003ch1 id=\"vm环境准备\"\u003evm环境准备\u003c/h1\u003e\n\u003ch2 id=\"生成vm通讯配置信息\"\u003e生成vm通讯配置信息\u003c/h2\u003e\n\u003cp\u003e这里主要介绍一些新手迷惑的部分。如环境变量设置及vm注册的方式\u003c/p\u003e\n\u003ch3 id=\"设置环境变量\"\u003e设置环境变量\u003c/h3\u003e\n\u003cp\u003e在设置变量时,对于”单网络“来讲 CLUSTER_NETWORK 和 VM_NETWORK 保留空值即可。如我这里设置如下\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ VM_APP\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;myapp\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ VM_NAMESPACE\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;vm\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ WORK_DIR\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;/root/myapp\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ SERVICE_ACCOUNT\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;vm-sa\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ CLUSTER_NETWORK\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;\u0026#34; …\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
September 13, 2021
利用 docker buildx 构建多平台镜像
"\u003ch1 id=\"什么是-docker-buildx\"\u003e什么是 docker buildx\u003c/h1\u003e\n\u003cp\u003eDocker Buildx是一个CLI插件,它扩展了Docker命令,完全支持Moby BuildKit builder toolkit提供的功能。它提供了与docker build相同的用户体验,并提供了许多新功能,如创建作用域生成器实例和针对多个节点并发构建。\u003c/p\u003e\n\u003cp\u003eDocker Buildx包含在Docker 19.03中,并与以下Docker Desktop版本捆绑在一起。请注意,必须启用“实验特性”选项才能使用Docker Buildx。\u003c/p\u003e\n\u003cp\u003eDocker Desktop Enterprise version 2.1.0\nDocker Desktop Edge version 2.0.4.0 or higher\u003c/p\u003e\n\u003ch1 id=\"用法\"\u003e用法\u003c/h1\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eUsage: docker buildx [OPTIONS] COMMAND\n\nExtended build capabilities with BuildKit\n\nOptions:\n --builder string Override the configured builder instance …\u003c/code\u003e\u003c/pre\u003e"
August 7, 2021
服务网格Istio之服务入口 ServiceEntry
"\u003cp\u003e使用服务入口(Service Entry) 来添加一个服务入口到 Istio 内部维护的服务注册中心。添加了服务入口后,Envoy 代理可以向服务发送流量,就好像它是网格内部的服务一样,可参考 \u003ca href=\"https://istio.io/latest/zh/docs/concepts/traffic-management/#service-entries\"\u003ehttps://istio.io/latest/zh/docs/concepts/traffic-management/#service-entries\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e简单的理解就是允许内网向外网服务发送流量请求,但你可能会说正常情况下在pod里也是可以访问外网的,这两者有什么区别呢?\u003c/p\u003e\n\u003cp\u003e确实默认情况下,Istio 配置 Envoy 代理可以将请求传递给外部服务。但是无法使用 Istio 的特性来控制没有在网格中注册的目标流量。这也正是 ServiceEntry 真正发挥的作用,通过配置服务入口允许您管理运行在网格外的服务的流量。\u003c/p\u003e\n\u003cp\u003e此外,可以配置虚拟服务和目标规则,以更精细的方式控制到服务条目的流量,就像为网格中的其他任何服务配置流量一样。\u003c/p\u003e\n\u003cp\u003e为了更好的理解这一块的内容,我们先看一下普通POD发送请求的流程图\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2021/08/d2b5ca33bd970f64a6301fa75ae2eb22.png\" alt=\"\"\u003e普通 Pod 请求\u003c/p\u003e\n\u003ch1 id=\"创建-serviceentry-资源\"\u003e创建 ServiceEntry 资源\u003c/h1\u003e\n\u003cp\u003e举例来说:\u003c/p\u003e\n\u003cp\u003esvc-entry.yaml …\u003c/p\u003e"
July 31, 2021
在linux下安装Kubernetes
"\u003cp\u003e环境 ubuntu18.04 64位\u003c/p\u003e\n\u003cp\u003eKubernetes v1.21.3\u003c/p\u003e\n\u003cp\u003e这里需要注意,本教程安装的k8s版本号 \u003ccode\u003e\u0026lt;- v1.24.0\u003c/code\u003e,主要是因为从v1.24.0以后移除了 \u003ccode\u003eDockershim\u003c/code\u003e,无法继续使用 \u003ccode\u003eDocker Engine\u003c/code\u003e,后续将默认采用 \u003ca href=\"https://containerd.io/\"\u003econtainerd\u003c/a\u003e ,它是一个从 CNCF 毕业的项目。如果仍想使用原来 \u003ccode\u003eDocker Engine\u003c/code\u003e 的方式可以安装 \u003ca href=\"https://github.com/Mirantis/cri-dockerd\"\u003ecri-dockerd\u003c/a\u003e ,它是 Dockershim 的替代品。\u003c/p\u003e\n\u003cp\u003e如果你想将现在 Docker Engine 的容器更换为 \u003ccode\u003econtainerd\u003c/code\u003e,可以参考官方迁移教程 \u003ca href=\"https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/migrating-from-dockershim/change-runtime-containerd/\"\u003e将节点上的容器运行时从 Docker Engine 改为 containerd\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e为了解决国内访问一些国外网站慢的问题,本文使用了国内阿里云的镜像。\u003c/p\u003e\n\u003ch1 id=\"更换apt包源\"\u003e更换apt包源\u003c/h1\u003e\n\u003cp\u003e这里使用aliyun镜像 , 为了安全起见,建议备份原来系统默认的 /etc/apt/sources.list 文件\u003c/p\u003e\n\u003cp\u003e编辑文件 /etc/apt/sources.list,将默认网址 或 替换为\u003c/p\u003e\n\u003cp\u003e更新缓存\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ sudo apt-get clean all\n$ sudo …\u003c/code\u003e\u003c/pre\u003e"
June 27, 2021
SPIFFE 学习参考资料
"\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/spiffe/spiffe/blob/main/standards/SPIFFE_Workload_API.md\"\u003eThe SPIFFE Workload API\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.scriptjc.com/article/1097\"\u003eEnvoy spiffe spire\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://blog.csdn.net/dnc8371/article/details/106701159\"\u003e简而言之SPIFFE\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://cloud.tencent.com/developer/article/1549231\"\u003eSPIFFE信任域\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://segmentfault.com/a/1190000018432444\"\u003e使用SPIRE(自动)提供TLS证书给Envoy以进行更强大的身份验证\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://segmentfault.com/a/1190000017881797\"\u003e谁使用SPIFFE?\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://blog.envoyproxy.io/securing-the-service-mesh-with-spire-0-3-abb45cd79810\"\u003eSecuring the Service Mesh with SPIRE 0.3\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e"
April 29, 2021
初识kubernetes 组件
"\u003cp\u003e对于一个刚刚接触 kubernetes(k8s)的新手来说,想好更好的学习它,首先就要对它有一个大概的认知,所以本文我们先以全局观来介绍一个 kubernetes。\u003c/p\u003e\n\u003ch2 id=\"kubernetes-架构-8ee9f2fa987eccb490cfaa91c6484f67kubernetes-架构图\"\u003ekubernetes 架构 \u003cimg src=\"https://blogstatic.haohtml.com/uploads/2021/04/56aec9997240192091adad3e14358736-52.png\" alt=\"8ee9f2fa987eccb490cfaa91c6484f67\"\u003ekubernetes 架构图\u003c/h2\u003e\n\u003cp\u003ekubernets 整体可以分为两大部分,分别为 \u003ccode\u003eMaster\u003c/code\u003e 和 \u003ccode\u003eNode\u003c/code\u003e ,我们一般称其为节点,这两种角色分别对应着控制节点和计算节点,根据我们的经验可以清楚的知道 Master 是控制节点。\u003c/p\u003e\n\u003ch2 id=\"master-节点\"\u003eMaster 节点\u003c/h2\u003e\n\u003cp\u003e控制节点 \u003ccode\u003eMaster\u003c/code\u003e 节点由三部分组成,分别为 \u003ccode\u003eController Manager\u003c/code\u003e 、 \u003ccode\u003eAPI Server\u003c/code\u003e 和 \u003ccode\u003eScheduler\u003c/code\u003e ,它们相互紧密协作,每个部分负责不同的工作职责。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003econtroller-manager\u003c/code\u003e 全称为 kube-controler-manager 组件,主要用来负责容器编排。如一个容器(实际上是 pod,pod 是最基本的调度单元。一般一个 pod 里会部署一个容器服务)服务可以指定副本数量,如果实际运行的副本数据与期望的不一致,则会自动再启动几个容器副本,最终实现期望的数量。这个组件,就是一系列控制器的集合。我们可以 …\u003c/li\u003e\u003c/ul\u003e"
March 28, 2020
k8s中的Service与Ingress
"\u003cp\u003e集群中的服务要想向外提供服务,就不得不提到Service和Ingress。 下面我们就介绍一下两者的区别和关系。\u003c/p\u003e\n\u003ch1 id=\"service\"\u003eService\u003c/h1\u003e\n\u003cp\u003e必须了解的一点是对 Service 的访问只有在 Kubernetes 集群内有效,而在集群之外是无效的。\u003c/p\u003e\n\u003cp\u003eService可以看作是一组提供相同服务的Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡。对于Service 的工作原理请参考\u003c/p\u003e\n\u003cp\u003e当需要从集群外部访问k8s里的服务的时候,方式有四种:\u003ccode\u003eClusterIP\u003c/code\u003e(默认)、\u003ccode\u003eNodePort\u003c/code\u003e、\u003ccode\u003eLoadBalancer\u003c/code\u003e、\u003ccode\u003eExternalName\u003c/code\u003e 。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e下面我们介绍一下这几种方式的区别\u003c/strong\u003e\u003c/p\u003e\n\u003ch2 id=\"一clusterip\"\u003e\u003cstrong\u003e一、ClusterIP\u003c/strong\u003e\u003c/h2\u003e\n\u003cp\u003e该方式是指通过集群的内部 IP 暴露服务,但此服务只能够在集群内部可以访问,这种方式也是默认的 ServiceType。\u003c/p\u003e\n\u003cp\u003e我们先看一下最简单的Service定义\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eapiVersion: v1\nkind: Service\nmetadata:\n name: hostnames\nspec:\n selector:\n app: hostnames\n ports:\n - name: …\u003c/code\u003e\u003c/pre\u003e"
March 28, 2020
mac下利用minikube安装Kubernetes环境
"\u003cp\u003e本机为mac环境,安装有brew工具,所以为了方便这里直接使用brew来安装minikube工具。同时本机已经安装过VirtualBox虚拟机软件。\u003c/p\u003e\n\u003cp\u003eminikube是一款专门用来创建k8s 集群的工具。\u003c/p\u003e\n\u003ch2 id=\"一安装minikube\"\u003e一、安装minikube\u003c/h2\u003e\n\u003cp\u003e参考 , 在安装minkube之前建议先了解一下minikube需要的环境。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e先安装一个虚拟化管理系统,如果还未安装,则在 HyperKit、VirtualBox 或 VMware Fusion 三个中任选一个即可,这里我选择了VirtualBox。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e如果你想使用hyperkit的话,可以直接执行 \u003cstrong\u003ebrew install hyperkit\u003c/strong\u003e 即可。\u003c/p\u003e\n\u003cp\u003e对于支持的driver_name有效值参考, 目前\u003cstrong\u003edocker\u003c/strong\u003e尚处于实现阶段。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ brew install minikube\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e查看版本号\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ minikube version\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eminikube version: v1.8.2\ncommit: eb13446e786c9ef70cb0a9f85a633194e62396a1\u003c/p\u003e\n\u003cp\u003e安装kubectl命令行工具\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ brew install kubectl\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"二启动minikube-创建集群\"\u003e二、启 …\u003c/h2\u003e"
January 15, 2020
开发者必知redis知识点
"\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e剖析Redis常用数据类型对应的数据结构 \u003ca href=\"https://time.geekbang.org/column/article/79159\"\u003ehttps://time.geekbang.org/column/article/79159\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eredis中的COW(Copy-On-Write) \u003ca href=\"https://www.jianshu.com/p/b2fb2ee5e3a0\"\u003ehttps://www.jianshu.com/p/b2fb2ee5e3a0\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eredis常用有哪些数据类型及每种数据类型的使用场景有哪些 \u003ca href=\"https://www.cnblogs.com/tqlin/p/10478459.html\"\u003ehttps://www.cnblogs.com/tqlin/p/10478459.html\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e如果存储一个JSON数据时,选择hash还是string 存储数据? \u003ca href=\"https://segmentfault.com/a/1190000019552836\"\u003ehttps://segmentfault.com/a/1190000019552836\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eredis与memcache的区别 \u003ca href=\"https://www.cnblogs.com/JavaBlackHole/p/7726195.html\"\u003ehttps://www.cnblogs.com/JavaBlackHole/p/7726195.html\u003c/a\u003e \u003ca href=\"https://blog.csdn.net/qq_34126805/article/details/81748107\"\u003ehttps://blog.csdn.net/qq_34126805/article/details/81748107\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eredis支持多CPU吗?如何发挥多cpu? …\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e"
October 18, 2019
一致性哈希算法及其在分布式系统中的应用(推荐)
"\u003ch1 id=\"摘要\"\u003e摘要\u003c/h1\u003e\n\u003cp\u003e本文将会从实际应用场景出发,介绍一致性哈希算法(Consistent Hashing)及其在分布式系统中的应用。首先本文会描述一个在日常开发中经常会遇到的问题场景,借此介绍一致性哈希算法以及这个算法如何解决此问题;接下来会对这个算法进行相对详细的描述,并讨论一些如虚拟节点等与此算法应用相关的话题。\u003c/p\u003e\n\u003ch1 id=\"分布式缓存问题\"\u003e分布式缓存问题\u003c/h1\u003e\n\u003cp\u003e假设我们有一个网站,最近发现随着流量增加,服务器压力越来越大,之前直接读写数据库的方式不太给力了,于是我们想引入Memcached作为缓存机制。现在我们一共有三台机器可以作为Memcached服务器,如下图所示。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/1.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e很显然,最简单的策略是将每一次Memcached请求随机发送到一台Memcached服务器,但是这种策略可能会带来两个问题:一是同一份数据可能被存在不同的机器上而造成数据冗余,二是有可能某数据已经被缓存但是访问却没有命中,因为无法保证对相同key的所有访问都被发送到相同的服务器。因此,随机策略无论是时间效率还是空间效率都非常不好。\u003c/p\u003e\n\u003cp\u003e要解决上述问题只需做到如下一点:保证对相同key的访问会被发送到相同的服务器。很多方法可以实现这一点,最常用的方法是计算哈希。例 …\u003c/p\u003e"
August 31, 2019
Redis 选择hash还是string 存储数据?
"\u003cp\u003e在Redis中存储数据时,经常使用string和hash这两种类型,至于这两者有什么不同,底层实现有何区别,推荐参考: \u003ca href=\"https://segmentfault.com/a/1190000019552836\"\u003ehttps://segmentfault.com/a/1190000019552836\u003c/a\u003e\u003c/p\u003e"
July 29, 2019
kubernetes dashboard向外网提供服务
"\u003cp\u003e目前新版本的 kubernetes dashboard ()安装了后,为了安全起见,默认情况下已经不向外提供服务,只能通过 \u003ca href=\"http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/\"\u003e\u003ccode\u003ehttp://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/\u003c/code\u003e\u003c/a\u003e 本机访问。在我们学习过程中,总有些不方便,这时我们可以利用 \u003ccode\u003ekubectl proxy\u003c/code\u003e 命令来实现。\u003c/p\u003e\n\u003cp\u003e首先我们看一下此命令的一些想着参数\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e➜ ~ kubectl proxy -h\nTo proxy all of the kubernetes api and nothing else, use:\n\n $ kubectl proxy --api-prefix=/\n\nTo proxy only part of the kubernetes api and also some static files:\n\n $ kubectl proxy --www=/my/files --www-prefix=/static/ --api-prefix=/api/\n\nThe above …\u003c/code\u003e\u003c/pre\u003e"
July 28, 2019
RabbitMQ常见面试题
"\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.rabbitmq.com/getstarted.html\"\u003eRabbitMq的消息类型(6种)\u003c/a\u003e、 \u003ca href=\"https://blog.haohtml.com/archives/15285\"\u003e消息确认机制\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRabbitMq中的概念及解释\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cul\u003e\n\u003cli\u003e \u003ccode\u003eServer(Broker)\u003c/code\u003e: 接收客户端连接,实现AMQP协议的消息队列和路由功能的进程;\u003c/li\u003e\n\u003cli\u003e \u003ccode\u003eVirtual Host\u003c/code\u003e:虚拟主机的概念,类似权限控制组,一个Virtual Host里可以有多个Exchange和Queue。\u003c/li\u003e\n\u003cli\u003e \u003ccode\u003eExchange\u003c/code\u003e: 交换机,接收生产者发送的消息,并根据Routing Key将消息路由到服务器中的队列Queue。\u003c/li\u003e\n\u003cli\u003e \u003ccode\u003eExchangeType\u003c/code\u003e: 交换机类型决定了路由消息行为,RabbitMQ中有四种类型Exchange,分别是\u003ccode\u003efanout\u003c/code\u003e、\u003ccode\u003edirect\u003c/code\u003e、\u003ccode\u003etopic\u003c/code\u003e 和 \u003ccode\u003eheaders\u003c/code\u003e;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eQueue\u003c/code\u003e:消息队列,用于存储还未被消费者消费的消息;\u003c/li\u003e\n\u003cli\u003e \u003ccode\u003eMessage\u003c/code\u003e:由Header和body组成,Header是由生产者添加的各种属性的集合,包括Message是否被持久化、优先级是多少、由哪个Message Queue接收等;body是真正需要发送的数据内容;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eBindingKey\u003c/code\u003e:绑定关键字,将一个特定的 \u003ccode\u003eExchange\u003c/code\u003e 和一个特定的 \u003ccode\u003eQueue\u003c/code\u003e 绑定起来。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e2. …\u003c/p\u003e"
July 28, 2019
rabbitmq消息队列的消息持久化机制
"\u003cp\u003e首先阅读这篇文章: \u003ca href=\"https://blog.csdn.net/yongche_shi/article/details/51500534\"\u003ehttps://blog.csdn.net/yongche_shi/article/details/51500534\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e之前其实已经写过一篇关于RabbitMQ持久化的 \u003ca href=\"http://jzhihui.iteye.com/blog/1642324\"\u003e文章\u003c/a\u003e ,但那篇文章侧重代码层面的写入流程,对于持久化操作何时发生以及什么时候会刷新到磁盘等问题其实都没有搞清楚,这篇文章着重于关注这些问题。\u003c/p\u003e\n\u003ch2 id=\"消息什么时候需要持久化\"\u003e消息什么时候需要持久化?\u003c/h2\u003e\n\u003cp\u003e根据 \u003ca href=\"http://www.rabbitmq.com/blog/2011/01/20/rabbitmq-backing-stores-databases-and-disks/\"\u003e官方博文\u003c/a\u003e 的介绍,RabbitMQ在两种情况下会将消息写入磁盘:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e消息本身在 \u003ccode\u003epublish\u003c/code\u003e 的时候就要求消息写入磁盘;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e内存紧张\u003c/code\u003e 需要将部分内存中的消息转移到磁盘;\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"消息什么时候会刷到磁盘\"\u003e消息什么时候会刷到磁盘?\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e写入文件前会有一个Buffer,大小为1M(1048576),数据在写入文件时,首先会写入到这个Buffer,如果Buffer已满,则会将Buffer写入到文件(未必刷到磁盘);\u003c/li\u003e\n\u003cli\u003e有个固定的刷盘时间:25ms,也就是不管Buffer满不满,每隔25ms,Buffer里的数据及未刷新到磁盘的文件内容必定会刷到磁盘;\u003c/li\u003e\n\u003cli\u003e每次消息写入后,如果没有后续写入请求,则会直接将已写入的消息刷到磁盘:使用Erlang的receive x after 0 …\u003c/li\u003e\u003c/ol\u003e"
July 26, 2019
docker exec 命令原理
"\u003cp\u003e我们经常使用 docker exec 命令进入到一个容器里进行一些操作,那么这个命令是如果进入到容器里的呢?想必大家都知道用到了Namespace来实现,但至于底层实现原理是什么,想必都不是特别清楚吧。\u003c/p\u003e\n\u003cp\u003e我们知道容器的本质其实就是一个进程,每个进程都有一个Pid,至于容器的Pid值可以通过 docker inspect container_id 来查看,我们这里是一个Python应用容器,我们看一下他的 Pid值\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003edocker inspect --format \u0026#39;{{ .State.Pid }}\u0026#39; 4ddf4638572d\n25686\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e而每个进程都有自己的Namespace,你可以通过查看宿主机的 proc 文件,看到这个 25686 进程的所有 Namespace 对应的文件\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003els -l /proc/25686/ns\ntotal 0\nlrwxrwxrwx 1 root root 0 Aug 13 14:05 cgroup -\u0026gt; cgroup:[4026531835]\nlrwxrwxrwx 1 root root 0 Aug 13 14:05 ipc …\u003c/code\u003e\u003c/pre\u003e"
July 26, 2019
docker中的命名空间
"\u003cp\u003eNamespace 的作用是“隔离”,它让应用进程只能看到该Namespace 内的“世界”;而 Cgroups 的作用是“限制”,它给这个“世界”围上了一圈看不见的墙。\u003c/p\u003e\n\u003cp\u003e命名空间是 Linux 内核一个强大的特性。每个容器都有自己单独的命名空间,运行在其中的应用都像是在独立的操作系统中运行一样。命名空间保证了容器之间彼此互不影响。\u003c/p\u003e\n\u003cp\u003e在docker中一共有以下几个命名空间,每个Namespace的发挥着不同的作用。\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/docker-namespace.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003ch3 id=\"pid-命名空间\"\u003epid 命名空间\u003c/h3\u003e\n\u003cp\u003e不同用户的进程就是通过 pid 命名空间隔离开的,且不同命名空间中可以有相同 pid。在同一个Namespace中只能看到当前命名空间的进程。所有的 LXC 进程在 Docker 中的父进程为Docker进程,每个 LXC 进程具有不同的命名空间。同时由于允许嵌套,因此可以很方便的实现嵌套的 Docker 容器。\u003c/p\u003e\n\u003ch3 id=\"net-命名空间\"\u003enet 命名空间\u003c/h3\u003e\n\u003cp\u003e有了 pid 命名空间, 每个命名空间中的 pid 能够相互隔离,但是网络端口还是共享 host 的端口。网络隔离是通过 net 命名空间实现的, 每个 net 命名空间有独立的 网络设备, IP 地址, 路由表, …\u003c/p\u003e"
July 13, 2019
docker容器调试利器nicolaka/netshoot
"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e在日常工作中,我们一般会将容器进行精简,将其大小压缩到最小,以此来提高容器部署效率,参考\u003ca href=\"https://mp.weixin.qq.com/s/S1Ib08SpQbf1SCbCutUoqQ\"\u003e小米云技术 – Docker最佳实践:5个方法精简镜像\u003c/a\u003e。但有一个比较尴尬的问题就是对容器排障,由于容器里没有了我们日常工作中用到许多排障命令,如top、ps、netstat等,所以想排除故障的话,常用的做法是安装对应的命令,如果容器过多的话,再这样搞就有些麻烦了,特别是在一些安装包源速度很慢的情况。\u003c/p\u003e\n\u003ch2 id=\"解决方案\"\u003e解决方案\u003c/h2\u003e\n\u003cp\u003e今天发现一篇文章(\u003ca href=\"http://www.dockone.io/article/9032\"\u003e简化 Pod 故障诊断:kubectl-debug 介绍\u003c/a\u003e)介绍针对此类问题的解决方案的,这里介绍的是一个叫做 \u003ccode\u003ekubectl-debug\u003c/code\u003e 的命令,由国内知名的PingCAP公司出品的,主要用在k8s环境中的。我们知道容器里主要两大技术,一个是用\u003cstrong\u003ecgroup来实现容器资源的限制\u003c/strong\u003e,一个是用\u003cstrong\u003eNamespace来实现容器的资源隔离的\u003c/strong\u003e)。(kubectl-debug 命令是基于一个工具包() 来实现的,其原理是利用将一个工具包容器添加到目标容器所在的Pod里,实现和目标容器的Network Namespace一致,从而达到对新旧容器进程的相互可见性,这样我们就可以直接在目标容器里 …\u003c/p\u003e"
July 12, 2019
基于docker环境实现Elasticsearch 集群环境
"\u003cp\u003e最近搭建了es集群的时候,现在需要测试添加一个新的数据节点,项目是使用docker-compose命令来搭建的。\u003c/p\u003e\n\u003cp\u003e以下基于最新版本 es7.2.0进行, 配置文件目录为 es, 所以docker 在创建网络的时候,网络名称会以 es_ 前缀开始,如本例中我们在docker-composer.yaml文件中指定了网络名称为esnet,但docker生成的实例名称为 es_esnet,至于网络相关的信息可以通过 \u003ccode\u003edocker network --help\u003c/code\u003e 查看。\u003c/p\u003e\n\u003ch2 id=\"搭建es集群\"\u003e搭建es集群\u003c/h2\u003e\n\u003cp\u003e// docker-compose.yaml 集群配置文件\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eversion: \u0026#39;2.2\u0026#39;\nservices:\n es01:\n image: docker.elastic.co/elasticsearch/elasticsearch:7.2.0\n container_name: es01\n environment:\n - node.name=es01\n - node.master=true\n - node.data=true\n - …\u003c/code\u003e\u003c/pre\u003e"
July 10, 2019
kafka常用术语
"\u003cp\u003e官方网站:,中文: \u003ca href=\"http://kafka.apachecn.org/\"\u003ehttp://kafka.apachecn.org/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e注意它和其它消息系统(消息队列)在\u003cstrong\u003e定义\u003c/strong\u003e上的区别,以便更好的理解它的应用场景。\u003cstrong\u003eApache Kafka 是一款分布式流处理平台(Distributed Streaming Platform)\u003c/strong\u003e。\u003c/p\u003e\n\u003ch2 id=\"术语\"\u003e术语\u003c/h2\u003e\n\u003cp\u003e消息:Record。消息实体,是通信的基本单位。\n主题:Topic。主题是承载消息的\u003cstrong\u003e逻辑容器\u003c/strong\u003e,在实际使用中多用来区分具体的业务。\n分区:Partition。一个\u003cstrong\u003e有序不变\u003c/strong\u003e的消息序列。每个主题Topic下可以有多个分区。\n消息位移:Offset。表示分区中每条消息的位置信息,是一个\u003cstrong\u003e单调递增\u003c/strong\u003e且不变的值。\n缓存代理,Broker。Kafka集群中的一台或多台服务器统称broker。\n副本:Replica。Kafka 中同一条消息能够被拷贝到多个地方以提供数据冗余,这些地方就是所谓的副本。\u003cstrong\u003e\u003cem\u003e副本还分为领导者副本和追随者副本\u003c/em\u003e\u003c/strong\u003e,各自有不同的角色划分。副本是在分区层级下的,即每个分区可配置多个副本实现高可用。\n生产者:Producer。向主题发布新消息的应用程序。\n消费者:Consumer。从主题订阅新消息的应用程序。\n消费者位 …\u003c/p\u003e"
July 3, 2019
ES集群的高可用性之节点
"\u003cp\u003e为了防止ES集群中单点问题,一般都需要对集群节点做高可用性,当发生单点问题时,也可以向外正常提供服务。这里主要记录一下节点的加入、离开和主节点选举。\u003c/p\u003e\n\u003cp\u003e集群安装教程请参考:\u003c/p\u003e\n\u003ch2 id=\"节点角色\"\u003e节点角色\u003c/h2\u003e\n\u003cp\u003e集群是由多个节点组成的,每个节点都扮演着不同的角色,一般常用的有 Master、Data 和 client。节点角色介绍:\u003c/p\u003e\n\u003cp\u003e节点角色配置参数:\nnode.master: true\nnode.data: false\nnode.ingest: false\u003c/p\u003e\n\u003cp\u003e在一个集群中,可以通过 查看到每个节点在集群中扮演的角色,一个节点可同时拥有多个角色,如值MDI,同时也是每个节点的默认值,其中的 Ingest 节点也称作\u003cstrong\u003e预处理节点\u003c/strong\u003e,不过在生产环境中一般将master 和 data节点分开的。所有节点默认都是支持 Ingest 操作的。节点组合参考:\u003c/p\u003e\n\u003ch2 id=\"新节点的加入\"\u003e新节点的加入\u003c/h2\u003e\n\u003cp\u003e随着数量大的增加,有时候我们不得进行机器的扩容,这时间就需要加入一些新的机器节点,用来提高访问速度。\u003c/p\u003e\n\u003cp\u003e当一个新节点加入的时候,它通过读取 \u003ccode\u003ediscovery.zen.ping.unicast.hosts\u003c/code\u003e 配置的节点获取集群状态,然后找到 \u003ccode\u003emaster\u003c/code\u003e 节点,并向 …\u003c/p\u003e"
July 2, 2019
docker容器 Exited (137)错误代码
"\u003cp\u003e最近要搭建es集群,由于刚接触es不久,直接使用的docker构建,发现当用两个容器搭建好集群时,再添加新的es容器节点时,总是出现其它容器被kill的现象,查看容器日志未发现任何错误信息,导致一段时间非常的迷茫。\u003c/p\u003e\n\u003cp\u003e起始认为是配置不当引起了,于是一直在配置这方面找问题,网上的有些教程是直接在物理机器上或者虚拟机上进行部署,而自己的环境是docker, 通过 docker-compose 来部署的,\b环境有些差异。\u003c/p\u003e\n\u003cp\u003e有网友提醒有可能是由 OOM 引起的问题,因为代码是137, 使用命令 “\u003ccode\u003edocker inspect 容器ID\u003c/code\u003e” 查看了一下容器, status列显示”\u003ccode\u003eOOMKilled\u0026quot;: false\u003c/code\u003e” ,所以从这里查看的话,并非是 OOM 引起的,起初个人分析容器的启动过程,是在启动一个容器时,dockerd应该先检查内存是否足够,如果不足够的话,则启动新窗口失败才对,而不是先将已存在的窗口killed,再去启动新容器,所以仍将OOM的原因排除掉了。\u003c/p\u003e\n\u003cp\u003e后来\b发现一篇文章 介绍到这个和 docker for mac 分配的内存大小有关系,试着将给 docker 分配的内存调整 …\u003c/p\u003e"
January 26, 2019
docker中将MySQL运行在容器中失败提示“ InnoDB : Error 22 with aio_write”的解决办法
"\u003cp\u003e今天利用docker容器创建mysql8.0的时候(window系统),指定了本地宿主机器的一个目录为容器mysql的datadir目录,发现创建失败了。\u003c/p\u003e\n\u003cp\u003e创建命令:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ docker run -d --name mysql81 -v /e/container/mysql/mysql81/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -p 33081:3306 mysql\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e错误提示:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ docker logs mysql81\n2019-01-26T03:05:42.567230Z 0 [Warning] [MY-011070] [Server] \u0026#39;Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it\u0026#39; is deprecated and will be removed in a future release. …\u003c/code\u003e\u003c/pre\u003e"
January 15, 2019
docker build . 命令后面的.是什么意思
"\u003cp\u003e今天来公司自己构建了一个Dockerfile,放在一个经常用到的项目目录里,内容如下:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# This is a comment\nFROM ubuntu:14.04\nMAINTAINER Docker Newbee \u0026lt;newbee@docker.com\u0026gt;\nRUN apt-get -qq update\nRUN apt-get -qqy install ruby ruby-dev\nRUN gem install sinatra\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e然后执行\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esudo docker build -t \u0026#34;cfanbo/test:v2\u0026#34; .\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e发现在构建的时候发送给 docker daemon 竟然有4G多,超极大。首先的第一反映出问题了。一个ubuntu镜像也没有这么大呀,况且现在还没有开始从远程pull 镜像呢。\u003c/p\u003e\n\u003cp\u003e那到底什么情况了呢?经过一翻搜索,发现在docker build . 的时候,会将当前目录里的内容发送给 docker daemon。只需要加一个 .dockerignore 文件,将其它内容排除掉就可以了,类似于git中的.gitignore文件的作用。\u003c/p\u003e\n\u003cp\u003e后面就想通 …\u003c/p\u003e"
October 20, 2018
分布式系统与消息的投递(转)
"\u003cp\u003e\u003ca href=\"https://mp.weixin.qq.com/s/ZLzwQAIG6ZL88ohusOyxIQ\"\u003ehttps://mp.weixin.qq.com/s/ZLzwQAIG6ZL88ohusOyxIQ\u003c/a\u003e\u003c/p\u003e"
October 13, 2018
Heap And Stack 堆与栈的区别
"\u003cp\u003e\u003cstrong\u003e堆与栈的区别\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e推荐: \u003ca href=\"https://www.programmerinterview.com/index.php/data-structures/difference-between-stack-and-heap/\"\u003ehttps://www.programmerinterview.com/index.php/data-structures/difference-between-stack-and-heap/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e栈是上下顺序存储的,且“先进后出LIFO”规则,只能删除顶部的元素,而堆是没有特定的顺序的存储,您可以删除任意元素。堆分配需要维护分配的内存和未分配的内存的完整记录,以及一些开销维护以减少碎片,找到足够大以适应请求大小的连续内存段,等等。内存可以随时释放,留出自由空间。有时,内存分配器将执行维护任务,比如通过将分配的内存到处移动来对内存进行碎片整理,或者在运行时进行垃圾收集——当内存不再处于作用域中时对其进行标识并释放它。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e栈用在线程中,程序执行时由线程创建有限数量的栈空间,当线程结束的时候会自动回收,属于系统级。\n堆一般是由应用程序在启动时创建,由应用程序回收,属于应用级。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe stack is attached to a thread, so when the thread exits the stack is reclaimed. The heap is …\u003c/p\u003e\u003c/blockquote\u003e"
October 11, 2018
raft一致性算法动画演示
"\u003cp\u003e\u003ca href=\"http://thesecretlivesofdata.com/raft/\"\u003ehttp://thesecretlivesofdata.com/raft/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://raft.github.io/raft.pdf\"\u003eThe Raft Paper\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eraft算法中文版: \u003ca href=\"https://github.com/maemual/raft-zh_cn/blob/master/raft-zh_cn.md\"\u003ehttps://github.com/maemual/raft-zh_cn/blob/master/raft-zh_cn.md\u003c/a\u003e\u003c/p\u003e"
October 11, 2018
Kubernetes学习资源
"\u003cp\u003e\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2021/04/1f57f5934f4db11b6e9e473ffd043b03.jpeg\" alt=\"\"\u003ek8s guide\u003c/p\u003e\n\u003ch2 id=\"准备\"\u003e准备\u003c/h2\u003e\n\u003cp\u003e对于一个新手来说,第一步是必须了解什么是 \u003ca href=\"https://kubernetes.io/zh/docs/concepts/overview/what-is-kubernetes/\"\u003ekubernetees\u003c/a\u003e、 \u003ca href=\"https://kubernetes.io/zh/docs/concepts/architecture/\"\u003e设计架构\u003c/a\u003e 和相关 \u003ca href=\"https://kubernetes.io/zh/docs/concepts/\"\u003e概念\u003c/a\u003e。只有在了解了这些的情况下,才能更好的知道k8s中每个组件的作用以及它解决的问题。\u003c/p\u003e\n\u003ch2 id=\"安装工具\"\u003e安装工具\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://minikube.sigs.k8s.io/\"\u003eminikube\u003c/a\u003e 参考 \u003ca href=\"https://minikube.sigs.k8s.io/docs/start/\"\u003ehttps://minikube.sigs.k8s.io/docs/start/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://kind.sigs.k8s.io/docs/\"\u003ekind\u003c/a\u003e 参考 \u003ca href=\"https://kind.sigs.k8s.io/docs/user/quick-start/\"\u003ehttps://kind.sigs.k8s.io/docs/user/quick-start/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e以上是安装k8s环境的两种推荐方法,这里更推荐使用kind。主要原因是 \u003ccode\u003eminikube\u003c/code\u003e 只支持单个节点,而 \u003ccode\u003ekind\u003c/code\u003e 可以支持多个节点,这样就可以实现在一台电脑上部署的环境与生产环境一样,方便大家学习。\u003c/p\u003e\n\u003cp\u003e要实现管理控制 Kubernetes 集群资源如pod、node、service等的管理,还必须安装一个命令工具 \u003ca href=\"https://kubernetes.io/zh/docs/reference/kubectl/kubectl/\"\u003ekubectl\u003c/a\u003e ,请参考: \u003ca href=\"https://kubernetes.io/zh/docs/tasks/tools/\"\u003ehttps://kubernetes.io/zh/docs/tasks/tools/\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"学习文档\"\u003e学习文档\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eKubernetes 文档 \u003ca href=\"https://kubernetes.io/zh/docs/home/\"\u003ehttps://kubernetes.io/zh/docs/home/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ePlay with …\u003c/li\u003e\u003c/ul\u003e"
September 29, 2018
kubernetes中apiserver的证书
"\u003cp\u003e在kubernetes中,与api server 通讯时一般都需要使用https证书,这些证书文件存在放 /etc/kubernetes/pki 目录中(ubuntu)。主要有以下几种\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e/etc/kubernetes/pki/ca.{crt,key}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e如果你已有现成的证书也可以直接将证书复制到这个目录里即可。这时kubeadm就会跳过证书生成这个步骤。\u003c/p\u003e\n\u003cp\u003e证书生成后,kubeadm 接下来会为其它组件生成访问api server 所需要的配置文件,这些文件路径为: /etc/kubernetes/xxx.conf:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003els /etc/kubernetes/\nadmin.conf controller-manager.conf kubelet.conf scheduler.conf\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这里可以看到这四个配置文件,分别 为不同的组件之间提供配置。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/kubernetes-master.jp\"\u003e\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/kubernetes-master.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e这些配置文件中存储的是Master节点的ip地址、端口号、证书目录等信息。这样对应的客户端(scheduler,kubelet, controller-manager等)就可以直接加载并读取相应的配置文件来与kube-apiserver 建立安全连 …\u003c/p\u003e"
August 1, 2018
Redis中的锁
"\u003cp\u003e单Redis实例锁: \u003ca href=\"http://www.redis.cn/commands/setnx.html\"\u003ehttp://www.redis.cn/commands/setnx.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e分布式锁: \u003ca href=\"http://redis.cn/topics/distlock.html\"\u003ehttp://redis.cn/topics/distlock.html\u003c/a\u003e(提供各种开发语言提供的库)\u003c/p\u003e"
July 10, 2018
使用Dockerfile构建Swoole+php7环境
"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eFROM php:7.2.7-cli\nRUN apt-get update \n \u0026amp;\u0026amp; apt-get install -y libmemcached-dev zlib1g-dev\nRUN pecl install redis-4.0.1 \n \u0026amp;\u0026amp; pecl install swoole-4.0.1 \n \u0026amp;\u0026amp; pecl install memcached-3.0.4 \n \u0026amp;\u0026amp; pecl install xdebug-2.6.0 \n \u0026amp;\u0026amp; docker-php-ext- enable redis swoole memcached xdebug\nCOPY . /usr/src/myapp\nWORKDIR /usr/src/myapp\nCMD [ \u0026#34;php\u0026#34;, \u0026#34;-m\u0026#34; ]\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e构建完环境后,使用方法见: \u003ca href=\"https://blog.haohtml.com/archives/17925\"\u003ehttps://blog.haohtml.com/archives/17925 …\u003c/a\u003e\u003c/p\u003e"
July 5, 2018
一个docker-compose微服务脚本,自用
"\u003cp\u003e容器为swoole+php7\u003c/p\u003e\n\u003cp\u003edocker-compose.yml\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eversion: \u0026#39;3.6\u0026#39;\nservices:\n redis:\n image: redis\n web:\n image: cfanbo/swoole4_php7:v1\n depends_on:\n - redis\n links:\n - redis\n volumes:\n - /Users/sxf/sites/msgserve:/usr/src/myapp\n command: \u0026#34;php /usr/src/myapp/src/wx_push_server.php start\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e对于 wx_push_server.php文件里redis的主机地址应该写成docker-compose配置文件里的容器服务名(redis)\u003c/p\u003e"
June 15, 2018
服务发现:Zookeeper vs etcd vs Consul vs Eureka
"\u003cp\u003e\u003ca href=\"https://studygolang.com/articles/4837\"\u003ehttps://studygolang.com/articles/4837\u003c/a\u003e \u003ca href=\"https://blog.csdn.net/dengyisheng/article/details/71215234\"\u003ehttps://blog.csdn.net/dengyisheng/article/details/71215234\u003c/a\u003e\u003c/p\u003e"
June 13, 2018
分布式事务XA解决方案之两阶段提交(2PC)
"\u003cp\u003e对于三阶段提交请参考:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/binyue/p/3678390.html\"\u003ehttps://www.cnblogs.com/binyue/p/3678390.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/charlesblc/p/6289348.html\"\u003ehttps://www.cnblogs.com/charlesblc/p/6289348.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e在 \u003ca href=\"https://zh.wikipedia.org/wiki/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C\" title=\"计算机网络\"\u003e计算机网络\u003c/a\u003e 以及 \u003ca href=\"https://zh.wikipedia.org/wiki/%E6%95%B0%E6%8D%AE%E5%BA%93\" title=\"数据库\"\u003e数据库\u003c/a\u003e 领域内, \u003cstrong\u003e二阶段提交\u003c/strong\u003e(英语:Two-phase Commit)是指,为了使基于 \u003ca href=\"https://zh.wikipedia.org/wiki/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F\" title=\"分布式系统\"\u003e分布式系统\u003c/a\u003e 架构下的所有节点在进行 \u003ca href=\"https://zh.wikipedia.org/wiki/%E6%95%B0%E6%8D%AE%E5%BA%93%E4%BA%8B%E5%8A%A1\" title=\"数据库事务\"\u003e事务\u003c/a\u003e 提交时保持一致性而设计的一种 \u003ca href=\"https://zh.wikipedia.org/wiki/%E7%AE%97%E6%B3%95\" title=\"算法\"\u003e算法\u003c/a\u003e(Algorithm)。通常, \u003cstrong\u003e二阶段提交\u003c/strong\u003e 也被称为是一种 \u003cstrong\u003e协议\u003c/strong\u003e(Protocol)。在分布式系统中,每个节点虽然可以知晓自己的操作时成功或者失败,却无法知道其他节点的操作的成功或失败。当一个事务跨越多个节点时,为了保持事务的 \u003ca href=\"https://zh.wikipedia.org/wiki/ACID\" title=\"ACID\"\u003eACID\u003c/a\u003e 特性,需要引入一个作为 \u003cstrong\u003e协调者\u003c/strong\u003e 的组件来统一掌控所有节点(称作 \u003cstrong\u003e参与者\u003c/strong\u003e)的操作结果并最终指示这些节点是否要把操作结果进行真正的提交(比如将更新后的数据写入磁盘等等)。因此,二阶段提交的算法思路可以概括为: \u003cstrong\u003e参与者将操作成败通知协调者,再由协调者根据所有参与者的反馈情报决定各参与者是否要提交操作还是中止操作。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e需要注意的是, \u003cstrong\u003e二阶段提交\u003c/strong\u003e(英文缩写: \u003cstrong\u003e2PC\u003c/strong\u003e)不 …\u003c/p\u003e"
April 20, 2018
使用docker-compose 快速创建一个mysql 数据库容器
"\u003cp\u003e\u003cstrong\u003e//创建一个独立的容器目录\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emkdir docker-db\ncd docker-db\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003e前提、创建 docker Compose 配置文件\u003c/strong\u003e\n#vi docker-compose.yml 文件,内容如下\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eversion: \u0026#39;3.6\u0026#39;\nservices:\n\n db:\n image: hub.c.163.com/library/mysql:5.7\n restart: always\n environment:\n MYSQL_ROOT_PASSWORD: 123456\n MYSQL_DATABASE: wordpress\n MYSQL_USER: root\n MYSQL_PASSWORD: 123456\n MYSQL_ALLOW_EMPTY_PASSWORD: \u0026#34;yes\u0026#34;\n ports:\n - \u0026#34;33061:3306\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eimage也可以直接写mysql:5.7 …\u003c/p\u003e"
February 8, 2018
Docker Machine 简介
"\u003cp\u003e一句话概括的话就是 Docker Machine是一个可以方便对多个宿主服务器中的多个容器进行管理的工具。\u003c/p\u003e\n\u003cp\u003eDocker 与 Docker Machine 的区别 \u003ca href=\"https://www.cnblogs.com/sparkdev/p/7066789.html\"\u003ehttps://www.cnblogs.com/sparkdev/p/7066789.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eDocker Machine 工具出现的意义 \u003ca href=\"https://www.2cto.com/net/201707/660864.html\"\u003ehttps://www.2cto.com/net/201707/660864.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eDocker Machine 用法 \u003ca href=\"http://www.linuxidc.com/Linux/2017-06/145232.htm\"\u003ehttp://www.linuxidc.com/Linux/2017-06/145232.htm\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eDocker Machine 命令 \u003ca href=\"http://blog.csdn.net/warren_1992/article/details/51451522\"\u003ehttp://blog.csdn.net/warren_1992/article/details/51451522\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eMac平台上Docker安装与使用 \u003ca href=\"http://blog.csdn.net/warren_1992/article/details/51451522\"\u003ehttp://blog.csdn.net/warren_1992/article/details/51451522\u003c/a\u003e\u003c/p\u003e"
February 8, 2018
windows平台在dos下执行docker pull 命令出错
"\u003cp\u003e\u003cstrong\u003e这里docker Machine 是安装和管理 Docker 的工具(用来代替Boot2Docker,对于个人玩的话,不建议使用docker Machine,毕竟多了一个虚拟层,不如直接使用当前物理机器作为容器的宿主机)\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ docker pull gitlab/gitlab-ce:latest\n\u003c/code\u003e\u003c/pre\u003e\u003cblockquote\u003e\n\u003cp\u003eWarning: failed to get default registry endpoint from daemon (error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.33/info: open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon configuration on Windows, the docker client must be run elevated to connect. This error may also indicate that the …\u003c/p\u003e\u003c/blockquote\u003e"
November 19, 2017
centos 下安装 certbot 常见问题
"\u003cp\u003e上一篇( \u003ca href=\"https://blog.haohtml.com/archives/17422\"\u003ehttps://blog.haohtml.com/archives/17422\u003c/a\u003e)我们介绍了centos下安装certbot的方法,但有时间服务器环境不一样,总会遇到一些问题,常见问题如下:\u003c/p\u003e\n\u003cp\u003ecentos7.5下安装certbot常见问题\u003c/p\u003e\n\u003cp\u003e一、出错”ImportError: ‘pyOpenSSL’ module missing required functionality. Try upgrading to v0.14 or newer.“\n解决办法:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esudo pip uninstall pyOpenssl\nsudo pip install pyOpenSSL==0.14.0\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e查看版本:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epip show pyOpenssl\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e一、出错信息为“certbot AttributeError: ‘module’ object has no attribute ‘SSL_ST_INIT’”\u003c/p\u003e\n\u003cp\u003e解决办法:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epip uninstall pyOpenSSL\npip install pyOpenSSL==16.2.0\n\u003c/code\u003e\u003c/pre\u003e"
December 12, 2016
使用Gitlab一键安装包后的日常备份恢复与迁移
"\u003ch4 id=\"gitlab-创建备份\"\u003e\u003cstrong\u003eGitlab 创建备份\u003c/strong\u003e\u003c/h4\u003e\n\u003cp\u003e使用Gitlab一键安装包安装Gitlab非常简单, 同样的备份恢复与迁移也非常简单. 使用一条命令即可创建完整的Gitlab备份:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003egitlab-rake gitlab:backup:create\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e使用以上命令会在\u003ccode\u003e/var/opt/gitlab/backups\u003c/code\u003e目录下创建一个名称类似为\u003ccode\u003e1393513186_gitlab_backup.tar\u003c/code\u003e的压缩包, 这个压缩包就是Gitlab整个的完整部分, 其中开头的\u003ccode\u003e1393513186\u003c/code\u003e是备份创建的日期.\u003c/p\u003e\n\u003ch4 id=\"gitlab-修改备份文件默认目录\"\u003e\u003cstrong\u003eGitlab 修改备份文件默认目录\u003c/strong\u003e\u003c/h4\u003e\n\u003cp\u003e你也可以通过修改\u003ccode\u003e/etc/gitlab/gitlab.rb\u003c/code\u003e来修改默认存放备份文件的目录:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003egitlab_rails[\u0026#39;backup_path\u0026#39;] = \u0026#39;/mnt/backups\u0026#39;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode\u003e/mnt/backups\u003c/code\u003e修改为你想存放备份的目录即可, 修改完成之后使用\u003ccode\u003egitlab-ctl reconfigure\u003c/code\u003e命令重载配置文件即可.\u003c/p\u003e\n\u003ch4 id=\"gitlab-自动备份\"\u003e\u003cstrong\u003eGitlab 自动备份\u003c/strong\u003e\u003c/h4\u003e\n\u003cp\u003e也可以通过\u003ccode\u003ecrontab\u003c/code\u003e使用备份命令实现自动备份:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esudo su -\ncrontab -e\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e加入以下, 实现每天凌 …\u003c/p\u003e"
November 4, 2016
在linux下,解决修改文件权限引起的git出现的文件变化问题
"\u003cp\u003e有时候,我们将服务器上的web文件夹的权限进行了修改,但git默认是也会记录权限状态的,这个时间用git status会发现所有的文件都处于被修改的状,这显示不是我们想要的。这时我们只要让git把文件权限忽略掉就可以了。\u003c/p\u003e\n\u003cp\u003e在操作前首先我们确认一下当前配置项core.filemode,默认为true,(也可以使用cat .git/config查看)\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ git config --list\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e然后执行\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ git config core.filemode false\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这样就设置了忽略文件权限。查看下配置:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ cat .git/config\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/git%E5%BF%BD%E7%95%A5%E6%96%87%E4%BB%B6%E6%9D%83%E9%99%90%E7%9A%84%E9%85%8D%E7%BD%AE.png\" alt=\"git%e5%bf%bd%e7%95%a5%e6%96%87%e4%bb%b6%e6%9d%83%e9%99%90%e7%9a%84%e9%85%8d%e7%bd%ae\"\u003e]\ngit忽略文件权限的配置\u003c/p\u003e"
March 15, 2016
给一个正在运行的Docker容器动态添加Volume(转)
"\u003cp\u003e之前有人问我Docker容器启动之后还能否再挂载卷,考虑mnt命名空间的工作原理,我一开始认为这很难实现。不过现在我认为是它实现的。\u003c/p\u003e\n\u003cp\u003e简单来说,要想将磁盘卷挂载到正在运行的容器上,我们需要:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e使用\u003ca href=\"https://github.com/jpetazzo/nsenter\"\u003ensenter\u003c/a\u003e将包含这个磁盘卷的整个文件系统mount到临时挂载点上;\u003c/li\u003e\n\u003cli\u003e从我们想当作磁盘卷使用的特定文件夹中创建绑定挂载(bind mount)到这个磁盘卷的位置;\u003c/li\u003e\n\u003cli\u003eumount第一步创建的临时挂载点。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"注意事项\"\u003e\u003cstrong\u003e注意事项\u003c/strong\u003e\u003c/h4\u003e\n\u003cp\u003e在下面的示例中,我故意包含了$符号来表示这是Shell命令行提示符,以帮助大家区分哪些是你需要输入的,哪些是机器回复的。有一些多行命令,我也继续用\u0026gt;。我知道这样使得例子里的命令无法轻易得被拷贝粘贴。如果你想要拷贝粘贴代码,请查看文章最后的示例脚本。\u003c/p\u003e\n\u003ch4 id=\"详细步骤\"\u003e\u003cstrong\u003e详细步骤\u003c/strong\u003e\u003c/h4\u003e\n\u003cp\u003e下面示例的前提是你已经使用如下命令启动了一个简单的名为charlie的容器:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ docker run --name charlie -ti ubuntu bash\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e我们需要做的是将宿主文件夹 \u003ccode\u003e/home/jpetazzo/Work/DOCKER/docker\u003c/code\u003e 挂载到容器里的 \u003ccode\u003e/src\u003c/code\u003e 目录。好了,让我们开始吧。 …\u003c/p\u003e"
March 30, 2015
亿级用户下的新浪微博平台架构
"\u003ch2 id=\"序言\"\u003e序言\u003c/h2\u003e\n\u003cp\u003e新浪微博在2014年3月公布的月活跃用户(MAU)已经达到1.43亿,2014年新年第一分钟发送的微博达808298条,如此巨大的用户规模和业务量,需要高可用(HA)、高并发访问、低延时的强大后台系统支撑。\u003c/p\u003e\n\u003cp\u003e微博平台第一代架构为LAMP架构,数据库使用的是MyIsam,后台用的是php,缓存为Memcache。\u003c/p\u003e\n\u003cp\u003e随着应用规模的增长,衍生出的第二代架构对业务功能进行了模块化、服务化和组件化,后台系统从php替换为Java,逐渐形成SOA架构,在很长一段时间支撑了微博平台的业务发展。\u003c/p\u003e\n\u003cp\u003e在此基础上又经过长时间的重构、线上运行、思索与沉淀,平台形成了第三代架构体系。\u003c/p\u003e\n\u003cp\u003e我们先看一张微博的核心业务图(如下),是不是非常复杂?但这已经是一个简化的不能再简化的业务图了,第三代技术体系就是为了保障在微博核心业务上快速、高效、可靠地发布新产品新功能。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://static.codeceo.com/images/2015/01/55d1809347e311e238e6a71e3fb726c0.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003ch2 id=\"第三代技术体系\"\u003e第三代技术体系\u003c/h2\u003e\n\u003cp\u003e微博平台的第三代技术体系,使用正交分解法建立模型:在水平方向,采用典型的三级分层模型,即接口层、服务层与资源层;在垂直方向,进一步细分为业务架构、技术架构、监控平台与服务治理平台。下面是平台的整体架构图:\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://static.codeceo.com/images/2015/01/405eb2f493a34eb937bfb32f08a34c12.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e如上图所示,正交分解法将整 …\u003c/p\u003e"
March 28, 2015
用PHP尝试RabbitMQ(amqp扩展)实现消息的发送和接收
"\u003cp\u003e上篇文章我们介绍了 \u003ca href=\"http://blog.haohtml.com/archives/15484\"\u003eamqp扩展在windows下的安装方法\u003c/a\u003e,这里我们看一下用法。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e消费者:接收消息\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e逻辑:\n创建连接–\u0026gt;创建channel–\u0026gt;创建交换机–\u0026gt;创建队列–\u0026gt;绑定交换机/队列/路由键–\u0026gt;接收消息\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\u0026lt;?php\n/*************************************\n* PHP amqp(RabbitMQ) Demo - consumer\n* Author: Linvo\n* Date: 2012/7/30\n*************************************/\n//配置信息\n$conn_args = array(\n \u0026#39;host\u0026#39; =\u0026gt; \u0026#39;192.168.1.93\u0026#39;,\n \u0026#39;port\u0026#39; =\u0026gt; \u0026#39;5672\u0026#39;,\n \u0026#39;login\u0026#39; =\u0026gt; \u0026#39;guest\u0026#39;,\n \u0026#39;password\u0026#39; =\u0026gt; \u0026#39;guest\u0026#39;, …\u003c/code\u003e\u003c/pre\u003e"
March 28, 2015
windows下安装rabbitmq的php扩展amqp(原创)
"\u003cp\u003e从php官方下载相应的版本 \u003ca href=\"http://pecl.php.net/package/amqp\"\u003ehttp://pecl.php.net/package/amqp\u003c/a\u003e,我这里使用的是1.4.0版本( \u003ca href=\"http://pecl.php.net/package/amqp/1.4.0/windows\"\u003ehttp://pecl.php.net/package/amqp/1.4.0/windows\u003c/a\u003e)\n根据当前使用的php版本选择相应的扩展dll,下载后是一个压缩包,里面有两个dll扩展(php_amqp.dll和rabbitmq.1.dll)。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2015/03/php_amqp1.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/php_amqp1.jpg\" alt=\"php_amqp\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e我的环境是64位的,php5.5.12.所以使用的是 \u003ca href=\"http://windows.php.net/downloads/pecl/releases/amqp/1.4.0/php_amqp-1.4.0-5.5-ts-vc11-x64.zip\"\u003ehttp://windows.php.net/downloads/pecl/releases/amqp/1.4.0/php_amqp-1.4.0-5.5-ts-vc11-x64.zip\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e1.将php_amqp.dll放在php的ext目录里,然后修改php.ini文件,在文件的最后面添加两行\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e[amqp\\]\nextension=php_amqp.dll\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e2.将rabbitmq.1.dll文件放在php的根目录里(也就是ext目录的父级目录),然后修改apache的httpd.con文件,文件尾部添加一行\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eLoadFile …\u003c/code\u003e\u003c/pre\u003e"
August 2, 2014
RabbitMQ中的ack介绍
"\u003cp\u003eno_ack 的用途:确保 message 被 consumer “成功”处理了。这里“成功”的意思是,(在设置了 no_ack=false 的情况下)只要 consumer 手动应答了 Basic.Ack ,就算其“成功”处理了。\u003c/p\u003e\n\u003cp\u003e对于ack简单的说就是“消费者”先从queue里读取一条数据,然后去处理,等处理完了,再给queue一个 ack 回应,表示处理完了,这时queue就将这条数据从队列中删除。如果不回应给队列ack的话,则这条消息仍然存在在queue中(这个也属于一种应用场景)。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e在 no_ack=true 的情况下,RabbitMQ 认为 message 一旦被 deliver 出去了,就已被确认了,所以会立即将缓存中的 message 删除。所以在 consumer 异常时会导致消息丢失。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cem\u003e\u003cstrong\u003eno_ack=false\u003c/strong\u003e(此时为 \u003cstrong\u003e手动应答\u003c/strong\u003e)\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e在这种情况下,要求 consumer 在处理完接收到的 Basic.Deliver + Content-Header + Content-Body 之后才回复 Ack 。而这个 Ack 是 AMQP 协议中的 Basic.Ack …\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e"
August 1, 2014
认识 RabbitMQ 消息队列
"\u003ch1 id=\"rabbitmq架构图\"\u003eRabbitMQ架构图\u003c/h1\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2014/08/rabbitmq-struct.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/rabbitmq-struct.png\" alt=\"rabbitmq-struct\"\u003e\u003c/a\u003e rabbitmq 架构图\u003c/p\u003e\n\u003ch1 id=\"基本概念\"\u003e基本\u003cstrong\u003e概念\u003c/strong\u003e\u003c/h1\u003e\n\u003cp\u003e\u003ccode\u003eBroker\u003c/code\u003e:简单来说就是消息队列服务器实体。\n\u003ccode\u003eExchange\u003c/code\u003e:消息交换机,它指定消息按什么规则,路由到哪个队列。\n\u003ccode\u003eQueue\u003c/code\u003e:消息队列载体,每个消息都会被投入到一个或多个队列。\n\u003ccode\u003eBinding\u003c/code\u003e:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。\n\u003ccode\u003eRouting Key\u003c/code\u003e:路由关键字,exchange根据这个关键字进行消息投递。\n\u003ccode\u003evhost\u003c/code\u003e:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。\n\u003ccode\u003eproducer\u003c/code\u003e:消息生产者,就是投递消息的程序。\n\u003ccode\u003econsumer\u003c/code\u003e:消息消费者,就是接受消息的程序。\n\u003ccode\u003echannel\u003c/code\u003e:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。\u003c/p\u003e\n\u003ch1 id=\"操作流程\"\u003e操作流程\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e(1)客户端连接到消息队列服务器,打开一个channel。\u003c/li\u003e\n\u003cli\u003e(2)客户端声明一个exchange,并设置相关属性。\u003c/li\u003e\n\u003cli\u003e(3)客户端声明一个queue,并设置相关属性。\u003c/li\u003e\n\u003cli\u003e(4)客户端使用routing key,在exchange和queue之间建立好绑定关系。\u003c/li\u003e\n\u003cli\u003e(5)客户 …\u003c/li\u003e\u003c/ul\u003e"
August 1, 2014
将rabbitmq 里的消息持久化
"\u003ch2 id=\"消息持久设置\"\u003e消息持久设置:\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e将交换机置为可持久;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e将通道置为可持久\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e消息发送时设置可持久。\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e当我们“生产”了一条可持久化的消息,尝试中断MQ服务,启动消费者获取消息,消息依然能够恢复。相反,则抛出异常。\u003c/p\u003e\n\u003cp\u003e上面三条必须全部设置,不然消息将无法持久化。\u003c/p\u003e"
August 1, 2014
rabbitmq 添加远程访问功能
"\u003cp\u003e刚刚安装过的rabbitmq 消息队列,并启用了插件管理功能,3.3.1版中,处于安全的考虑,guest这个默认的用户只能通过http://localhost:15672 来登录,其他的IP无法直接使用这个账号。 这对于服务器上没有安装桌面的情况是无法管理维护的,除非通过在前面添加一层代理向外提供服务,这个又有些麻烦了,这里通过配置文件来实现这个功能。\u003c/p\u003e\n\u003cp\u003e只要编辑 /etc/rabbitmq/rabbitmq.config 文件,添加以下配置就可以了。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[\n{rabbit, [{tcp_listeners, [5672]}, {loopback_users, [“asdf”]}]}\n].\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e现在添加了一个新授权用户asdf,可以通过外网使用这个用户名和密码访问.(记得要先用命令添加这个命令才行,#rabbitmqctl add_user asdf pwd123456)我是通过在管理平台里直接添加的用户和密码的,我的测试环境装有桌面的。\n参考文档: \u003ca href=\"http://www.rabbitmq.com/access-control.html\"\u003ehttp://www.rabbitmq.com/access-control.html\u003c/a\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# rabbitmqctl add_user …\u003c/code\u003e\u003c/pre\u003e"
August 1, 2014
【架构】关于RabbitMQ
"\u003ch1 id=\"1什么是rabbitmq\"\u003e1 什么是RabbitMQ?\u003c/h1\u003e\n\u003cp\u003eRabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然:\n\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2014/08/rabbitmq_decouping.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/rabbitmq_decouping.png\" alt=\"rabbitmq_decouping\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e单向解耦\n双向解耦(如:RPC)\u003c/p\u003e\n\u003cp\u003e例如一个日志系统,很容易使用RabbitMQ简化工作量,一个Consumer可以进行消息的正常处理,另一个Consumer负责对消息进行日志记录,只要在程序中指定两个Consumer所监听的queue以相同的方式绑定到同一个exchange即可,剩下的消息分发工作由RabbitMQ完成。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2014/08/rabbitmq_producer_consumer.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/rabbitmq_producer_consumer.png\" alt=\"rabbitmq_producer_consumer\"\u003e\u003c/a\u003e\n使用RabbitMQ server需要:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eErLang语言包;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRabbitMQ安装包;\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eRabbitMQ同时提供了java的客户端(一个jar包)。\u003c/p\u003e\n\u003ch1 id=\"2概念和特性\"\u003e2 概念和特性\u003c/h1\u003e\n\u003ch2 id=\"21交换机exchange\"\u003e2.1 交换机(exchange):\u003c/h2\u003e\n\u003cp\u003e1. 接收消息,转发消息到绑定的队列。四种类型:direct, topic, headers and fanout\u003c/p\u003e\n\u003cp\u003edirect:转发消息 …\u003c/p\u003e"
June 17, 2014
进程管理工具Supervisord
"\u003ch2 id=\"supervisord-简介\"\u003eSupervisord 简介\u003c/h2\u003e\n\u003cp\u003e上面已经介绍了Go目前是有两种方案来实现他的daemon,但是官方本身还不支持这一块,所以还是建议大家采用第三方成熟工具来管理我们的应用程序,这里我给大家介绍一款目前使用比较广泛的进程管理软件: \u003ca href=\"http://supervisord.org/\"\u003eSupervisord\u003c/a\u003e。Supervisord是用Python实现的一款非常实用的进程管理工具。supervisord会帮你把管理的应用程序转成daemon程序,而且可以方便的通过命令开启、关闭、重启等操作,而且它管理的进程一旦崩溃会自动重启,这样就可以保证程序执行中断后的情况下有自我修复的功能。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e我前面在应用中踩过一个坑,就是因为所有的应用程序都是由Supervisord父进程生出来的,那么当你修改了操作系统的文件描述符之后,别忘记重启Supervisord,光重启下面的应用程序没用。当初我就是系统安装好之后就先装了Supervisord,然后开始部署程序,修改文件描述符,重启程序,以为文件描述符已经是100000了,其实Supervisord这个时候还是默认的1024个,导致他管理的进程所有的描述符也是1024.开放之后压力一上来系统就开始报文件描述符用光 …\u003c/p\u003e\u003c/blockquote\u003e"
June 17, 2014
京东网站url规划分析
"\u003cp\u003e对于一些大型产品网站,当不同产品项的过滤条件不一样的时候,多个过滤条件会完全不一样。如服装行业与电脑配置的许多参数都不一样。而他们又是如何实现自动通过程序来调用的呢,是一个很值得学习的知识的。\u003c/p\u003e\n\u003cp\u003e下面我们来通过京东其中一个服装url来看一下,他们是如何实现这一点的。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2014/06/jd_url_parse1.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/jd_url_parse1.png\" alt=\"jd_url_parse1\"\u003e\u003c/a\u003e上图是对于一些大类频道的url规划信息。非常的清楚,就不再一一讲述了。下面我们主要讲右侧”条件筛选“这一块.\u003c/p\u003e\n\u003cp\u003e分析url:\n\u003ca href=\"http://list.jd.com/list.html?cat=1315%2C1342%2C9733\u0026amp;brand=35553%2Ctzmall\u0026amp;page=1\u0026amp;ext=53345%3A%3A1373%5E%5E64135%3A%3A8646%5E%5E95400%3A%3A8648%5E%5E10669%3A%3A1656%5E%5E29520%3A%3A1589%5E%5E110357%3A%3A10991%5E%5E\u0026amp;delivery=2\u0026amp;sort=sort_dredisprice_asc\"\u003ehttp://list.jd.com/list.html?cat=1315%2C1342%2C9733\u0026amp;brand=35553%2Ctzmall\u0026amp;page=1\u0026amp;ext=53345%3A%3A1373%5E%5E64135%3A%3A8646%5E%5E95400%3A%3A8648%5E%5E10669%3A%3A1656%5E%5E29520%3A%3A1589%5E%5E110357%3A%3A10991%5E%5E\u0026amp;delivery=2\u0026amp;sort=sort_dredisprice_asc\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e经过用js的unescape(url)反编码后,得出url …\u003c/p\u003e"
June 15, 2014
Swift中的柯里化函数
"\u003cp\u003e柯里化函数(curried function)的类型相当于一个嵌套函数类型。例如,下面的柯里化函数 \u003ccode\u003eaddTwoNumber()()\u003c/code\u003e 的类型是 \u003ccode\u003eInt -\u0026gt; Int -\u0026gt; Int\u003c/code\u003e:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-lang-swift\" data-lang=\"lang-swift\"\u003efunc addTwoNumbers(a: Int)(b: Int) -\u0026gt; Int{\n return a + b\n}\naddTwoNumbers(4)(5) // returns 9\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e柯里化函数的函数类型从右向左组成一组。例如,函数类型 \u003ccode\u003eInt -\u0026gt; Int -\u0026gt; Int\u003c/code\u003e 可以被理解为 \u003ccode\u003eInt -\u0026gt; (Int -\u0026gt; Int)\u003c/code\u003e——也就是说,一个函数传入一个 \u003ccode\u003eInt\u003c/code\u003e 然后输出作为另一个函数的输入,然后又返回一个 \u003ccode\u003eInt\u003c/code\u003e。例如,你可以使用如下嵌套函数来重写柯里化函数 \u003ccode\u003eaddTwoNumbers()()\u003c/code\u003e:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-lang-swift\" data-lang=\"lang-swift\"\u003efunc addTwoNumbers(a: Int) -\u0026gt; (Int -\u0026gt; Int){\n func addTheSecondNumber(b: Int) -\u0026gt; Int{\n return a + b\n } …\u003c/code\u003e\u003c/pre\u003e"
April 8, 2014
日600亿消息,月4.65亿用户——WhatsApp的Erlang世界[架构设计](最新版)
"\u003cp\u003e来自 High Scalability。相较 \u003ca href=\"http://highscalability.com/blog/2014/2/26/the-whatsapp-architecture-facebook-bought-for-19-billion.html\"\u003e上篇\u003c/a\u003e,这篇内容更新、更全。 \u003ca href=\"http://www.csdn.net/article/2014-04-04/2819158-how-whatsapp-grew-to-nearly-500-million-users-11000-cores-an\"\u003e译文\u003c/a\u003e a\u003c/p\u003e\n\u003cp\u003e【编者按】在之前我们有分享过HighScalability创始人Tod Hoff总结的 \u003ca href=\"http://www.csdn.net/article/2014-02-27/2818559-an-overview-at-whatsapp%27s-19b-architecture\"\u003eWhatsApp早期架构\u003c/a\u003e,其中包括了大量的Erlang优化来支撑单服务器200万并发连接,以及如何支撑所有类型的手机并提供一个完美的用户体验。然而时过境迁,两年后WhatsApp又是如何支撑10倍于之前的流量,以及应用的飞速扩展,这里我们一起看Tod带来的总结。以下为译文:\u003c/p\u003e\n\u003ch3 id=\"两年内的飞跃\"\u003e两年内的飞跃\u003c/h3\u003e\n\u003cp\u003e天价应用当下的规模显然不能与两年前同日而语,这里总结了一些WhatsApp两年内发生的主要变化:\u003c/p\u003e\n\u003cp\u003e**1. **从任何维度上都可以看到WhatsApp的巨变,但是工程师的数量却一直未变。当下,WhatsApp有更多的主机、更多的数据中心、更多的内存、更多的用户以及更多的扩展性问题,然而最引以为豪的却是那支10人工程团队——每个工程师平均负责4000万个用户。当然,这也是云时代的胜利:工程师只负责软件的开发,网络、硬件及数据中心运维全部假手于人。\u003c/p\u003e\n\u003cp\u003e**2. **在之前,面对负载的激增,他们必须让单服务器支撑尽可能多的连接数,但是现在他 …\u003c/p\u003e"
February 18, 2014
纽约时报网站改版背后的web技术
"\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2014/02/nytimes-redesign.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2014/02/nytimes-redesign.png\" alt=\"nytimes-redesign\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e原文地址: \u003ca href=\"http://open.blogs.nytimes.com/2014/01/08/the-technology-behind-the-nytimes-com-redesign/?_php=true\u0026amp;_type=blogs\u0026amp;_php=true\u0026amp;_type=blogs\u0026amp;_r=1\"\u003e“The Technology Behind the NYTimes.com Redesign”\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e纽约时报英文网站今年进行了一次改版,这次改版不仅仅是给一艘大船重新刷了遍油漆那么简单,除了外观上的重新设计,我们也对代码进行了大量的重构,采用了新的框架,让网站更快,也为以后代码的维护、升级便利性进行了重新设计。 \u003ca href=\"https://twitter.com/remmons\"\u003eReed Emmons\u003c/a\u003e,是这次改版的负责人,在这篇文章将分享我们如何让纽约时报这首老船更快更酷。\u003c/p\u003e\n\u003cp\u003e很少有机会能够在像纽约时报这么老资格和规模的网站进行一场「从头来过」的重构和设计工作,我这里说的从头来过,不仅仅是视觉设计上的重新设计,更是一个重新发明整个数码传媒平台。纽约时报的上次一次视觉改版是在2006年,但是我们得回溯到2000千禧年才有如此规模的从底层的重构和改版。我们决定重构用户端和服务端以支持我们新的服务、设计和新闻报道,比如说更佳的网站性能、响应式布局等等。尽管有些旧有的代码依旧保留或者进行了深度重构,大部分老的代码都被删除或者仅仅是用来做参考。\u003c/p\u003e\n\u003ch4 id=\"静态页面发布历史的教训\"\u003e\u003cstrong\u003e静态页面发布:历史的教训\u003c/strong\u003e\u003c/h4\u003e\n\u003cp\u003e直到今天为止,纽约时报的大部分网页内容还是静态 html 页面,这些页面储存在我们 …\u003c/p\u003e"
November 9, 2013
lxc学习-安装篇
"\u003cp\u003e\u003cstrong\u003e安装环境:\u003c/strong\u003e\u003c/p\u003e\n\u003ch1 id=\"内存-1g\"\u003eVirtualBox 4.2.18\nCentos6.4 64位\n内存 1G\u003c/h1\u003e\n\u003cp\u003e\u003cstrong\u003e安装方法:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e[shell]\u003c/p\u003e\n\u003cp\u003eyum -y install gcc libcap-devel libcgroup\nwget \u0026ldquo;\u003ca href=\"http://downloads.sourceforge.net/project/lxc/lxc/lxc-0.9.0/lxc-0.9.0.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Flxc%2Ffiles%2Flxc%2F\u0026amp;ts=1383981486\u0026amp;use_mirror=jaist%22\"\u003ehttp://downloads.sourceforge.net/project/lxc/lxc/lxc-0.9.0/lxc-0.9.0.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Flxc%2Ffiles%2Flxc%2F\u0026amp;ts=1383981486\u0026amp;use_mirror=jaist\u0026quot;\u003c/a\u003e\ntar zxvf lxc-0.9.0.tar.gz\ncd lxc-0.9.0\n./autogen.sh\n./configure\nmake \u0026amp;\u0026amp; make install[/shell]\u003c/p\u003e\n\u003cp\u003e这里,在/usr/local/bin 目录里可以看到以 lxc_开头的命令.(注意要将这个目录添加到用户的环境变量里)\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2013/11/lxc_commends.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2013/11/lxc_commends.png\" alt=\"lxc_commends\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e更多学习参考资料请参考: …\u003c/p\u003e"
October 22, 2013
安装zeromq时,出现 error while loading shared libraries: libzmq.so 错误的解决办法
"\u003cp\u003eIs this on Ubuntu? You’ll need to add /usr/local/lib to ldconfig to be able to use ZeroMQ. Here’s a web page with some info: \u003ca href=\"http://ubuntuforums.org/showthread.php?t=420008\"\u003ehttp://ubuntuforums.org/showthread.php?t=420008\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eHere are the actual instructions:\u003c/p\u003e\n\u003cp\u003eAdd \u003cstrong\u003e/usr/local/lib\u003c/strong\u003e to a new line in ld.so.conf:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ sudo vi /etc/ld.so.conf\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eRerun ldconfig:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ sudo ldconfig\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThat should work (if I remember correctly). Let me know if you have any issues.\u003c/p\u003e"
August 8, 2013
Redis配置文件参数说明
"\u003cp\u003e\u003cstrong\u003e配置文件参数说明\u003c/strong\u003e:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eRedis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003edaemonize no\u003c/strong\u003e\u003c/p\u003e\n\u003col start=\"2\"\u003e\n\u003cli\u003e当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003epidfile /var/run/redis.pid\u003c/strong\u003e\u003c/p\u003e\n\u003col start=\"3\"\u003e\n\u003cli\u003e指定Redis监听端口,默认端口为6379,作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e** port 6379**\u003c/p\u003e\n\u003col start=\"4\"\u003e\n\u003cli\u003e绑定的主机地址\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003ebind 127.0.0.1\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e5.当 客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003etimeout 300\u003c/strong\u003e\u003c/p\u003e\n\u003col start=\"6\"\u003e\n\u003cli\u003e指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003eloglevel verbose\u003c/strong\u003e\u003c/p\u003e\n\u003col start=\"7\"\u003e\n\u003cli\u003e日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送 …\u003c/li\u003e\u003c/ol\u003e"
May 5, 2013
linux下安装zeromq消息队列软件
"\u003cp\u003e在上一节 \u003ca href=\"http://blog.haohtml.com/archives/13790\"\u003e消息中间件的技术选型心得-RabbitMQ、ActiveMQ和ZeroMQ\u003c/a\u003e 我们介绍了一些相关的消息队列软件.这里我们对安装zeromqq这款软件的安装及php使用方法介绍一下.\u003c/p\u003e\n\u003cp\u003ecentos下安装zeromq消息队列软件.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一.安装服务端\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecd ~\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewget http://download.zeromq.org/zeromq-3.2.3.tar.gz\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etar zxvf zeromq-3.2.3.tar.gz\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecd zeromq-3.2.3\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e./configure \u003cspan style=\"color:#75715e\"\u003e# –prefix=/usr/local/zeromq\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emake \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e make install\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e**二.安装php扩展 **\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit clone git://github.com/mkoppanen/php-zmq.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecd php-zmq\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ephpize\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e./configure –with-php-config\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e/usr/local/php/bin/php-config\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emake \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e make install\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e执行完以后,会提示:\u003c/p\u003e\n\u003cp\u003eInstalling shared …\u003c/p\u003e"
May 5, 2013
消息中间件的技术选型心得-RabbitMQ、ActiveMQ和ZeroMQ
"\u003cp\u003eRabbitMQ、ActiveMQ和ZeroMQ都是极好的消息中间件,但是我们在项目中该选择哪个更适合呢?很多开发者面临这个烦恼。下面我会对这三个消息中间件做一个比较,看了后你们就心中有数了。\u003c/p\u003e\n\u003cp\u003eRabbitMQ是AMQP协议领先的一个实现,它实现了代理(Broker)架构,意味着消息在发送到客户端之前可以在中央节点上排队。此特性使得RabbitMQ易于使用和部署,适宜于很多场景如路由、负载均衡或消息持久化等,用消息队列只需几行代码即可搞定。但是,这使得它的可扩展性差,速度较慢,因为中央节点增加了延迟,消息封装后也比较大。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2013/05/rabbitmq.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/rabbitmq.jpg\" alt=\"rabbitmq\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.zeromq.org/\"\u003eZeroMQ\u003c/a\u003e 是一个非常轻量级的消息系统,专门为高吞吐量/低延迟的场景开发,在金融界的应用中经常可以发现它。与RabbitMQ相比,ZeroMQ支持许多高级消息场景,但是你必须实现ZeroMQ框架中的各个块(比如Socket或Device等)。ZeroMQ非常灵活,但是你必须学习它的80页的手册(如果你要写一个分布式系统,一定要阅读它)。\n\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2013/05/zmq.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/zmq.jpg\" alt=\"zmq\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eActiveMQ居于两者之间,类似于ZemoMQ,它可以部署于代理模式和P2P模式。类似于RabbitMQ,它易于实现高级场 …\u003c/p\u003e"
February 18, 2013
RESTful Web Service Cookbook 学习笔记
"\u003cp\u003e每个HTTP方法都具有特定的主义.\nGET 的目的是得到一个资源的表述\nPUT 用于建立或更新一个资源\nDELETE 用于删除一个资源\nPOST 用于创建多个新资源或者对资源进行多种其它变更\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e不要将GET方法用于不安全或非幂等操作.因为这样做可能会造成永久性的、不到的、不符合需要的资源改变。\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e在所有上述方法中,GET被滥用的情况最少,因为GET既安全又幂等。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2013/02/crud.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/crud.png\" alt=\"crud\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e参考:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2013/02/rest-mi.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/rest-mi-20230904211219008.png\" alt=\"rest-mi\"\u003e\u003c/a\u003e\u003c/p\u003e"
January 17, 2013
运行cacti的问题Cannot connect to MySQL server on ‘localhost’.Please make sure you have specified a valid MySQL database name in ‘include/config.php’
"\u003cp\u003e参考以次的教程 \u003ca href=\"http://blog.haohtml.com/archives/9428\"\u003ehttp://blog.haohtml.com/archives/9428\u003c/a\u003e,在centos安装cacti监控工具,发现在命令行下运行\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ephp /var/www/html/cacti/poller.php\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e的时候,提示以下错误\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFATAL: Cannot connect to MySQL server on ‘localhost’. Please make sure you have specified a valid MySQL database name in ‘include/config.php’\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e而这此配置文件是没有任何问题的,cacti后台访问一切正常的。poller.php是使用/var/lib/mysql/mysql.sock的,\u003c/p\u003e\n\u003cp\u003e当我在my.cnf里把mysql.sock定义到/var/lib/mysql/mysql.sock时,poller.php可以连接,\n但执行mysql就提示错误了,我把mysql.sock的位置改为/tmp/mysql.sock,使用网上提供\u003cstrong\u003e解决办法:\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eln -s /tmp/mysql.sock …\u003c/p\u003e\u003c/blockquote\u003e"
December 7, 2011
利用autobench测试web服务器极限并发数
"\u003ch1 id=\"一目的\"\u003e一、目的\u003c/h1\u003e\n\u003cp\u003e利用autobench工具结合httperf命令对web服务器进行测试,得出该服务器可以承载的最大并发连接数与最佳并发数。\u003c/p\u003e\n\u003ch1 id=\"二测试工具\"\u003e二、测试工具\u003c/h1\u003e\n\u003ch2 id=\"工具介绍\"\u003e工具介绍\u003c/h2\u003e\n\u003ch3 id=\"1httperf\"\u003e1、Httperf\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"http://code.google.com/p/httperf/\"\u003ehttperf\u003c/a\u003e 是一款高性能的HTTP测试工具,使用它我们可以准确定位服务器的并发连接能力。下面介绍一下它的主要特征\u003c/p\u003e\n\u003cp\u003e(1) 可以观察测试客户端(并非被测服务器)在发起压力测试时的负载情况。这样在测试高并发的情况下可以准确的分析问题。(被测服务器无法承载高并发还是测试客户端无法发起过多请求)\n(2)支持HTTP/1.1和SSL\n(3)可以生成可扩展的测试计划\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e下载\u003c/strong\u003e:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e安装\u003c/strong\u003e:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# tar xvzf httperf-0.9.0.tar.gz\n# cd httperf-0.9.0\n#./configure\n# make \u0026amp;\u0026amp; make install\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e更多的使用方法参见man page。\u003c/p\u003e\n\u003ch3 id=\"2autobench\"\u003e2、autobench\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"http://www.xenoclast.org/autobench/\"\u003eautobench\u003c/a\u003e 是一款基于httperf的Perl脚本。它会在一次测试中调用多次httperf来对web服务器进行测试,每次会按照给定的参数增加并发连接数,将httperf的测试结果保存 …\u003c/p\u003e"
December 7, 2011
velocity2011讲师经验总结及velocity2011的ppt下载[54chen]
"\u003cp\u003e总结:\n1)会场有点小,比较热\n2)讲的东西为了照顾更多人,比较片面,如果有想听深入的同学,可以参加我们 \u003ca href=\"http://blog-brother.com/\"\u003e哥学社\u003c/a\u003e 的吃喝会。\n3)会上遇到了douban强宁大侠、安全宝的冯大侠、还有一位来自清华的主任、以及各位一线的朋友恕不能一一列出,深感荣幸。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"http://www.slideshare.net/54chen/ss-10490088\" title=\"互联网创业服务器运维工具集\"\u003e互联网创业服务器运维工具集\u003c/a\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eView more \u003ca href=\"http://www.slideshare.net/\"\u003epresentations\u003c/a\u003e from \u003ca href=\"http://www.slideshare.net/54chen\"\u003ezhen chen\u003c/a\u003e.\u003c/p\u003e"
November 22, 2011
varnish英文手册生词
"\u003cp\u003e当客户端请求相同的页面时.varnish只发送一个请求到后端(backend)机器,等后面返回数据信息的时候再copy多份\u003c/p\u003e\n\u003cp\u003eserve – 服务\u003c/p\u003e\n\u003cp\u003eplethora – 过多\u003c/p\u003e\n\u003cp\u003eencounter – 遇到\u003c/p\u003e\n\u003cp\u003ehopefully – 希望\u003c/p\u003e\n\u003cp\u003eGuru – 领袖\u003c/p\u003e\n\u003cp\u003emeditation – 冥想\u003c/p\u003e\n\u003cp\u003erelevant – 有关\u003c/p\u003e\n\u003cp\u003eprobably – 可能\u003c/p\u003e\n\u003cp\u003eclue – 线索\u003c/p\u003e\n\u003cp\u003eransaction – 交易\u003c/p\u003e\n\u003cp\u003eelaboration – 拟定\u003c/p\u003e\n\u003cp\u003efurther – 进一步\u003c/p\u003e\n\u003cp\u003evarious – 各种\u003c/p\u003e\n\u003cp\u003eDirector – 主任\u003c/p\u003e\n\u003cp\u003eresilience – 弹性\u003c/p\u003e\n\u003cp\u003edistribute – 分发\u003c/p\u003e\n\u003cp\u003eprobe – 探头\u003c/p\u003e\n\u003cp\u003estale – 陈旧\u003c/p\u003e\n\u003cp\u003ecoalesce – 合并\u003c/p\u003e\n\u003cp\u003eidentical – 相同\u003c/p\u003e\n\u003cp\u003eshield – 盾\u003c/p\u003e\n\u003cp\u003eMisbehave – 胡作非为\u003c/p\u003e\n\u003cp\u003eability – 能力\u003c/p\u003e\n\u003cp\u003eGrace – 恩典(优雅,恩,恩惠)\u003c/p\u003e"
November 21, 2011
varnish中vcl_recv子程序actions 动作
"\u003cp\u003e\u003cstrong\u003e主要有以下动作\u003c/strong\u003e\npass \\当一个请求被pass后,这个请求将通过varnish转发到后端服务器,但是它不会被缓存。pass可以放在vcl_recv 和 vcl_fetch中。\nlookup \\当一个请求在vcl_recv中被lookup后,varnish将从缓存中提取数据,如果缓存中没有数据,将被设置为pass,不能在 vcl_fetch中设置lookup。\npipe \\pipe和 pass相似,都要访问后端服务器,不过当进入pipe 模式后,在此连接未关闭前,后续的所有请求都发到后端服务器(这句是我自己理解后简化的,有能力的朋友可以看看官方文档,给我提修改建议) 。\ndeliver \\请求的目标被缓存,然后发送给客户端\nesi \\ESI-process the fetched document(我理解的就是vcl 中包换一段 html代码)\u003c/p\u003e"
November 21, 2011
varnishstat 参数分析
"\u003cp\u003eHitrate ratio由三个数字组成,第一个数字范围0-10,第二个数字范围0-100,第三个数字范围0-1000。\u003c/p\u003e\n\u003cp\u003e分别表示过去N秒内的Hitrate avg。上图由于我是刚打开varnishstat,因此三个数字都是4,表示过去4秒内的平均hitrate,如果打开的时间足够长,以上三个数字就会逐渐变成\u003cstrong\u003e10,100,1000\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003eHitrate avg里的内容是命中率,需要乘以100转换成百分比,例如上图表示命中率为99.23%\u003c/p\u003e\n\u003cp\u003e接着往下看,三列数据分别表示实时数据,每秒平均值,自启动以来每秒平均值。有些参数是没有后两列的,这是因为这些值都有固定变动范围,例如N work threads,只会在0到最大值(我设的是200)之间变动,搞每秒平均值意义不大(我猜)。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e以下指标需要重点关注一下:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eClient connections accepted: (每秒处理连接数)。\nClient requests received:经验表明connection:request=1:10左右时比较理想,比这个数大很多或者小很多都是不好的。代表到目前为止,浏览器向反向代理服务器发送的HTTP请求累积 …\u003c/p\u003e"
November 21, 2011
varnishncsa(以 NCSA 的格式显示日志)
"\u003cp\u003e\u003cstrong\u003e●varnishncsa(以 NCSA 的格式显示日志)\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eAuthor: Dag-Erling Sm?rgrav\u003c/p\u003e\n\u003cp\u003eDate: 2010-05-31\u003c/p\u003e\n\u003cp\u003eVersion: 1.0\u003c/p\u003e\n\u003cp\u003eManual section: 1\u003c/p\u003e\n\u003cp\u003eDisplay varnish logs in apache/NCSA combined log format\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSYNOPSIS\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003evarnishncsa [-a] [-b] [-C] [-c] [-D] [-d] [-f] [-I regex] [-i tag]\u003c/p\u003e\n\u003cp\u003e[-n varnish_name] [-P file] [-r file] [-V] [-w file] [-X regex] [-x tag]\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eDESCRIPTION\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eVarnishncsa 工具读取共享内存的日志,然后以 apache/NCSA 的格式显示出来。下 面的选项可以用。\u003c/p\u003e\n\u003cp\u003e-a 当把日志写到文件里时,使用附加,而不是覆盖。\u003c/p\u003e\n\u003cp\u003e-b 只显示 varnishd 和后端服务器的日志。\u003c/p\u003e\n\u003cp\u003e-C 匹配正则表达式的时候,忽略大小写差异。\u003c/p\u003e\n\u003cp\u003e-c 只显示 varnishd 和客户端的日志。\u003c/p\u003e\n\u003cp\u003e-D 以进程方式运行\u003c/p\u003e\n\u003cp\u003e-d 在 …\u003c/p\u003e"
November 21, 2011
Misbehaving servers(服务器停止运转)
"\u003cp\u003eVarnish的一个关键特色就是它有能力防御 web和应用服务器宕机。\n\u003cstrong\u003eGrace mode\u003c/strong\u003e\n当几个客户端请求同一个页面的时候,varnish只发送一个请求到后端服务器,然后让那个其他几个请求挂起等待返回结果,返回结果后,复制请求的结果发送给客户端。\n如果您的服务每秒有数千万的点击率,那么这个队列是庞大的,没有用户喜欢等待服务器响应。为了使用过期的 cache 给用户提供服务,我们需要增加他们的 TTL,保存所有cache 中的内容在 TTL过期以后30 分钟内不删除,使用以下VCL:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esub vcl_fetch {\n set beresp.grace = 30m;\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eVarnish 还不会使用过期的目标给用户提供服务,所以我们需要配置以下代码,在cache过期后的15 秒内,使用旧的内容提供服务:\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esub vcl_recv {\n set req.grace = 15s;\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e你会考虑为什么要多保存过去的内容 30 分钟?当然,如果你使用了健康检查,你可以通过健康状态设置保存的时间:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eif (! req.backend.healthy) {\n set req.grace …\u003c/code\u003e\u003c/pre\u003e"
November 21, 2011
varnish中的Health checks(健康检查)
"\u003cp\u003e让我们设置一个 director和两个后端,然后加上健康检查:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ebackend server1 {\n .host = \u0026#34;server1.example.com\u0026#34;;\n .probe = {\n .url = \u0026#34;/\u0026#34;;\n .interval = 5s;\n .timeout = 1 s;\n .window = 5;\n .threshold = 3;\n }\n }\nbackend server2 {\n .host = \u0026#34;server2.example.com\u0026#34;;\n .probe = {\n .url = \u0026#34;/\u0026#34;;\n .interval = 5s;\n .timeout = 1 s;\n .window = 5;\n .threshold = 3;\n }\n }\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这些新的就是探针,varnish将检查通过探针检查每个后端服务器是 …\u003c/p\u003e"
November 21, 2011
varnish中的Directors
"\u003cp\u003e您可以把多台 backends 聚合成一个组,这些组被叫做 directors。这样可以增强性能和弹力。您可以定义多个 backends和多个 group在同一个directors。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ebackend server1 {\n .host = \u0026#34;192.168.0.10\u0026#34;;\n}\nbackend server2{\n .host = \u0026#34;192.168.0.10\u0026#34;;\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e现在我们创建一个 director:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003edirector example_director round-robin {\n{\n .backend = server1;\n}\n# server2\n{\n .backend = server2;\n}\n# foo\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这个 director 是一个循环的 director。它的含义就是 director 使用循环的方式把backends分给请求。\n但是如果您的一个服务器宕了?varnish 能否指导所有的请求到健康的后端?当然可以,这就是健康检查在起作用了。\u003c/p\u003e"
November 21, 2011
varnish中advanced backend configuration (后端服务高级配置)
"\u003cp\u003e在某些时刻您需要 varnish 从多台服务器上缓存数据。您可能想要 varnish 映射所有的URL 到一个单独的主机或者不到这个主机。这里很多选项。\n我们需要引进一个 java程序进出php的web站点。假如我们的java程序使用的 URL开始于/JAVA/\u003c/p\u003e\n\u003cp\u003e我们让它运行在8000端口,现在让我们看看默认的default.vcl:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ebackend default {\n .host = \u0026#34;127.0.0.1\u0026#34;;\n .port = \u0026#34;8080\u0026#34;;\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e我们添加一个新的 backend:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ebackend java {\n .host = \u0026#34;127.0.0.1\u0026#34;;\n .port = \u0026#34;8000\u0026#34;;\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e现在我们需要告诉特殊的URL 被发送到哪里:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esub vcl_recv {\n if (req.url ~ \u0026#34;^/java/\u0026#34;) {\n set req.backend = java;\n } else {\n set req.backend …\u003c/code\u003e\u003c/pre\u003e"
November 21, 2011
Achiveving a high hitrate(提高缓存命中率)-varnish篇
"\u003cp\u003e现在 varnish 已经正常运行了,您可以通过 varnish 访问到您的 web 应用程序。如果您的 web 程序在设计时候没有考虑到加速器的架构,那么您可能有必要修改您的应用程序或者varnish配置文件,来提高varnish的命中率。\n既然这样,您就需要一个工具用来观察您和web服务器之间HTTP头信息。服务器端您可以轻松的使用varnish 的工具,比如varnishlog和 varnishtop,但是客户端的工具需要您自己去准备,下面是我经常使用的工具。\n\u003cstrong\u003eVarnistop\u003c/strong\u003e\n您可以使用varnishtop 确定哪些URL经常命中后端。 Varnishtop –i txurl 就是一个基本的命令。您可以通过阅读“Statistics”了解其他示例。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eVarnishlog\u003c/strong\u003e\n当您需要鉴定哪个 URL 被频繁的发送到后端服务器,您可以通过varnishlog对请求做一个全面的分析。 varnishlog –c –o /foo/bar 这个命令将告诉您所有(-o)包含”/football/bar”字段来自客户端(-c)的请求。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eLwp-request\u003c/strong\u003e\nLwp-request是 www …\u003c/p\u003e"
November 21, 2011
varnish中的Statistics(统计 varnish相关数据)-Varnishtop ,Varnishhist ,Varnishsizes ,Varnishstat
"\u003cp\u003e现在您的varnish已经正常运行,我们来看一下varnish在做什么,这里有些工具可以帮助您做到。\n\u003cstrong\u003eVarnishtop\u003c/strong\u003e\nVarnishtop工具读取共享内存的日志,然后连续不断的显示和更新大部分普通日志。\n适当的过滤使用 –I,-i,-X 和-x 选项,它可以按照您的要求显示请求的内容,客户端,浏览器等其他日志里的信息。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003evarnishtop -i rxurl \\您可以看到客户端请求的 url次数。\nVarnishtop -i txurl \\您可以看到请求后端服务器的url次数。\nVarnishtop -i Rxheader –I Accept-Encoding \\可以看见接收到的头信息中有有多少次包含Accept-Encoding。\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003eVarnishhist\u003c/strong\u003e\nVarnishhist工具读取varnishd的共享内存段日志,生成一个连续更新的柱状图,显示最后 N 个请求的处理情况。这个 N 的值是终端的纵坐标的高度,横坐标代表的是对数,如果缓存命中就标记“|”,如果缓存没有命中就标记上“#”符号。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eVarnishsizes\u003c/strong\u003e\nVarnishsizes 和varnishhist相似,除 …\u003c/p\u003e"
November 21, 2011
Varnish Configuration Language – VCL (varnish 配置 语言-VCL)
"\u003cp\u003e官方手册:\u003c/p\u003e\n\u003cp\u003e** **Varnish 有一个很棒的配置系统,大部分其他的系统使用配置指令,让您打开或者关闭一些开关。 Varnish使用区域配置语言,这种语言叫做“VCL”(varnish configuration language),在执行vcl时,varnish 就把VCL转换成二进制代码。\n** **VCL 文件被分为多个子程序,不同的子程序在不同的时间里执行,比如一个子程序在接到请求时执行,另一个子程序在接收到后端服务器传送的文件时执行。\nvarnish 将在不同阶段执行它的子程序代码,因为它的代码是一行一行执行的,不存在优先级问题。随时可以调用这个子程序中的功能并且当他执行完成后就退出。\u003c/p\u003e\n\u003cp\u003e** **如果到最后您也没有调用您的子进程中的功能,varnish 将执行一些内建的 VCL代码,这些代码就是default.vcl 中被注释的代码.\u003c/p\u003e\n\u003cp\u003e** 99%的几率您需要改变vcl_recv 和 vcl_fetch 这两个子进程。**\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003evcl_recv\u003c/strong\u003e\n** **vcl_recv(当然,我们在字符集上有点不足,应为它是unix)在请求的开始被调用,在接收、解析 …\u003c/p\u003e"
November 21, 2011
PutVarnish on port 80(使varnish工作在 80 端口上)
"\u003cp\u003e\u003cstrong\u003ePutVarnish on port 80(使 varnish工作在 80 端口上)\u003c/strong\u003e\n如果您的程序正常运行,没有问题,我们就可以把varnish调整到80端口运行。先关闭vernish\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epkill varnishd\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e然后停止您的 web服务器,修改web服务器配置,把 web服务器修改成监听8080端口,然后修改varnish 的default.vcl和改变默认的后端服务器端口为8080.\n先启动您的web服务器,然后在启动varnish:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003evarnishd -f /usr/local/etc/varnish/default.vcl -s malloc,1G -T 127.0.0.1:2000\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e我们取消了-a 选项,这样varnish将监控默认端口,启动后,检查您的 web程序是否正常。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e相关教程:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003evarnish中Varnishlog命令解析:\u003c/p\u003e\n\u003cp\u003elinux下varnish配置及使用教程:\u003c/p\u003e\n\u003cp\u003eVarnish Configuration Language – VCL (varnish 配置 语言-VCL):\u003c/p\u003e\n\u003cp\u003evarnish中的Statistics(统计 varnish相关数 …\u003c/p\u003e"
November 21, 2011
varnish中Varnishlog命令解析
"\u003cp\u003eVarnish一个真正的特点就是它如何记录数据的。使用内存段代替普通的日志文件,当内存段使用完以后,又从头开始,覆盖最旧的记录。这样就可以非常快的记录数据,并且不需要磁盘空间。缺点就是您没有把数据写到磁盘上,可能会消失。 (varnish也支持将数据写到硬盘的文件上,看您如何选择)\nVarnishlog 这个程序可以查看 varnish 记录了哪些数据。Varnishlog 给您生成原始的日志,包括所有的事件。我一会给您演示。\n在运行了varnish的终端窗口上,运行varnishlog这个命令。\n您可以看见如下显示\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#./varnishlog\n0 CLI – Rd ping\n0 CLI – Wr 200 PONG 1277172542 1.0\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e这是检查varnish的主进程是否正常,如果看见这就说明一切OK.\u003c/p\u003e\n\u003cp\u003e现在您去浏览器通过 varnish 重新访问您的 web程序,您将看到如下信息:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e11 SessionOpen c 127.0.0.1 58912 0.0.0.0:8080\n11 ReqStart c 127.0.0.1 58912 595005213\n11 …\u003c/code\u003e\u003c/pre\u003e"
November 20, 2011
Troubleshooting varnish(varnish排错方法)
"\u003cp\u003e1.有时候 varnish 会出错,为了使您知道该检查哪里,您可以检查 varnishlog,/var/log/syslog/,var/log/messages 这里可以发现一些信息,知道varnish怎么了。\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e2.When varnish won’t start\n有些时候,varnish 不能启动。这里有很多 varnish不能启动的原因,通常我们可以观看/dev/null的权限和是否其他软件占用了端口。\n使用debug模式启动 varnish,然后观看发生了什么:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003evarnishd -f /usr/local/etc/varnish/default.vcl -s malloc,1G -T 127.0.0.1:2000 -a 0.0.0.0:8080 –d\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e提示-d 选项,它将给您更多的信息关于接下来发生了什么。让我们看看如果其他程序暂用了varnish 的端口,它将显示什么:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# varnishd -n foo -f /usr/local/etc/varnish/default.vcl -s malloc,1G -T 127.0.0.1:2000\n-a …\u003c/code\u003e\u003c/pre\u003e"
November 18, 2011
linux下varnish配置及使用教程
"\u003cp\u003ecentos6.0 32位\nVarnish3.0.2\u003c/p\u003e\n\u003cp\u003e我们先配置nginx环境.参考教程:http://blog.haohtml.com/archives/6051\n并修改nginx的监听端口为81.下面我们varnish监听的端口为80端口.\u003c/p\u003e\n\u003cp\u003e==============================================================\n目前varnish的最新版本为3.0.2,这里我们使用最新的稳定版本\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ecd /usr/local/soft\nwget http://repo.varnish-cache.org/source/varnish-3.0.2.tar.gz\ntar zxvf varnish-3.0.2.tar.gz\ncd varnish-3.0.2\n./configure --prefix=/usr/local/varnish\nmake \u0026amp;\u0026amp; make install\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e如果在执行./configure命令的过程中遇到”No package ‘libpcre’ found”的错误提示信息的话,需要执行以下命令\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eexport …\u003c/code\u003e\u003c/pre\u003e"
October 19, 2011
memcache的addServer的故障转移机制
"\u003cp\u003e如果有多台memcached服务器端(当然其他支持memcache协议的服务前端都可以,比如Tokyo Tyrant),最好使用$memcache-\u0026gt;addServer 来连接服务前端。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e连接示例:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$mem_conf = array(\n array(\u0026#39;host\u0026#39;=\u0026gt;\u0026#39;192.168.0.11\u0026#39;, \u0026#39;port\u0026#39;=\u0026gt;\u0026#39;11211\u0026#39;),\n array(\u0026#39;host\u0026#39;=\u0026gt;\u0026#39;192.168.0.12\u0026#39;, \u0026#39;port\u0026#39;=\u0026gt;\u0026#39;11211\u0026#39;),\n array(\u0026#39;host\u0026#39;=\u0026gt;\u0026#39;192.168.0.13\u0026#39;, \u0026#39;port\u0026#39;=\u0026gt;\u0026#39;11211\u0026#39;)\n);\n\n$memcache = new Memcache ( );\nforeach ( $mem_conf as $v ) {\n $memcache-\u0026gt;addServer ( $v …\u003c/code\u003e\u003c/pre\u003e"
September 14, 2011
Nginx作为反向代理时传递客户端IP
"\u003cp\u003e因为架构的需要采用多级 Nginx 反向代理,但是后端的程序获取到的客户端 IP 都是前端 Nginx 的 IP,问题的根源在于后端的 Nginx 在 HTTP Header 中取客户端 IP 时没有取对正确的值。同样适用于前端是 Squid 或者其他反向代理的情况。(通用的解决方案是直接取服务器的变量 HTTP_X_FORWARDED_FOR 的值即可取出客户端的真实ip地址)\u003c/p\u003e\n\u003cp\u003e首先前端的 Nginx 要做转发客户端 IP 的配置:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003elocation / {\u003c/p\u003e\n\u003cp\u003eproxy_pass http://localhost:8000;# Forward the user’s IP address to Rails\u003c/p\u003e\n\u003cp\u003eproxy_set_header X-Real-IP $remote_addr;\u003c/p\u003e\n\u003ch1 id=\"needed-for-https\"\u003eneeded for HTTPS\u003c/h1\u003e\n\u003ch1 id=\"proxy_set_header------x_forwarded_proto-https\"\u003e proxy_set_header X_FORWARDED_PROTO https;\u003c/h1\u003e\n\u003cp\u003eproxy_set_header X-Forwarded-For $remote_addr; …\u003c/p\u003e\u003c/blockquote\u003e"
September 9, 2011
kickstart安装教程[原创]
"\u003cp\u003e转载请注明本文来源: \u003ca href=\"http://blog.haohtml.com/archives/11341\"\u003ehttp://blog.haohtml.com/archives/11341\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e我们知道RH中的Kickstart可以实现RedHat光盘启动后的自动安装,如果把 ks.cfg及RPM安装文件考到一台HTTP或NFS服务器上,就可以实现网络自动安装,但还是需要RedHat的启动盘来启动机器,但加上DHCP、 TFTP和PXElinux及支持PXE的网卡,噢,那就可以实现远程启动了。也就是说,有了上面的条件,你只要给一台支持PXE的客户机上电,然后再打 入一个设置好的命令就可以安装好一RedHat台机器了。\n实现上面安装的过程是这样的:PXE网卡启动——DHCP服务器——获得IP——从TFTP上下载pxelinux.0、vmlinuz、initrd——启动系统——通过PEXlinux去HTTP下载ks.cfg文件—–跟据ks.cfg去HTTP下载RPM包及安装系统——完成安装。\u003c/p\u003e\n\u003cp\u003e下面的教程我们主要的工作目录在/tftpboot/目录里,/tftpboot/目录里是光盘安装包,可以将光盘内容全部复制到这里,也可以直接挂载到pub目录.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e基本介绍:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003elinux下的网络批量 …\u003c/p\u003e"
September 8, 2011
squid命中率(转)
"\u003cp\u003e察看命中率的shell\ncat access.log|gawk ‘{print $4}’|sort|uniq -c|sort -nr\u003c/p\u003e\n\u003cp\u003e重点观察下面三个内容\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eTCP_MEM_HIT\u003c/li\u003e\n\u003cli\u003eTCP_IMS_HIT\u003c/li\u003e\n\u003cli\u003eTCP_REFRESH_HIT\u003c/li\u003e\n\u003c/ul\u003e\n\u003cblockquote\u003e\n\u003cp\u003e1198559749.083 0 60.4.218.18 TCP_REFRESH_HIT/200 271 GET – FIRST_UP_PARENT/d text/html\n1198559813.186 1 218.106.61.11 TCP_IMS_HIT/304 233 GET – NONE/- text/html\n1198559829.358 0 218.106.61.11 TCP_IMS_HIT/304 224 GET – NONE/- text/html\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eTCP_IMS_HIT:NONE 客户端发送确认请求,Squid发现更近来的、新鲜的请求资源的拷贝。\nSquid发送更新的内容到客户端,而不联系原始服务器。(这指明Squid对本次请求,不会与任何其他服务器(邻居或原始服务器)通信。)\nTCP_MEM_HIT:NONE …\u003c/p\u003e"
September 6, 2011
squid中HTTP/1.1 501 Method Not Implemented的解决办法
"\u003cp\u003e刚安装的squid,但在用squidclient清除缓存的时候,提示错误:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003efreebsd# ./squidclient -m PURGE -p 80 http://www.testsquid.com/index.html\nHTTP/1.1 501 Method Not Implemented\nDate: Tue, 28 Jun 2011 23:03:22 GMT\nServer: Apache/2.2.19 (FreeBSD) mod_ssl/2.2.19 OpenSSL/0.9.8k DAV/2\nAllow: GET,HEAD,POST,OPTIONS,TRACE\nContent-Length: 217\nConnection: close\nContent-Type: text/html; charset=iso-8859-1\n\n\u0026lt;!DOCTYPE HTML PUBLIC \u0026#34;-//IETF//DTD HTML 2.0//EN\u0026#34;\u0026gt;\n\u0026lt;html\u0026gt;\u0026lt;head\u0026gt;\n\u0026lt;title\u0026gt;501 Method Not …\u003c/code\u003e\u003c/pre\u003e"
August 28, 2011
关于SQUID3.0的cache_peer说明介绍
"\u003cp\u003ehttp_port 8000 vhost # Squid 服务器监听本机 8000 端口,vhost 支持虚拟主机。\u003c/p\u003e\n\u003cp\u003ecache_peer 192.168.1.50 parent 81 0 no-query originserver weight=1 name=a\ncache_peer 192.168.1.50 parent 82 0 no-query originserver weight=1 name=b\ncache_peer 192.168.1.51 parent 80 0 no-query originserver weight=1 name=c\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ecache_peer_domain a \u003ca href=\"https://www.serverA1.com\"\u003ewww.serverA1.com\u003c/a\u003e\u003c/strong\u003e\n\u003cstrong\u003ecache_peer_domain b \u003ca href=\"https://www.serverA2.com\"\u003ewww.serverA2.com\u003c/a\u003e\u003c/strong\u003e\n\u003cstrong\u003ecache_peer_domain c \u003ca href=\"https://www.serverB.com\"\u003ewww.serverB.com\u003c/a\u003e\n#以上六行配置,让 Squid 服务器知道:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e**\n#从客户端过来的请求,如果是 \u003ca href=\"https://www.serverA1.com\"\u003ewww.serverA1.com\u003c/a\u003e,则 Squid 向 ServerA 192.168.1.50 的端口 81发送请求;\n#**\u003cstrong\u003e从客户端过 …\u003c/strong\u003e\u003c/p\u003e"
August 23, 2011
每个程序员都应该了解的磁盘知识
"\u003cp\u003e虽然我们可能经常都在说 SSD 时代即将来临,可能我们今天的建立在磁盘结构上的很多知识都将无用武之地,但毕竟当前很多的存储产品,包括很多NoSQL产品,都是建立在磁盘存储的理论基础上的。下面是一个关于磁盘原理的PPT,描述了磁盘存储的各种知识。推荐给大家。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"http://www.slideshare.net/iammutex/what-every-data-programmer-needs-to-know-about-disks\" title=\"What every data programmer needs to know about disks\"\u003eWhat every data programmer needs to know about disks\u003c/a\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eView more \u003ca href=\"http://www.slideshare.net/\"\u003epresentations\u003c/a\u003e from \u003ca href=\"http://www.slideshare.net/iammutex\"\u003eiammutex\u003c/a\u003e\u003c/p\u003e"
August 9, 2011
Nagios监控Mysql服务器
"\u003cp\u003e\u003cstrong\u003eNagios-监控Mysql\u003c/strong\u003e服务器\u003c/p\u003e\n\u003cp\u003e监控Mysql需要在nagios和Mysql服务器这两个部分做处理:Mysql服务器安装nrpe、创建Mysql监控用户;配置nagios及用htpasswd创建浏览器验证帐号。下面分步描述。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、 在Mysql服务器安装nrpe\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e这个操作与nagios服务器安装nrpe基本相同,唯一不同的是nrpe.cfg文件server_address,把它改成Mysql服务器的ip地址即可。检查无误后启动nrpe服务.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二、创建Mysql访问用户nagios\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e这个账号仅仅是nagios监控程序用来访问Mysql数据库所用,与其它帐号毫无关系。为了安全起见,nagios这个账号的权限应该特别低,仅仅有数据库的select权限即可。再进一步,我们创建一个空的数据库nagdb,然后让nagios账号访问这个空库,就可以通过check_Mysql插件测试和监控Mysql数据库。\u003c/p\u003e\n\u003cp\u003e一切正常以后,Mysql服务器这边的配置和测试就算完成了。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e三、nagios服务器上的操作\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e即在nagios配置文件后面追加内容。\u003c/p\u003e\n\u003cp\u003e(一)、主机配置文件追加Mysql主机定义,联系 …\u003c/p\u003e"
August 9, 2011
zfs与ufs有什么区别
"\u003cp\u003eFreeBSD9.0将使用zfs作为默认的文件系统.with ZFS, basically you don’t need to use 3rd party volume management software to manage raw device, before you can access them as file system.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eZFS的特点:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eZFS是SUN推出的世界上第一个128位的文件系统,这意味着它能存储1800亿亿(18.4 × 10^1 8)倍于当前64位文件系统的数据。ZFS的设计如此超前以至于这个极限就当前现实际可能永远无法遇到。据说:“要填满一个128位的文件系统,将耗尽地球上所有存储设备。除非你拥有煮沸整个海洋的能量,不然你不可能将其填满。(Populating 128-bit file systems would exceed the quantum limits of earth-based storage. You couldn’t fill a 128-bit storage pool without boiling the oceans.)”[1] …\u003c/p\u003e"
August 8, 2011
nagios出现NRPE: Unable to read output问题的解决办法
"\u003cp\u003e在服务器部署好nagios,分别在客户端安装好,但是其中几台系统不是自己安装,里面的环境不太了解。\u003c/p\u003e\n\u003cp\u003e在nagios服务器端使用nrpe检查出现\u003c/p\u003e\n\u003ch3 id=\"nrpe-unable-to-read-output\"\u003eNRPE: Unable to read output\u003c/h3\u003e\n\u003cp\u003e在监控机上运行check_nrpe -H IP\u003c/p\u003e\n\u003cp\u003e可以查看到客户端的nrpe信息,说明监控机与被监控机的nrpedaemon通信是正常。\u003c/p\u003e\n\u003cp\u003e在网上查找了一下,也没个具体的原因等。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e根据问题查找得出一些分析的注意地方:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1、检查客户端nrpe的权限是否可读,可被nagios执行。\u003c/p\u003e\n\u003cp\u003e2、检查nrpe.cfg里面commands命令路径是否正确。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e常见的一些nrpe的错误信息解决方法:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在监控机上,执行:\u003c/p\u003e\n\u003cp\u003e#\u003ca href=\"mailto:#root@localhost\"\u003eroot@localhost\u003c/a\u003e libexec]# /opt/nagios/libexec/check_nrpe -H IP\u003c/p\u003e\n\u003cp\u003eCHECK_NRPE: Error – Could not complete SSL handshake.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e解决方案:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在被监控机nrpe.cfg中,增加监控主机的地址:\u003c/p\u003e\n\u003cp\u003e#NOTE: This option is ignored if NRPE is running …\u003c/p\u003e"
August 8, 2011
Nagios监控客户端CentOS设置(check_nrpe)
"\u003cp\u003e上一节我们在FreeBSD上实现了了安装nagios(),下面我们要监控一台linux(centos)的主机.\u003c/p\u003e\n\u003cp\u003eNote: It is possible to execute Nagios plugins on remote Linux/Unix machines through SSH. There is a\ncheck_by_ssh plugin that allows you to do this. Using SSH is more secure than the NRPE addon, but it also imposes a larger (CPU) overhead on both the monitoring and remote machines. This can become an issue when you start monitoring hundreds or thousands of machines. Many Nagios admins opt for using using the NRPE addon because of the lower …\u003c/p\u003e"
July 29, 2011
性能测试工具sysbench简介
"\u003cp\u003e\u003ca href=\"http://sysbench.sourceforge.net/\"\u003esysbench\u003c/a\u003e是一款开源的多线程性能测试工具,可以执行CPU/内存/线程/IO/数据库等方面的性能测试。数据库目前支持MySQL/Oracle/PostgreSQL。本文只是简单演示一下几种测试的用法,后续准备利用sysbench来对MySQL进行一系列的测试。具体的一些参数设置,需要根据不同的测试要求来进行调整。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e下载\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e**\n编译安装**\n默认支持MySQL,如果需要测试Oracle/PostgreSQL,则在configure时需要加上–with-oracle或者–with-pgsql参数\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e./configure --prefix=/u01/sysbench \\\n--with-mysql-includes=/opt/mysql/include/mysql \\\n--with-mysql-libs=/opt/mysql/lib/mysql\n\nmake \u0026amp;\u0026amp; make install\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003e参数\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eNinGoo:/u01/sysbench/bin\u0026gt;$sysbench\nMissing required command argument.\nUsage:\n sysbench …\u003c/code\u003e\u003c/pre\u003e"
July 26, 2011
利用taskset有效控制cpu资源
"\u003cp\u003e常常感觉系统资源不够用,一台机子上跑了不下3个比较重要的服务,但是每天我们还要在上面进行个备份压缩等处理,网络长时间传输,这在就很影响本就不够用的系统资源;\u003c/p\u003e\n\u003cp\u003e这个时候我们就可以把一些不太重要的比如copy/备份/同步等工作限定在一颗cpu上,或者是多核的cpu的一颗核心上进行处理,虽然这不一定是最有效的方法,但可以最大程度上利用了有效资源,降低那些不太重要的进程占用cpu资源;\u003c/p\u003e\n\u003cp\u003e查看系统下cpu信息:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#cat /proc/cpuinfo\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003etaskset就可以帮我们完成这项工作,而且操作非常简单;\u003c/p\u003e\n\u003cp\u003e该工具系统默认安装,rpm包名util-linux\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#taskset --help\ntaskset (util-linux 2.13-pre7)\nusage: taskset [options] [mask | cpu-list] [pid | cmd [args...]]\nset or get the affinity of a process\n\n-p, --pid operate on existing given pid\n-c, --cpu-list …\u003c/code\u003e\u003c/pre\u003e"
July 22, 2011
squid缓存php动态文件
"\u003cblockquote\u003e\n\u003cp\u003eacl QUERY urlpath_regex cgi-bin ?\nno_cache deny QUERY\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e这段代码会不cache 所有带 cgi-bin 和 ? 的url path.表面看来,如果url 里面不带?还是可以被缓存的。可惜实际并非如此,squid 会根据header读取httpd的声明信息,例如生成时间等信息;实际上.php的页面不返回 last-modified 信息,因此很难被cache。\u003c/p\u003e\n\u003cp\u003e通过增加 php 的last-modified header强制 squid 的cache功能:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eheader(“Last-Modified: ” . gmdate(“D, d M Y H:i:s”) . ” GMT”);\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eheader要放在所有.php文件中去。换而言之,就是要\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e在 include.php中,构造一个当前时间转换为最近那次5分钟/n分钟划分的时间函数\u003c/li\u003e\n\u003cli\u003e把这个时间函数的结果返回到 header\u003c/li\u003e\n\u003cli\u003e在所有页面中调用这个 include\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e以上方法本人已经测试通过.\u003c/p\u003e\n\u003cp\u003e分别是加last-modified …\u003c/p\u003e"
July 12, 2011
[教程]为PHP安装phpRedis扩展模块
"\u003cp\u003e\u003cstrong\u003e一.安装phpredis\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# wget \u003ca href=\"https://download.github.com/owlient-phpredis-2.1.1-1-g90ecd17.tar.gz\"\u003ehttps://download.github.com/owlient-phpredis-2.1.1-1-g90ecd17.tar.gz\u003c/a\u003e\n# tar -zxvf owlient-phpredis-2.1.1-1-g90ecd17.tar.gz\n# cd owlient-phpredis-2.1.1-1-g90ecd17\n# /usr/local/php/bin/phpize\n# ./configure –with-php-config=/usr/local/php/bin/php-config\n# make \u0026amp;\u0026amp; make install\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e修改php.ini文件,应用扩展\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# /usr/local/php/etc/php.ini\n加入:\nextension=redis.so\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e重启httpd\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e# service httpd -k restart\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e我这里使用的是php-fpm模块运行的Nginx\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e/usr/local/php/sbin/php-fpm restart\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e通过phpinfo()函数查看,可以看到redis扩展\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/07/phpredis.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2011/07/phpredis.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e如 …\u003c/p\u003e"
July 6, 2011
网络流量实时监控工具 nload
"\u003cp\u003e\u003cstrong\u003eLinux下nload的安装:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003enload是个很好用的一个工具,功能也很强.只是相对单一,只能查看总的流量,不能像iptraf那样,可针对IP,协议等\n可以实时地监控网卡的流量,分Incoming,Outgoing两部分,也就是流入与流出的流量。同时统计当前,平均,最小,最大,总流量的值,使人看了一目了然,如下图\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/07/linux_nload.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2011/07/linux_nload.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e下载地址:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://sourceforge.net/project/showfiles.php?group_id=35865\"\u003ehttp://sourceforge.net/project/showfiles.php?group_id=35865\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#wget \u003ca href=\"http://cdnetworks-kr-1.dl.sourceforge.net/project/nload/nload/0.7.2/nload-0.7.2.tar.gz\"\u003ehttp://cdnetworks-kr-1.dl.sourceforge.net/project/nload/nload/0.7.2/nload-0.7.2.tar.gz\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e#tar zxvf nload-0.7.2.tar.gz\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#cd nload-0.7.2\u003c/p\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#./configure –prefix=/usr/local/nload \u0026amp;\u0026amp; make \u0026amp;\u0026amp; make install\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e安装好以后,来看看效果\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#/usr/local/nload/bin/nload …\u003c/p\u003e\u003c/blockquote\u003e"
July 4, 2011
centos搭建jira bug问题追踪系统
"\u003cp\u003e\u003cstrong\u003e一. 安装jdk\u003c/strong\u003e\n参考:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二. 建立JIRA数据库\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003emysql\u0026gt;create database jiradb character set utf8;\nmysql\u0026gt;grant all on jiradb.* to `jira`@`localhost` identified by ‘jira’;\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e三.JIRA 安装\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ewget \u003ca href=\"http://wpc.29c4.edgecastcdn.net/8029C4/downloads/software/jira/downloads/atlassian-jira-enterprise-4.2.4-b591-standalone.tar.gz\"\u003ehttp://wpc.29c4.edgecastcdn.net/8029C4/downloads/software/jira/downloads/atlassian-jira-enterprise-4.2.4-b591-standalone.tar.gz\u003c/a\u003e\ntar zxvf atlassian-jira-enterprise-4.2.4-b591-standalone.tar.gz\nmv atlassian-jira-enterprise-4.2.4-b591-standalone /usr/local/jira\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e创建jira.home文件夹\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003emkdir -p /usr/local/jira_home\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e修改vi …\u003c/p\u003e"
June 21, 2011
centos下安装RabbitMQ消息队列
"\u003cp\u003e这里环境为centos7 64位.\n一。安装erlang\u003c/p\u003e\n\u003cp\u003e[shell]su -c ‘rpm -Uvh \u003ca href=\"http://download.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm\"\u003ehttp://download.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm\u003c/a\u003e’\nsudo yum install erlang[/shell]\u003c/p\u003e\n\u003cp\u003e二。安装rabbitmq\u003c/p\u003e\n\u003cp\u003e我们是用CentOS7(RHEL7也一样),可以从这里: \u003ca href=\"http://fedoraproject.org/wiki/EPEL/FAQ#howtouse\"\u003ehttp://fedoraproject.org/wiki/EPEL/FAQ#howtouse\u003c/a\u003e 找到安装有erlang的RHEL7(CentOS同)软件仓库并安装:\u003c/p\u003e\n\u003cp\u003e[shell]\nwget -c \u003ca href=\"http://www.rabbitmq.com/releases/rabbitmq-server/v3.5.0/rabbitmq-server-3.5.0-1.noarch.rpm\"\u003ehttp://www.rabbitmq.com/releases/rabbitmq-server/v3.5.0/rabbitmq-server-3.5.0-1.noarch.rpm\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003esudo rpm –import \u003ca href=\"http://www.rabbitmq.com/rabbitmq-signing-key-public.asc\"\u003ehttp://www.rabbitmq.com/rabbitmq-signing-key-public.asc\u003c/a\u003e\nsudo yum install …\u003c/p\u003e"
May 22, 2011
开源混合存储方案(Flashcache)
"\u003cp\u003e\u003cstrong\u003e\u003ca href=\"http://www.slideshare.net/mryufeng/flashcache\" title=\"开源混合存储方案(Flashcache)\"\u003e开源混合存储方案(Flashcache)\u003c/a\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eView more \u003ca href=\"http://www.slideshare.net/\"\u003epresentations\u003c/a\u003e from \u003ca href=\"http://www.slideshare.net/mryufeng\"\u003eFeng Yu\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eFlashCache简介: \u003ca href=\"http://blog.haohtml.com/archives/10263\"\u003ehttp://blog.haohtml.com/archives/10263\u003c/a\u003e\u003c/p\u003e"
May 22, 2011
推荐 14 款开源的 Web 应用测试工具
"\u003cp\u003e\u003ca href=\"http://www.oschina.net/p/jmeter\"\u003e\u003cimg src=\"http://static.oschina.net/uploads/img/201105/22092540_Ka0N.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eJMeter是Apache组织的开放源代码项目,它是功能和性能测试的工具,100%的用java实现。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://www.oschina.net/uploads/img/201003/01171026_RWEE.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.oschina.net/p/the+grinder\"\u003eGrinder\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eGrinder是一个负载测试框架,通过 \u003ca href=\"http://www.oschina.net/p/jython\"\u003eJython\u003c/a\u003e 来编写测试脚本,基于HTTP的测试可以由浏览器来记录整个要测试的过程。\u003c/p\u003e\n\u003cp\u003e关键特性:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e泛型测试方法\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e灵活的测试脚本编写\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e分布式框架\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e成熟的HTTP支持\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ca href=\"http://www.oschina.net/p/multi-mechanize\"\u003eMulti-Mechanize\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eMulti-Mechanize 是一个开源的Web性能和负载测试框架,可让你并发运行多个 Python 脚本来对网站或者Web服务进行压力测试。\u003c/p\u003e\n\u003cp\u003e主要特性:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e支持各种 HTTP methods\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e高级超链接和HTML表单支持\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e支持 SSL\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e自动处理 Cookies\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e可设置HTTP头\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e自动处理重定向\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e支持代理\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e支持 HTTP 认证\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e下面是一些测试结果图表:\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://www.oschina.net/uploads/img/201003/25213132_igf9.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.oschina.net/p/selenium\"\u003eSelenium\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eSelenium (SeleniumHQ) 是 thoughtworks公司的一个集成测试的强大工具。\u003c/p\u003e\n\u003cp\u003e一、Selenium 的版本\u003c/p\u003e\n\u003cp\u003eSelenium 现在存在2个版本,一个叫 selenium-core, 一 …\u003c/p\u003e"
May 22, 2011
腾讯陈军:腾讯云平台与技术实践分享
"\u003cp\u003e[第三届中国云计算大会]2011年最受瞩目的IT业界盛会——第三届中国云计算大会于2011年5月18-20日在北京国家会议中心隆重举行。本 次大会由中国电子学会主办,中国电子学会云计算专家委员会、中国云计算技术与产业联盟承办,CSDN网站、《程序员》杂志和电子工业出版社协办。\u003c/p\u003e\n\u003cp\u003e5月20日,在第三节云计算大会分论坛二“云计算平台与应用实践”中,腾讯网络平台部技术总监陈军带来了主题为《腾讯云平台与技术实践》精彩演讲。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://articles.csdn.net/uploads/allimg/110520/6_110520142414_1.jpg\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e更多精彩演讲,即将为您播报,敬请关注。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e以下是陈军的演讲实录:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e我是腾讯的陈军,我加入腾讯之前在硅谷工作了十几年,我要讲的就是开发平台与腾讯海量业务面对的挑战,重点讲几个比较有意思的话题,网络方面,集群任务调度、分布式同步,还有云存储和数据中心运维,因为腾讯做的东西很多。时间关系,就挑一些重点来讲。\u003c/p\u003e\n\u003cp\u003e去年12月份腾讯和360事件之后,腾讯就做了一个策略的转变,就是要打造开放平台。目前朋友社区和Qzone平台已经向第三方开放。目的就是营造一个良 好的互联网生态圈,带动互联网产业链的发展。这样就可以让一些小公司、创业公司可以借助腾讯这个平台来服务亿万用户。\u003c/p\u003e\n\u003cp\u003e这里有一个比较成功的 …\u003c/p\u003e"
May 18, 2011
使用mysql-proxy实现mysql读写分离[修正于2011-06-23]
"\u003cp\u003e由于公司数据库负载较大,所以便打算使用读写分离来减轻mysql的负载。目前较为常见的mysql读写分离分为两种:\u003c/p\u003e\n\u003cp\u003e1、\u003cstrong\u003e基于程序代码内部实现\u003c/strong\u003e:在代码中根据select、insert进行路由分类;这类方法也是目前生产环境应用最广泛的。优点是性能较好,因为在程序代码中实现,不需要增加额外的设备作为硬件开支。缺点是需要开发人员来实现,运维人员无从下手。\u003c/p\u003e\n\u003cp\u003e2、\u003cstrong\u003e基于中间代理层实现\u003c/strong\u003e:我们都知道代理一般是位于客户端和服务器之间,代理服务器接到客户端请求后通过判断然后转发到后端数据库。在这有两个代表性程序\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003emysql-proxy\u003c/strong\u003e**:** \u003ca href=\"http://dev.mysql.com/downloads/mysql-proxy/\"\u003emysql-proxy\u003c/a\u003e 为mysql开源项目,通过其自带的lua脚本进行sql判断,虽然是mysql官方产品,但是mysql官方并不建议将mysql-proxy用到生产环境。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eamoeba\u003c/strong\u003e**:**由陈思儒开发,作者曾就职于阿里巴巴,现就职于盛大。该程序由java语言进行开发,目前只听说阿里巴巴将其用于生产环境。另外,此项目严重缺少维护和推广(作者有个官方博客,很多用户反馈的问题发现作者不理睬)\u003c/p\u003e\n\u003cp\u003e经过上述简单的比较,通过程序代码实现mysql读写分离自然是一个不错的选 …\u003c/p\u003e"
May 8, 2011
用cacti监控centos下mysql,memcache等服务状态
"\u003cp\u003eCACTI测试OK\n安装环境:CENTOS5.4\n提前需要安装的组件:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003emysql\n2。APACHE\n3。PHP\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e步骤:\n一。安装 net-snmp\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eyum install net-snmp*\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e注意加个*,把所有的咚咚都装上,否则没有cacti需要的命令.\u003c/p\u003e\n\u003cp\u003e二。安装 php-snmp\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eyum install php-snmp\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e三.安装rrdtool,根据自己系统的版本,选择不同的RPM包\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ca href=\"http://www.express.org/%7Ewrl/rrdtool/\"\u003ewget\u003c/a\u003e \u003ca href=\"http://www.express.org/%7Ewrl/rrdtool/rrdtool-1.2.30-1.el5.wrl.x86_64.rpm\"\u003ehttp://www.express.org/~wrl/rrdtool/rrdtool-1.2.30-1.el5.wrl.x86_64.rpm\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003ewget \u003ca href=\"http://www.express.org/%7Ewrl/rrdtool/rrdtool-devel-1.2.30-1.el5.wrl.x86_64.rpm\"\u003ehttp://www.express.org/~wrl/rrdtool/rrdtool-devel-1.2.30-1.el5.wrl.x86_64.rpm\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003ewget \u003ca href=\"http://www.express.org/%7Ewrl/rrdtool/rrdtool-perl-1.2.30-1.el5.wrl.x86_64.rpm\"\u003ehttp://www.express.org/~wrl/rrdtool/rrdtool-perl-1.2.30-1.el5.wrl.x86_64.rpm\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e三个包必须一块安装\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003erpm -ivh *-1.2.30*\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e四。安装cacti\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ewget\nrpm -ivh …\u003c/p\u003e\u003c/blockquote\u003e"
April 16, 2011
cacti 监控nginx 出现 no (LWP::UserAgent not found)的解决办法
"\u003cp\u003e在上一篇\u0026laquo; \u003ca href=\"http://blog.haohtml.com/archives/9288\"\u003e如何安装cacti监控nginx的插件\u003c/a\u003e \u0026raquo;文章里我们介绍了如何安装,但在最后发现执行\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eget_nginx_clients_status.pl \u003ca href=\"http://nginx.server.tld/nginx\"\u003ehttp://nginx.server.tld/nginx\u003c/a\u003e_status\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e的时候,提示 no (LWP::UserAgent not found) 错误的原因是该系统 perl 缺少了相关组建,解决办法:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e[shell]yum -y install perl-libwww-perl[/shell]\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e如果还不行,再按下面的方法解决:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e[shell]#perl -MCPAN -e shell 一直回车,知道出现cpan\u0026amp;amp;gt;\u0026amp;nbsp; 提示符开始。\n\ncpan\u0026amp;gt; install LWP::UserAgent\ncpan\u0026amp;gt; exit\n[/shell]\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e如果perl相关组件安装成功,就能正常显示了。\u003c/p\u003e\n\u003cp\u003e[root@localhost scripts]# ./get_nginx_clients_status.pl\nnginx_active:149 …\u003c/p\u003e"
April 16, 2011
[教程]Centos 5.5 快速安装cacti
"\u003cp\u003e\u003cstrong\u003e一、准备工作\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e环境:Centos 5.4 x86_64\n所需软件:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ehttp\nPhp\nPhp-mysql\nPhp-snmp\nMysql\nPerl-DBD-MySQL\nPhp-pdo\nrrdtool\nNet-snmp\nNet-snmp-libs\nNet-snmp-utils\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e#下载相关软件\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ecd /usr/local/src/\u003c/p\u003e\n\u003cp\u003ewget \u003ca href=\"http://www.cacti.net/downloads/cacti-0.8.7e.tar.gz\"\u003ehttp://www.cacti.net/downloads/cacti-0.8.7e.tar.gz\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e二、环境介绍\u003c/strong\u003e\n主监控机是Centos 5.4 x86_64\n主监控机IP=10.0.0.52\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e三、安装配置\u003c/strong\u003e\n(1)在主监控机上安装apache+php+gd的web环境,推荐编译安装,不再赘述,本处方便起见用yum装了\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eyum install php php-mysql php-snmp mysql mysql-server net-snmp net-snmp-libs net-snmp-utils php-pdo perl-DBD-MySQL\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e(2)在主监控机上安装rrdtool,rrdtool依赖的包过多,所以选择增加源,然后用yum安装\n#增 …\u003c/p\u003e"
March 24, 2011
[教程]windows下安装awstats来分析apache的访问日志
"\u003cp\u003e下面的教程是在windows2003服务器下安装配置的,由于awstats是由perl程序写的,所以需要我们在安装awstats以前,需要安装ActivePerl( \u003ca href=\"http://www.activestate.com/\"\u003ehttp://www.activestate.com/\u003c/a\u003e),这里安装的为 v5.10.1版本.安装路径为d:\\perl,记得要启动httpd.conf文件里的LoadModule cgi_module modules/mod_cgi.so模块.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一.下载软件包\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e从官方网站( \u003ca href=\"http://awstats.sourceforge.net/\"\u003ehttp://awstats.sourceforge.net/\u003c/a\u003e)下载最新的awstats压缩包(也可以下载.exe的安装文件),这里下载的是awstats-7.0.zip压缩包.将其解压到D:\\site\\awstats-7.0目录里.\n\u003cstrong\u003e二.初始化配置环境\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e打开D:/site/awstats-7.0/tools文件夹,双击执行awstats_configure.pl,根据提示输入自己apache的安装环境和httpd.conf文件所在的位置,以下为我本机的环境,如图所示:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/03/awstats_install_1.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/awstats_install_1.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/03/awstats_install_2.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/awstats_install_2.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e回车后,提示\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2011/03/awstats_install_3.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/awstats_install_3.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e这里直接输入”n”,我们手动来配置就可以了,接着是两次回车就可以 …\u003c/p\u003e"
March 23, 2011
squid中日志文件详解
"\u003ch3 id=\"a4\"\u003e4.4 日志文件路径\u003c/h3\u003e\n\u003cp\u003e我将在第13章讨论所有squid的日志细节。你现在你关注的唯一事情是,squid将它的日志放在何处。默认的日志目录是squid安装位置下的logs目录。例如,假如你在./configure时没有使用–prefix=选项,那么默认的日志文件路径是/usr/local/squid/var/logs.\u003c/p\u003e\n\u003cp\u003e你必须确认日志文件所存放的磁盘位置空间足够。在squid写日志时如果接受到错误,它会退出和重启。该行为的主要理由应引起你的注意。squid想确认你不会丢失任何重要的日志信息,特别是你的系统被滥用或者被攻击时。\u003c/p\u003e\n\u003cp\u003esquid有三个主要的日志文件:cache.log,access.log,store.log.第一个文件即cache.log,包含状态性的和调试性的消息。当你刚开始运行squid时,你应密切的关注该文件。假如squid拒绝运行,理由也许会出现在cache.log文件的结尾处。在正常条件下,该文件不会变得很大。也请注意,假如你以-s选项来运行squid,重要的cache.log消息也可被送到你的syslog进程。通过使用cache_log指令,你可以改变该日志文件的路 …\u003c/p\u003e"
March 10, 2011
负载均衡工具haproxy安装,配置,使用
"\u003cp\u003e\u003cstrong\u003e一,什么是haproxy\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eHAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代 理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。 HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二,安装haproxy\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e下载列表地址 \u003ca href=\"http://haproxy.1wt.eu/#down\"\u003ehttp://haproxy.1wt.eu\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ewget \u003ca href=\"http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.8.tar.gz\" title=\"haproxy下载\"\u003ehttp://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.8.tar.gz\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e#tar zxvf haproxy-1.4.8.tar.gz\n#cd haproxy-1.4.8\n#uname -a //查看linux内核版本\n#make TARGET=linux26 PREFIX=/usr/local/haproxy\n#make install PREFIX=/usr/local/haproxy\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e三,配置haproxy\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003evi …\u003c/strong\u003e\u003c/p\u003e"
February 15, 2011
可伸缩性最佳实践:来自eBay的经验
"\u003cp\u003e摘自:\u003c/p\u003e\n\u003cp\u003e在eBay,可伸缩性是我们每天奋力抵抗的一大架构压力。我们所做的每一项架构及设计决策,身前身后都能看到它的踪影。当我们面对的是全世界数以亿计的用户,每天的页面浏览量超过10亿,系统中的数据量要用皮字节(1015或250)来计算——可伸缩性是生死交关的问题。\u003c/p\u003e\n\u003cp\u003e在一个可伸缩的架构中,资源的消耗应该随负载线性(或更佳)上升,负载可由用户流量、数据量等测量。如果说性能衡量的是每一工作单元所需的资源消 耗,可伸缩性则是衡量当工作单元的数量或尺寸增加时,资源消耗的变化情况。换句话说,可伸缩性是整个价格-性能曲线的形状,而不是曲线上某一点的取值。\u003c/p\u003e\n\u003cp\u003e可伸缩性有很多侧面——事务的方面、运营的方面、还有开发的方面。我们在改善一个Web系统的事务吞吐量的过程中学到了很多经验,本文总结了其中若 干关键的最佳实践。可能很多最佳实践你会觉得似曾相识,也可能有素未谋面的。这些都是开发和运营eBay网站的众人的集体经验结晶。\u003c/p\u003e\n\u003ch3 id=\"最佳实践-1按功能分割\"\u003e最佳实践 #1:按功能分割\u003c/h3\u003e\n\u003cp\u003e相关的功能部分应该合在一起,不相关的功能部分应该分割开来——不管你把它叫做SOA、功能分解还是工程秘诀。而且,不相关的功能之间耦合程度越松散,就越能灵活地独立 …\u003c/p\u003e"
December 17, 2010
[教程]FreeBSD下安装cacti教程(原创)
"\u003cp\u003e以下配置环境为:FreeBSD8.1 Nginx0.8.54 PHP5.2.15 Mysql5.1.54-log\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一.首先配置php网站环境\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e一般采用的lamp(linux,apache,php,mysql),我们这里用的是FreeBSD的系统,web用的是Nginx,平台搭建教程请参考:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二.安装sockets扩展\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e注意要选择sockets的扩展版本与您所使用的php版本一致,这里我使用的为php5.2.15版本,所以选择了php52-sockets.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#cd /usr/ports/net/php52-sockets\n#make install clean\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e上面的命令会产生一个sockets.so的扩展,系统会自动将一行\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eextension=sockets.so\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e信息添加到/usr/local/etc/php/extensions.ini 文件末尾.\u003c/p\u003e\n\u003cp\u003e如果您确认已经安装过pdo_mysql这个扩展的话,这步可以跳过.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#cd /usr/ports/databases/php5-pdo_mysql\n#make install clean\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e三、安装rrdtool12\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#cd …\u003c/p\u003e\u003c/blockquote\u003e"
December 13, 2010
KVM与Xen和VMware的PK
"\u003cp\u003eKVM和Xen都是linux下的虚拟机软件,不过似乎都说Xen比KVM强大一些,我也试用了一段时间,今天终于在我的HP笔记本上安装了个Xen上的WinXP,感觉似乎比KVM下的是更稳定一些。\u003c/p\u003e\n\u003cp\u003e不过就配置来说,kvm比xen简单太多了,Xen还必须有个单独的内核,原有的Linux内核是作为模块加载的。Kvm不论是安装win还是linux系统都必须有CPU的支持,而Xen只有安装Win的时候才需要CPU的支持。\u003c/p\u003e\n\u003cp\u003e就稳定性来说,还是老辣的Xen好的多,KVM下用everest等软件取硬件信息就死机,xen就不会。但是对鼠标的支持就是KVM好一些了,到了虚拟机的屏幕里就直接锁定了,不像Xen有两个鼠标,位置不一样老是漂来漂去的,让我找的烦死了。\u003c/p\u003e\n\u003cp\u003e这篇文章翻译至KVM的maintainer Avi Kivity的一篇\u003ca href=\"http://avikivity.blogspot.com/2008/04/maintainability-vs-performance.html\"\u003e文章\u003c/a\u003e. 文中提到了KVM比ESX和Xen优越的一个地方:既能获得很好的performance,又能解决设备驱动的维护问题。还是有一定的道理。\u003c/p\u003e\n\u003cp\u003eI/O的性能对一个hypervisor而言至关重要。同时,I/O也是一个很大的维护负担,因为有大量需要被支持的硬件设备,大量的I/O协议,高可 …\u003c/p\u003e"
November 24, 2010
Memcache mutex设计模式
"\u003cp\u003e周六的S2 \u003ca href=\"http://www.s2forum.org/1/topic/\"\u003eWeb 2.0技术沙龙\u003c/a\u003e上介绍了memcache中使用mutex场景(文后要演讲稿),有网友对详情感兴趣,简单介绍如下。\u003c/p\u003e\n\u003ch3 id=\"场景\"\u003e场景\u003c/h3\u003e\n\u003cp\u003eMutex主要用于有大量并发访问并存在cache过期的场合,如\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e首页top 10, 由数据库加载到memcache缓存n分钟\u003c/li\u003e\n\u003cli\u003e微博中名人的content cache, 一旦不存在会大量请求不能命中并加载数据库\u003c/li\u003e\n\u003cli\u003e需要执行多个IO操作生成的数据存在cache中, 比如查询db多次\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"问题\"\u003e问题\u003c/h3\u003e\n\u003cp\u003e在大并发的场合,当cache失效时,大量并发同时取不到cache,会同一瞬间去访问db并回设cache,可能会给系统带来潜在的超负荷风险。\u003cstrong\u003e我们曾经在线上系统出现过类似故障\u003c/strong\u003e。\u003c/p\u003e\n\u003ch3 id=\"解决方法\"\u003e解决方法\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003e方法一\u003c/strong\u003e\n在load db之前先add一个mutex key, mutex key add成功之后再去做加载db, 如果add失败则sleep之后重试读取原cache数据。为了防止死锁,mutex key也需要设置过期时间。伪代码如下\n(\u003cem\u003e注:下文伪代码仅供了解思路,可能存在bug,欢迎随时指出。\u003c/em\u003e)\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eif (memcache.get(key) == null) {\n // 3 min …\u003c/code\u003e\u003c/pre\u003e"
November 24, 2010
Twitter系统运维经验
"\u003cp\u003e最近看到的另外一个介绍Twitter技术的视频[\u003ca href=\"http://assets.en.oreilly.com/1/event/29/Fixing%20Twitter_%20Improving%20the%20Performance%20and%20Scalability%20of%20the%20World%27s%20Most%20Popular%20Micro-blogging%20Site%20Presentation.pdf\"\u003eSlides\u003c/a\u003e] [\u003ca href=\"http://blip.tv/file/2300327\"\u003eVideo\u003c/a\u003e (GFWed)],这是Twitter的John Adams在\u003ca href=\"http://en.oreilly.com/velocity2009\"\u003eVelocity 2009\u003c/a\u003e的一个演讲,主要介绍了Twitter在系统运维方面一些经验。 本文大部分整理的观点都在Twitter(@\u003ca href=\"http://twitter.com/xmpp\"\u003exmpp\u003c/a\u003e)上发过,这里全部整理出来并补充完整。\u003c/p\u003e\n\u003cp\u003eTwitter没有自己的硬件,都是由NTTA来提供,同时NTTA负责硬件相关的网络、带宽、负载均衡等业务,Twitter operations team\u003cstrong\u003e只关注核心的业务,包括Performance,Availability,Capacity Planning容量规划,配置管理\u003c/strong\u003e等,这个可能跟国内一般的互联网公司有所区别。\u003c/p\u003e\n\u003ch3 id=\"1-运维经验\"\u003e1. 运维经验\u003c/h3\u003e\n\u003ch4 id=\"-metrics\"\u003e* Metrics\u003c/h4\u003e\n\u003cp\u003eTwitter的监控后台几乎都是图表(critical metrics),类似驾驶室的转速表,时速表,让操作者可以迅速的了解系统当前的运作状态。联想到我们做的类似监控后台,数据很多,但往往还需要浏览者做二次分析判断,像这样满屏都是图表的方法做得还不够,可以学习下这方面经验。 据John介绍可以从图表上看到系统的瓶颈-系统最弱 …\u003c/p\u003e"
November 18, 2010
杨卫华:新浪微博的架构发展历程
"\u003cp\u003e新浪科技讯 11月16日下午消息,由 \u003ca href=\"http://t.sina.com.cn/\"\u003e新浪微博\u003c/a\u003e( \u003ca href=\"http://t.sina.com.cn/\"\u003ehttp://t.sina.com.cn\u003c/a\u003e)(\u003ca href=\"http://t.sina.com.cn/\"\u003ehttp://t.sina.com.cn\u003c/a\u003e)主办的中国首届微博开发者大会在北京举行,这是国内微博行业的首场技术盛宴。作为国内微博市场的绝对领军者,新浪微博将在此次大会上公布一系列针对开发者的扶持政策,以期与第三方开发者联手推动微博行业的整体发展。图为微博平台首席架构师杨卫华演讲。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e以下为演讲实录:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e大家下午好,在座的大部分都是技术开发者,技术开发者往往对微博这个产品非常关心。最晚的一次,是12点多收到一个邮件说想了解一下微博底层是 怎么构架的。很多技术人员对微博的构架非常感兴趣,就是一个明星他有300万粉丝,这个技术怎么来实现?今天在这里跟大家分享一下微博的底层机构,让大家 对微博的底层技术有更好的了解。另外不管是做客户端、1.0、2.0、论坛、博客都要考虑架构的问题,架构实际上是有一些共性的。今天我通过讲解微博里面 的一些架构,分析一下架构里面哪些共性大家可以参考。\u003c/p\u003e\n\u003cp\u003e首先给大家介绍一下微博架构发展的历程。新浪微博在短短一年时间内从零发展到五千万用户,我们的基层架构也发展了几个版本。第一版就是是 …\u003c/p\u003e"
November 11, 2010
分布式数据库拆表拆库的常用策略
"\u003cp\u003e在大容量,高负荷的web系统中,对数据库进行一系列拆分,可有效提升数据库容量和性能。在初学程序的早期,程序员通常都喜欢按传统数据库设计模式,设计为单库和单一功能表的结构,这样的结构在数据量和并发量达到一定程度之后,会出现严重性能问题和维护问题。在出现问题的时候才着手进行优化,会非常痛苦,所以应该在系统架设之初就考虑好之后会出现的问题。\u003c/p\u003e\n\u003cp\u003e目前有些数据库策略是采用单库结构,然后通过同步分发到数台服务器实现读写分离。个人觉得这样的策略非常笨拙,还是想办法将其分隔开来好,否则每台机器的内存都很容易超支。\u003c/p\u003e\n\u003cp\u003e一般只对数据量比较大的表进行拆分,这应该没有什么异议;还有一种是有可能会进行维护的比较重要的表,比如文章目录表,如果有从其它系统倒数据进来的可能的话,也要拆掉,不然倒数据时一不小心把目录表弄坏了,发现忘了备份,那真是欲哭无泪。\u003c/p\u003e\n\u003cp\u003e下面来分析一下:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、时间结构\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e如果业务系统对时效性较高,比如新闻发布系统的文章表,可以把数据库设计成时间结构,按时间分有几种结构:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e平板式\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e表类似:\narticle_200901\narticle_200902\narticle_200903\u003c/p\u003e\n\u003cp\u003e用年来分还是用月可自定, …\u003c/p\u003e"
November 9, 2010
网络七层协议及负载均衡
"\u003cp\u003e根据OSI模型把网络通信的工作分为七层.一至四层被认为是低层,这些层与数据移动密切相关.五至七层是高层,包含应用程序级的数据.每一层负责一项具体的工作,然后把数据传送到下一层.由低到高具体分为:物理层.数据链路层,网络层,传输层,会话层,表示层和应用层.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/11/osi.gif\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2010/11/osi.gif\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOSI模型的最低层或第一层:物理层\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e物理层包含物理连网网媒介,实际上就是布线,光纤,网卡和其它用来把两台网络通信设备连接在一起的设施.它规定了激活,维持,关闭通信端之间的机械特性,电气特性,功能特性及过程特性.虽然物理层不提供纠错服务,但它能够设定数据传输速率并监测数据出错率.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOSI模型的第二层:数据链路层\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e数据链路层的主要作用是控制网络层与物理层之间的通信.它保证了数据在不可靠的物理线路上进行可靠的传递.它把从网络层接收到的数据侵害成特定的可被牧师层传输的帧,保证了传输的可靠性.它的主要作用包括:物理地址寻址,数据的成帧,流量控制,数据的栓错,重发等.它是独立于网络层和物理层的,工作时无须关心计算机是否在运行软件还是其它操作.\n数据链路层协议主要有:SDLC,DHLC,PPP,STP,帧中继等.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOSI模型的第三层:网络层\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e很多 …\u003c/p\u003e"
November 9, 2010
Nginx中的upstream
"\u003cp\u003eNginx中upstream有以下几种方式:\u003c/p\u003e\n\u003cp\u003e1、轮询(weight=1)\n默认选项,当weight不指定时,各服务器weight相同,\n每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。\u003c/p\u003e\n\u003cp\u003e[shell]upstream bakend {\nserver 192.168.1.10;\nserver 192.168.1.11;\n}\n[/shell]\u003c/p\u003e\n\u003cp\u003e2、weight\n指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。\n如果后端服务器down掉,能自动剔除。\n比如下面配置,则1.11服务器的访问量为1.10服务器的两倍。\u003c/p\u003e\n\u003cp\u003e[shell]upstream bakend {\nserver 192.168.1.10 weight=1;\nserver 192.168.1.11 weight=2;\n}[/shell]\u003c/p\u003e\n\u003cp\u003e3、ip_hash\n每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session不能跨服务器的问题。\n如果后端服务器down掉,要手工down掉。\u003c/p\u003e\n\u003cp\u003e[shell]upstream …\u003c/p\u003e"
October 30, 2010
又拍网架构中的分库设计
"\u003cp\u003e又拍网是一个照片分享社区,从2005年6月至今积累了260万用户,1.1亿张照片,目前的日访问量为200多万。5年的发展历程里经历过许多起伏,也积累了一些经验,在这篇文章里,我要介绍一些我们在技术上的积累。\u003c/p\u003e\n\u003cp\u003e又拍网和大多数Web2.0站点一样,构建于大量开源软件之上,包括\u003ca href=\"http://www.mysql.com/\"\u003eMySQL\u003c/a\u003e、\u003ca href=\"http://www.php.net/\"\u003ePHP\u003c/a\u003e、\u003ca href=\"http://nginx.org/en/\"\u003enginx\u003c/a\u003e、\u003ca href=\"http://www.python.org/\"\u003ePython\u003c/a\u003e、\u003ca href=\"http://www.danga.com/memcached/\"\u003ememcached\u003c/a\u003e、\u003ca href=\"http://code.google.com/p/redis\"\u003eredis\u003c/a\u003e、\u003ca href=\"http://lucene.apache.org/solr/\"\u003eSolr\u003c/a\u003e、\u003ca href=\"http://hadoop.apache.org/\"\u003eHadoop\u003c/a\u003e和\u003ca href=\"http://www.rabbitmq.com/\"\u003eRabbitMQ\u003c/a\u003e等等。又拍网的服务器端开发语言主要是\u003ca href=\"http://www.php.net/\"\u003ePHP\u003c/a\u003e和\u003ca href=\"http://www.python.org/\"\u003ePython\u003c/a\u003e,其中\u003ca href=\"http://www.php.net/\"\u003ePHP\u003c/a\u003e用于编写Web逻辑(通过HTTP和用户直接打交道), 而\u003ca href=\"http://www.python.org/\"\u003ePython\u003c/a\u003e则主要用于开发内部服务和后台任务。在客户端则使用了大量的Javascript, 这里要感谢一下\u003ca href=\"http://mootools.net/\"\u003eMooTools\u003c/a\u003e这个JS框架,它使得我们很享受前端开发过程。 另外,我们把图片处理过程从\u003ca href=\"http://www.php.net/\"\u003ePHP\u003c/a\u003e进程里独立出来变成一个服务。这个服务基于\u003ca href=\"http://nginx.org/en/\"\u003enginx\u003c/a\u003e,但是是作为\u003ca href=\"http://nginx.org/en/\"\u003enginx\u003c/a\u003e的一个模块而开放REST API。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/10/sharding1.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/sharding1.png\" alt=\"开发语言\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e**图1:**开发语言\u003c/p\u003e\n\u003cp\u003e由于\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.php.net/\"\u003ePHP\u003c/a\u003e的单线程模型,我们把耗时较久的运算和I/O操作从HTTP请求周期中分离出来, 交给由\u003ca href=\"http://www.python.org/\"\u003ePython\u003c/a\u003e实现的任务进程来完成,以保证请求响应速度。这 …\u003c/p\u003e"
October 30, 2010
软件架构设计中的同步与异步问题(修改版)
"\u003cp\u003e内容概要:本文分析了大型程序系统设计中经常需要面对的同步和异步结构问题。列举异步结构模式实现手段,论证异步模式效率远远优越于同步模式,证明在硬件资源理想情况下,对同步模式而言并发量对计算机系统的平均交易处理时间没有影响,对异步模式而言平均交易处理时间会随着并发量的增大而急剧下降,最终也趋向一个恒定值。在实际有限计算机资源情况下,程序设计必须设置最大并发量以控制并发程度,否则过多并发量会形成交易对硬件资源的竞争,造成交易的拥塞。\u003c/p\u003e\n\u003cp\u003e关键词:同步,异步,消息队列,效率,并发\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一.基本概念\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e同步和异步问题是大型程序设计中需要慎重等待的问题,但目前这方面的讨论很少,本文就试图进行有关方面讨论。\u003c/p\u003e\n\u003cp\u003e一个大型的程序系统常常是由很多不能功能模块组成的。程序系统运行时不同功能模块要按一定顺序执行,以协同完成一件任务。功能模块协作运行完成一件任务存在同步和异步两种方式。如果在某一时间段,这个程序系统的所有功能模块都在为完成相同的一件任务而服务,某一个功能模块在完成一件任务的子任务后,需要等待其他功能模块完成子任务,这样只有当全部功能模块按顺序完成一件任务后,程序系统才能接收下一个任务,功能模块是串行运行,这 …\u003c/p\u003e"
October 28, 2010
ipvsadm+keepalived 实现高可用负载均衡
"\u003ch4 id=\"一使用系统red-hat-enterprise-linux-server-release-54\"\u003e一.使用系统Red Hat Enterprise Linux Server release 5.4\u003c/h4\u003e\n\u003ch4 id=\"二安装环境\"\u003e二.安装环境\u003c/h4\u003e\n\u003ch4 id=\"1说明\"\u003e1.说明\u003c/h4\u003e\n\u003cp\u003erealserver:192.168.1.11\u003c/p\u003e\n\u003cp\u003erealserver:192.168.1.12\u003c/p\u003e\n\u003cp\u003elvs控制机 MASTER:192.168.1.100\u003c/p\u003e\n\u003cp\u003eBACKUP:192.168.1.101\u003c/p\u003e\n\u003cp\u003e虚拟VIP:192.168.1.200\u003c/p\u003e\n\u003cp\u003e其中:realserver上只需要简单的安装apache即可\u003c/p\u003e\n\u003cp\u003elvs控制机需要安装:ipvsadm,keepalived\u003c/p\u003e\n\u003ch4 id=\"2lvs控制机安装主备机分别安装ipvsadm\"\u003e2.lvs控制机安装,主备机分别安装ipvsadm\u003c/h4\u003e\n\u003cp\u003e实现LVS/DR最重要的两个东西是ipvs内核模块和ipvsadm工具包,现在的系统已经包含ip_vs模块\u003c/p\u003e\n\u003ch4 id=\"1检查内核模块看一下ip_vs是否被加载\"\u003e1)检查内核模块,看一下ip_vs 是否被加载\u003c/h4\u003e\n\u003cblockquote\u003e\n\u003ch1 id=\"lsmod-grep-ip_vs\"\u003elsmod |grep ip_vs\u003c/h1\u003e\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eip_vs 35009 0\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e如果没有显示,则说明没有加载,执行命令 modprobe ip_vs 就可以把ip_vs模块加载到内核\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#modprobe ip_vs\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch4 id=\"2安装ipvsadm\"\u003e2)安装ipvsadm\u003c/h4\u003e\n\u003cp\u003e先把目 …\u003c/p\u003e"
October 26, 2010
Centos5下配置 lvs DR
"\u003cp\u003e系统环境如下:\u003c/p\u003e\n\u003cp\u003eserver1:192.168.1.206 vip server centos5\nserver2:192.168.1.210 apache centos5\nserver3:192.168.1.211 apache centos5\u003c/p\u003e\n\u003cp\u003evip:192.168.1.208\nport:80\u003c/p\u003e\n\u003cp\u003e============================================\u003c/p\u003e\n\u003cp\u003e下面的安装是在vip server上进行的\u003c/p\u003e\n\u003cp\u003e1、查看自己的操作系统的内核 #uname -a\u003c/p\u003e\n\u003cp\u003e2、这个内核已经包括了ipvs的补丁,进行如下的操作就可以\u003c/p\u003e\n\u003cp\u003e3、下面建立一个指向,为了保证ipvsadm安装\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003emodprobe ip_vs\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ecat /proc/net/ip_vs\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e出现如下的提示\u003c/p\u003e\n\u003cp\u003eIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags\u003c/p\u003e\n\u003cp\u003e– \u0026gt; RemoteAddress:Port Forward Weight ActiveConn InActConn\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e4、安装ipvsadm …\u003c/strong\u003e\u003c/p\u003e"
October 22, 2010
nginx与lvs做负载均衡的比较
"\u003cp\u003elvs和nginx都可以用作多机负载的方案,它们各有优缺,在生产环境中需要好好分析实际情况并加以利用。\u003c/p\u003e\n\u003cp\u003e首先提醒,做技术切不可人云亦云,我云即你云;同时也不可太趋向保守,过于相信旧有方式而等别人来帮你做垫被测试。把所有即时听说到的好东西加以钻研,从而提高自己对技术的认知和水平,乃是一个好习惯。\u003c/p\u003e\n\u003cp\u003e下面来分析一下两者:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、lvs的优势:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1、抗负载能力强,因为lvs工作方式的逻辑是非常之简单,而且工作在网络4层仅做请求分发之用,没有流量,所以在效率上基本不需要太过考虑。在我手里的lvs,仅仅出过一次问题:在并发最高的一小段时间内均衡器出现丢包现象,据分析为网络问题,即网卡或linux2.4内核的承载能力已到上限,内存和cpu方面基本无消耗。\u003c/p\u003e\n\u003cp\u003e2、配置性低,这通常是一大劣势,但同时也是一大优势,因为没有太多可配置的选项,所以除了增减服务器,并不需要经常去触碰它,大大减少了人为出错的几率。\u003c/p\u003e\n\u003cp\u003e3、工作稳定,因为其本身抗负载能力很强,所以稳定性高也是顺理成章,另外各种lvs都有完整的双机热备方案,所以一点不用担心均衡器本身会出什么问题,节点出现故障的话,lvs会自动判别,所以系统整体是非常稳定 …\u003c/p\u003e"
October 1, 2010
[教程]FreeBSD下squid3.0安装教程
"\u003cp\u003e以下文章,虽然在FreeBSD下安装,linux下的安装方法类似.只是一些命令如fetch=\u0026gt;wget变更一下即可.\u003c/p\u003e\n\u003cp\u003e如何您是在FreeBSD下用ports来安装的话,前两步基本可以省略,默许的安装路径为/usr/local/sbin/squid,配置目录为/usr/local/etc/squid。\u003c/p\u003e\n\u003cp\u003e此版本好像有漏洞,安装时请使用最新的稳定版本: \u003ca href=\"http://www.cnbeta.com/articles/121237.htm\"\u003ehttp://www.cnbeta.com/articles/121237.htm\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、编译安装\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#fetch \u003ca href=\"http://www.squid-cache.org/Versions/v3/3.0/squid-3.0.STABLE25.tar.gz\"\u003ehttp://www.squid-cache.org/Versions/v3/3.0/squid-3.0.STABLE25.tar.gz\u003c/a\u003e\n#tar zxvf squid-3.0.STABLE25.tar.gz //稳定版\n#cd squid-3.0.STABLE25\n#./configure –prefix=/usr/local/squid \u003cbr\u003e\n–enable-arp-acl \u003cbr\u003e\n–enable-linux-netfilter \u003cbr\u003e\n–enable-pthreads …\u003c/p\u003e\u003c/blockquote\u003e"
September 30, 2010
apache squid 配置反向代理服务相关文章
"\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"http://www.haohtml.com/server/services/44403.html\"\u003eapache + squid 配置反向代理服务\u003c/a\u003e环境 :ubuntu 9.04(linux 2.6.28-15-generic) apache版本:Apache/2.2.11 squid版本:Squid3.0/STABLE8 本机IP :192.168.1.102并在/etc/hosts里添加www.abc.com的伪域名以便测试 安装方式 :apt-get安装(源码安装同) 配置文件: apache:(/etc/apach…\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"http://www.haohtml.com/server/services/44402.html\"\u003eLinux下Squid3.0反向代理的安装与配置\u003c/a\u003e1. Squid3.0的安装是很简单的: ./configure –prefix=/usr/local/squid make make install chown -R nobody.nobody /usr/local/squid/var/ /usr/local/squid/sbin/squid -z Squid3.0的配置也不复杂: 假设我们有两台Apache服务器需要反向代理:www.avnads.c…\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"http://www.haohtml.com/server/services/44401.html\"\u003esquid3.0快速缓存实现\u003c/a\u003e一、编译安装 #tar zxvf …\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e"
September 11, 2010
远程存储图片到其它服务器上
"\u003cp\u003e关于\u003ca href=\"http://www.dbanotes.net/web/web_image_server.html\"\u003e图片服务器的优化\u003c/a\u003e基本都是采用独立的域名,使用独立的域名,不光是可以并发连接的问题,还有一个重要因素是可以避免 COOKIE 的影响。下面介绍几种方案来实现图片服务器。本人在硬件方面还是个菜鸟,不对之处请谅解!\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e使用同步软件拷贝数据\n使用ftp传递数据,php也可以操作\n使用samba来共享文件夹\n使用NFS来共享文件夹\n使用其他专业数据存储\n使用socket来post上传数据\n使用curl来上传数据\nAJAX、FLASH跨域上传\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e共享方式\u003c/strong\u003e\nNFS:在图片服务器上使用NFS服务,其他服务器上绑定NFS的共享目录,目录权限是可读可写,这样来实现读写。\n其他的共享方式应该都差不多吧,没研究,需要的自己google。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e因为php是不能直接在不同服务器之间存取文件的,但是我们还是可以采用FTP方式远程传输,socket方式来POST文件的。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e使用FTP远程传输\u003c/strong\u003e\nPHP是支持FTP的,给个FTP类里面,自己看着办吧,上传后调用FTP类,同步到FTP服务器中,好处是现有程序只需要在上传那段加上FTP上传就行了,坏处就是一定要支持FTP。\u003c/p\u003e\n\u003col start=\"2\"\u003e\n\u003cli\u003e\n\u003cp\u003e// …\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e"
September 1, 2010
squid优化建议
"\u003cp\u003e\u003cstrong\u003esquid优化建议(转贴) 作者:听松一隅\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eSQUID是个很不错CACHE服务器,各大门户网站都在用。过去二天也做了些SQUID优化,把经验贴上来。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e几个重要参数:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003emaximum_object_size 是能cache最大的文件大小。对应wmv,rm文件,建议设置为32768 kB\u003c/li\u003e\n\u003cli\u003emaximum_object_size_in_memory 是在内存中cache的最大文件大小。一般为128的倍数.\u003c/li\u003e\n\u003cli\u003ecache_mem 是SQUID可用到的最大内存。经实践,4G内存的服务器用2G;超过2G导致SQUID运行不稳\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e首先要分析SQUID所cache内容:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e运行 squidclient -p 80 cache_object://localhost/info 能看到如下内容:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eStorage Swap size: 7549104 KB\nStorage Mem size: 418804 KB\nMean Object Size: 160.46 KB\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eMean Object Size是平均内容大小,一般要把maximum_object_size_in_memory设置成离它最近的128的倍数。 …\u003c/p\u003e"
August 28, 2010
三种LVS负载均衡模式
"\u003cp\u003e调度器的实现技术中,IP负载均衡技术是效率最高的,IP虚拟服务器软件(IPVS)是在linux内核中实现的。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eLVS负载均衡模式—1.NAT模式\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eNAT用法本来是因为网络IP地址不足而把内部保留IP地址通过映射转换成公网地址的一种上网方式(原地址NAT)。如果把NAT的过程稍微变化,就可以成为负载均衡的一种方式。原理其实就是把从客户端发来的IP包的IP头目的地址在DR上换成其中一台REALSERVER的IP地址并发至此REALSERVER,而REALSERVER则在处理完成后把数据经过DR主机发回给客户端,DR在这个时候再把数据包的原IP地址改为DR接口上的IP地址即可。期间,无论是进来的流量,还是出去的流量,都必须经过DR。\u003c/p\u003e\n\u003cp\u003e**LVS负载均衡模式—2.IP隧道模式\n**\n隧道模式则类似于VPN的方式,使用网络分层的原理,在从客户端发来的数据包的基础上,封装一个新的IP头标记(不完整的IP头,只有目的IP部)发给REALSERVER,REALSERVER收到后,先把DR发过来的数据包的头给解开,还原其数据包原样,处理后,直接返回给客户端,而不需要再经过DR。需要注意的是,由 …\u003c/p\u003e"
August 28, 2010
Nginx+keepalived负载均衡篇
"\u003cp\u003e由于nginx的url hash功能可以很好的提升squid的性能,所以我把squid前端的负载均衡器更换为nginx,但是一台nginx就形成了单点,现在使用keepalived来解决这个问题,keepalived的故障转移时间很短,而且配置简单,这也是选择keepalived的一个主要原因,建议日PV值小的中小型企业web均可采用如下方案实行,下面直接上安装步骤:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、\u003cstrong\u003e\u003cstrong\u003e环境\u003c/strong\u003e\u003c/strong\u003e:\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ecentos5.3、nginx-0.7.51、keepalived-1.1.19\u003c/p\u003e\n\u003cp\u003e主nginx负载均衡器:192.168.0.154\u003c/p\u003e\n\u003cp\u003e辅nginx负载均衡器:192.168.9.155\u003c/p\u003e\n\u003cp\u003evip:192.168.0.188\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e二、安装keepalived\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#tar zxvf keepalived-1.1.19.tar.gz\u003c/p\u003e\n\u003cp\u003e#cd keepalived-1.1.19\u003c/p\u003e\n\u003cp\u003e#./configure –prefix=/usr/local/keepalived\u003c/p\u003e\n\u003cp\u003e#make\u003c/p\u003e\n\u003cp\u003e#make install\u003c/p\u003e\n\u003cp\u003e#cp /usr/local/keepalived/sbin/keepalived /usr/sbin/\u003c/p\u003e\n\u003cp\u003e#cp …\u003c/p\u003e\u003c/blockquote\u003e"
August 22, 2010
squid和varnish的小结
"\u003cp\u003e上周初步接触linux下的这2个反向缓存软件,都实验了一下,貌似squid还是比较顺利的,varnish则碰到了一些问题\u003c/p\u003e\n\u003cp\u003e从varnish的文档看,性能比squid强很多,而且不是一点点,下面国外某在线媒体的12台squid换成3台varnish前后访问响应延时比较,据说有人也测试过的确如此,\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/squid-vs-varnish.jpg\" alt=\"\"\u003e][1]\u003c/p\u003e\n\u003cp\u003e但我就不那么顺利了。先说squid,安装很顺利,网上的中文文档也很多,在这次尝试中,被缓存的网站的静态内容并不多,主要还是以PHP为主,所以反向cache的效果并不是很好,缓存命中率在60到70%之间,缓存的主要对象是图片。由于安装调试都很顺利,所以在“试玩”了一天后,直接就上线用上了,几天下来,正常。由于做反向缓存的服务器内存不大,只有1G,所以缓存大小只设置了384M,使用了shm,保证了速度,但应该是没有充分发挥出缓存的效能,后期准备增加1G的内存,把缓存扩大到1G,这样的话,缓存对象的大小还能再设置大一些,也许有些mp3之类的也可以缓存起来,这样命中率也许会更高些。\u003c/p\u003e\n\u003cp\u003e但即便缓存的命中不是很高,但对后面WEB服务器的压力确实是大大减少了,下面是web服务器上并发连接的图示,一处 …\u003c/p\u003e"
August 22, 2010
lvs-可伸缩Web和媒体服务
"\u003cp\u003e基于LVS可伸缩Web和媒体服务的体系结构如图2.2所示:在前端是一个负载调度器,一般采用IP负载均衡技术来获得整个系统的高吞吐率;在第二层是服务器池,Web服务和媒体服务分别运行在每个结点上;第三层是数据存储,通过分布式文件系统使得每个服务器结点共享相同的数据。集群中结点间是通过高速网络相连的。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/08/web-media-cluster.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/web-media-cluster.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e2.2:基于LVS的可伸缩Web和媒体集群\u003c/p\u003e\n\u003cp\u003e分布式文件系统提供统一的存储空间,这使得系统的维护工作比较方便,且系统运行比较高效。当所有服务器结点超载时,管理员可以很快地加入新的结点来处理请求,而无需将Web文档等复制到结点的本地硬盘上。Webmaster可以看到统一的文档存储空间,维护和更新页面比较方便,对分布式文件系统中页面的修改对所有的服务器都有效。大的媒体文件(如视频文件)分段存储在分布式文件系统的多个结点上,可以提高文件系统的性能和文件服务器间的负载均衡。\u003c/p\u003e\n\u003cp\u003eIP负载调度器(即VS/DR方法,将在下一章详细叙述)可以分别将Web服务和媒体服务负载均衡地分发到各个服务器上,服务器将响应数据直接返回给客户,这样可以极大地提高系统的吞吐率。\u003c/p\u003e\n\u003cp\u003eReal公司以其高压缩比的音频视频格式和音频视频 …\u003c/p\u003e"
August 22, 2010
LVS集群的通用结构
"\u003cp\u003eLVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/08/lvs-architecture.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/lvs-architecture.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e图2.1:LVS集群的体系结构\u003c/p\u003e\n\u003cp\u003e为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。LVS集群的体系结构如图2.1所示,它有三个主要组成部分:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e负载调度器(load balancer),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址上的。它可以是用IP负载均衡技术的负载调度器,也可以是基于内容请求分发的负载调度器,还可以是两者的结合。\u003c/li\u003e\n\u003cli\u003e服务器池(server pool),是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等。\u003c/li\u003e\n\u003cli\u003e后端存储(backend storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e调度器采用IP负载均衡技术、基于内容请求分发技术或者两者相结合。在IP负载均衡技术中,需要服务器池拥有相同的内容提供相同的服务。当客 …\u003c/p\u003e"
August 20, 2010
Keepalived服务器状态监测
"\u003cp\u003ekeepalived是一个类似于layer3, 4 \u0026amp; 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。\u003c/p\u003e\n\u003cp\u003eLayer3,4\u0026amp;5工作在IP/TCP协议栈的IP层,TCP层,及应用层,原理分别如下:\u003c/p\u003e\n\u003cp\u003eLayer3:Keepalived使用Layer3的方式工作式时,Keepalived会定期向服务器群中的服务器\u003c/p\u003e\n\u003cp\u003e发送一个ICMP的数据包(既我们平时用的Ping程序),如果发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除,…\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e相关keepalived实现的教程:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e基于LVS的集群配置:\u003c/p\u003e\n\u003cp\u003e利用LVS+Keepalived 实现高性能高可用负载均衡服务器:\u003c/p\u003e\n\u003cp\u003eCentOS5.5环境下布 …\u003c/p\u003e"
August 11, 2010
可扩展性设计之数据切分
"\u003cp\u003e可能很多读者朋友在网上或者杂志上面都已经多次见到关于数据切分的相关文章了, 只不过在有些文章中称之为数据的 Sharding 。其实不管是称之为数据的 Sharding 还是数据的切分,其概念都是一样的。简单来说,就是指通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面,以达到分散单台设备负载的效果。 数据的切分同时还可以提高系统的总体可用性,因为单台设备 Crash 之后,只有总体数据的某部分不可用,而不是所有的数据。\u003c/p\u003e\n\u003cp\u003e数据的切分( Sharding )根据其切分规则的类型,可以分为两种切分模式。\n\u003cstrong\u003e垂直(纵向)切分:\u003c/strong\u003e 一种是按照不同的表(或者 Schema )来切分到不同的数据库(主机)之上,这种切可以称之为数据的垂直(纵向)切分;\n\u003cstrong\u003e水平(横向)切分:\u003c/strong\u003e 另外一种则是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,这种切分称之为数据的水平(横向)切分。\u003c/p\u003e\n\u003cp\u003e垂直切分的最大特点就是规则简单,实施也更为方便,尤其适合各业务之间的耦合度非常低,相互影响很小,业务逻辑非常清晰的系统。在这种系统中,可以很容易做到将不同业务模块所 …\u003c/p\u003e"
August 3, 2010
Cacti进阶应用一:汇总流量图-将数据合并后作图
"\u003cp\u003e在使用Cacti方便快捷的建立监控图时,往往根据实际应用必须监控几台甚至上百台服务器的汇总流量图来观察该应用服务器组的总流量等指标。\u003c/p\u003e\n\u003cp\u003e这里我们就来介绍如何用cacit快速的建立汇总流量图,其他汇总图建立方法相同;\n\u003cstrong\u003e一、创建CDEF\u003c/strong\u003e\n1、点击cacti左边菜单中的graph Management下的CDEFs\n2、点击CDEF‘s右边的add,增加一个名为Turn All Data into Bits项\u003c/p\u003e\n\u003cp\u003e3、在CDEF Items表格中点击add,输入如下图:依次创建以下三个Items;\n[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/4.jpg\" alt=\"\"\u003e][1]\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/5.jpg\" alt=\"\"\u003e][2]\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/6.jpg\" alt=\"\"\u003e][3]\u003c/p\u003e\n\u003cp\u003e4、完成后如下图:\n[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/7.jpg\" alt=\"\"\u003e][4]\nCDEF item创建完成。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二、创建new graph\u003c/strong\u003e\n1、点击cacti左边菜单中的graph Management\u003c/p\u003e\n\u003cp\u003e2、在右边点击add出现如下图,直接选择create\n[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/1.jpg\" alt=\"\"\u003e][5]\u003c/p\u003e\n\u003cp\u003e3、在Graph Configuration表格中的title输入新图的名字;如IDC all interface traffic in(bits/sec)\u003c/p\u003e\n\u003cp\u003e4、表格最下的选项Vertical Label是纵轴的标识,这里我们填入Bits Per …\u003c/p\u003e"
August 1, 2010
Cacti的常用插件
"\u003cp\u003e\u003cstrong\u003e一、Cacti的插件框架PIA\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1、PIA\u003c/strong\u003e\n要想让Cacti支持更多的插件,那么首先要安装PIA(Cacti-Plugin),下面是PIA与其它插件之间的框架图\n\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/08/cacti-pia.jpg\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2010/08/cacti-pia.jpg\" alt=\"\"\u003e\u003c/a\u003e\nPIA的下载地址:http://www.cactiusers.org/index.php\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/08/cacti-plugin-0.8.7g-PA-v2.8.tar.gz\"\u003ecacti-plugin-0.8.7g-PA-v2.8.tar\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e将压缩包里的文件解压放在cacti目录里,导入pa.sql脚本.然后在”User Management”里的admin用户启用”plugin Management “权限.这时可以在左侧菜单看到”\u003cstrong\u003ePlugin Management\u003c/strong\u003e“菜单.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2、PIA的安装\u003c/strong\u003e\n主要有以下几个步骤\ntar -zvxf cacti-plugin-arch.tar.gz\npatch -PI -N \u0026lt; cacti-plugin-arch.diff\nmysql -ucacti -p2010 \u0026lt; pa.sql\n修改includesl/config.php下的\n$canfiig[‘url_path’] = “/cacti/”;\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e二、Cacti的常用插件\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1、Thold插件\u003c/p\u003e\n\u003cp\u003e功能:基于上下界线 …\u003c/p\u003e"
July 30, 2010
用cacti来监控windows 服务器,snmp服务在windows的配置
"\u003cp\u003e\u003cstrong\u003e监控客户端windows2003服务器的snmp服务配置(202.96.209.2)\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(1)、打开“控制面板”—“添加删除程序”—“添加删除组建”,在“管理和监视工具”中选中“简单网络管理协议(snmp)”,点击“下一步”,开始安装,在安装过程中需要i386文件.\u003c/p\u003e\n\u003cp\u003e(2)、打开“开始”—“程序”—“管理工具”—“服务”,找到“snmp service”,右键打开“属性”,选择“安全”,在“接受团体名称”处,点“添加”,在“团体名称”处写入你的cacti使用的community,选中“接受来自这些主机的snmp数据包”,默认值为“localhost”,点击“编辑”,将“localhost”改为\u003cstrong\u003ecacti监控服务器的实际 ip地址\u003c/strong\u003e.(指定要接收哪些主机的snmp数据,这里要填写上运行cacti程序的服务器ip地址)\u003c/p\u003e\n\u003cp\u003e(3)、还需要安装SNMP Informant-STD 1.6 软件下载地址: \u003ca href=\"http://www.wtcs.org/informant/download.htm\"\u003ehttp://www.wtcs.org/informant/download.htm\u003c/a\u003e\n有防火墙的要开通UDP端口161(可以在cmd命令行下输入:netstat -an 来查看udp协议的161端口 …\u003c/p\u003e"
July 29, 2010
[教程]cacti for windows 安装
"\u003cp\u003e本文章前提为配置好了apache(iis)+php+mysql这些基本的需要。\u003c/p\u003e\n\u003cp\u003e安装snmp服务,需要windows光盘或i386目录的文件。在”安全”标签设置好团体字后重新启动snmp服务。主要防火墙对udp 161开放权限一定要做好,不要将161完全暴露在公网上,最好只对特定的IP或子网开放。(可以用netstat -an命令查看udp协议的161端口是否在监听)\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ecacti相关软件下载:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1.cacti下载: \u003ca href=\"http://www.cacti.net/downloads/\"\u003ehttp://www.cacti.net/downloads/\u003c/a\u003e\n2.Cygwin下载: \u003ca href=\"http://www.cygwin.com/setup.exe\"\u003ehttp://www.cygwin.com/setup.exe\u003c/a\u003e\n3.rrdtool下载(1.2X): \u003ca href=\"http://www.cacti.net/downloads/rrdtool/win32/\"\u003ehttp://www.cacti.net/downloads/rrdtool/win32/\u003c/a\u003e\n4.net-snmp下载: \u003ca href=\"http://sourceforge.net/projects/net-snmp/files/\"\u003ehttp://sourceforge.net/projects/net-snmp/files/\u003c/a\u003e(注意下载的是net-snmp binaries的EXE安装文件,这里使用win32下的文件)\n5.Spine(原来好像是cactid)下载: …\u003c/p\u003e"
July 27, 2010
用linux上的cacti去监控windows服务器
"\u003cp\u003e另篇相同的教程: \u003ca href=\"http://blog.haohtml.com/index.php/archives/4850\"\u003ehttp://blog.haohtml.com/index.php/archives/4850\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e以前一直用cacti或者mrtg来监控交换机流量,很少用来监控服务器,最近突然有个任务需要监控windows服务器,一般刚装好的cacti,里面的监控设置都是基于交换机和linux的,没有专门监控windows的选择,于是研究了一下,和大家分享一下经验。另外我的cacti是安装的debian linux上,有些安装命令不适合其他linux上,请大家注意。\u003c/p\u003e\n\u003cp\u003e操作系统:debian 5\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.安装mysql\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eapy-get install mysql-server-5.0\u003c/p\u003e\n\u003cp\u003e安装时会提示你输入mysql root密码\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2.安装apache和php\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eapt-get install apache2 libapache2-mod-php5 php5 php5-gd php5-mysql php5-cli php5-common php5-snmp php-net-socket\u003c/p\u003e\n\u003cp\u003ephp5-gd是关系到绘图\u003c/p\u003e\n\u003cp\u003ephp5-mysql和数据库有关系\u003c/p\u003e\n\u003cp\u003ephp-net-socket这个有时候cacti …\u003c/p\u003e"
July 21, 2010
监控工具mrtg,cacti,rrdtool,nagios,zabbix比较和安装
"\u003cp\u003e\u003ca href=\"http://www.cacti.net/\"\u003ecacti\u003c/a\u003e 是一个用 \u003ca href=\"http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/\"\u003errdtool\u003c/a\u003e 来画图的网络监控系统, 通常一说到网络管理, 大家首先想到的经常是 \u003ca href=\"http://people.ee.ethz.ch/~oetiker/webtools/mrtg/\"\u003emrtg\u003c/a\u003e, 但是 mrtg 画的图简单且难看, rrdtool 虽然画图本领一流, 画出来的图也漂亮, 但是他也就是一个画图工具, 不像 mrtg 那样本身还集成了数据收集功能. cacti 则是集成了各种数据收集功能,然后用 rrdtool 画出监控图形. 其本身界面比起同类系统要漂亮不少. 推荐所有有监控需求的人都去研究一下.\u003c/p\u003e\n\u003cp\u003ecacti 和 \u003ca href=\"http://www.nagios.org/\"\u003enagios\u003c/a\u003e 是不同功用的系统, nagios 适合监视大量服务器上面的大批服务是否正常, 重点并不在图形化的监控, 其集成的很多功能例如报警,都是 cacti 没有或者很弱的. cacti 主要用途还是用来收集历史数据和画图, 所以界面比 nagios 漂亮很多.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://net-snmp.sourceforge.net/\"\u003enet-snmp\u003c/a\u003e 是一套广泛使用在类 unix 系统上的 \u003ca href=\"http://www.cisco.com/univercd/cc/td/doc/cisintwk/ito_doc/snmp.htm\"\u003esnmp\u003c/a\u003e 软件, 包含一套 snmp agent 框架 ,一个 snmpd 和 一堆 snmp 工具 , 其前身为 ucd-snmp. 关于 snmp 是什么, 以及如何配置的文章,网上搜一下有一堆一堆的. 在这里就不 …\u003c/p\u003e"
July 7, 2010
再跟 Flickr 学习网站运维经验
"\u003cp\u003e学习了一下 Flickr 的运维工程师 John Allspaw 的这个\u003ca href=\"http://www.slideshare.net/jallspaw/operational-efficiency-hacks-web20-expo2009\"\u003eOperational Efficiency Hacks\u003c/a\u003e 讲座内容。做一点笔记。\u003c/p\u003e\n\u003cp\u003e现在 Flickr 的数据相比\u003ca href=\"http://www.dbanotes.net/web/flickr_lamp_capacity_planning.html\"\u003e2007 年\u003c/a\u003e的时候真是有了显著的增长:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e24 TB 的 MySQL 数据\u003c/li\u003e\n\u003cli\u003e每秒钟 MySQL 有 3.2 万次写操作\u003c/li\u003e\n\u003cli\u003e每秒钟 MySQL 有 12万次读操作\u003c/li\u003e\n\u003cli\u003e图片容量 6 PB\u003c/li\u003e\n\u003cli\u003e每天要用掉 10TB 存储\u003c/li\u003e\n\u003cli\u003e超过 15000 个服务监控点\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e在 2004 年的时候 ,Flickr 使用 \u003ca href=\"http://www.imagemagick.org/\"\u003eImageMagick\u003c/a\u003e (version 6.1.9)之后转移到 \u003ca href=\"http://www.graphicsmagick.org/\"\u003eGraphicsMagick\u003c/a\u003e, 我还\u003ca href=\"http://www.dbanotes.net/arch/yupoo_arch.html\"\u003e以为\u003c/a\u003e是因为版权问题,现 在知道这样做是因为速度,换用 GraphicsMagick 处理速度提升了 15%,而 ImageMagick 功能尽管强大,但都是 Flickr 用不到的功能。如无必要,勿增实体啊。GraphicsMagick 在并行方面(\u003ca href=\"http://openmp.org/wp/\"\u003eOpenMP\u003c/a\u003e)的支持也很不错(\u003ca href=\"http://www.kitchensoap.com/2008/09/02/why-we-use-graphicsmagick/\"\u003e参 考\u003c/a\u003e)。\u003c/p\u003e\n\u003cp\u003e除了技术手段的优化,Flickr 充分利用硬件本身的更新换代带来的好处,曾经用 18 台新机器替换掉原来的 67 台 Web 服务器, …\u003c/p\u003e"
July 7, 2010
高并发高流量网站架构
"\u003cp\u003eWeb2.0的兴起,掀起了互联网新一轮的网络创业大潮。以用户为导向的新网站建设概念,细分了网站功能和用户群,不仅成功的造就了一大批新生的网站,也 极大的方便了上网的人们。但Web2.0以用户为导向的理念,使得新生的网站有了新的特点——高并发,高流量,数据量大,逻辑复杂等,对网站建设也提出了 新的要求。\u003c/p\u003e\n\u003cp\u003e本文围绕高并发高流量的网站架构设计问题,主要研究讨论了以下内容:\u003c/p\u003e\n\u003cp\u003e首先在整个网络的高度讨论了使用镜像网站,CDN内容分发网络等技术对负载均衡带来的便利及各自的优缺点比较。然后在局域网层次对第四层交换技术,包括硬 件解决方案F5和软件解决方案LVS,进行了简单的讨论。接下来在单服务器层次,本文着重讨论了单台服务器的Socket优化,硬盘级缓存技术,内存级缓 存技术,CPU与IO平衡技术(即以运算为主的程序与以数据读写为主的程序搭配部署),读写分离技术等。在应用层,本文介绍了一些大型网站常用的技术,以 及选择使用该技术的理由。最后,在架构的高度讨论了网站扩容,容错等问题。\u003c/p\u003e\n\u003cp\u003e本文以理论与实践相结合的形式,结合作者实际工作中得到的经验,具有较广泛的适用性。\u003c/p\u003e\n\u003cp\u003e1 引言\u003c/p\u003e\n\u003cp\u003e1.1 互联网的发展\n最近十 …\u003c/p\u003e"
June 26, 2010
关于 I/O 的五分钟法则(Five-Minute Rule)
"\u003cp\u003e去年在对 SSD 做调查的时候就关注过这个\u003ca href=\"http://queue.acm.org/detail.cfm?id=1413264\"\u003e五分钟法则\u003c/a\u003e,今天又发现了\u003ca href=\"http://cacm.acm.org/magazines/2009/7/32091-the-five-minute-rule-20-years-later/fulltext#R15\"\u003e这 篇文章\u003c/a\u003e的修订版(为了纪念 Jim Gray),这个话题倒是可以简单介绍一下,对架构师衡量 I/O 能力、Cache 评估和做硬件选型还是会有一些帮助的。\u003c/p\u003e\n\u003cp\u003e在 1987 年,\u003ca href=\"http://en.wikipedia.org/wiki/Jim_Gray_%28computer_scientist%29\"\u003eJim Gray\u003c/a\u003e 与 Gianfranco Putzolu 发表了这个”五分钟法则”的观点,简而言之,如果一条记录频繁被访问,就应该放到内存里,否则的话就应该待在硬盘上按需要再访问。这个临界点就是五分钟。 看上去像一条经验性的法则,实际上五分钟的评估标准是根据投入成本判断的,根据当时的硬件发展水准,在内存中保持 1KB 的数据成本相当于硬盘中存储同样大小数据 400 秒的开销(接近五分钟)。这个法则在 1997 年左右的时候进行过一次回顾,证实了五分钟法则依然有效(硬盘、内存实际上没有质的飞跃),而这次的回顾则是针对 SSD 这个”新的旧硬件”可能带来的影响。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/06/Five-Minute-Rule.gif\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/Five-Minute-Rule.gif\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e随着闪存时代的来临,五分钟法则一分为二:是把 SSD 当成较慢的内存(extended buffer pool )使用还是当成较快的硬盘(extended disk)使用。小内存页在内存和 …\u003c/p\u003e"
June 10, 2009
MFS分布式文件系统架设笔记
"\u003cp\u003e什么是MFS文件系统?\nMoose File System 是一个具备容错功能的网络分布式文件系统,它将数据分布在网络中的不同服务器上,MooseFS 通过 FUSE 使之看起来就是一个 Unix 的文件系统。\nMFS文件系统个人理解: 将分布在各个范围的计算机,将他们未使用的分区统一进行管理使用的一种文件系统.\n\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2009/06/architecture.png\" alt=\"architecture\"\u003e\nMFS文件系统结构:\n包含3种角色:\n管理服务器managing server (master)\n数据存储服务器data servers (chunkservers)\n客户机挂载使用client computers\u003c/p\u003e\n\u003cp\u003e个人理解3种角色作用:\n管理服务器:负责各个数据存储服务器的管理,文件读写调度,文件空间回收以及恢复.多节点拷贝\n数据存储服务器:负责连接管理服务器,听从管理服务器调度,提供存储空间.\n客户端:挂接远程管理服务器上所管理的数据存储服务器,通过fuse内核接口.看起来共享的文件系统和\n本地unix文件系统使用一样的效果.\u003c/p\u003e\n\u003cp\u003e架设过程:\u003c/p\u003e\n\u003cp\u003e服务器2台\n(最少是2台,一台服务器做管理服务器,数据存储服务器,以及客户端3种角色,另外一台计算机做数据存储和客户端)\n称第1台计 …\u003c/p\u003e"
May 7, 2009
nginx图片服务器的架构方案[2009-03-18 01:15:06]
"\u003cp\u003e图片服务通常数据容量较大,而且访问也频繁,鉴于此,图片服务就会有两种问题,一是存储问题,二是访问量问题。\u003c/p\u003e\n\u003cp\u003e存储问题就是硬盘容量问题,花钱买硬盘就可以了,看似简单,但着实也是最苦的问题。按目前探索来看,最好的方式是:在任何时刻遇到硬盘空间不够时,买颗硬盘插上,最多改改配置,就能立刻利用;另外,硬盘要能充分利用,不然图片存储量大再加上备份,很恐怖,最好是每颗硬盘都用上100%的空间。\u003c/p\u003e\n\u003cp\u003e访问量也是个大问题,如果服务不允许防盗链,那么访问量会引起带宽、服务器压力等问题,有钱的话直接扔CDN,没钱或者有更多的钱,就自己做吧。根据垣古不变的真理“越老的图,访问量也相对较少”这一点,分成两大部分,一边处理最新的图片,一边处理老旧的图片。最新的图片访问量大,但存储量较少;老图片访问量低,但存储量大。\u003c/p\u003e\n\u003cp\u003e大概分析完了,开始制定方案。\u003c/p\u003e\n\u003cp\u003e一、拟定一个存储目录规则:\u003c/p\u003e\n\u003cp\u003e在现有的/a/b/abcde.jpg这样的hash方式下多加一个日期的目录变成:/200810/16/a/b/abcde.jpg或者/2008/10/16/a/b/abcde.jpg。按日期制定这个目录规则后,就可以按年月来拆机器了。\u003c/p\u003e\n\u003cp\u003e二、分机器, …\u003c/p\u003e"
May 7, 2009
图片服务器的hash架构[2009-04-19 23:17:00]
"\u003cp\u003e\u003ca href=\"/wp-content/uploads/2009/05/image_hash.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2009/05/image_hash.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e如图,这是一个最简洁的架构。\u003c/p\u003e\n\u003cp\u003e在这个架构里,负载均衡器都可以省了,用最为廉价的dns来替代,dns的优点就是廉价,不用维护,也不愁性能和稳定,还可以跨机房多用几条带宽作分流。另外,在图片服务中,可以选择用另一个域名做dns。优点是主站中的任何cookie等header不会带到图片服务中,省了不少上传流量和服务器可能有的处理时间;缺点是多花了点域名的钱。目前门户都喜欢用这办法,小站用的话,用另一个域名还附带有一个特别的优点:因为部分域名服务商允许添加的二级域名有限,所以用别的域名可以节约有限的域名资源。dns这一块也可以用泛域名,不过貌似国内的泛域名支持不是特别的稳定,有些网站的泛域名,在linux下不能解析windows就正常,比较奇怪,我也没法解释。\u003c/p\u003e\n\u003cp\u003e在这个架构里我总共开了36个域名,但是一时没有那么多机器,所以有一些域名指向同一台机器。一般来说,一个刚上线的项目,放一台机也未尝不可,但是链接(包括域名)一定要固定下来,不然以后调整会非常痛苦。\u003c/p\u003e\n\u003cp\u003e域名的事情还是比较简单的,只要照着填写web表单就完成了,配置四台nginx服务器当然也是非常简单的,因为不需要什么特殊的功能,所以四台机 …\u003c/p\u003e"
May 7, 2009
新型的大型bbs架构(squid+nginx)[2009-03-18 01:15:06]
"\u003cp\u003e这个架构基于squid、nginx和lvs等技术,从架构上对bbs进行全面优化和保护,有如下特点:\u003c/p\u003e\n\u003cp\u003e1、高性能:所有的点击基本上全部由前端缓存负责,提供最快速的处理。\u003c/p\u003e\n\u003cp\u003e2、高保障度:不需考虑应用程序稳定与否、程序语言是何种、数据库是何种,都能从架构上保证稳定。\u003c/p\u003e\n\u003cp\u003e3、高可用性:对应用程序的修改达到最简化:在程序的某些地方加入清缓存的语句即可,当然还需要做页面静态化的工作和统计工作。\u003c/p\u003e\n\u003cp\u003e首先看图,这个图比较大:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2009/05/archi_bbs.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2009/05/archi_bbs.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e这个架构的特点和一些流程的说明:\u003c/p\u003e\n\u003cp\u003e1、主域名和图片域名分离\u003c/p\u003e\n\u003cp\u003e域名分离可以使流量分离,缓存策略分离等等,好处诸多。bbs初期一定要做好规划,将图片用另外的域名独立服务,即使没有足够机器,域名也要先分开。另外,图片服务器可以使用有别于主域名的另一个域名,一个好处是可以减少读取cookie对图片服务器的压力,另一个是提高安全性,避免cookie泄露。\u003c/p\u003e\n\u003cp\u003e2、使用LVS作为前端、二级代理和数据库的访问入口\u003c/p\u003e\n\u003cp\u003e使用LVS作为入口,比其他任何一种方式都来得更优质。首先LVS的负载能力很强,因为它工作在网络协议的第4层,使用虚拟ip技术,所以它本身并不担负任何流量的处理,仅仅是一个封包转发的功能;第 …\u003c/p\u003e"
May 7, 2009
Nginx 简单的负载均衡配置示例
"\u003cp\u003e\u003ca href=\"http://www.haohtml.com\"\u003ewww.haohtml.com\u003c/a\u003e 和 blog.haohtml.com 域名均指向 Nginx 所在的服务器IP。\u003c/p\u003e\n\u003cp\u003e用户访问,将其负载均衡到192.168.1.2:80、192.168.1.3:80、192.168.1.4:80、192.168.1.5:80四台服务器。\u003c/p\u003e\n\u003cp\u003e用户访问,将其负载均衡到192.168.1.7服务器的8080、8081、8082端口。\u003c/p\u003e\n\u003cp\u003e以下为配置文件nginx.conf:\n引用\nuser www www;\u003c/p\u003e\n\u003cp\u003eworker_processes 10;\u003c/p\u003e\n\u003cp\u003e#error_log logs/error.log;\n#error_log logs/error.log notice;\n#error_log logs/error.log info;\u003c/p\u003e\n\u003cp\u003e#pid logs/nginx.pid;\u003c/p\u003e\n\u003cp\u003e#最大文件描述符\nworker_rlimit_nofile 51200;\u003c/p\u003e\n\u003cp\u003eevents\n{\nuse epoll;\u003c/p\u003e\n\u003cp\u003eworker_connections 51200;\n}\u003c/p\u003e\n\u003cp\u003ehttp\n{\ninclude conf/mime.types;\ndefault_type …\u003c/p\u003e"
May 7, 2009
服务器的大用户量的承载方案 Nginx Squid Apache PHP MySQL
"\u003cp\u003e一、前言\u003c/p\u003e\n\u003cp\u003e二、编译安装\u003c/p\u003e\n\u003cp\u003e三、 安装MySQL、memcache\u003c/p\u003e\n\u003cp\u003e四、 安装Apache、PHP、eAccelerator、php-memcache\u003c/p\u003e\n\u003cp\u003e五、 安装Squid\u003c/p\u003e\n\u003cp\u003e六、后记\u003c/p\u003e\n\u003cp\u003e一、前言,准备工作\u003c/p\u003e\n\u003cp\u003e当前,LAMP开发模式是WEB开发的首选,如何搭建一个高效、可靠、稳定的WEB服务器一直是个热门主题,本文就是这个主题的一次尝试。\u003c/p\u003e\n\u003cp\u003e我们采用的架构图如下:\u003c/p\u003e\n\u003cp\u003e引用\u003c/p\u003e\n\u003cp\u003e——– ———- ————- ——— ————\u003c/p\u003e\n\u003cp\u003e| 客户端 | ===\u0026gt; |负载均衡器| ===\u0026gt; |反向代理/缓存| ===\u0026gt; |WEB服务器| ===\u0026gt; |数据库服务器|\u003c/p\u003e\n\u003cp\u003e——– ———- ————- ——— ————\u003c/p\u003e\n\u003cp\u003eNginx Squid …\u003c/p\u003e"