未来往事
Awstats简介
Awstats 是在 SourceForge 上发展很快的一个基于 Perl 的 WEB 日志分析工具,一个充分的日志分析让 Awstats 显示您下列资料:
    访问次数、独特访客人数,
    访问时间和上次访问,
    使用者认证、最近认证的访问,
    每周的高峰时间(页数,点击率,每小时和一周的千字节),
    域名/国家的主机访客(页数,点击率,字节,269域名/国家检测, geoip 检测),
    主机名单,最近访问和未解析的 IP 地址名单
    大多数看过的进出页面,
    档案类型,
    网站压缩统计表(mod_gzip 或者 mod_deflate),
    使用的操作系统 (每个操作系统的页数,点击率 ,字节, 35 OS detected),
    使用的浏览器,
    机器人访问(检测 319 个机器人),
    蠕虫攻击 (5 个蠕虫家族),
    搜索引擎,利用关键词检索找到你的地址,
    HTTP 协议错误(最近查阅没有找到的页面),
    其他基于 URL 的个性报导,链接参数, 涉及综合行销领域目的.
    贵网站被加入"最喜爱的书签".次数.
    屏幕大小(需要在索引页补充一些 HTML 标签).
    浏览器的支持比例: Java, Flash, RealG2 reader, Quicktime reader, WMA reader, PDF reader.
    负载平衡服务器比率集群报告.
Awstats 是一款基于 Perl 的 WEB 日志分析工具,从Awstats的文档来看,他对 Apache HTTP Server 的支持是非常完美的。同时 JAWStats 是一款基于 PHP 的统计套件,旨在为 Awstats 提供更为精美图形界面。
由于日志是按照一定的规则来生成的,把访问数据存入到文件中,但是数据存入的时候可能是不全的,awstats分析的时候就会有误差。

环境信息约定:
日志文件位置:/htdoc/logs
系统:CentOS6.3 X64
软件存储位置:/opt
awstats安装位置:/usr/local/awstats
JAWStats安装位置:/htdoc/stats/
这里我们配置的站点域名:slog.fity.cn
WEB服务器:Nginx
静态页面文件输出路径:/usr/local/apache/data(可选)


一、安装和配置 Awstats
Awstats 安装非常简单,但必须先确认你服务器上 Perl 的环境已经就绪。
1、下载和安装 Awstats
awstats项目地址:http://sourceforge.net/projects/awstats/
目前最新版本 7.1.1,这里我们下载 7.1.1
[root@iredmail ~]# cd /opt
[root@iredmail opt]# wget http://sourceforge.net/projects/awstats/files/AWStats/7.1.1/awstats-7.1.1.tar.gz
[root@iredmail opt]# tar -zxf awstats-7.1.1.tar.gz
[root@iredmail opt]# mv awstats-7.1.1 /usr/local/awstats

wget下载的包中权限可能是一个不存在的UID用户,赋予权限让.pl的文件可以运行:
[root@iredmail opt]# chown -R root:root /usr/local/awstats
[root@iredmail opt]# chmod +x /usr/local/awstats/tools/*.pl
[root@iredmail opt]# chmod +x /usr/local/awstats/wwwroot/cgi-bin/*.pl

2、生成配置文件
+阅读全文
问:在现在的这样一个国情下,做技术的年轻人,到底应该怎么做,走什么样的发展方向,才不至于虚度一生,到老的时候后悔?

答:我小的时候,有一本书很流行,就是今天题图这本《钢铁是怎样炼成的》。书中主人公有一句名言:

「人最宝贵的就是生命,生命对于每个人来说只有一次。人的一生应该这样度过:回首往事,他不会因为虚度年华而悔恨,也不会因为碌碌无为而羞愧;」

注意上面是分号,因为这句名言还没完,下半句是这样的

「临终之际,他能够说:“我的整个生命和全部精力,都献给了世界上最壮丽的事业——为解放全人类而斗争。”」

我引用这句话要做什么呢?是要鼓励你去做主人公做的事情?很明显下半句说的事情已经不需要我们了,留给八千万党员去做即可。但是上半句呢?现在来看也未必那么正确。人的一生怎样度过,不需要别人来定义。

一个技术人究竟怎么才能不虚度一生?

既然你能这么问,说明你是想一生做一个技术人。至少在我看来这是个好事情。

应该说,我们身处一个大时代,风云变幻,但我们每个人其实又都微不足道。可以说,我们绝大多数人最后都还是普通人,做的事情也可能一辈子都是普通的事情,必须要说,普通的事情和普通人也可以改变社会,比如做 12306 抢票插件的那位程序员。怎么能做一辈子普通事情又让自己觉得不虚度一生呢?

我们应该尝试去做对这个社会有正价值的事情 而不是去让这个社会变得更糟,这是一个普世价值。举个例子来说,一个技术人,具备给 GFW 做事情的能力,具备做流氓软件的能力,也具备去做电子商务的能力,前两者可能获益更大,但是后者对社会无疑更有价值。我们可以去尝试做后者。至少,后者对这个社会更有价值一点。这么说是不是站着说话不腰疼?我不知道,但是选择之前,可以多想一下。

我们应该尝试更有效率一些,做一些高效的事情 人的一生很短暂,如果每天沉浸在文山会海之中,深陷繁文缛节之中,即使有再大的能力又能做多少事情?如果你想创造更大的价值,要么用更有效的方式,要么投入更大的资源,可惜,绝大多数人力量都很有限,那我们就更高效一点。我们看到身边太多的不思进取,得过且过,甚至年纪轻轻就有一种养老心态的人。

我们应该持续学习 看一下我们的父辈,想一下他们那个年代追求的事情,那时候的一份好工作是什么样子,所谓的铁饭碗是什么样子,现在呢?整个社会变化了。看看那些下岗工人,至少我是不胜惶恐。曾经他们也是技术人。如果丧失了学习的能力,很快就会被这个时代抛弃。包括现在削减了脑袋想进入体制的年轻人,谁知道20年后体制是否会发生变化,到时候你们怎么办?

我们应该尽可能的帮助一下别人 尽我们的能力,去看看能否帮助一些人,就当是回报那些曾经帮助过我们自己的人。帮助别人更有效的事情,也是一种正向价值。

怎么样才能不虚度一生,能做到以上几个「应该」做的,我个人认为就够了,注意,我只是建议。

对了,上面提到的那本书,不值得去看。

zeroMQ/php-zmq消息队列安装配置 不指定

Rinald 本站原创 Linux 2013/05/30 20:23
zeroMQ消息队列介绍及zeroMQ/php-zmq安装
首先了解下ZMQ的概念,ØMQ(ZeroMQ)是啥玩意儿?
ZeroMQ是个类似于Socket的一系列接口,他跟Socket的区别是:普通的socket是端到端的(1:1的关系),而ZMQ却是可以N:M 的关系,人们对BSD套接字的了解较多的是点对点的连接,点对点连接需要显式地建立连接、销毁连接、选择协议(TCP/UDP)和处理错误等,而ZMQ屏蔽了这些细节,让你的网络编程更为简单。ZMQ用于node与node间的通信,node可以是主机或者是进程。
ZeroMQ是网络栈中新的一层,它是个可伸缩层,分散在分布式系统间。因此,它可支持任意大的应用程序。ØMQ不是简单的点对点交互,相反,它定义了分布式系统的全局拓扑。ØMQ应用程序没有锁,可并行运行。此外,它可在多个线程、内核和主机盒之间弹性伸缩。

与其他的消息队列相比,ZeroMQ有以下一些特点
1、点对点无中间节点
传统的消息队列都需要一个消息服务器来存储转发消息。而ZeroMQ则放弃了这个模式,把侧重点放在了点对点的消息传输上,并且(试图)做到极致。以为消息服务器最终还是转化为服务器对其他节点的点对点消息传输上。ZeroMQ能缓存消息,但是是在发送端缓存。ZeroMQ里有水位设置的相关接口来控制缓存量。当然,ZeroMQ也支持传统的消息队列(通过zmq_device来实现)。
2、强调消息收发模式
在点对点的消息传输上ZeroMQ将通信的模式做了归纳,比如常见的订阅模式(一个消息发多个客户),分发模式(N个消息平均分给X个客户)等等。下面是目前支持的消息模式配对,任何一方都可以做为服务端。
• PUB and SUB
• REQ and REP
• REQ and XREP
• XREQ and REP
• XREQ and XREP
• XREQ and XREQ
• XREP and XREP
• PUSH and PULL
• PAIR and PAIR
3、以统一接口支持多种底层通信方式(线程间通信,进程间通信,跨主机通信)
如果你想把本机多进程的软件放到跨主机的环境里去执行,通常要将IPC接口用套接字重写一遍。非常麻烦。而有了ZeroMQ就方便多了,只要把通信协议从"ipc:///xxx"改为"tcp://*.*.*.*:****"就可以了,其他代码通通不需要改,如果这个是从配置文件里读的话,那么程序就完全不要动了,直接复制到其他机器上就可以了。以为ZeroMQ为我们做了很多。
4、异步,强调性能
ZeroMQ设计之初就是为了高性能的消息发送而服务的,所以其设计追求简洁高效。它发送消息是异步模式,通过单独出一个IO线程来实现,所以消息发送调用之后不要立刻释放相关资源哦,会出错的(以为还没发送完),要把资源释放函数交给ZeroMQ让ZeroMQ发完消息自己释放。

zeromq的官方网站: http://www.zeromq.org/

系统环境约定:
OS:centos 6.3 X64
web目录:/htdoc/web
软件临时存放目录:/opt/
zeromq安装目录:/usr/local/webserver/zeromq


一、安装zeromq
Tip:To build on UNIX-like systems,make sure that libtool, autoconf, automake are installed.
[root@iredmail opt]# wget http://download.zeromq.org/zeromq-3.2.3.tar.gz
[root@iredmail opt]# tar -zxvf zeromq-3.2.3.tar.gz
[root@iredmail opt]# cd zeromq-3.2.3
[root@iredmail zeromq-3.2.3]# ./configure --prefix=/usr/local/webserver/zeromq --with-pgm=libpgm-5.1.118~dfsg
(libpgm-5.1.118~dfsg位于zeromq-3.2.3/foreign/openpgm/目录下)
[root@iredmail zeromq-3.2.3]# make && make install
[root@iredmail zeromq-3.2.3]# ldconfig
官方文档:http://www.zeromq.org/area:download
Tip:If you get an error:configure: "error: cannot link with -luuid, install uuid-dev".Please install e2fsprogs-devel


二、安装php扩展
[root@iredmail zeromq-3.2.3]# cd..
[root@iredmail opt]# git clone git://github.com/mkoppanen/php-zmq.git
Tip: If you get an error of git command,please install git or use other download tools
[root@iredmail opt]# cd php-zmq
[root@iredmail php-zmq]# /usr/local/webserver/php5318/bin/phpize
Tip:
①/usr/local/webserver/php5318/is my php installation path;
②If you are using php installed from your distribution's package manager the 'phpize' command is usually in php-dev or php-devel package
[root@iredmail php-zmq]# ./configure --with-php-config=/usr/local/webserver/php5318/bin/php-config --with-zmq=/usr/local/webserver/zeromq
Tip:
①/usr/local/webserver/zeromq is my zeromq installation path;
②If you get an error:"checking libzmq installation... configure: error: Unable to find libzmq installation",please use param"--with-zmq" specify the zeromq installation path.
[root@iredmail php-zmq]# make && make install
Installing shared extensions:     /usr/local/webserver/php5318/lib/php/extensions/no-debug-non-zts-20090626/
表示生成了动态链接库文件zmq.so.这个时候可以查看一下目录里有没有zmq.so 这个文件.

Add the following line to your php.ini:
extension=zmq.so
OR:
If you are using PHP 5.4.x and/or using PHP-FPM, you will need to add a zmq.ini file in /etc/php5/conf.d:
Add the following:
extension=zmq.so
Restart php-fpm

访问phpinfo页面就可以看到zeroMQ的消息了:
点击在新窗口中浏览此图片

官方文档:http://www.zeromq.org/bindings:php
If you need an Java language environment,you can get client from:https://github.com/zeromq/jzmq
If you need an Python language environment,you can get client from:https://github.com/zeromq/pyzmq


三、实例测试
+阅读全文
在用到一个新产品时,我们肯定会做的一件事就是做性能测试。但是你真的会做性能测试吗?今天要说的是一个关于Redis性能测试的争论。

事情起因是一篇叫做Redis vs Memcached的文章,本文作者在听说Redis之后将Redis和Memcached进行了一组性能对比测试,测试结果Redis完败。然而其测试方法却引起了不小的争执,其博文下的第一篇回复就是Redis作者antirez同学的回复。antirez非常有风度的感谢了他的测试结果,然后指出其测试中的问题。

而后在antirez的一篇博文(On Redis, Memcached, Speed, Benchmarks and The Toilet)中,他指出了一些做性能测试方面的经验,并自己对Redis和Memcached做了性能对比。结果与上面的相反,Redis全胜。这一篇文章好像一个教程一样,让大家别再不懂装懂瞎做性能测试了。

然而此文后两天,antirez又发布了另一篇博文(An update on the Memcached/Redis benchmark),对其上篇文章中的内容进行了补充。而正如Alex Popescu说的一样,性能测试一定要基于自己的实际情况,用自己的业务数据来进行测试,才是最靠谱的。
这篇文章主要叙述Discuz x2.5 X3.0 X3.1 php单页面的制作方法,包括单页的DIY,选项卡页面的制作等。Discuz单页的制作其实还是很简单的,本文以制作美食单页面为例。

单页包括该单页的php文件和该单页的模板(.htm)文件,比如:food.php、food.htm。下面就开始分析说明单页的代码:
1、首先创建一个php文件,这里我把文件命名为food.php(存在论坛的根目录)
注意:food为模板文件名,不需要加.htm扩展名,这里暂定存在默认风格目录下的portal目录下。如果不理解可以看看Discuz!模板解析机制:http://open.discuz.net/?ac=document&page=dev_template


2、新建一个支持Diy的普通单页面模板文件:food.htm(存在论坛当前风格的portal目录,上面已经定义了路径)


3、新建带有右侧边栏的单页模版文件代码(根据自己需要,如果不需要就不用建立)
+阅读全文
Discuz多论坛用户积分同步 Discuz多论坛积分同步 Discuz多站点用户信息数据同步
文章已有最新版:http://fity.cn/post/457/
最后更新:2014-02-10 12:08
     关于Discuz积分同步,近期将重新发布一篇新文章介绍在discuzX3中实现discuz用户积分同步。本文bug不在修复。
最后更新:2013-04-23 22:19
     修复了已知bug。如使用,请确定自己对Discuz或mysql服务器有所了解或联系未来往事获取帮助。另外就是目前Discuz已发布X3测试版产品和Discuz的程序版本的生命周期时间,建议你往高版本升级。

录入时间:2013-04-10 23:55
前段时间有几个discuz上面的网友在QQ上问针对discuzX1.5-X2.0多论坛、站点环境下如何同步各个站点的用户相关数据信息(例如:积分、消息、提醒、勋章获得情况等),确保多站点用户数据的一致性,提升用户体验,于是整理了这篇文章。如果要实现这样的结果,很显然需要共用用户数据信息,当然从程序或是服务器方面综合来说实现方法也有很多种。

本文基于Discuz!X2.0版本程序、独立主机(如果为虚拟主机需要修改部分内容)环境所写,阐述的方法是通过Discuz的分布式部署+MySQL触发器实现这一需求。
Discuz在X1.0版本发布以后开始支持在多个数据库之间操作,到X2.0版本可以看到分布式MySQL部署已经有个趋势但依然并不完善、存在诸多的bug。官方的回复是目前X2.0依然不支持分布式部署。不过现在好多站点都已经升级到X2.5版本,X2.5版本官方给出的产品文档中已指出支持分布式MySQL部署,X3.0中官方曝光支持站点热点数据缓存层和数据库分布式部署,在架构、性能、移动互联网方面逐渐增强。

闲话不多说了,下面进入正题:

环境相关信息约定:
Discuz版本:DiscuzX2.0(未集成UCenter Home)
                   UCenter1.6.0(单独的域名:uc.fity.cn)
站点域名:a.fity.cn 和 b.fity.cn(这里我们需要实现这两个站点的用户积分同步)
MySQL版本:5.0.x
数据库相关信息:
    a.fity.cn 使用MySQL数据库:bbs_a
    b.fity.cn 使用MySQL数据库:bbs_b
    积分同步的表存储到公共数据库:memberdata(该库存储用户的信息和积分,第二主库<读写>,部分页面依然读配置文件中定义的db1下的用户表)
补充信息:由上面的介绍,我们知道在Discuz未来新版本中已经对分布式部署有了更好的支持,所以这里我们考虑到未来架构的移植及可扩展性把需要同步的数据表单独存储到一个公共的数据库memberdata中,实现过程简单示意图:
点击在新窗口中浏览此图片


一、暂时对站点进行关闭操作,以确保各数据库暂时不再被写入
  后台——关闭站点

二、额外了解一些基础:Discuz主要性能优化瓶颈表
  • member表
  • Post表
  • Thread表点击数
  • DIY模块数据更新
  • 帖子点评和评分功能的

Discuz!X系统功能丰富,数据表多达200多个,在实际生产环境中对各种功能的深度使用各不一样,导致每个数据表都有可能承受高并发的访问压力,当出现这种情况时,需要将负载大的数据表及其相关数据表单独部署,以增强系统的负载能力。
这里我们先来看下Discuz!X2.5的分布式部署。Discuz!X2.5理论上支持以表为单位的数据库分布式部署,部分无法独立部署的表将与其相关表被合并为最小部署单位。以下图为例:
点击在新窗口中浏览此图片

三、在Discuz!X2.0中配置MySQL数据库分布式部署,这里我们把pre_common_member和pre_common_member_count两张表部署到第二台数据库服务器(公共用户信息数据库),编辑a.fity.cn和b.fity.cn站点的config_global.php配置文件,CONFIG DB配置区域参考如下内容:
代码中暴露了php脚本代码,未能正常显示,请联系未来往事更正文章……


至此,Discuz!X2.0中的MySQL数据库分布式部署几乎完成了。
需要注意:这里我们需要确保`memberdata`库下的表的信息数据是最终数据(最完整的数据),同时同步给a.fity.cn和b.fity.cn各一份(这里可能在同步一份到各个站点,这样公共库memberdata下的pre_common_member和pre_common_member_count两张表的数据和各个论坛库库下的pre_common_member和pre_common_member_count两张表不是重复了吗?分布式还有什么意义?当你部署完成后就知道原因:同为主库,Discuz!X2.0下设计理念是第二服务器上`memberdata`库pre_common_member和pre_common_member_count两张表可读写,但部分页面读取依然会读第一服务器上的数据,这里不再过多赘述。如果可以建议更新到新版本discuz程序或自行修改程序代码进行调整,这里本文重点介绍的是通过MySQL触发器实现各表数据同步。)如果你的站点数据表之间在这里没有同步,后面完成后你可能会遇到如下错误信息:
点击在新窗口中浏览此图片

更多配置信息请至官方阅读“Discuz!X2.5新版架构优化说明——X2.5的新程序架构”:
http://dev.discuz.org/wiki/index.php

四、利用MySQL触发器将`memberdata`库下pre_common_member和pre_common_member_count两张表的数据同步给a.fity.cn和b.fity.cn站点
+阅读全文
MySQL触发器 触发程序语句代码自动生成源码(PHP版),实现数据同步

点击进入在线编解码工具页面>>>
MySQL触发程序--触发器(TRIGGER)详解及实例
触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。Mysql5之后开始支持触发器,并且在创建触发器后会自动在/var/lib/mysql目录下生成TRG以及TRN文件(Linux下)你必须拥有足够的权限才能创建触发器(CREATE TRIGGER),如果你已经是root用户,那么就足够了。这跟SQL的标准有所不同。

MySQL触发器 触发程序语句代码在线生成

基本语法:
CREATE TRIGGER <触发器名称>   //触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象.

trigger_time触发程序的动作时间:
{ BEFORE | AFTER }   //触发器有执行的时间设置:可以设置为事件发生前或后。

trigger_event激活触发程序的语句的类型
{ INSERT | UPDATE | DELETE }   //同样也能设定触发的事件:它们可以在执行insert、update或delete的过程中触发。

ON <表名称>   //触发器是属于某一个表的:当在这个表上执行插入、 更新或删除操作的时候就导致触发器的激活. 我们不能给同一张表的同一个事件安排两个触发器。

FOR EACH ROW   //触发器的执行间隔:FOR EACH ROW子句通知触发器 每隔一行执行一次动作,而不是对整个表执行一次。

<触发器SQL语句>   //触发器包含所要触发的SQL语句:这里的语句可以是任何合法的语句, 包括复合语句,但是这里的语句受的限制和函数的一样。


MySQL命令行下创建触发程序,实例1:
DELIMITER //      #等同于DELIMITER $$

CREATE TRIGGER testref BEFORE INSERT ON test1
  FOR EACH ROW    #为什么创建触发器时使用 for each row 这是因为加上这句则触发事件就是行级的,那么对每一行有这个动作都要触发一次事件
  BEGIN
    INSERT INTO test2 SET a2 = NEW.a1;
    DELETE FROM test3 WHERE a3 = NEW.a1;  
    UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
  END //       #等同于END $$

DELIMITER ;    #其中delimiter告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了。默认情况下,delimiter是分号;。在命令行客户端中,如果有一行命令以分号结束,那么回车后,mysql将会执行该命令。但有时候,不希望MySQL这么做。在为可能输入较多的语句,且语句中包含有分号。使用delimiter //,这样只有当//出现之后,mysql解释器才会执行这段语句。

实例2:
drop trigger pre_common_member_insert;   //如果触发器member_update存在则删除
delimiter |
create trigger pre_common_member_insert
after insert
on `membertest`.`pre_common_member`  //触发器执行的表
for each row
begin
INSERT INTO      //被触发的表`web`.`pre_common_member`(`uid`,`email`,`username`,`password`,`status`,`emailstatus`,`avatarstatus`,`videophotostatus`,`adminid`,`groupid`,`groupexpiry`,`extgroupids`,`regdate`,`credits`,`notifysound`,`timeoffset`,`newpm`,`newprompt`,`accessmasks`,`allowadmincp`,`onlyacceptfriendpm`,`conisbind`) VALUES (new.uid,new.email,new.username,new.password,new.status,new.emailstatus,new.avatarstatus,new.videophotostatus,new.adminid,new.groupid,new.groupexpiry,new.extgroupids,new.regdate,new.credits,new.notifysound,new.timeoffset,new.newpm,new.newprompt,new.accessmasks,new.allowadmincp,new.onlyacceptfriendpm,new.conisbind);
end |
delimiter ;
解释:当membertest数据库库下的pre_common_member数据表更新,则触发该事件把数据同步更新到web数据库下pre_common_member表中。简单的说就是当membertest数据库库下的pre_common_member数据表更新则同步更新web数据库下pre_common_member表。

可以在mysql的命令行模式下创建触发器,也可以利用以下几款mysql管理软件创建,在这些软件中实现mysql触发器非常方便简单:
1、SQLyog (连接本机数据库成功后,我们可以在数据表上右击选择“Create Trigger…”或右键Triggers,选择Create Trigger…,这里不再过多赘述,适合windows系列系统)
2、Navicat(选择数据表--设计表--触发器,这里不再过多赘述,适合windows系列系统)
3、phpMyAdmin(版本有所差异,适合多系统)


MySQL触发器也存在一定的安全隐患,常见的有利用权限漏洞提权隐患:
1、上面提到的t.TRG文件可以看到是通过DEFINER来将触发器“绑定”到该触发器的创建用户上,并在执行时拥有该用户的权限。
2、利用mysql用户的file权限(文件读写权限),直接添加触发器TRG以及TRN文件,使其“绑定”到mysql默认管理员root@localhost用户上,触发器文件内容为提升mysql用户权限SQL语句。
3、利用之前发现的栈溢出漏洞来刷新服务器配置使得触发器文件可以被识别,并且在触发器执行时具有root@localhost的权限,以此来提升mysql用户权限。
预防措施:
1、由于该提权方式可以被远程利用,所以管理员应当关闭Mysql远程管理方式,只允许本地用户连接。
2、本着最小权限原则,应当为连接用户配置最小权限,不要分配all,file等高危权限。

MySQL触发器 触发程序语句代码在线生成
• 参考mysql官方文档:http://dev.mysql.com/doc/refman/5.1/zh/triggers.html

MySQL 多实例配置指南 不指定

Rinald 本站原创 MySQL 2013/04/03 11:59
Mysql具有一次安装可以运行多个实例的功能,简单的说,MySQL可以以多实例的方式,实现一台服务器,运行在不同端口不同数据文件的MySQL,它们是相互独立的。每个实例的datadir,pid,port,socket是不同的。本文将通过两种方法阐述MySQL多实例的配置。如果你看到这篇文章,未来往事推荐选择方法一进行实施MySQL多实例配置,便于后期的自动化、高效运维管理。

为什么要这样做?这样做的好处是什么?
1、提高CPU的利用率;
2、其实配置mysql多实例运行就是新建数据库存放的位置和监听的socket端口,这样当client连接时就会经由不同的端口访问新建的数据库。创建多实例可以通过下载源码重新编译安装,这样做的好处是可以加入新数据库需要的特别配置。
…………………………


方法/方案一:
首先我们明确一些约定信息:
系统约定:CentOS 6.3
MySQL程序相关信息:
mysql version:5.5.20
basedir:/usr/local/webserver/mysql5520
datadir:/data/mysql_3306    //实例一
             /data/mysql_3307    //实例二
sysconfdir:/etc/my.cnf

一、基础知识:
如果选择使用该方法,首先我们需要了解下mysqld_multi:
mysqld_multi是管理多个mysqld的服务进程,这些服务进程程序用不同的unix socket或是监听于不同的端口,通过简单的命令,它可以启动,关闭和报告所管理的服务器的状态 。(也可以用此在一台机器上做mysql的主从复制)。

二、mysql5.5.20安装
这里不再赘述,下载源码后
cmake -<option>... && make && make install

三、多实例配置
1、建立配置文件
下面是本例中的配置文件my.cnf:
[client]
#password       = your_password
port            = 3306
socket          = /tmp/mysql/mysqld.sock
# MySQL Server

[mysqld_multi]
mysqld = /usr/local/webserver/mysql5520/bin/mysqld_safe
mysqladmin = /usr/local/webserver/mysql5520/bin/mysqladmin
log  = /var/log/mysqld_multi.log
user = multi_admin
password = fity@2013

[mysqld1]
port            = 3306
basedir         = /usr/local/webserver/mysql5520
datadir         = /data/mysql1
socket          = /tmp/mysql/mysqld3306.sock
#thread_concurrency  = 8
skip-external-locking
key_buffer_size = 512M
max_allowed_packet = 1024M
table_open_cache = 2048
sort_buffer_size = 8M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 64
query_cache_type = 0
#query_cache_size = 32M
query_cache_size = 0M
query_cache_limit = 2M
thread_concurrency = 8
skip-name-resolve
skip-slave-start
wait_timeout = 600
default-storage-engine  = MyISAM
connect_timeout=30
max_user_connections = 200
max_connections = 1000
max_connect_errors = 10000
binlog_format = mixed
max_binlog_size = 128M
binlog_cache_size = 4194304
tmp_table_size = 256M
max_heap_table_size = 64M
#tmpdir = /data/3306mysql/tmp
#slave_load_tmpdir=/tmp
slow-query-log-file = /data/log/mysql/slowquery.log
long_query_time = 4
log-queries-not-using-indexes = true
log-slave-updates
init-connect = 'set names utf8'
log-bin=mysql-bin
server-id   = 1
#set-variable = max_connections=1000
net_buffer_length = 8K
myisam_sort_buffer_size = 8M
back_log = 500
expire_logs_days = 4
lower_case_table_names = 1
join_buffer_size = 4M


[mysqld2]
port            = 3307
basedir         = /usr/local/webserver/mysql5520
datadir         = /data/mysql2
socket          = /tmp/mysql/mysqld3307.sock
#thread_concurrency  = 8
skip-external-locking
key_buffer_size = 512M
max_allowed_packet = 1024M
table_open_cache = 2048
sort_buffer_size = 8M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 64
query_cache_type = 0
#query_cache_size = 32M
query_cache_size = 0M
query_cache_limit = 2M
thread_concurrency = 8
skip-name-resolve
skip-slave-start
wait_timeout = 600
default-storage-engine  = MyISAM
connect_timeout=30
max_user_connections = 200
max_connections = 1000
max_connect_errors = 10000
binlog_format = mixed
max_binlog_size = 128M
binlog_cache_size = 4194304
tmp_table_size = 256M
max_heap_table_size = 64M
log-slave-updates
init-connect = 'set names utf8'
log-bin=mysql-bin
server-id   = 1
net_buffer_length = 8K
myisam_sort_buffer_size = 8M
back_log = 500
expire_logs_days = 4
lower_case_table_names = 1
join_buffer_size = 4M

[mysqldump]
quick
max_allowed_packet = 1024M
[mysql]
no-auto-rehash
[isamchk]
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M
[myisamchk]
key_buffer_size = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout = 600

由上面的配置文件我们可以看到这里我们在本机配置了两个MySQL实例:
MySQL实例一 -- [mysqld1]数据库实例信息:
datadir:/data/mysql1
port:3306
socket:/tmp/mysql/mysqld3306.sock
开启了MySQL慢查询日志记录

MySQL实例二 -- [mysqld2]数据库实例信息:
datadir:/data/mysql2
port:3307
socket:/tmp/mysql/mysqld3307.sock
未开启MySQL慢查询日志记录

根据以上的配置信息,可知我们配置了mysqld1,mysqld2两个mysql实例,每个实例都指定了不同的连接端口(是3306——3307)和数据存储路径(datadir所指定的就是它们各自数据的存储路径)等等一些其他的信息。

2、建立需要的文件夹和初始化数据库
[mysqld1]是一个默认的,在我们安装mysql时已经有了,所以不用管它。接下来我们要配置的是[mysqld2]
(1)建立[mysqld2]实例的数据存储目录
#mkdir /data/mysql2 -p
#chown mysql.mysql /data/mysql2

(2)初始化[mysqld2]实例的数据库:
你可以把默认的mysql数据库复制过来,也可以通过mysql工具重新初始化一个数据库,本例中是重新初始化的[mysqld2]实例数据库:
#/usr/local/webserver/mysql5520/scripts/mysql_install_db --user=mysql --basedir=/usr/local/webserver/mysql5520/ --datadir=/data/mysql2
备注:老版本mysql的mysql_install_db位于安装目录下bin中

3、管理mysql多实例:启动/关闭
mysqld_multi [OPTIONS] {start|stop|report} [GNR,GNR,GNR...]
mysqld_multi [OPTIONS] {start|stop|report} [GNR-GNR,GNR,GNR-GNR,...]

如:
#只启动第一个mysql实例服务,相关文件由my.cnf中[mysqld1]设定
#/usr/local/webserver/mysql5520/bin/mysqld_multi --defaults-extra-file=/etc/my.cnf start 1

#只停止第一个mysql服务,相关文件由my.cnf中[mysqld1]设定
#/usr/local/webserver/mysql5520/bin/mysqld_multi --defaults-extra-file=/etc/my.cnf stop 1  

#启动第1至2个mysql实例服务,本例中的全部mysql实例
#/usr/local/webserver/mysql5520/bin/mysqld_multi --defaults-extra-file=/etc/my.cnf start 1-2

然后,可以看到两个MySQL实例都已经成功的启动了
# netstat -lntp &#124; grep mysql
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      21955/mysqld        
tcp        0      0 0.0.0.0:3307                0.0.0.0:*                   LISTEN      23281/mysqld

开机启动:
#/etc/rc.local
/usr/local/webserver/mysql/bin/mysqld_multi --defaults-extra-file=/etc/my.cnf start 1-2

4、初始化[mysqld2]实例数据库的root密码:
# mysql -u root -P3307 -S /tmp/mysql/mysqld3307.sock
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456';
flush privileges;
quit

5、分别在[mysqld1]实例和[mysqld2]实例中建立多实例管理用户multi_admin
grant shutdown on *.* to 'multi_admin'@'localhost' identified by 'fity@2013';
flush privileges;

这里需要注意的是:这个用户和密码需要在两个实例中都有且赋权,否则无法关闭实例。

6、测试
登录mysql服务器,看数据库是否正确加载,权限是否正确
#mysql -u root -p123456 -P3306 -S /tmp/mysql/mysqld3306.sock  //登录mysql实例1
#mysql -u root -p123456 -P3307 -S /tmp/mysql/mysqld3307.sock  //登录mysql实例2

如果不指定socket路径,可能你会收到服务器抛出的如下错误:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql/mysqld.sock' (2)

分析:个人认为出现这个错误是,默认会去找mysql.sock这个文件,而因为此物理机器上运行的是多个实例,所以这个文件不存在。
当然你可以查阅本博客这篇文章以了解mysql的连接方式及通信原理:《mysql连接类型与socket通信原理说明》http://fity.cn/post/348/



方法/方案二:
+阅读全文
MySQL连接类型中的localhost与127.0.0.1、IP区别:
localhost与127.0.0.1的区别是什么?相信有人会说是本地ip,曾有人说,用127.0.0.1比localhost好,可以减少一次解析。 看来这个入门问题还有人不清楚,其实这两者是有区别的。

NO.1 - 普通接说:
localhost也叫local ,正确的解释是:本地服务器
127.0.0.1在windows等系统的正确解释是:本机地址(本机服务器)

NO.2:
localhot(local)是不经网卡传输!这点很重要,它不受网络防火墙和网卡相关的的限制。
127.0.0.1是通过网卡传输,依赖网卡,并受到网络防火墙和网卡相关的限制。
一般设置程序时本地服务用localhost是最好的,localhost不会解析成ip,也不会占用网卡、网络资源。
有时候用localhost可以,但用127.0.0.1就不可以的情况就是在于此。猜想localhost访问时,系统带的本机当前用户的权限去访问,而用ip的时候,等于本机是通过网络再去访问本机,可能涉及到网络用户的权限。

NO.3 - MySQL被连接时主机类型:
1、 mysql -h 127.0.0.1 的时候,使用TCP/IP连接,
mysql server 认为该连接来自于127.0.0.1或者是"localhost.localdomain"
2、mysql -h localhost 的时候,是不使用TCP/IP连接的,而使用Unix socket;
此时,mysql server则认为该client是来自"localhost"

在mysql权限管理中的"localhost"有特定含义:
—— MySQL手册 5.6.4 ..... A Host value may be a hostname or an IP number, or 'localhost' to indicate the local host.

注意:虽然两者连接方式有区别,但当localhost 为默认的127.0.0.1时,两种连接方式使用的权限记录都是以下的记录(因为记录在前,先被匹配)
Host: localhost
User: root


MySQL连接类型证明:
# mysql -h 127.0.0.1  -u root -pfity.cn#123
ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111)[需要指定端口,反之收到这个错误]

# mysql -h 127.0.0.1 -P 3307 -u root -pfity.cn#123
mysql> status;
--------------
mysql  Ver 14.12 Distrib 5.0.95, for redhat-linux-gnu (i686) using readline 5.1

Connection id:          1599
Current database:
Current user:           root@127.0.0.1
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.1.48-log Source distribution
Protocol version:       10
Connection:             127.0.0.1 via TCP/IP  //注意这里
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    latin1
Conn.  characterset:    latin1
TCP port:               3307
Uptime:                 5 hours 54 min 48 sec

Threads: 1  Questions: 5432  Slow queries: 1619  Opens: 72  Flush tables: 1  Open tables: 65  Queries per second avg: 0.255
--------------

# mysql -h 192.168.1.246  -u root -pfity.cn#123
ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.1.246' (111)[需要指定端口,反之收到这个错误]

# mysql -h 192.168.1.246 -P 3307 -u root -pfity.cn#123
mysql> status;
--------------
mysql  Ver 14.12 Distrib 5.0.95, for redhat-linux-gnu (i686) using readline 5.1

Connection id:          1598
Current database:
Current user:           root@192.168.1.246
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.1.48-log Source distribution
Protocol version:       10
Connection:             192.168.1.246 via TCP/IP    //注意这里
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    latin1
Conn.  characterset:    latin1
TCP port:               3307
Uptime:                 5 hours 53 min 54 sec

Threads: 1  Questions: 5428  Slow queries: 1619  Opens: 72  Flush tables: 1  Open tables: 65  Queries per second avg: 0.255
--------------

# mysql -h localhost  -u root -pfity.cn#123[连接OK]

# mysql -h localhost -P 3307 -u root -pfity.cn#123
mysql> status;
--------------
mysql  Ver 14.12 Distrib 5.0.95, for redhat-linux-gnu (i686) using readline 5.1

Connection id:          1600
Current database:
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.1.48-log Source distribution
Protocol version:       10
Connection:             Localhost via UNIX socket    //注意这里
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    latin1
Conn.  characterset:    latin1
UNIX socket:            /var/lib/mysql/mysql.sock
Uptime:                 5 hours 56 min 18 sec

Threads: 1  Questions: 5436  Slow queries: 1619  Opens: 72  Flush tables: 1  Open tables: 65  Queries per second avg: 0.254
--------------
+阅读全文
bo-blog 简约 简单 主题 模板 风格 - FitySimple3.0 发布

主题风格:FitySimple 由 未来往事 于2013/01/01设计制作,测试使用两个多月后于2013/03/02发布,最后更新时间:2013/11/10 - 3.0版本。 感谢您对 未来往事博客 的关注!
PS:如果可能就尽可能的不要再用bo-blog程序了,这个博客程序2008年最后一次更新之后就再没更新过,出现问题修改起来也比较纠结,未来往事推荐你选择其他开源博客程序,如:emlog、wordpress等

最后更新:2013年11月10日
--------------------------------------------------------------------
1、页面DIV结构重新布局
2、精简、合并了CSS样式表(部分区块使用了CSS3属性选择器,建议使用IE9++版本浏览器)
3、放弃对IE6进行友好支持,仅做相对兼容,不影响使用(鄙视IE6 grin

最后更新:2013年05月15日
--------------------------------------------------------------------
1、部分用户反馈的字体及尺寸调整;
2、CSS样式优化及去除了一些页面冗余代码;
3、去除页面自适应宽度、自定义宽度、显示/隐藏区块等功能JS代码,提升加载速度;
4、增加RSS订阅、QQ邮箱订阅、微博等;
5、增加返回顶部、转到底部按钮;
6、主要调整了对IE6的兼容;

发布日期:2013年01月01日
--------------------------------------------------------------------
模板名称:FitySimple 3.0
风格作者:Contributed by ‘未来往事
模板适用:Bo-Blog V2.1.X(据网友M我说能支持2.0.3及以上版本。如果需要,你可以试试)
适用分辨率:1024*768++
适合浏览器:IE6++ / Firefox2++ / Chrome / Opera /Safari
演示地址:http://fity.cn
其他说明:请保留底部的版权,谢谢!

预览图片:
点击在新窗口中浏览此图片
+阅读全文
      公司一台服务器网站程序长时间运行后,速度变慢,重新启动网站后速度明显变快,估计是网站程序占用的内存和CPU资源没能及时释放,才需要每隔一段时间重启网站释放资源。但手工重启总不能算解决问题的方法,怎样才能实现自动管理呢?IIS6.0的应用程序池自动回收功能可以解决这一问题。

      应用程序池是将一个或多个应用程序链接到一个或多个工作进程集合的配置。因为应用程序池中的应用程序与其他应用程序被工作进程边界分隔,所以某个应用程序池中的应用程序不会受到其他应用程序池中应用程序所产生的问题的影响。

      为Web程序配置应用程序池需要以下步骤:
      1)创建应用程序池,右键单击“应用程序池”,“新建/应用程序池”,命名为KefuAppPool;
      2)为Web程序指定应用程序池,在网站虚拟目录属性“应用程序设置”里面的“应用程序池(N)”里选择KefuAppPool;
      3)应用程序池自动回收方式的设置。回收方式有如下几种:
      a.根据运行时间
       系统默认是1740分钟,也就是29个小时,这个不是很好控制,建议不用。
      b.请求数目
       这个要看具体的情况了。如果只有10个请求,可是有5个都在请求那个比较占资源的页面(可能是统计年度报表之类),这个时候就会出现进程当掉的情况,如果请求有1000个可是一个也没运行比较占资源的页面,这个时候进程肯定是很正常的,所以根据请求的数目来决定也不一定符合实际需要。

      c.计划的时间
       这个其实很好,不过具体什么时间回收好呢?通常我们都是设置在凌晨两三点钟,这个时候回收是有必要的,不过针对出现随时可能出现是高内存占用并不是很适用。

      d.内存(虚拟内存或已使用的内存)
       这个针对出现内存问题引起的进程当掉实在太合适了,不过设置多大的值比较好是一个很重要的问题,值不能太小了,否则如果访问量都很大超过这个值的时候也会自动回收,这个就很没必要了。一定要多多观察进程的实际占用情况再做决定。

       下面重点谈谈对工作进程回收应用程序池的理解。
       默认情况下,WWW服务建立“重叠回收”,即继续运行要终止的工作进程,直到启动新的工作进程后为止。 在重叠回收方案中,要回收的进程继续处理请求,同时 WWW 服务创建一个替代工作进程。在停止旧工作进程之前启动新的工作进程,然后将请求定向到新的进程。此设计可以防止服务中断,因为旧进程关闭前仍然保持与 HTTP.sys 的通信以处理请求。因为可重叠关闭或启动的关闭超时值是可以配置的,所以在工作进程仍在处理请求的同时可以终止该进程(如果它在时间限制内没有处理完请求的话)。
       注意:当 WWW 服务回收某个工作进程时,它并不断开现有的 TCP/IP 连接。HTTP 协议堆栈 (HTTP.sys) 建立并维护 TCP/IP 连接。


       IIS中的每个应用程序池由一个“工作进程”进行管理,也就是"W3wp.exe" 进程。如果有多个应用程序池中的程序运行,我们就能看到多个w3wp.exe。这点可以在任务管理器中看到,如下图所示,任务管理器中有两个w3wp.exe进程,恰好对应两个有应用程序在运行的应用程序池。
点击在新窗口中浏览此图片
       在命令提示符下运行iisapp -a,可以
+阅读全文

MySQL 5.5编译参数说明 参考指南 不指定

Rinald 本站原创 MySQL 2013/02/21 16:06
MySQL编译安装常用参数:
DCMAKE_INSTALL_PREFIX                mysql的安装路径
DMYSQL_DATADIR                          数据库存放目录
DMYSQL_USER                                mysql的所有者,运行用户
DMYSQL_TCP_PORT                        tcp协议使用的端口(默认为3306)
DMYSQL_UNIX_ADDR                       连接数据库socket路径
DDEFAULT_CHARSET                       默认字符
DDEFALUT_CHARSETS                     支持所有字符集(默认为all)
DDEFAULT_COLLATION                    默认字符集(默认为Italian,不支持中文)
DWITH_EXTRA_CHARSETS=all                   校验字符
DWITH_MYISAM_STORAGE_ENGINE=1       安装MYISAM存储引擎
DWITH_INNOBASE_STORAGE_ENGINE=1    安装 innodb 存储引擎
DWITH_MEMORY_STORAGE_ENGINE=1      安装 memory 存储引擎
DWITH_ARCHIVE_STORAGE_ENGINE=1      安装Archive引擎
DWITH_BLACKHOLE_STORAGE_ENGINE=1  安装BLACKHOLE引擎
DWITH_FEDERATED_STORAGE_ENGINE=1  安装FEDERATED引擎
DWITH_PARTITION_STORAGE_ENGINE=1   安装分区存储引擎
DWITH_READLINE=1                       使用绑定的readline
DENABLED_LOCAL_INFILE=1             允许从本地导入数据
DWITH_DEBUG                                是否开启debug模式
DWITH_SSL=yes                              支持SSL


Mysql 编译参数详解(取自官方)
命令      说明     默认值     版本支持
BUILD_CONFIG  采用官方发行版一致的编译参数
CMAKE_BUILD_TYPE  指定产品编译说明信息  RelWithDebInf
CMAKE_INSTALL_PREFIX  指定MySQL安装路径  /usr/local/mysql
CPACK_MONOLITHIC_INSTALL  是否建立单个安装包文件 OFF   5.5.7
DEFAULT_CHARSET   MYSQL 默认字符集  latin1   5.5.7
DEFAULT_COLLATION  MYSQL 默认排序字符集  latin1_swedish_ci 5.5.7
ENABLE_DEBUG_SYNC  是否启用同步调试功能  ON   5.5.7
ENABLE_DOWNLOADS  是否下载可选文件  OFF   5.5.7
ENABLE_DTRACE  是否包含 DTrace 支持     5.5.7
ENABLE_GCOV  是否包含 Gcov 支持     5.5.14
ENABLED_LOCAL_INFILE  是否启用本地 LOAD DATA INFILE OFF   5.5.7
ENABLED_PROFILING  是否启用代码查询分析  ON   5.5.7
INSTALL_BINDIR  MySQL 主执行文件目录  PREFIX/bin  5.5.7
INSTALL_DOCDIR  文档安装路径   PREFIX/docs  5.5.7
INSTALL_DOCREADMEDIR  自述文件目录   PREFIX   5.5.7
INSTALL_INCLUDEDIR  头文件目录   PREFIX/include  5.5.7
INSTALL_INFODIR  关于信息文件目录  PREFIX/docs  5.5.7
INSTALL_LAYOUT  选择预定义的安装  STANDALONE  5.5.7
INSTALL_LIBDIR  库文件目录   PREFIX/lib  5.5.7
INSTALL_MANDIR  手册页面目录   PREFIX/man  5.5.7
INSTALL_MYSQLSHAREDIR  共享数据目录   PREFIX/share  5.5.7
INSTALL_MYSQLTESTDIR  mysql-test 目录   PREFIX/mysql-test 5.5.7
INSTALL_PLUGINDIR  插件目录   PREFIX/lib/plugin 5.5.7
INSTALL_SBINDIR  服务器超级用户执行文件目录 PREFIX/bin  5.5.7
INSTALL_SCRIPTDIR  脚本目录   PREFIX/scripts  5.5.7
INSTALL_SHAREDIR  aclocal/mysql.m4 安装目录 PREFIX/share  5.5.7
INSTALL_SQLBENCHDIR  sql-bench 性能测试工具目录 PREFIX   5.5.7
INSTALL_SUPPORTFILESDIR  扩展支持文件目录  PREFIX/support-files 5.5.7
MYSQL_DATADIR  数据库存放目录      5.5.7
MYSQL_MAINTAINER_MODE  是否启用MySQL的维护环境  OFF   5.5.7
MYSQL_TCP_PORT  TCP/IP 端口号   3306   5.5.7
MYSQL_UNIX_ADDR  Unix Socket 套接字文件  /tmp/mysql.sock  5.5.7
SYSCONFDIR  选项配置文件目录     5.5.7
WITH_COMMENT  编译环境发表评论     5.5.7
WITH_DEBUG  是否包括调试支持  OFF   5.5.7
WITH_EMBEDDED_SERVER  是否要建立嵌入式服务器  OFF   5.5.7
WITH_xxx_STORAGE_ENGINE  静态编译xxx 存储引擎到服务器    5.5.7
WITH_EXTRA_CHARSETS  额外的字符集,包括  all   5.5.7
WITH_LIBWRAP  是否包括支持libwrap(TCP包装) OFF   5.5.7
WITH_READLINE  使用捆绑的readline  OFF   5.5.7
WITH_SSL  是否支持SSL  no   5.5.7
WITH_ZLIB  是否支持Zlib  system   5.5.7
WITHOUT_xxx_

参考信息:http://dev.mysql.com/doc/refman/5.5/en/index.html
MySQL慢日志分析工具mysqlsla安装及使用详细说明

最后更新时间:2013-01-29
  • 2013-01-18 首次整理成文档
  • 2013-01-29 发布到博客并整理添加了实例及工具对比表


一、MySQL慢日志分析意义
在运营 PHP+MySQL 网站的过程中,可能会遇到网站突然变慢的问题,一般情况下和 MySQL 慢有关系,可以通过开启慢查询来记录超过指定时间的SQL语句,MySQL慢查询日志对于跟踪有问题的查询非常有用,可以分析出当前程序里有很耗费资源的sql语句,找到影响效率的SQL语句,然后采取相应的措施进行代码或缓存等优化,从而提高整个系统的性能。

关于MySQL慢查询记录日志启用可以参考这篇文章:《MySQL开启慢查询日志记录 - MySQL优化》

二、常见的5种MySQL日志文件分析工具:
引用
# mysqldumpslow slow_query_9.log    (推荐)

[root@monitor opt]# mysqlsla -lt  slow slow_query_9.log  (强烈推荐)

[root@monitor opt]# php parser.php -slow slow_query_9.log (php强烈推荐)

[root@monitor opt]# ./mysql_explain_slow_log --user=root --password=123456 < slow_query_9.log  (不推荐)

[root@monitor opt]# python mysql_filter_slow_log.py --no-duplicates slow_query_9.log (推荐)

以上命令是在CentOS系统下测试

5种MySQL日志文件分析工具对比:
点击在新窗口中浏览此图片
本文主要介绍mysqlsla日志分析工具,这里不再多赘述其他。

三、mysqlsla分析工具安装
mysqlsla工具是hackmysql.com推出的一款日志分析工具(该网站还维护了 mysqlreport, mysqlidxchk 等比较实用的mysql工具)。整体来说,功能非常强大。数据报表,非常有利于分析慢查询的原因,包括执行频率,数据量,查询消耗等。
1、下载 mysqlsla
附官方网站:http://hackmysql.com/mysqlsla
[root@monitor opt]# wget http://hackmysql.com/scripts/mysqlsla-2.03.tar.gz

2、解压并进入安装目录
[root@monitor opt]# tar -zxvf mysqlsla-2.03.tar.gz
[root@monitor opt]# cd mysqlsla-2.03
[root@monitor mysqlsla-2.03]# less INSTALL    //浏览下安装说明

3、执行perl脚本检查包依赖关系
[root@monitor mysqlsla-2.03]# perl Makefile.PL
Checking if your kit is complete...
Looks good
Writing Makefile for mysqlsla

补充:安装mysqlsla需要perl-DBI和per-DBD-Mysql两模块的支持,centos下安装mysql自动安装了这2个模块。

4、安装mysqlsla
[root@monitor mysqlsla-2.03]#make && make install


常见错误:
1)类似错误:Can't locate ExtUtils/MakeMaker.pm OR Time/HiRes.pm in @INC
     可参考这篇文章:《Can't locate ExtUtils/MakeMaker.pm OR Time/HiRes.pm in @INC解决方法》
2)类似错误:Can't locate DBI.pm in @INC (@INC contains: /usr/lib/perl
     可参考这篇文章:《Can't locate DBI.pm in @INC (@INC contains: /usr/lib/perl错误解决方法》

四、mysqlsla分析工具使用说明
语法:
Slow log: mysqlsla -lt slow slow.log
General log: mysqlsla -lt general general.log
Binary log: mysqlbinlog bin.log | mysqlsla -lt binary -

这里以slow log为例:
[root@monitor mysqlsla-2.03]# mysqlsla -lt slow /opt/slow.log | more
mysqlsla -lt slow /opt/slow.log  | more                
Use of uninitialized value $line in pattern match (m//) at /usr/local/bin/mysqlsla line 675, <LOG> line 211.
Use of uninitialized value $line in pattern match (m//) at /usr/local/bin/mysqlsla line 692, <LOG> line 211.
Report for slow logs: /opt/slow.log
35 queries total, 15 unique
Sorted by 't_sum'
Grand Totals: Time 229 s, Lock 0 s, Rows sent 443.57k, Rows Examined 10.11M


______________________________________________________________________ 001 ___
Count         : 7  (20.00%)
Time          : 42.930986 s total, 6.132998 s avg, 4.046063 s to 10.72709 s max  (18.76%)
Lock Time (s) : 354 otal, 51 vg, 38 o 65 ax  (15.26%)
Rows sent     : 54 avg, 54 to 54 max  (0.09%)
Rows examined : 1.58k avg, 222 to 4.57k max  (0.11%)
Database      : dz_nanchang
Users         :
       dz_nanchang@ 192.168.1.10 : 42.86% (3) of query, 11.43% (4) of all users
       dz_nanchang@ 192.168.1.15 : 42.86% (3) of query, 8.57% (3) of all users
       dz_nanchang@ 192.168.1.20 : 14.29% (1) of query, 2.86% (1) of all users

Query abstract:
SET timestamp=N; SELECT t.* FROM pre_forum_thread t WHERE t.fid='S' AND (t.displayorder IN (N2)) ORDER BY displayorder DESC, lastpost DESC LIMIT N;

Query sample:
SET timestamp=1354213966;
SELECT t.* FROM pre_forum_thread t
                        WHERE  t.fid='139'  AND (t.displayorder IN (0, 1))
                        ORDER BY displayorder DESC, lastpost DESC
                        LIMIT 54;
……………………
……………………


统计结果选项说明:
+阅读全文

vsftpd cmds_allowed 实现权限控制 不指定

Rinald 本站原创 Linux 2013/01/14 23:43
在实际的系统运维工作中,我们经常会面临或提及服务器数据安全问题,例如FTP连接时用户对文件可以进行覆盖操作 不具有删除权限等等。本文通过vsftpd cmds_allowed 参数配置对vsftpd服务实现精细权限控制做了详细的说明。

vsftpd cmds_allowed
cmds_allowed=ABOR,CWD,LIST,MDTM,MKD,NLST,
PASS,PASV,PORT,PWD,QUIT,RETR,RMD,RNFR,
RNTO,SITE,SIZE,STOR,TYPE,USER,ACCT,
APPE,CDUP,HELP,MODE,NOOP,REIN,STAT,STOU,STRU,SYST

注意:一定不能使用换行和空格,不然就没效果..

# ABOR - abort a file transfer
# CWD - change working directory
# DELE - delete a remote file
# LIST - list remote files
# MDTM - return the modification time of a file
# MKD - make a remote directory
# NLST - name list of remote directory
# PASS - send password
# PASV - enter passive mode
# PORT - open a data port
# PWD - print working directory
# QUIT - terminate the connection
# RETR - retrieve a remote file
# RMD - remove a remote directory
# RNFR - rename from
# RNTO - rename to
# SITE - site-specific commands
# SIZE - return the size of a file
# STOR - store a file on the remote host
# TYPE - set transfer type
# USER - send username
#

# less common commands:
# ACCT* - send account information
# APPE - append to a remote file
# CDUP - CWD to the parent of the current directory
# HELP - return help on using the server
# MODE - set transfer mode
# NOOP - do nothing
# REIN* - reinitialize the connection
# STAT - return server status
# STOU - store a file uniquely
# STRU - set file transfer structure
# SYST - return system type

VSFTPD的非常有用的权限控制语句,也许在使用FTP的过程中,可能是有一些权限控制的不如意,通过下面例子大家或许能找到适合自己需求的权限分配
我们首先来看看下面的几个例子:
1、只能上传。不能下载、删除、重命名。
cmds_allowed=FEAT,REST,CWD,LIST,MDTM,MKD,NLST,PASS,PASV,PORT,PWD,QUIT,RMD,SIZE,STOR,TYPE,USER,ACCT,APPE,CDUP,HELP,MODE,NOOP,REIN,STAT,STOU,STRU,SYST
2、只能下载。不能上传、删除、重命名。write_enable=NO
3、只能上传、删除、重命名。不能下载。download_enable=NO
4、只能下载、删除、重命名。不能上传。
cmds_allowed=FEAT,REST,CWD,LIST,MDTM,MKD,NLST,PASS,PASV,PORT,PWD,QUIT,RMD,RNFR,RNTO,RETR,DELE,SIZE,TYPE,USER,ACCT,APPE,CDUP,HELP,MODE,NOOP,REIN,STAT,STOU,STRU,SYST

以上的2、3两点好控制,可是1和4就不是那么好控制了!

我给出了1和4的方法,当然,大家也可以说说自己是如何实现1和4的控制的,我们相互交流!
下面我就把具体的一些参数来和大家说说!

CWD - change working directory 更改目录
LIST - list remote files 列目录
MKD - make a remote directory 新建文件夹
NLST - name list of remote directory
PWD - print working directory 显示当前工作目录
RETR - retrieve a remote file 下载文件
STOR - store a file on the remote host 上传文件

DELE - delete a remote file 删除文件
RMD - remove a remote directory 删除目录
RNFR - rename from 重命名
RNTO - rename to 重命名

以上是常用的一些参数,大家对照学习一下!下面是列也的全部参数,供大家参考!

# ABOR - abort a file transfer 取消文件传输
# CWD - change working directory 更改目录
# DELE - delete a remote file 删除文件
# LIST - list remote files 列目录
# MDTM - return the modification time of a file 返回文件的更新时间
# MKD - make a remote directory 新建文件夹
# NLST - name list of remote directory
# PASS - send password
# PASV - enter passive mode
# PORT - open a data port 打开一个传输端口
# PWD - print working directory 显示当前工作目录
# QUIT - terminate the connection 退出
# RETR - retrieve a remote file 下载文件
# RMD - remove a remote directory
# RNFR - rename from
# RNTO - rename to
# SITE - site-specific commands
# SIZE - return the size of a file 返回文件大小
# STOR - store a file on the remote host 上传文件
# TYPE - set transfer type
# USER - send username

# less common commands:

# ACCT* - send account information
# APPE - append to a remote file
# CDUP - CWD to the parent of the current directory
# HELP - return help on using the server
# MODE - set transfer mode
# NOOP - do nothing
# REIN* - reinitialize the connection
# STAT - return server status
# STOU - store a file uniquely
# STRU - set file transfer structure
# SYST - return system type


例如:vsftp 用户只能上传不能删除
编辑vsftpd.conf配置文件添加
# vi /etc/vsftpd/vsftpd.conf
cmds_allowed=ABOR,CWD,LIST,MDTM,MKD,NLST,PASS,PASV,PORT,PWD,QUIT,RETR,RNFR,RNTO,SIZE,STOR,TYPE,USER,REST,CDUP,HELP,MODE,NOOP,REIN,STAT,STOU,STRU,SYST,FEAT(一些FTP的命令,就是除了DELE等命令)
# service vsftpd restart

第4页 / 共6页 第一页 « 上一页 1 2 3 4 5 6 下一页 » 最后页 [ 显示模式: 摘要 | 列表 ]