Arganzheng's Blog

stay hungry, stay foolish

静态资源服务器迁移MFS方案

背景 目前的静态资源以普通Linux文件系统(Ext3)的方式存放在05机器上,主要是图片和新闻(以及新闻附带的图片)。每半个小时更新一次。通过rsync + cron 脚本定时同步到01。01只是备份,不提供服务。随着静态资源的增加,静态服务器的压力比较大,而且读写服务是单点,虽然有冗余容灾,但是不能同时提供服务,不具有线性拓展性。一般来说海量的文件系统都需要使用分布式文件系统。具体参见海量图片存储思考。 目前的文件数量有1000w左右,基本都是图片和HTML文件。 关于MFS MFS是Moose File System的简称,与我们熟悉的fat,ntfs,ext3一样是一种文件系统(驼鹿文件系统)。与普通的文件系统不同,MFS是一种分布式的文件系统,类似...

服务器编程模型

多进程模型 1.fork子进程在accept阻塞等待连接。 业务和网络层分离为不同进程模型。 负载均衡模型,多个进程绑定不同的端口。 多线程模型 1.主线程在accept处阻塞,当有新连接时实时创建新线程处理,处理完关闭。 2.创建线程池,都在accept处阻塞,当有新连接时notify一个线程去处理,处理完归还。 3.线程(池)关联一个线程消息队列,主线程在accept处阻塞,将新连接放入消息队列,线程(池)读取线程消息队列处理。 Java最经典的处理就是一个链接一个线程处理: class Server implements Runnable { public void run() ...

Java NIO.2

五种IO模型 按照《Unix网络编程》的划分,IO模型可以分为下面五种: 阻塞IO: blocking I/O 进程处于阻塞模式时,让出CPU,进入休眠状态,直到数据到达并且被复制到应用程序缓冲区中或者发生错误才返回 Linux下的I/O操作默认是阻塞I/O,即open和socket创建的I/O都是阻塞I/O 非阻塞IO: nonblocking I/O 可以通过fcntl或者open时使用O_NONBLOCK参数,将fd设置为非阻塞的I/O 进程并不投入睡眠,而是立即返回一个错误 应用程序需要不停的轮询(polling)内核来检查是否I/O操作已经完成 ...

nginx URL rewrite与下载文件名称问题

背景 我们的APK官方下载链接原来是http://app.arganzheng.me/official/download?language=xxx。这个链接是请求到tomcat,然后在应用服务器中遍历某个目录,找到最新的apk版本,让用户下载。 /** * 下载APK。处理CDN的真正下载请求。其实应该是在静态资源服务器和nginx处理。 */ @RequestMapping("/download") public void downloadApk(HttpServletResponse response) { File file = getLatestApkFile(); if (file == null) { logger.error("No a...

Java NIO

WHAT is Java NIO 虽然说Java NIO的真正含义是Non-Blocking IO。但是实际上它的字面意义是Java New IO,在Java 1.4的时候引入,用于区分原来老的IO方式。整个新的IO API是为服务器设计的,只与服务器相关。 WHY NIO 1. 网络IO往往是性能瓶颈 与CPU和内存相比,甚至与磁盘相比,网络都很慢。CPU与主存之间的传输速度大概是6GB每秒。与之相比,磁盘的传输速度要慢的多,但是也能够达到150MB每秒。但是,当今最快的局域网的理论速度是每秒120MB,但是大多数LAN只支持这个速度的十分之一到百分之一。而通过公用的Internet传输的速度一般至少要比LAN的速度低一个数量级。随着时间的的推移,CPU、...

如何实时同步大量小文件

需求 静态资源服务器存放新闻、视频、图片,每隔一段时间定时拉取更新。为了反正静态资源服务器(现在是用MFS)挂掉,需要将静态资源同步到普通的linux文件系统做备份。这样故障的时候可以切换回去。 大概有900w+的小文件,使用rsync,在没有任何文件变更的情况下,都需要执行20多分钟(扫描对比差异)。如何实时的同步呢? 方案 1、cron + rsync [work@xxx-xxxx-mob01.hk01.baidu.com zhengzhibin]$ cat ~/userbin/sync_static_mbrowser.sh #!/bin/bash source /home/work/.bashrc BASH_PATH="/home/work/.b...

服务端监控方案

需求 功能性监控(availability):我们希望能够及时的发现线上的bug,异常。 性能监控与调优(performance):我们希望能够识别可能的性能瓶颈,并且有数据支撑方便对性能进行调优。比如慢速SQL,缓存命中率,链接池等。 预警报警:我们希望能够第一时间收到线上异常,进行处理。 辅助线上故障定位、故障分析 运维支持:我们系统能够有数据支撑我们进行容量规划、报警和扩容,等。 自动化运维:比如自动扩容;或者根据监控的数据和配置的SLA进行服务降级。等等。 监控方案 监控对象 操作系统:OP 网络监控:OP 应用监控:RD URI Spring JDBC ...

如何监控线上应用的运行状态

需求 通常我们对线上的运行状态有监控的需求。比如我们需要知道队列的大小和使用情况,缓存的命中率,链接池的大小和使用情况,每个请求的QPS、响应时间,等等。 解决方案 一般的做法如下: 对需要监控的点进行埋点做统计。可以使用AOP尽量做到对应用透明。 统计结果通过某种方式导出。比如最常见的是通过log打印出来,再去查看log。 其实上面的步骤明显的将这个过程进行了抽象: Measurement Exportor/Reportor 进一步具体化,Measurement主要有如下几个维度: Gauges: A gauge is an instantaneous measurement of a value. Counter...

配置MySQL Slave

需求 已经有一主一备,需要再增加一个只读备机。 步骤 1. 安装mysql 最好找个跟Master一样的MySQL版本(特别是主版本号)。基本不需要源码安装,到官网找到相应平台编译好的二进制包就可以了。 具体参考: 2.2 Installing MySQL on Unix/Linux Using Generic Binaries。可以不建立mysql组和用户。 shell> tar zxvf /path/to/mysql-VERSION-OS.tar.gz shell> cd /path/to/mysql-VERSION-OS shell> scripts/mysql_install_db --basedir=/path/to/mysq...

使用Redis做简单的消息队列

消息队列的好处直接,就是 1. 解耦;2. 削峰;3. 异步化。基本上和缓存一样是居家必备之良药。然而消息队列虽然重要,但是同时其实是蛮重的一个组件。 所以就想能不能先简单的通过Redis来实现消息队列呢?不考虑PubSub、分布式、持久化、事务等复杂的情况。就像JDK的各种Queue一样。答案当然是可以的,因为Redis提供的list数据结构就非常适合做消息队列。 List List是一个双向链表,支持双向的Pop/Push,江湖规矩一般从左端Push,右端Pop——LPush/RPop,而且还有Blocking的版本BLPop/BRPop,客户端可以阻塞在那直到有消息到来,所有操作都是O(1)的好孩子,可以当Message Queue来用。当多个...

×