未来往事

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

再见2012。你好,2013 不指定

Rinald 本站原创 随笔/分享 2013/01/03 23:15
祝看到这篇博文的朋友们2013年身体健康,事随心愿,工作顺利,生活愉快!

——写在前面的         

  每年这个季节、这段时间,我想大家和我一样我们每个人几乎都会对上一年度的工作 生活 学习做一个简短的总结和对下一年做个简单的展望及计划。

  在写这篇总结之前,简单的翻了下2012年的博文,2月工作生活学习繁忙的状态开始,4月岗位的变动更换了工作环境及岗位,为了做个纪念,5月底未来往事博客域名正式由运行一年之久的esho域名更换为fity.cn,fity也没大家猜测那样多内涵多文艺 smoke  这个域名源于对Felicity的简写而出,6月鉴于工作单一、也学不到自己想要或需要的,告别了第一份工作随之踏入第二份工作,依然和虚拟化、云计算、存储有关系吧;9月初发现身体状态不是很好,心情低落,工作也不再有什么动力和激情而言,畅想下当前的生活、工作,毕竟生活工作学习除积累以外,或许都是一次次的经历,这里或许也是让我经历了认知,温故了职场,或许这里也不适合我,反之我也并不适合这里。不过还是值得说说我最最受不了的就是部门就那么四五个人,背着A把A从上到下说一通,背着B把B从上到下说一遍,背着C把C从上到下说一遍,博主不是那样喜欢敷衍的人、也不想再听重播,于是这个收获的季节——清晰的记得9.12听完一首音乐毅然点下Stop按钮不再循环的决定。10月中旬离职。这家公司或许唯一的收获的便是自己能认真对待生活的细节及从小事着手。
  离职后第一想法就是什么也不管先休息一段时间,哈哈,休息一段时间后无论是精神还是身体都感觉轻松了好多。进入11月匆匆茫茫投简历,11.5开始了新的工作。

2012,如果给个总结,或许是不安、茫然、彷徨、奔波、孤独、成熟的一年。。。正因为不安,所以青春;因为茫然,所以青春;因为彷徨,所以青春;因为孤独,所以青春。

2012,心中有甜有苦,脸上有喜有忧,细细感受,身边的人有聚有散,在乎的人有近有远,做的事有成有败,想的事有实有空,所有的日子都不曾虚度,所有的得失都已过去,留下的仅存记忆及经历。

2012,对我来说很重要,对很多事物有了新的认识,学着用立体的思维去分析,去看待一些事情。

2012,已然成为历史的366天。这一年里,有收获的喜悦,也曾经历挫折。

2012,这一年,我们一起调戏了杜浦、麻烦了元芳、共同鉴证了玛雅人的末日预言,跨过了世界末日,来到历史的新纪元!

2012,感谢那些陪我一路走来的朋友,感谢!

再见,2012。你好,2013,明年的今天我又会是怎样呢?是不是有很大进步和成功呢?俱往矣,还看我的2013!grin

2013,允许自己慢慢来,重新出发。认真的过好每一天,认真的对待生命。坚持读书看书、锻炼身体。或耐心把一些基本的事做好,开始慢慢来;学习接纳生活中的痛苦,并记录下每一份微幸福。

2013,我也想有以下的几件事想做,在这里做个记录,等明年的今日我来看看我完成了多少,哈哈:
+阅读全文
Web网站性能压力 测试工具WebBench使用详解

Webbench是知名的网站压力方面的测试工具,它是由Lionbridge公司开发。
官方主页:http://home.tiscali.cz/~cz210552/webbench.html

在运维工作中,网站压力及性能测试是一项很重要的工作。比如在一个网站上线之前,能承受多大访问量、在大访问量情况下性能怎样,这些数据指标好坏将会直接影响用户体验。但是,在压力及性能测试中存在一个共性,那就是压力及性能测试的结果与实际负载结果不会完全相同,就算压力及性能测试工作做的再好,也不能保证100%和线上性能指标相同。面对这些问题,我们只能尽量去想方设法去模拟。所以,压力及性能测试非常有必要,有了这些数据,我们就能对自己做维护的平台做到心中有数。

Web Bench最多可以模拟3万个并发连接去测试网站的负载能力。Web Bench能测试处在相同硬件上,不同服务的性能以及不同硬件上同一个服务的运行状况。Web Bech的标准测试可以向我们展示服务器的两项内容:每秒钟相应请求数和每秒钟传输数据量。Web Bench不但能具有静态页面的测试能力,还能对动态页面(ASP,PHP,JAVA,CGI)进行测试的能力。还有就是他支持对含有SSL的安全网站例如电子商务网站进行静态或动态的性能测试。

适用于linux操作系统
1、WebBench安装:
wget http://home.tiscali.cz/~cz210552/distfiles/webbench-1.5.tar.gz
tar zxvf webbench-1.5.tar.gz
cd webbench-1.5
make
make install
补充:安装过程中如提示缺少组件请安装,缺少目录,请手动创建。
常见错误:
cc -Wall -ggdb -W -O   -c -o webbench.o webbench.c
webbench.c: In function ‘alarm_handler’:
webbench.c:77: warning: unused parameter ’signal’
cc -Wall -ggdb -W -O   -o webbench webbench.o
ctags *.c
/bin/sh: ctags: command not found
make: [tags] Error 127 (ignored)
centos有相应的组件,搜索一下ctags安装即可 # yum install ctags

2、WebBench使用:
webbench -c 1000 -t 60 http://a.fity.cn/info.php
webbench -c 并发数 -t 运行测试时间(秒)  URL


3、测试结果示例:
# webbench -c 600 -t 30 http://a.fity.cn/index.php #每秒并发数为600,持续执行60秒
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.

Benchmarking: GET http://a.fity.cn/index.php
600 clients, running 30 sec.

Speed=12082 pages/min, 152635 bytes/sec.
Requests: 6041 susceed, 0 failed.

-------------------------------------------------------------------------------------

# webbench -c 1000 -t 60 http://a.fity.cn/index.php #每秒并发数为1000,持续执行60秒
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.

Benchmarking: GET http://a.fity.cn/index.php
1000 clients, running 60 sec.

Speed=5553 pages/min, 70152 bytes/sec.
Requests: 5553 susceed, 0 failed.
注释:
Speed:(5553 pages/min)每分钟处理/响应的请求数,(70152 bytes/sec)每秒处理/传输的数据量
Requests:此次压力测试成功的请求数和失败数。


当并发2000时,已经显示有26个连接failed了,说明超负荷了。
# webbench -c 2000 -t 60 http://a.fity.cn/index.php
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.

Benchmarking: GET http://a.fity.cn/index.php
2000 clients, running 60 sec.

Speed=10479 pages/min, 132043 bytes/sec.
Requests: 10453 susceed, 26 failed.

补充:
1、压力及性能测试工作应该放到产品上线之前,而不是上线以后;
2、测试时并发应当由小逐渐加大,并使用TOP检查网站负载,或自行打开页面查看速度。比如并发100时观察一下网站负载是多少、打开页面是否流畅,并发200时又是多少、网站打开缓慢时并发是多少、网站打不开时并发又是多少;
3、更详细的进行某个页面测试,如电商网站可以着重测试购物车、推广页面等,因为这些页面占整个网站访问量比重较大。

备注:webbench 做压力及性能测试时,该软件自身也会消耗CPU和内存资源,为了测试准确,建议将 webbench 安装在其他的服务器上,已达到测试数据更加精确。
云计算的时代正在来临,运维的工作也将在今后几年中发生翻天覆地的变化。
如果你是一个能给自己做主的人,你必须看清形势顺势而为,在变革的时代埋头苦干仍然保证不了你的正常生活;如果你是一个弓骑兵,无论你怎么勤学苦练都打不过坦克手的;铁达尼号上的乘客无论多有钱,总是免不了泡进海水里的。

首先,我作为一个运维为何唱衰运维这个职业。
我们运维靠什么能力在公司里自立哪?
A.关心硬件和施工;
B.关注网络问题;
C.擅长系统和服务的调试维护;
D.相对与架构师/DBA的价格优势;
E.快速可靠的响应.

大家看看云计算能给企业带来的好处:
A.硬件完全免维护;
B.网络接近免维护;
C.系统、服务接近免维护;
D.无论是硬件还是人力成本都很廉价;
E.可靠性高于个人。

我们会发现,云计算的目标就是要做的比运维人员更好,好到“不用关心”的地步。从技术上来说,各大云计算运营商对通用的Web、RDBMS、存储 服务都是可以做到很好的。运维人员中一多半都是网站运维,这些运维受到云计算行业的碾压性冲击,必然会波及整个运维行业,以及因此衍生的培训、管理、硬件销售、IDC工作。

我原先一直不愿意承认这一点,我也认为运维工作很重要,但前端时间我看了一个故事,想和大家分享一下。

在191x年的时候,每个工厂都有一个副厂长负责管理电力,那个时候新建工厂要考虑是自己建水电站还是火电站,甚至连拉煤球的车都要自己准备;但后来各个工厂用的电力标准趋于一致,就没有企业自主发电而是从电网买电了,这个电力副总裁的职位就成为历史了。

我记得05年以前做运维,我们都要自己找很多种驱动、学习不同的主板配置方式、研究自有机房的空调系统,但如今运维的职位完全不用关心这些事情了,反倒是对负载均衡、高可用、大数据等问题越研究越深了。

云计算的目标是让IT服务像电力一样随时可用,这是一个积极正面的趋势,没有人能也没有人应该挡住他,运维职位可用消失,但你不应该因此而失业。
+阅读全文
本文为分享的安居客网站系统架构、web系统架构简报,简报加载速度依据你网速的快慢而受影响。
+阅读全文
Discuz UCenter通信原理与用户免激活同步登录
本文阐述了Discuz UCenter用户中心数据自动同步其他通信应用 免去用户激活 批量激活站点整合用户相关的原理与实现方法。

最后更新:2013/04/08
新版本可以论坛程序后台——ucenter中设置直接激活即可(但不能数据同步)。


本文档基于DiscuzX2.0环境所写。原则上兼容X1.5/X2.5版本的Discuz!X,毕竟这里本人未对其他版本进行测试,如用于X2.0之外的其他版本,请谨慎操作,以免造成不可能挽回的结果。

Ucenter通信原理:
1、用户登录bbs,通过logging.php文件中,使用函数uc_user_login验证,如果验证成功,将调用函数uc_user_synlogin(位于uc_client下的client.php文件中), 在这个函数中调用 uc_api_post('user', 'synlogin', array('uid'=>$uid));之后向UC_API.'/index.php'传递了数据;这里的UC_API就是在 config.inc.php中的定义的uc_server之URL地址

2、uc_server的index.php接受参数数据,获得model为user,action为synlogin,就调用control目录下的 user.php类中的onsynlogin方法,通过foreach循环,以javascript的方式通知uc应用列表中的应用同步登录;即通过 get方式传递给应用目录中api下的uc.php一些数据;

3、uc.php接收通知并处理get过来的数据,并在函数synlogin(位于uc.php中)通过函数_authcode加密数据(默认以UC_KEY作为密钥),用函数_setcookie设置cookie;

4、各个应用在适当的文件中用对应的密钥解码上面设置的cookie,得到用户id等数据;通过这个值来判断用户是否经过其它应用登录过;
点击在新窗口中浏览此图片

以discuz举例:
一、用户登录检查与用户登录验证logging.php
在bbs的logging.php中如下代码段

检查用户id变量$discuz_uid是否为空来判断,用户是否登录(包括从别的应用登录。)
如果用户从bbs登录,则在登录验证成功后通过如下代码:
$ucsynlogin = $allowsynlogin ? uc_user_synlogin($discuz_uid) : '';

通知其它应用----“用户已从bbs登录,请通知其它应用设置cookie”
(uc_server通过javascript调用方式向其它应用的api/uc.php传递数据)
可以在uc应用目录下新建一个名为test.php的文件,来模拟登录成功,请求uc_server通知其它应用。文件内容为:

PS:这段测试代码还可以测试同步登录不好使的情况,具体使用方法,你可以思考一下(本文后面也有介绍),有问题可以在此文结尾发表评论与我讨论。
运行后,查看源代码即可看到javascript;
这里要注意了:这些javascript的通知中是不包含用户登录的应用的。也就是说只"通知"用户未登录的应用,因为用户通过uc_server登录成功的当前应用,当然不需要uc_server再通知了。具体代码请参看:webroot\uc_server\control\user.php中的onsynlogin函数的这句:
if($app['synlogin'] && $app['appid'] != $this->app['appid'])
代码解释:
$app['synlogin']是uc应用是否允许同步登录
而且应用id不等于用户当前登录的应用id
$app数组就是uc_server\data\cache\apps.php中的数组$_CACHE['apps'];
$this->app就是用户登录的应用

二、接受其它应用的同步登录通知:
在discuz的api目录下的uc.php中的函数synlogin,在这里接受uc_server发送过来的“同步登录通知”,并设置discuz的cookie,在这个函数中你可以查看到cookie的加密密钥的“算法”;
如果你想看看uc_server发送过的的“通知”是什么数据,你可以这么做:
1、修改要接受通知的应用目录下的api\uc.php,在$action = $get['action'];代码下面添加如下代码:
echo "<pre>";var_dump($get);echo "</pre>";die("<hr>api\uc.php");

2、将上面建立的test.php文件放置在其它允许同步登录的应用目录下,并在浏览器中运行,然后点击页面中对应第一步的应用链接,即可看到uc_server“通知”给改应用的数据;

三、检查用户是否已登录(无论是那个应用下登录):
discuz的include目录中common.inc.php中有这样的代码:

这段代码就是解码在uc.php中用密钥($discuz_auth_key)加密的cookie值,以获得用户id($discuz_uid)
这里的解密函数位于bbs\include\global.func.php中,虽然未给函数传递cookie密钥,但函数中通过全局变量$GLOBALS['discuz_auth_key'])获得密钥。

Ucenter App通信详细过程如图:
+阅读全文
本文主要介绍:
strlen() mb_strlen() mb_substr() mb_strcut()的使用和区别以及在不使用mb_strlen函数的情况下,如何自定义函数替换mb_strlen函数,实现中英文混合组成的字符串的长度?如何编译安装php程序时支持mbstring函数库?

以上函数默认需要PHP函数库支持:mbstring

1、使用及区别:
PHP内置的字符串长度函数strlen无法正确处理中文字符串,它得到的只是字符串所占的字节数。对于GB2312的中文编码,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是1~3倍的差异了。

采用mb_strlen函数可以较好地解决这个问题。mb_strlen的用法和strlen类似,只不过它有第二个可选参数用于指定字符编码。例如得到UTF-8的字符串$str长度,可以用mb_strlen($str,’UTF-8′)。如果省略第二个参数,则会使用PHP的内部编码。内部编码可以通过mb_internal_encoding()函数得到,设置有两种方式:
1. 在php.ini中设置mbstring.internal_encoding = UTF-8
2. 调用mb_internal_encoding(“GBK”)

除了mb_strlen,还有很多切割函数,其中mb_substr是按字来切分字符,而mb_strcut是按字节来切分字符,但是都不会产生半个字符的现象。而且从函数切割对长度的作用也不同,mb_strcut的切割条件是小于strlen, mb_substr是等于strlen,看下面的例子

因为在utf8中一个中文字符是三个字节,所以“这是”这个字符串的长度是6,而mb_substr或mb_strlen处理是六个字符。
strlen或mb_strcut是按英文来的,英文字母在任何编码中都是一个字节。所以strlen在含有其他语言文字的时候,计算的其实可以理解为字节数目。而mb_strlen或mb_substr计算的是字符数目。

2、如何使用其他自定义函数取缔或替换mb_strlen..
今天在测试修正程序博客文章页面描述信息截取字符时遇到下图所示问题:
点击在新窗口中浏览此图片

firstheader.php文件中line 21 codes:
if(mb_strlen($newDescription,'UTF-8')>=mb_strlen($config['blogdesc'],'UTF-8')){

错误已经提示的很清楚是缺少函数库对函数mb_strlen的支持(未定义),但是由于所在的服务器虚拟主机空间PHP不支持mbstring函数库,所以只能靠自己想办法解决啦,这里莪是通过自定义了一个函数然后替换了之前的mb_strlen函数,如果你有更好的解决方法可以评论哈,code如下:

3、独立主机php如何支持mbstring函数库
需要注意的是,mb_strlen并不是PHP核心函数,使用前需要确保在php编译模块时加入mbstring的支持:
Windows或Linux系统环境下配置php支持mbstring函数库你可以参考这篇文章:http://fity.cn/post/179/
+阅读全文
现在网站发展的趋势对网络负载均衡的使用是随着网站规模的提升根据不同的阶段来使用不同的技术:
一种是通过硬件来进行进行,常见的硬件有比较昂贵的NetScaler、F5、Radware和Array等商用的负载均衡器,它的优点就是有专业的维护团队来对这些服务进行维护、缺点就是花销太大,所以对于规模较小的网络服务来说暂时还没有需要使用;另外一种就是类似于LVS/HAProxy、Nginx的基于Linux的开源免费的负载均衡软件策略,这些都是通过软件级别来实现,所以费用非常低廉,所以我个也比较推荐大家采用第二种方案来实施自己网站的负载均衡需求。

近期朋友刘鑫(紫雨荷雪)的项目成功上线了,PV达到了亿级/日的访问量,最前端用的是HAProxy+Keepalived双机作的负载均衡器/反向代理,整个网站非常稳定;这让我更坚定了以前跟老男孩前辈聊的关于网站架构比较合理设计的架构方案:即Nginx/HAProxy+Keepalived作Web最前端的负载均衡器,后端的MySQL数据库架构采用一主多从,读写分离的方式,采用LVS+Keepalived的方式。

在这里我也有一点要跟大家申明下:很多朋友担心软件级别的负载均衡在高并发流量冲击下的稳定情况,事实是我们通过成功上线的许多网站发现,它们的稳定性也是非常好的,宕机的可能性微乎其微,所以我现在做的项目,基本上没考虑服务级别的高可用了。相信大家对这些软件级别的负载均衡软件都已经有了很深的的认识,下面我就它们的特点和适用场合分别说明下。

LVS:使用集群技术和Linux操作系统实现一个高性能、高可用的服务器,它具有很好的可伸缩性(Scalability)、可靠性(Reliability)和可管理性(Manageability),感谢章文嵩博士为我们提供如此强大实用的开源软件。
LVS的特点是:
1、抗负载能力强、是工作在网络4层之上仅作分发之用,没有流量的产生,这个特点也决定了它在负载均衡软件里的性能最强的;
2、配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率;
3、工作稳定,自身有完整的双机热备方案,如LVS+Keepalived和LVS+Heartbeat,不过我们在项目实施中用得最多的还是LVS/DR+Keepalived;
4、无流量,保证了均衡器IO的性能不会收到大流量的影响;
5、应用范围比较广,可以对所有应用做负载均衡;
6、软件本身不支持正则处理,不能做动静分离,这个就比较遗憾了;其实现在许多网站在这方面都有较强的需求,这个是Nginx/HAProxy+Keepalived的优势所在。
7、如果是网站应用比较庞大的话,实施LVS/DR+Keepalived起来就比较复杂了,特别后面有Windows Server应用的机器的话,如果实施及配置还有维护过程就比较复杂了,相对而言,Nginx/HAProxy+Keepalived就简单多了。

Nginx的特点是:
1、工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构,它的正则规则比HAProxy更为强大和灵活,这也是许多朋友喜欢它的原因之一;
2、Nginx对网络的依赖非常小,理论上能ping通就就能进行负载功能,这个也是它的优势所在;
3、Nginx安装和配置比较简单,测试起来比较方便;
4、也可以承担高的负载压力且稳定,一般能支撑超过几万次的并发量;
5、Nginx可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点,不过其中缺点就是不支持url来检测;
6、Nginx仅能支持http和Email,这样就在适用范围上面小很多,这个它的弱势;
7、Nginx不仅仅是一款优秀的负载均衡器/反向代理软件,它同时也是功能强大的Web应用服务器。LNMP现在也是非常流行的web架构,大有和以前最流行的LAMP架构分庭抗争之势,在高流量的环境中也有很好的效果。
8、Nginx现在作为Web反向加速缓存越来越成熟了,很多朋友都已在生产环境下投入生产了,而且反映效果不错,速度比传统的Squid服务器更快,有兴趣的朋友可以考虑用其作为反向代理加速器。

HAProxy的特点是:
1、HAProxy是支持虚拟主机的,以前有朋友说这个不支持虚拟主机,我这里特此更正一下。
2、能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作
3、支持url检测后端的服务器出问题的检测会有很好的帮助。
4、它跟LVS一样,本身仅仅就只是一款负载均衡软件;单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的。
5、HAProxy可以对Mysql读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,不过在后端的MySQL slaves数量超过10台时性能不如LVS,所以我向大家推荐LVS+Keepalived。
6、HAProxy的算法现在也越来越多了,具体有如下8种:
①roundrobin,表示简单的轮询,这个不多说,这个是负载均衡基本都具备的;
②static-rr,表示根据权重,建议关注;
③leastconn,表示最少连接者先处理,建议关注;
④source,表示根据请求源IP,这个跟Nginx的IP_hash机制类似,我们用其作为解决session问题的一种方法,建议关注;
⑤ri,表示根据请求的URI;
⑥rl_param,表示根据请求的URl参数'balance url_param' requires an URL parameter name;
⑦hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求;
⑧rdp-cookie(name),表示根据据cookie(name)来锁定并哈希每一次TCP请求。
第5页 / 共7页 第一页 « 上一页 1 2 3 4 5 6 7 下一页 » 最后页 [ 显示模式: 摘要 | 列表 ]