MySQL的innodb_flush_log_at_trx_commit配置项

我发现同事在项目做压力测试的时候,误解了innodb_flush_log_at_trx_commit的含义,认为配置为0是不写日志,所以性能高。

配置项说明

文档写的很清楚:

0

如果innodb_flush_log_at_trx_commit的值为0,log buffer每秒就会被刷写日志文件到磁盘,提交事务的时候不做任何操作。

1

当设为默认值1的时候,每次提交事务的时候,都会将log buffer刷写到日志。

2

如果设为2,每次提交事务都会写日志,但并不会执行刷的操作。每秒定时会刷到日志文件。要注意的是,并不能保证100%每秒一定都会刷到磁盘,这要取决于进程的调度。

默认值1是为了保证完整的ACID。当然,你可以将这个配置项设为1以外的值来换取更高的性能,但是在系统崩溃的时候,你将会丢失1秒的数据。设为0的话,mysqld进程崩溃的时候,就会丢失最后1秒的事务。设为2,只有在操作系统崩溃或者断电的时候才会丢失最后1秒的数据。InnoDB在做恢复的时候会忽略这个值。

刷写的概念

刷写其实是两个操作,刷(flush)和写(write),区分这两个概念(两个系统调用)是很重要的。在大多数的操作系统中,把Innodb的log buffer(内存)写入日志(调用系统调用write),只是简单的把数据移到操作系统缓存中,操作系统缓存同样指的是内存。并没有实际的持久化数据。

所以,通常设为0和2的时候,在崩溃或断电的时候会丢失最后一秒的数据,因为这个时候数据只是存在于操作系统缓存。之所以说“通常”,可能会有丢失不只1秒的数据的情况,比如说执行flush操作的时候阻塞了。

总结

设为1当然是最安全的,但性能页是最差的(相对其他两个参数而言,但不是不能接受)。如果对数据一致性和完整性要求不高,完全可以设为2,如果只最求性能,例如高并发写的日志服务器,设为0来获得更高性能。

Posted in mysql | Tagged , , , , | Leave a comment

MySQL分区表的优缺点

分区表的优点

分区是很有好处的,特别是一些特定的场景:

  • 当表非常大,或者表中有大量的历史记录,而“热数据”却位于表的末尾。
  • 分区与不使用分区相比,能够更好的维护数据。比如,你可以很快的通过删除分区来移除旧数据。你还可以优化、检查、修复个别分区。
  • 分区的数据可以分布导不同的物理磁盘中,使得服务器可以高效的利用多个磁盘。
  • 你可以通过分区来避免某些场景下会出现的瓶颈,例如InnoDB的单索引互斥量或者ext3文件系统中的inode锁。
  • 如果有必要,你可以单独的备份和恢复指定的分区,这对于大数据来说是非常有用处的。

分区表的局限

分区表也有一些局限性,以下是几点需要特别主义的:

  • 每张表最大分区数为1024。
  • 在MySQL 5.1中,分区表达式必须是整型或者表达式返回整型值。在MySQL 5.5中,你可以通过具体某字段值进行分区。
  • 所有的主键或者唯一索引必须被保函在分区表达式中。
  • 不能使用任何外间约束。
Posted in mysql | Tagged , , , , , | Leave a comment

sphinx实时索引配置项说明

查看原文

11.2.49.rt_mem_limit

内存块大小限制。可选选项,默认为空。在1.10-beta版本中引入。

RT索引会把一些数据存放在内存(RAM chunk)同时也会维护一些磁盘文件索引(disk chunks)。这条指令可以控制内存块得大小。当有大量数据在内存种得时候,RT索引将会刷写到磁盘中,新创建一个磁盘块,并重置内存块得数据。

这个限制项是非常严格的,RT索引不会申请超过这个配置项的内存,也不会预先申请内存。所以如果指定RT索引的内存限制为512M,在存储3MB大小数据的时候,只会申请3MB的内存而不是512MB。

Example

rt_mem_limit = 512M

11.2.50 rt_field

定义全文索引的字段。可以出现多次,必须选项。在1.10-beta版本中引入。

使用rt_field指定声明要索引的全文字段。名称必须是唯一的。顺序是预设的,在使用INSERT语句时,如果没有指定要插入的字段时,就会使用配置中的顺序。

Example

rt_field = author
rt_field = title
rt_field = content

11.2.51. rt_attr_uint

定义无符号整数属性。可以出现多次,可选选项。在1.10-beta版本中引入。

Example

rt_attr_uint = gid

11.2.52. rt_attr_bigint

定义BIGINT属性。可以出现多次,可选选项。在1.10-beta版本中引入。

Example:

rt_attr_bigint = guid

11.2.53. rt_attr_float

定义一个单精度32位符合IEEE754格式的属性。可以出现多次,可选选项。在1.10-beta版本中引入。

Example:

rt_attr_float = gpa

11.2.54. rt_attr_multi

定义一个无符号32位整数的多值属性(MVA)。可以出现多次,可选选项。只能应用在RT索引中。

Example:

rt_attr_multi = my_tags

11.2.55. rt_attr_multi_64

定义一个无符号64位整数的多值属性(MVA)。可以出现多次,可选选项。只能应用在RT索引中。

Example:

rt_attr_multi_64 = my_wide_tags

11.2.56. rt_attr_timestamp

定义时间戳属性。可以出现多次,可选选项。在1.10-beta版本中引入。

Example:

rt_attr_timestamp = date_added

11.2.57. rt_attr_string

定一字符串属性。可以出现多次,可选选项。在1.10-beta版本中引入。

Example:

rt_attr_string = author
Posted in sphinx | Tagged , , , , , | Leave a comment

RabbitMQ中文入门教程

这系列教程是翻译官方入门教程

第一部分:
Hello World
第二部分:
工作队列(Work queues)
第三部分:
发布/订阅(Publish/Subscribe)
第四部分:
路由(Routing)
声明:
此系列教程翻译纯属个人学习笔记,本人英文水平有限,难免会有翻译错误,本文仅供参考。欢迎指正:)

Posted in RabbitMQ | Tagged , , , , , , , , , , , , , | 2 Comments

Cakephp调试shell-输出SQL

CakePHP提供了一个框架用来创建shell脚本,可是默认情况下不能像正常的B/S开发那样输出调试SQL语句。如果需要在cakephp shell 下输出SQL,可以在shell代码中加入以下方法即可。

function initialize() {
    Configure::write('debug', 2);
    $this->_loadDbConfig();
    $this->_loadModels();
}
Posted in cakephp, PhP | Tagged , , , , , | Leave a comment

cakephp中action名为validate时提示missing action错误

今天在cakephp项目中写了一个名为validate的action,运行后却提示missing action错误。仔细看了源码(cake/libs/controller/controller.php)之后找到了原因。见以下代码:

// cake/libs/controller/controller.php
function __construct() {
    // 省略n行代码......
    $childMethods = get_class_methods($this);
    $parentMethods = get_class_methods('Controller');
    // 省略n行代码......
 
    // 重点就在这里,原来cake把子类controller中与超类controller重复命名的方法去出了
    $this->methods = array_diff($childMethods, $parentMethods);
}

在/cake/dispatcher.php中

// cake/dispatcher.php
function _invoke(&$controller, $params) {
    // 省略n行代码......
    $methods = array_flip($controller->methods);
 
    if (!isset($methods[strtolower($params['action'])])) {
        // 显示missing action
    }
}

总结:子类controller中action不能与Controller类的方法名重名。否则会报missing action的错误。

Posted in cakephp, PhP | Tagged , , , , , , | Leave a comment

Mac下安装HandlerSocket

参考官方安装指南:https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL/blob/master/docs-en/installation.en.txt

下载与已经安装的mysql同版本号的源码和handlersocket的源码。

我本机的mysql源码目录:
/Users/luadam/Downloads/database/mysql/mysql-5.5.13
handlersocket源码目录:
/Users/luadam/Downloads/database/handlersocket/ahiguti-HandlerSocket-Plugin-for-MySQL-d2979f3

进入handlersocket的源码目录下运行以下命令:

./autogen.sh
./configure \
--with-mysql-source=/Users/luadam/Downloads/database/mysql/mysql-5.5.13 \
--with-mysql-bindir=/usr/local/mysql/bin \
--with-mysql-plugindir=/usr/local/mysql/lib/plugin

–with-mysql-source 参数是指向mysql源码目录
–with-mysql-bindir 参数是指向mysql二进制文件的目录(我使用dmg文件安装的msql,所以是/usr/local/mysql/bin目录)
–with-mysql-plugindir 参数指向mysql插件的目录(如果不清楚目录在哪里,可以使用mysqladmin variables | grep plugin 命令查看)

make
sudo make install

将以下配置添加到my.cnf中
 [mysqld]
  loose_handlersocket_port = 9998
    # the port number to bind to (for read requests)
  loose_handlersocket_port_wr = 9999
    # the port number to bind to (for write requests)
  loose_handlersocket_threads = 16
    # the number of worker threads (for read requests)
  loose_handlersocket_threads_wr = 1
    # the number of worker threads (for write requests)
  open_files_limit = 65535
    # to allow handlersocket accept many concurrent
    # connections, make open_files_limit as large as
    # possible.

登录mysql,运行下面的命令:
install plugin handlersocket soname ‘handlersocket.so’;

运行成功后,运行“show processlist”命令可以看到handersocket的工作线程。

Posted in linux, mysql | Tagged , , , , | Leave a comment

在MAC中安装httpsqs

在MAC中安装httpsqs并不像在ubuntu中那样顺利,安装libevent和tokyocabinet都没有问题,在编译httpsqs的时候却遇到了几个问题。

问题1
编译httpsqs(运行make命令的时候),提示错误信息如下:
ld: library not found for -lcrt0.o
collect2: ld returned 1 exit status
解决方法:编辑httpsqs中的Makefile文件,删除 –static参数。
参考资料:http://stackoverflow.com/questions/3801011/ld-library-not-found-for-lcrt0-o-on-osx-10-6-with-gcc-clang-static-flag

问题2
解决完 –static参数的问题之后,继续运行make命令,提示错误信息如下:
ld: library not found for -lrt
collect2: ld returned 1 exit status
解决方法:编译httpsqs中的Makefile文件,删除 -lrt参数。
参考资料:http://stackoverflow.com/questions/1505402/library-not-found-for-lrt-with-qtcreator-mac-os

这样就成功编译完httpsqs并成功运行,暂时发现有什么问题:)

Posted in linux | Tagged , , , , , , , , | Leave a comment

ubuntu开启远程桌面

今天要在mac上远程连接Ubuntu桌面,因为使用的协议是rdp,所以我们要装rdp。打开终端:

sudo apt-get install xrdp

装上xrdp之后,再:

sudo apt-get install vnc4server tightvncserver
Posted in linux | Leave a comment

数据库的还原

备份这个操作远远比还原简单得多,没有备份就不可能还原,备份的目的就是为了还原。没有人是为了备份而备份,所以,对还原进行规划是相当重要的。在《高性能MySQL第二版》的第11章中的11.1.2小节有提到以下几点大致如下:

  • 在你分析你的还原需求之前,不应该搭建你的备份系统
  • 你应该特意去演练你的还原过程,直到还原过程与你的备份过程一样流畅为止
  • 备份一般不是在压力很大的时候进行的,可是进行还原的时候可能就是十万火急,所以说还原是非常重要的一点都不夸张
  • 不要过分加密你的数据,导致需要还原的时候没有人可以解密你的数据
  • 你应该要为了还原而培养几个人,这样就不会找一个不合适的人去还原你的数据

该节还建议置顶还原需求的时候,把以下几个因素考虑进去,并加入系统化文档里,原文如下:

  • 在产生严重后果前,你会丢失多少数据?你需要及时点(Point-In-Time)还原吗?或者说把最近一次正式备份以来的所有数据都丢失了,你能接受吗?有法律上的麻烦吗?
  • 还原需要多块?哪一种故障停工可以被你接受?哪种影响(比如局部不可用)对于你的应用和用户能够被接受吗?当上述场景发生时,你要构建怎么样的功能来维持系统的原有机能?
  • 你确实需要还原吗?通常的需求是还原整个服务器、一个单独的数据、一张表、或者是一些指定的事物或语句。
Posted in mysql | Tagged , , , , | Leave a comment