使用MySQL5.7做中文全文索引

MySQL5.6开始支持了全文索引,但是只限于英文等拉丁语系,并不支持中文。这是主要是因为分词的缘故。以英文为例,单词之间有空格分隔,所以不需要做分词。但是中文里词语之间没有明显的分割符,必须先做分词才能基于词语做倒排索引。中文的分词技术有基于词库的方法也有基于概率统计等算法,但MySQL做全文索引毕竟处于起步阶段,不可能单为中文支持一个复杂的分词算法,所以5.6暂时不支持中文的全文索引。

MySQL5.7终于支持中文的全文索引了,这不得不说是一个进步。使用的分词算法是“ngram”,官方文档上说此算法支持对中文,日文和韩文三种语言做分词。而且该算法的实现思想也非常简单:设定好词语的长度[......]

Read more

使用ganglia监控hbase

整个监控系统的架构如下图所示:
ganglia-hbase (2)

1)hbase将metric信息发送到一个gmond服务上,gmond缓存接收到的信息;
2)gmetad定期从gmond拉取最新的信息,并保存在本地的rrdtool数据库中;
3)gweb从rrdtool数据库中读起监控信息,并绘制成图;
4)apache对外提供对gweb的访问。

ganglia的详细介绍
ganglia-web的介绍
hbase可供监控的metric信息
appache服务的搭建

hbase的配置,在$HBASE_BASEDIR/conf/hadoop-metrics2-hbase.properties文件[......]

Read more

日语学习so easy!!

最近想自学日语,但日语入门感觉太难了,光基本发音就有近百个!还分平假名和片假名,根本不是人学的!!本想自己做个日语入门学习的app,想想过程比较长,就偷懒做了个网页版的。主要学习日语的50个清音,包括平假名和片假名,支持点读发音。
屏幕快照 2015-07-29 上午9.12.22

想试试的朋友可以点这里

下面讲讲实现过程:
网页主要包含两个资源:背景图片和日语发音。
背景图片是百度上找的,来自here
50音的音频也是百度找的,来自here,并通过imove剪辑成一个个独立的音频文件。

大概思路是:
1,窗口的整个body以50音图作为背景,图片的宽度覆盖整个窗口,高度自动变化。实现如下:

  body {[......]

Read more

InnoDB分区表与自增字段导致的死锁

最近遇到一个很奇怪的死锁问题,是由auto_increment table lock引起的,问题现象如下:
屏幕快照 2015-07-24 下午2.09.43
可以看到,两个事务之间由于竞争AUTO_INC table lock而互相等待形成了死锁。这个死锁的产生有两个关键的因素:分区表和自增字段。但是图中并不能直接看出循环等待的具体情况,需带进一步的分析。

背景知识

在分析问题之前先交代两个概念,分区表:根据分区规则将一个表中的数据分别存放在多个ibd文件中(具体看这里)。自增字段:首先是一个int类型字段,它的值可以不指定而由系统直接累加产生。两者都在生产环境中应用很多,但是两者应用到一起容易产生死锁你可曾知道?

这[......]

Read more

自增字段导致并行复制的锁冲突问题

我们公司内部的MySQL(InnoSQL)实现了并行复制功能,实现过程借鉴了MariaDB大神kristen的方案。MariaDB的并行复制基于binlog的group commit,基本原理是:一个binlog group commit提交的所有事物是不会有锁竞争冲突的。这个原理是并行复制的基石,但是今天却在并行复制中碰到了record锁冲突,着实吓了一跳。差点怀疑这个原理的正确性,要知道MySQL5.7的并行复制也是基于这个原理做的。

背景知识

分析问题前先介绍下背景知识。
并行复制的基本要求是:可以并行的事务之间必定没有锁竞争(gap锁除外),否则并行将没法进行。

另外,[......]

Read more

InnoDB的redo日志管理

概述

redo日志模块是InnoDB的重要功能模块,是实现事务ACID特性的原子性、一致性和持久性的基石,任何支持事务的关系型数据库都必须实现自己的日志系统。InnoDB也不例外,它遵守了do_undo_redo协议,在做一次操作时既要记录操作的undo日志,也要记录操作的redo日志。顾名思义,undo日志的作用是撤销操作,而redo日志的作用是重做操作。本文着重介绍InnoDB的redo日志管理,undo日志的管理将在后面的文章中阐述。

InnoDB每做一次操作都会记录一条redo日志,这里所说的操作并不是SQL语句级别的操作,而是InnoDB内部不能再分割的page操作(page[......]

Read more

InnoDB表空间管理

InnoDB的表空间(又名文件空间)指存储在磁盘上的数据文件,典型的是以.ibd*结尾的文件。表空间分成共享表空间和独立表表空间。共享表空间又称全局表空间,是InnoDB默认创建的文件,以.ibdata1,.ibdata2等为后缀。共享表空间保存一些InnoDB的系统信息,以及表数据。独立表空间是用来存储表数据,一个独立表空间文件存放一个表的数据,通常是以.ibd后缀结尾的文件。在参数innodb_file_per_table开启的情况下,一个表的数据存放在一个独立表空间文件中,反之所有表的数据都放在共享表空间文件中。

页(page)

页是表空间的最小物理单位,一个页的默认大小为1[......]

Read more单位里最牛的人,年薪500万,平常啥也不干,谈业务带上他准成

InnoDB索引检索过程

InnoDB的大部分数据都是按照B+树索引方式存放的,比如一个表的记录是按照以主键为键值的B+树组织存放的,如果一个表没有定义主键则InnoDB内部会为每条表记录添加一个隐藏主键。二级索引也是B+树结构,只不过它的记录内容是表记录的主键,而不是表记录本身。

在B+树中所有的记录都存放在叶子节点,非叶子节点存放的都是索引建值。并且所有的叶子上相邻的两个记录由指针相连,形成一条有序的记录链表。B+树既适合通过健值比较做二分快速查找,也适合通过记录链表做顺序查找。本文讲解InnoDB的索引做二分快速查找的具体过程。

B+树的结构如下所示:
b+_tree
查询记录时,通过叶子节点的记录链表做顺序查[......]

Read more

基于relaylog的failover补丁与工具

在之前的一篇文章中介绍了基于relaylog实现mysql的failover的方案拖拖拉拉,慢慢悠悠,答应过的补丁和方案终于算是完成了, github代码地址

项目中包含了两个mysql补丁文件和一个位置转换工具。之前提到,每个relaylog开始处必须强制加上一个rotate event来标示对应的binlog文件名,官方的mysql没有此功能,因此必须打上补丁。转换工具可以将master上的binlog位置转化到对应relaylog的文件位置。有了这个功能就可以实现各种场景下的failover。

以只读从节点的failover方案为例,
1

master1与master[......]

Read more

关于MySQL中的xid

MySQL在开启binlog情况下,支持事务的引擎每提交一个事务时都会在binlog中记录一个xid_event,通过工具mysqlbinlog可以看到
每个xid_event中都包含了一个xid值,该xid值实际是查询id号query_id,此值是一个递增变量,每一条查询语句进入都增加1.

InnoDB层的每个事务结构trx中都有一个xid的成员变量,该变量的是一个逻辑结构体,组成如下:
struct xid_t {
long formatID; //1表示进行了初始化
long gtrid_length; //data中的数据长度
long bqual_length; //[......]

Read more