为 MySQL 增加 HTTP/REST 客户端:MySQL UDF 函数 mysql-udf-http 1.0 发布
2015/05/26 08:09 | by admin ]
Mysql-udf-http 是一款简单的MySQL用户自定义函数(UDF, User-Defined Functions),具有http_get()、http_post()、http_put()、http_delete()四个函数,可以在MySQL数据库中利用HTTP协议进行REST相关操作。
项目网址:http://code.google.com/p/mysql-udf-http/
中文说明:http://blog.zyan.cc/mysql-udf-http/
使用环境:Linux操作系统,支持的MySQL版本:5.1.x 和 5.5.x。5.0.x未经测试。
软件作者:张宴
一、REST架构风格:
REST(Representational State Transfer)是一种轻量级的Web Service架构风格,其实现和操作明显比SOAP和XML-RPC更为简洁,可以完全通过HTTP协议实现,还可以利用缓存Cache来提高响应速度,性能、效率和易用性上都优于SOAP协议。REST最早是由 Roy Thomas Fielding 博士2000年在论文《Architectural Styles and the Design of Network-based Software Architectures》中提出的,中文译文全文PDF点此下载。另外,有篇译文对REST做了一个简化说明。
目前,REST架构风格的常见实现是基于HTTP协议及其四种基本方法(如POST、GET、PUT和DELETE)的。有人将HTTP协议的四种方法与CRUD原则相对应,CRUD原则对于资源只需要四种行为:Create(创建)、Read(读取)、Update(更新)和Delete(删除)就可以完成对其操作和处理。


在Mysql-udf-http中,四个函数http_post()、http_get()、http_put()、http_delete()分别对应HTTP协议的POST、GET、PUT、DELETE四种方法。
REST是一种架构风格,而不是协议或标准。HTTP协议“POST、GET、PUT、DELET”四种方法与CRUD原则“Create、Read、Update、Delete”四种行为的一一对应关系只是一种架构设计习惯,而不是规范。因此,POST方法也可以用来更新资源,PUT方法也可以用来创建资源,这就要看具体应用程序作者的定义了。例如Tokyo Tyrant除了支持Memcached协议外,还支持REST方式存取,PUT代表创建和更新,GET代表读取,DELETE代表删除(关于Tokyo Tyrant的安装使用请点击这儿)。
目前国内外流行的Web 2.0应用API接口中,很多都支持REST架构风格。例如:新浪微博开放平台、人人网API、Google OpenID、Flickr、Twitter、eBay、Facebook、Last.fm、del.icio.us、Yahoo Search、Amazon S3、Amazon EC2、Digg、Microsoft Bing、FriendFeed、PayPal、Foursquare,更多...
当记录数成百上千万条时,通常采用 MySQL 分表减低数据库压力。但是,全部数据按点击数、精华、积分排序显示等功能,在MySQL 分表中则无法实现。编写 Mysql-udf-http 的最初目的,是为了在项目开发中,将 MySQL 各分表的数据自动同步到我们的 TCSQL 高速列表数据库,用来做列表查询、显示,内容页则根据ID直接查询各 MySQL 分表的内容。由于HTTP协议的通用性,通过 Mysql-udf-http 可以做更多的事情。
通过Mysql-udf-http,你可以在MySQL中利用触发器,将MySQL的数据同步到支持REST的应用上。例如你有一个独立博客,你可以在文章表创建MySQL触发器,这样,在发表文章时,就可以将文章标题、URL自动同步到新浪微博、Twitter。你想用 Tokyo Tyrant 做缓存,也可以利用MySQL触发器在发生增、删、改时,将数据自动同步到 Tokyo Tyrant。详细配置方法本文第4节中会有介绍。
二、Mysql-udf-http的安装与使用:
1. 在Linux系统上安装Mysql-udf-http
注意:“/usr/local/webserver/mysql/”是你的MySQL安装路径,如果你的MySQL安装路径不同,请自行修改。
wget http://curl.haxx.se/download/curl-7.21.1.tar.gz
tar zxvf curl-7.21.1.tar.gz
cd curl-7.21.1/
./configure --prefix=/usr
make && make install
cd ../
echo "/usr/local/webserver/mysql/lib/mysql/" > /etc/ld.so.conf.d/mysql.conf
/sbin/ldconfig
wget http://mysql-udf-http.googlecode.com/files/mysql-udf-http-1.0.tar.gz
tar zxvf mysql-udf-http-1.0.tar.gz
cd mysql-udf-http-1.0/
./configure --prefix=/usr/local/webserver/mysql --with-mysql=/usr/local/webserver/mysql/bin/mysql_config
make && make install
cd ../
2. 通过命令行登陆进入MySQL
3. 创建MySQL自定义函数
mysql>
- create function http_get returns string soname 'mysql-udf-http.so';
- create function http_post returns string soname 'mysql-udf-http.so';
- create function http_put returns string soname 'mysql-udf-http.so';
- create function http_delete returns string soname 'mysql-udf-http.so';
4. 使用方法
I. 函数描述:
mysql>
- SELECT http_get('<url>');
- SELECT http_post('<url>', '<data>');
- SELECT http_put('<url>', '<data>');
- SELECT http_delete('<url>');
II. 示例 A:
mysql>
- /* HTTP GET、POST方式提交关键词“xoyo”到百度移动搜索 */
- SELECT http_get('http://m.baidu.com/s?word=xoyo&pn=0');
- SELECT http_post('http://m.baidu.com/s','word=xoyo&pn=0');
- /* 新浪微博开放平台:获取新浪用户ID为103500的最近一条微博内容 */
- SELECT http_get('http://api.t.sina.com.cn/statuses/user_timeline/103500.json?count=1&source=1561596835') AS data;
- /* 新浪微博开放平台:发表一条微博 */
- SELECT http_post('http://your_sina_uid:your_password@api.t.sina.com.cn/statuses/update.xml?source=1561596835', 'status=Thins is sina weibo test information');
- /* Tokyo Tyrant 写入、读取、删除操作 */
- SELECT http_put('http://192.168.8.34:1978/key', 'This is value');
- SELECT http_get('http://192.168.8.34:1978/key');
- SELECT http_delete('http://192.168.8.34:1978/key');
III. 示例
通过MySQL触发器,利用mysql-udf-http和第三方UDF函数lib_mysqludf_json,自动同步数据到 Tokyo Tyrant。
(1). 下载安装 lib_mysqludf_json 修改版:
以下安装包适合32位Linux操作系统:
tar zxvf lib_mysqludf_json-i386.tar.gz
cd lib_mysqludf_json-i386/
# 如果你的MySQL安装路径不是/usr/local/webserver/mysql/,请修改以下路径。
cp -f lib_mysqludf_json.so /usr/local/webserver/mysql/lib/mysql/plugin/lib_mysqludf_json.so
cd ../
以下安装包适合64位Linux操作系统:
tar zxvf lib_mysqludf_json-x86_64.tar.gz
cd lib_mysqludf_json-x86_64/
# 如果你的MySQL安装路径不是/usr/local/webserver/mysql/,请修改以下路径。
cp -f lib_mysqludf_json.so /usr/local/webserver/mysql/lib/mysql/plugin/lib_mysqludf_json.so
cd ../
通过命令行登陆进入MySQL:
mysql>
- create function lib_mysqludf_json_info returns string soname 'lib_mysqludf_json.so';
- create function json_array returns string soname 'lib_mysqludf_json.so';
- create function json_members returns string soname 'lib_mysqludf_json.so';
- create function json_object returns string soname 'lib_mysqludf_json.so';
- create function json_values returns string soname 'lib_mysqludf_json.so';
(2). 创建测试表
mysql>
- SET NAMES UTF8;
- USE test;
- CREATE TABLE IF NOT EXISTS `mytable` (
- `id` int(10) NOT NULL AUTO_INCREMENT,
- `addtime` int(10) NOT NULL,
- `title` varchar(255) CHARACTER SET utf8 NOT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
(3). 为测试表创建触发器:
mysql>
- /* INSERT插入操作的触发器 */
- DELIMITER |
- DROP TRIGGER IF EXISTS mytable_insert;
- CREATE TRIGGER mytable_insert
- AFTER INSERT ON mytable
- FOR EACH ROW BEGIN
- SET @tt_json = (SELECT json_object(id,addtime,title) FROM mytable WHERE id = NEW.id LIMIT 1);
- SET @tt_resu = (SELECT http_put(CONCAT('http://192.168.8.34:1978/', NEW.id), @tt_json));
- END |
- DELIMITER ;
- /* UPDATE更新操作的触发器 */
- DELIMITER |
- DROP TRIGGER IF EXISTS mytable_update;
- CREATE TRIGGER mytable_update
- AFTER UPDATE ON mytable
- FOR EACH ROW BEGIN
- SET @tt_json = (SELECT json_object(id,addtime,title) FROM mytable WHERE id = OLD.id LIMIT 1);
- SET @tt_resu = (SELECT http_put(CONCAT('http://192.168.8.34:1978/', OLD.id), @tt_json));
- END |
- DELIMITER ;
- /* DELETE删除操作的触发器 */
- DELIMITER |
- DROP TRIGGER IF EXISTS mytable_delete;
- CREATE TRIGGER mytable_delete
- AFTER DELETE ON mytable
- FOR EACH ROW BEGIN
- SET @tt_resu = (SELECT http_delete(CONCAT('http://192.168.8.34:1978/', OLD.id)));
- END |
- DELIMITER ;
(4). 将 MySQL 表和 Tokyo Tyrant 关联进行查询:
mysql>
- SELECT id,addtime,title,http_get(CONCAT('http://192.168.8.34:1978/',id)) AS tt FROM mytable ORDER BY id DESC LIMIT 0,5;
5. 如何删除mysql-udf-http UDF函数:
mysql>
- drop function http_get;
- drop function http_post;
- drop function http_put;
- drop function http_delete;
HTTPSQS 1.7 发布:Libevent 2.0.x 的 evhttp_parse_query BUG 与动态编译时指定动态链接库 .so 寻找路径
2015/05/26 08:08 | by admin ]
HTTPSQS(HTTP Simple Queue Service)是一款基于 HTTP GET/POST 协议的轻量级开源简单消息队列服务,使用 Tokyo Cabinet 的 B+Tree Key/Value 数据库来做数据的持久化存储。
项目网址:http://code.google.com/p/httpsqs/
使用文档:http://blog.zyan.cc/httpsqs/
使用环境:Linux(同时支持32位、64位操作系统,推荐使用64位操作系统)
软件作者:张宴
HTTPSQS 1.7 版本更新内容:
下面的内容不只是介绍 HTTPSQS 1.7 更新了哪些东西,更多的介绍在于:如何绕开 Libevent 2.0.x evhttp 使用过程中,无法正常处理包含“|”字符的 URI 参数的问题;提供了一份比 Libevent 官方网站更新的在线文档;Linux 下如何动态编译程序,运行时不用在 /etc/ld.so.conf 文件中添加动态链接库路径。
1、针对 Libevent 2.0.x 版本 evhttp_parse_query 函数的 BUG。
网友发邮件,反应了一个 HTTPSQS 的 BUG,见下图,data 的值为NULL。我查找发现,这不是 HTTPSQS 的 BUG,而是 Libevent 2.0.x 版本的 BUG。在 Libevent 1.4.14b 版本中,evhttp_parse_query 函数是能够正常处理包含“|”字符的 URI 的,而在 Libevent 2.0.12 版本中,同样使用 evhttp_parse_query 函数,包含“|”字符的 URI 处理后的结果是 NULL。

对比 Libevent 2.0.12 和 1.4.14b 版本的 evhttp_parse_query 函数代码,发现在 2.0.12 版本中,evhttp_parse_query(const char *uri, struct evkeyvalq *headers) 实际变成了调用 evhttp_parse_query_impl(uri, headers, 1) 函数,该函数内再调用的一个 2.0.x 版本新增的函数 evhttp_uri_parse(const char *source_uri),逻辑处理代码在 evhttp_uri_parse_with_flags(const char *source_uri, unsigned flags) 函数中。evhttp_uri_parse(const char *source_uri) 无法正确解析含有“|”的URL,遇到类似“http://127.0.0.1:1218/?opt=get&name=aaa|bbb”的URL,直接返回NULL,也就是 BUG 所在。
libevent-2.0.12-stable/http.c



不建议修改第三方库,这个 BUG 还是留给 Libevent 自己去解决吧。使用 Libevent 2.0.x evhttp 作开发的同学,遇到URI参数中包含“|”的问题,注意一下吧。
我修改了 HTTPSQS 代码,在 HTTPSQS 1.7 版本,采用以下方式来绕开evhttp_uri_parse(const char *source_uri)函数,解决这个问题。其中用到了 Libevent 2.0.x evhttp_request 结构体中新增的 struct evhttp_uri *uri_elems,以及新增的函数 evhttp_parse_query_str (const char *uri, struct evkeyvalq *headers)。
- /* 处理模块 */
- void httpsqs_handler(struct evhttp_request *req, void *arg)
- {
- struct evbuffer *buf;
- buf = evbuffer_new();
- /* 分析URL参数 */
- const char *httpsqs_query_part;
- struct evkeyvalq httpsqs_http_query;
- httpsqs_query_part = evhttp_uri_get_query(req->uri_elems);
- evhttp_parse_query_str(httpsqs_query_part, &httpsqs_http_query);
Libevent 的官方文档只有 1.4.10-stable 和 2.0.1-alpha 版本的,2.0.1x 很多新增的函数、结构体都没有。
我这里提供一份最新的 Libevent 在线文档: http://blog.zyan.cc/book/libevent/
2、静态编译改为动态编译,并指定程序运行时查找的动态链接库路径
一些网友反映,CentOS 6.0、Fedora 等系统没有默认安装lz、lbz2、lrt、...等静态链接库,出现无法编译HTTPSQS的情况:
/usr/bin/ld: cannot find -lz
/usr/bin/ld: cannot find -lbz2
/usr/bin/ld: cannot find -lrt
/usr/bin/ld: cannot find -lpthread
/usr/bin/ld: cannot find -lm
/usr/bin/ld: cannot find -lc
/usr/bin/ld: cannot find -lc
collect2: ld 返回 1
make: *** [httpsqs] 错误 1
HTTPSQS 1.7 版本改为动态编译,编译时使用“-Wl,-rpath”参数指定了程序运行时的动态库搜索路径。这样就不需要在 /etc/ld.so.conf 中 添加 HTTPSQS 程序运行时需要的 libevent、tokyocabinet 动态链接库路径了,可以避免与其他软件(例如:Memcached、TT)使用的 libevent、tokyocabinet 动态链接库版本相冲突。详情请见 Makefile 文件:
CC=gcc
CFLAGS=-Wl,-rpath,/usr/local/libevent-2.0.12-stable/lib/:/usr/local/tokyocabinet-1.4.47/lib/ -L/usr/local/libevent-2.0.12-stable/lib/ -levent -L/usr/local/tokyocabinet-1.4.47/lib/ -ltokyocabinet -I/usr/local/libevent-2.0.12-stable/include/ -I/usr/local/tokyocabinet-1.4.47/include/ -lz -lbz2 -lrt -lpthread -lm -lc -O2 -g
httpsqs: httpsqs.c
$(CC) -o httpsqs httpsqs.c prename.c $(CFLAGS)
@echo ""
@echo "httpsqs build complete."
@echo ""
clean: httpsqs
rm -f httpsqs
install: httpsqs
install $(INSTALL_FLAGS) -m 4755 -o root httpsqs $(DESTDIR)/usr/bin
用 ldd 命令查看一下 HTTPSQS 使用的动态链接库:
linux-vdso.so.1 => (0x00007fff0ebff000)
libevent-2.0.so.5 => /usr/local/libevent-2.0.12-stable/lib/libevent-2.0.so.5 (0x00007f5157979000)
libtokyocabinet.so.9 => /usr/local/tokyocabinet-1.4.47/lib/libtokyocabinet.so.9 (0x00007f51576f6000)
libz.so.1 => /lib64/libz.so.1 (0x00000038a1400000)
libbz2.so.1 => /lib64/libbz2.so.1 (0x00000038a8800000)
librt.so.1 => /lib64/librt.so.1 (0x00000038a2000000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00000038a1000000)
libm.so.6 => /lib64/libm.so.6 (0x00000038a1800000)
libc.so.6 => /lib64/libc.so.6 (0x00000038a0c00000)
/lib64/ld-linux-x86-64.so.2 (0x00000038a0400000)
发现,libevent 和 libtokyocabinet 使用的是我们指定 lib 路径中的动态链接库。
HTTPSQS 的详细使用说明,请访问: http://blog.zyan.cc/httpsqs/
Nginx 1.5.2 + PHP 5.5.1 + MySQL 5.6.10 在 CentOS 下的编译安装
2015/05/26 08:07 | by admin ]
http://blog.zyan.cc/nginx_php_v6
1、安装Nginx:
cd /Data/tgz
yum install wget
yum install pcre
yum install openssl*
yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers make
yum -y install gd gd2 gd-devel gd2-devel
/usr/sbin/groupadd www
/usr/sbin/useradd -g www www
ulimit -SHn 65535
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.32.tar.gz
tar zxvf pcre-8.32.tar.gz
cd pcre-8.32
./configure --prefix=/Data/apps/pcre
make && make install
cd ../
wget http://nginx.org/download/nginx-1.5.2.tar.gz
tar zxvf nginx-1.5.2.tar.gz
cd nginx-1.5.2
./configure --user=www --group=www --prefix=/Data/apps/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/Data/tgz/pcre-8.32 --with-http_realip_module --with-http_image_filter_module
make
make install
cd ../
2、安装 MySQL:
tar zxvf mysql-5.6.10-linux-glibc2.5-x86_64.tar.gz
mv mysql-5.6.10-linux-glibc2.5-x86_64 /Data/apps/mysql
/usr/sbin/groupadd mysql
/usr/sbin/useradd -g mysql mysql
mkdir -p /Data/data/mysql/data
yum install libaio
/Data/apps/mysql/scripts/mysql_install_db --basedir=/Data/apps/mysql --datadir=/Data/data/mysql/data --user=mysql
sed -i "s#/usr/local/mysql#/Data/apps/mysql#g" /Data/apps/mysql/bin/mysqld_safe
3、安装PHP依赖库
wget http://www.ijg.org/files/jpegsrc.v9.tar.gz
tar zxvf jpegsrc.v9.tar.gz
cd jpeg-9/
./configure --prefix=/Data/apps/libs --enable-shared --enable-static --prefix=/Data/apps/libs
make
make install
cd ../
wget http://prdownloads.sourceforge.net/libpng/libpng-1.6.2.tar.gz
tar zxvf libpng-1.6.2.tar.gz
cd libpng-1.6.2/
./configure --prefix=/Data/apps/libs
make
make install
cd ../
wget http://download.savannah.gnu.org/releases/freetype/freetype-2.4.12.tar.gz
tar zxvf freetype-2.4.12.tar.gz
cd freetype-2.4.12/
./configure --prefix=/Data/apps/libs
make
make install
cd ../
wget "http://downloads.sourceforge.net/mhash/mhash-0.9.9.9.tar.gz?big_mirror=0"
wget "http://downloads.sourceforge.net/mcrypt/libmcrypt-2.5.8.tar.gz?big_mirror=0"
wget "http://downloads.sourceforge.net/mcrypt/mcrypt-2.6.8.tar.gz?big_mirror=0"
tar zxvf libmcrypt-2.5.8.tar.gz
cd libmcrypt-2.5.8/
./configure --prefix=/Data/apps/libs
make
make install
cd libltdl/
./configure --prefix=/Data/apps/libs --enable-ltdl-install
make
make install
cd ../../
tar zxvf mhash-0.9.9.9.tar.gz
cd mhash-0.9.9.9/
./configure --prefix=/Data/apps/libs
make
make install
cd ../
添加:
然后:
cd mcrypt-2.6.8/
export LDFLAGS="-L/Data/apps/libs/lib -L/usr/lib"
export CFLAGS="-I/Data/apps/libs/include -I/usr/include"
touch malloc.h
./configure --prefix=/Data/apps/libs --with-libmcrypt-prefix=/Data/apps/libs
make
make install
cd ../
4、编译安装PHP 5.5
tar zxvf php-5.5.1.tar.gz
cd php-5.5.1/
export LIBS="-lm -ltermcap -lresolv"
export DYLD_LIBRARY_PATH="/Data/apps/mysql/lib/:/lib/:/usr/lib/:/usr/local/lib:/lib64/:/usr/lib64/:/usr/local/lib64"
export LD_LIBRARY_PATH="/Data/apps/mysql/lib/:/lib/:/usr/lib/:/usr/local/lib:/lib64/:/usr/lib64/:/usr/local/lib64"
./configure --prefix=/Data/apps/php --with-config-file-path=/Data/apps/php/etc --with-mysql=/Data/apps/mysql --with-mysqli=/Data/apps/mysql/bin/mysql_config --with-iconv-dir --with-freetype-dir=/Data/apps/libs --with-jpeg-dir=/Data/apps/libs --with-png-dir=/Data/apps/libs --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-fpm --enable-mbstring --with-mcrypt=/Data/apps/libs --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --enable-opcache --with-pdo-mysql --enable-maintainer-zts
make
make install
cp php.ini-development /Data/apps/php/etc/php.ini
cd ../
ln -s /Data/apps/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
mv /Data/apps/php/etc/php-fpm.conf.default /Data/apps/php/etc/php-fpm.conf
5、编译安装PHP扩展
tar zxvf autoconf-latest.tar.gz
cd autoconf-2.69/
./configure --prefix=/Data/apps/libs
make
make install
cd ../
wget http://pecl.php.net/get/memcache-2.2.7.tgz
tar zxvf memcache-2.2.7.tgz
cd memcache-2.2.7/
export PHP_AUTOCONF="/Data/apps/libs/bin/autoconf"
export PHP_AUTOHEADER="/Data/apps/libs/bin/autoheader"
/Data/apps/php/bin/phpize
./configure --with-php-config=/Data/apps/php/bin/php-config
make
make install
cd ../
打开 /Data/apps/php/etc/php.ini 查找 ; extension_dir = "ext"
在其后增加一行:
Windows Server 2008 R2 Enterprise[企业版]多国语言版
2015/05/25 07:38 | by admin ]
1、首先声明本作品不含任何个人信息,本作品只用作技术上的学习与交流,不作其它任何盈利用途!
2、采用微软MSDN英文原版为母盘,加入“简体、香港繁体、台湾繁体”语言包!
3、Windows Server 2008 R2 Enterprise企业版——在PE安装时、安装好系统之后,均可以选择、切换系统显示语言!
4、35in1品牌数量为33个,头3个为MSDN版本(1、MSDN原版;2、MSDN开启6项功能;3、MSDN开启6项功能和更新系统补丁至2010年9月28日),因为是包含4个区域也相当于35系统*4区域=140in1
5、品牌顺序按字母排列:MSDN、OEMALL、Acer、Alienware、ASUS、BENQ、Compaq、DELL、eMachines、Founder、Fujitsu、Gateway、Gigabyte、GreatWall、Haier、Hasee、Hedy、HP、HPVoodooPC、Lenovo、LG、Medion、MSI、NEC、PackardBell、Panasonic、Samsung、Sharp、Sony、TCL、Thinkpad、TongFang、Toshiba
企业版:TFGPQ-J9267-T3R9G-99P7B-HXG47
Windows Server 2008官方原版镜像下载地址(每个系列只有1个安装包)
Windows Server 2008 64位 中文版下载地址(用迅雷下载)
ed2k://|file|cn_windows_server_2008_standard_enterprise_and_datacenter_with_sp2_x64_dvd_x15-41319.iso|2952992768|5F2CA73C9DA296CB05E7C0319F7D0E62|/
文件名:cn_windows_server_2008_standard_enterprise_and_datacenter_with_sp2_x64_dvd_x15-41319.iso
SHA1:E722E8F91722EFE988FA274A5062EE978E53C22A
文件大小:2.75GB
发布时间:2009-06-16
Windows Server 2008 32位 中文版下载地址(用迅雷下载)
ed2k://|file|cn_windows_server_standard_enterprise_and_datacenter_with_sp2_x86_dvd_x15-41045.iso|2190057472|E93B029C442F19024AA9EF8FB02AC90B|/
文件名:cn_windows_server_standard_enterprise_and_datacenter_with_sp2_x86_dvd_x15-41045.iso
SHA1:80F1E47364AD05C28763EA29D7A11527C8067A3F
文件大小:2.04GB
发布时间:2009-06-16
Windows Server 2008 R2 中文版下载地址(用迅雷下载)
ed2k://|file|cn_windows_server_2008_r2_standard_enterprise_datacenter_and_web_with_sp1_vl_build_x64_dvd_617396.iso|3368962048|7C210CAC37A05F459758BCC1F4478F9E|/
文件名:cn_windows_server_2008_r2_standard_enterprise_datacenter_and_web_with_sp1_vl_build_x64_dvd_617396.iso
SHA1:A92C97C38EF6ED5F827637179052AD218900377A
文件大小:3.14GB
发布时间:2011-02-21
Windows Server 2008 R2 英文版下载地址(用迅雷下载)
ed2k://|file|en_windows_server_2008_r2_standard_enterprise_datacenter_and_web_with_sp1_vl_build_x64_dvd_617403.iso|3166720000|54056D959F64770EB5E0A7B1FB6A0BE2|/
文件名:en_windows_server_2008_r2_standard_enterprise_datacenter_and_web_with_sp1_vl_build_x64_dvd_617403.iso
SHA1:7E7E9425041B3328CCF723A0855C2BC4F462EC57
文件大小:2.95GB
发布时间:2011-02-16
Windows Server 2012 中文版下载地址(用迅雷下载)
ed2k://|file|cn_windows_server_2012_vl_x64_dvd_917962.iso|3827054592|2F40F8D0D60B86E9FFA551624D5A5257|/
文件名:cn_windows_server_2012_vl_x64_dvd_917962.iso
SHA1:C02CE28DCBE0CC745EA1035EB051A0EF02C0164F
文件大小:3.56GB
发布时间:2012-09-04
Windows Server 2012 英文版下载地址(用迅雷下载)
ed2k://|file|en_windows_server_2012_vl_x64_dvd_917758.iso|3694114816|AE62DB062FD9D433750F54F4518AF4C5|/
文件名:en_windows_server_2012_vl_x64_dvd_917758.iso
SHA1:063BC26ED45C50D3745CCAD52DD7B3F3CE13F36D
文件大小:3.44GB
发布时间:2012-09-04
Windows Server 2012 R2 中文版下载地址(用迅雷下载)
ed2k://|file|cn_windows_server_2012_r2_vl_with_update_x64_dvd_4051059.iso|4683122688|BD0B95997679F83A4EE2D062865D8E64|/
文件名:cn_windows_server_2012_r2_vl_with_update_x64_dvd_4051059.iso
SHA1:75BB45680A0CCA0B33E7EE70F20037599BDB2929
文件大小:4.36GB
发布时间:2014-04-08
Windows Server 2012 R2 英文版下载地址(用迅雷下载)
ed2k://|file|en_windows_server_2012_r2_vl_with_update_x64_dvd_4065221.iso|4548247552|CAB7FBCD275AF5F62E89C02EF898893D|/
文件名:en_windows_server_2012_r2_vl_with_update_x64_dvd_4065221.iso
SHA1:D4B28F350981A7C3306DD409B172AEA10D8599AC
文件大小:4.24GB
发布时间:2014-04-02
移动互联网初创型团队需要什么样的云计算服务?
2015/05/24 19:29 | by admin ]
一、不靠谱的 App Engine
1、Google App Engine 云服务在国外的成功,不代表国内巨头们各种 *AE 仿造品的成功。在微博上搜搜就可以看到小伙伴们吐槽的各种不稳定,另外,*AE们对资源使用最大数各种规定限制,加上为了计费、阉割功能的各种限制,使它的价格优势成为鸡肋。*AE们就好比100M共享带宽的小区宽带,以低价卖给每个上网用户5M的带宽,前几十个用户感觉这网速真不错,等他卖了100个以上用户5M带宽,而这部分用户白天上班去了,晚上下班回来都在上网,其中又有一部分看视频、BT下载,于是乎,白天网速快,晚上慢得要死,连200K带宽都达不到。要知道,不怕神一样的对手,就怕猪一样的队友,在国内的 App Engine 环境下,水平参差不齐的开发者的代码质量、习惯性的资源滥用、别人网站被攻击殃及池鱼对*AE性能的影响,导致*AE的稳定性非常差。
2、所以,*AE们也意识到公共 App Engine 不稳定,所以又推出专用 App Engine,但费用一下就翻了很多倍。所以,*AE只是个人博客、个人开发者玩玩的工具,真正用作项目,还是需谨慎。根据实际的经验,*AE们还真不如VPS稳定。
二、成本低的小而美VPS
1、对于初创团队来说,购买服务器、交换机,托管服务器费用、带宽月使用费,是极其昂贵的。购买可以弹性升级硬件配置的云服务VPS,是降低成本不错的选择。国内VPS,1G内存、1~2核CPU、1M带宽、多线BGP,大概价格在100元/月左右,支持备案,可以作为最低入门选择,有条件可以购买两台互为热备,阿里云主机可以作为参考。大多数VPS服务商使用的都是廉价的SATA磁盘。如果你对磁盘IO要求较高,可以选择提供有SAS磁盘的IAAS云主机服务商,比如UCloud。
2、市场上的VPS商家主要有 Xen、OpenVZ、KVM 三种开源的虚拟化技术。全虚拟化的 Xen 更像独立主机,服务器资源按VPS实际大小平均分配,一般无法超售。半虚拟化的 OpenVZ 在同样的性能测试下,会比 Xen 高一些,但是,一台物理内存16G的服务器,可以分配出总内存大小超过16G很多倍的VPS,服务商可以超售,想卖多少台VPS就可以卖多少台,所以不推荐使用。KVM 在最新的 Linux 发行版中,已经是集成,但是,商业化应用还不成熟,基于 KVM 的 VPS 服务商很少。
3、VPS的操作系统,建议选择64位的Linux。在32位Linux下,PHP能给处理的整数不能超过正负2^31=2147483648,如果以后接入新浪微博、淘宝、腾讯等第三方开放平台,他们的接口里会有超过32位的整数(比如新浪用户ID、淘宝商品ID)。如果不幸使用32位Linux,你只能将这些整数当成字符串处理了,以后配合Sphinx等搜索引擎,会非常麻烦。
4、现在,可以在北京进行备案的域名有:国际域名 .com .net .org,国内域名 .cn .com.cn .中国,国别域名 .cc,其他的域名均不能进行备案。仅北京有限制,其它省市正常提交备案即可。我们原来申请的 .me 域名,在北京无法备案,后来只好拿到苏州去备案了。所以,在选择域名的时候,需要慎重。
5、使用 VPS,一定要定期在本地,做好数据备份,不要相信所谓的 7*24服务,99.99%安全稳定性,只要有人的VPS出问题了,都归为那 0.01%。
三、应对峰值带宽的云存储
1、对于DAU(日活跃用户)过十万的网站、APP应用来说,CDN或云存储是必需品。使用云存储不是因为存储空间,因为一块几TB的SATA磁盘很便宜,使用云存储是因为高出平均带宽值几倍至几十倍的峰值带宽。做手机APP应用,峰值带宽更集中,当你向所有用户群发PUSH一条消息,用户被唤醒打开APP应用,几分钟的时间,会消耗几十倍的带宽峰值。图片、下载,是最主要的带宽消耗者。也许,数据接口API只需不到1M的带宽,而图片对带宽的峰值需求则会达到100M。为了几分钟的峰值,去购买100M昂贵的带宽,其他时间带宽都空闲,是一件非常奢侈的事。
2、国内提供云存储服务的商家有很多,真正好用得却不多,提供FTP等公共通用协议的云存储更是微乎其微。使用第三方云服务,切忌千万不要吊死在一棵树上。支持FTP等公共协议,如果将来有问题,能够方便的进行数据迁移和技术替代。如果云服务厂商一直能够提供优质的服务,那么,也就可以长期使用他们的云服务。相信优秀的云存储提供商,是不会惧怕这一点的。
3、之前,我用过阿里云的开放存储服务OSS,但是,稳定性比起阿里云主机ECS等其他服务,要差多了。下面是用阿里云自家的云监控,监控最近一个月阿里云主机和OSS上的文件,云主机的可用性99.99%,而OSS可用性只有97.83%,月宕机累积时间31.27小时。而OSS每次一遇到升级,就更坑爹了,不多说,自己看他们的公告吧( http://bbs.aliyun.com/read.php?tid=146819 、http://bbs.aliyun.com/read.php?tid=141828 、 http://bbs.aliyun.com/read.php?tid=139381 ):


4、后来,本博客的图片、附件下载,改用了又拍云存储。相比于其他的云存储,又拍云支持FTP上传、下载管理文件,同时对于图片类文件的处理功能,也比较强大:
(1)、支持缩略图&水印,可以支持自定义版本:限定宽度,高度自适应;限定高度,宽度自适应;限定最长边,短边自适应;限定最短边,长边自适应;限定宽高;等比缩放等多种缩略模式。

示例:
原图:http://yphoto.b0.upaiyun.com/test/gzhd.jpg
限定宽度(600px),高度自适应:http://yphoto.b0.upaiyun.com/test/gzhd.jpg_b
限定最长边(100px),短边自适应:http://yphoto.b0.upaiyun.com/test/gzhd.jpg_100
当然,通过 Nginx 的 image_filter 也可以实现其中的限宽或限高自适应功能、并缓存在本地,只是功能要少,缺少了又拍云存储的CDN加速功能。Nginx image_filter 配置示例:
{
proxy_cache_path /Data/cache/nginx/app levels=1:2 keys_zone=cache_app:200m inactive=7d max_size=10g;
upstream view_store_server_pool{
server 192.168.1.2:80;
server 192.168.1.3:80;
}
server {
server_name view.store.zyan.cc;
access_log off;
location / {
proxy_cache_valid 200 600s;
expires 600s;
proxy_pass http://view_store_server_pool;
}
location ~ /resize_width/(\d+)/(.*) {
set $width $1;
rewrite ^/resize_width/(\d+)/(.*) /$2 break;
image_filter resize $width -;
image_filter_jpeg_quality 90;
image_filter_buffer 10m;
proxy_cache cache_app;
proxy_cache_valid 200 600s;
expires 600s;
proxy_pass http://view_store_server_pool;
}
location ~ /resize_height/(\d+)/(.*) {
set $height $1;
rewrite ^/resize_height/(\d+)/(.*) /$2 break;
image_filter resize - $height;
image_filter_jpeg_quality 90;
image_filter_buffer 10m;
proxy_cache cache_app;
proxy_cache_valid 200 600s;
expires 600s;
proxy_pass http://view_store_server_pool;
}
}
......
(2)、又拍云存储支持 Token 防盗链。对于图片类防盗链来说,判断域名、Reffer就够了。但是对于软件下载等防盗链来说,Reffer等信息都可以伪造,比较靠谱的方法,还是Token防盗链。

四、可选的关系型数据库服务(即 MySQL 服务)
1、资源消耗的大户在于 MySQL,影响整体性能的因素也在于 MySQL。对于创业型团队来说,不要过度依赖 MySQL,不要将高并发业务逻辑都用 MySQL 来处理。在 MySQL 前加个 Memcached 做 SQL 查询缓存,跟 MySQL 的 Query Cache 区别不大,治标不治本,命中率不高,还降低了实时性。现在的移动应用,交互性比较强,实时性要求非常高,Web 时代缓存几分钟的老方法,已经不能适合移动互联网时代的需求。因此,MySQL 只适合存储一些并发查询量不大的核心数据,或作为数据的备份,只写入不查询。我遇到过很多创业团队,用户飞速增长时,最后都是被 MySQL 数据库的性能瓶颈蹩了脚,最后不得不减缓产品功能开发的脚步,来做性能调优,失去了与竞争者、模仿者、山寨大王腾讯的竞争优势。创业团队靠什么和大公司竞争,靠得就是灵活与速度,跑赢大公司。
2、在不依赖 MySQL 的条件下,那么,最低配的关系型数据库服务(比如阿里云的最低配内存 240M、磁盘IOPS 150、最大连接数 60,70元/月),就能适合自己的需求了,不然,勉强满足一般业务配置的关系型数据库服务的费用,就得 700~3000 元/月了。
3、如果购买最低配的关系型数据库服务,还不如省掉 70元/月的费用,在自己 1GB 以上内存的 VPS 上,自己搭建一个 MySQL 数据库,磁盘IOPS、最大连接数、存储空间还不受限制。自己做好 MySQL 的主主、主从同步备份,定时dump备份就可以了。需要注意的是,很多VPS默认没有开启sawp,使用 MySQL 请一定记得开启。下面提供一个 MySQL 5.6 版本适合在 1GB 内存 VPS 上的 my.cnf 配置文件。
下载文件4、如果说 VPS 云服务是必选项的话,关系型数据库服务则是可选项。
五、结构化存储 NoSQL 数据库
1、既然不依赖 MySQL 数据库,那么,对于高并发访问,就需要依赖结构化存储 NoSQL 数据库了。虽然一些云计算服务商,也提供了结构化存储服务,但是,不推荐使用。因为他们使用的都是私有协议,你无法在他们的服务质量、稳定性变差了,价格变贵了,或出现别的更好服务商时,快捷地迁移数据。数据迁移、代码修改的成本太高,还要收到一些服务商规定的单个键值对数据大小不能超过多少、数据导出单个文件大小不能超过多少,使用了,就等于被绑架了。当你准备迁移时,发现不能停服务、数据量太大导入导出速度慢、数据一致性问题受影响,你会发现,早知如此,何必当初。
2、所以,对于 NoSQL 来说,本着使用软件,而不使用服务的原则。寻找开源、免费、付费 NoSQL 软件,安装在自己的 VPS 上,做到多机备份,要好得多。现在的 NoSQL 已经超越了单纯的 Key-Value,对于 List、结构化存储的支持,已经可以取代 MySQL 的大部分功能。
3、对于我们团队来说,NoSQL(自行开发的BigSea数据库) 与 MySQL 在业务中的使用比例为 80% 比 20%,MySQL 主要用于给内部编辑、销售人员使用的后台管理系统。而对于APP、网站流量,95% 的数据库访问为 NoSQL,5% 为 MySQL。
4、如果用 MySQL 数据库,一条联合查询的SQL,也许就可以处理完业务逻辑,但是,遇到大量并发请求,就歇菜了。如果用 NoSQL 数据库,也许需要十次查询,才能处理完同样地业务逻辑,但每次查询都比 MySQL 要快,十次循环NoSQL查询也许比一次MySQL联合查询更快,应对几万次/秒的查询完全没问题。PHP 从 5.3 版本开始,已经可以真正地支持多线程。如果加上PHP多线程,通过十个线程同时查询NoSQL,返回结果汇总输出,速度就要更快了。关于 PHP 多线程的使用,我接下来会再写篇文章细说。
六、防DDOS、CC、Web注入攻击
1、世界上总会有人看你不爽,于是就想着利用不对称的服务器、带宽资源,DDOS、CC攻击你。在云计算时代之前,小规模的攻击可以依靠iptable,大规模的攻击只能依靠昂贵的专业防火墙了。在云计算时代,可以使用一些专业的防DDOS、CC攻击服务商,比如:与腾讯云合作的安全宝、跟百度合作的加速乐。
2、使用这类服务,有一点需要注意,对于域名的@记录,CNAME别名记录和MX邮件记录会冲突,如果将@记录由A记录改为CNAME记录,可能会导致该域名下绑定的企业邮箱服务器收不到邮件。
七、云监控
1、对于一家没有专门系统运维人员的创业企业来说,可以使用第三方云监控来代替运维人员。使用云主机,硬件故障找云计算服务商解决;操作系统故障,云监控中的服务器监控项目很细,通过故障报警就可以定位出问题;剩下的就剩下Web程序代码问题了,使用Nginx+PHP语言运行服务的,将PHP慢日志打开,如果云监控报Web服务502、504错误,快速检测一下PHP慢日志,看看那个PHP文件的哪行代码导致的,作为源头查下去(比如慢日志中显示是MySQL Query查询的代码执行慢,则进一步追查能否正常连接MySQL服务器,没问题则再追查MySQL自身的问题),一步步快速去解决。
2、用过阿里云监控、盛大云监控、监控宝,功能大相径庭。谁的免费版本功能越多、赠送的免费短信通知越多(对于故障的第一时间告知,相比邮件监控通知、手机APP监控通知,短信的延迟速度是最小的),就用谁的。





