存档

文章标签 ‘MySQL’

lbmysqlping (LegendBase MySQL Ping)

2012年6月1日 谭俊青 3 条评论

lbmysqlping (LegendBase MySQL Ping) is a tool that does MySQL service availability check for MySQL HA solution.

Of course, it could be used to monitor MySQL servers availability. If some server down, LBMySQLping will run “Down” command that could send email or message to your mobile.

有不少朋友在做MySQL数据库高可用(Heartbeat,keepalived)和主从负载均衡(LVS,F5,A10等)的时候都面对MySQL服务可用性检测的问题.

检测可用性面对的几个问题不太容易解决:

  • 端口能连上,但是SQL语句很可能无法执行,其实这时候MySQL服务是不可用的
  • 连上了,SQL语句执行堵塞,长时间不能返回,因为MySQL是堵塞式的
  • MySQL Slave延时太大,应该从路由表里面清除

而且我了解到的有不少人都是用检测端口的方法,这是有风险的.

今天贡献的lbmysqlping通过可配置的方式,能够灵活的对MySQL服务进行检测,如果出现异常\超时或者Slave延时超过配置大小,可以执行指定的失效命令,当服务恢复可用的时候又可以执行恢复命令.

另外lbmysqlping还可以做简单的报警系统,配置好默认信息后,其他realserver 只需要配置ip地址即可,如果端口不一样,改下端口。然后在down命令和up命令里面填上相关的脚本或者报警程序,这样一个简单的MySQL服务可用性报警系统就出来了,简单、高效。

配置文件格式如下:

【阅读全文·MySQL实验室】

MySQL driver(驱动) liblbmysql for Go1

2012年5月24日 谭俊青 1 条评论

Go语言1.0出来之后,原来可用的MySQL驱动在新版本上基本不可用了,于是这几天自己写了个简单的MySQL的驱动,暂不支持prepare,没有implement sql/driver. 或许有能用的上的朋友,所以分享出来. 先介绍用法,后面提供下载链接.
先直接上例子

package main

import (
        "log"
        "liblbmysql"
)

func main() {
        settings := make(map[string]interface{})

        settings["host"] = "localhost"
        settings["port"] = 3306
        settings["uname"] = "ivan"
        settings["pass"] = "******"
        settings["dbname"] = "test"
        settings["charset"] = "utf8"
       
        conn, err := liblbmysql.Connect(settings)
        if err != nil {
                log.Fatal("Connect to MySQL error: %v", err)
        }

        var qr *liblbmysql.QueryResult

        qr, err = conn.ExecuteFetch("select * from ivan")
        if err != nil {
                log.Printf("query error: %v", err)
        } else {
                for {
                        m := qr.FetchMap()
                        if m != nil {
                                log.Printf("row map: %v\n", m)
                        } else {
                                break
                        }
                }
        }
        qr.Free()
        conn.Close()
}
 

【阅读全文·MySQL实验室】

分类: Go, MySQL 标签: ,

DMB(For MySQL)数据库监控备份工具

2010年8月22日 谭俊青 没有评论

因为初学Python, 花费了几个礼拜的周末休息时间, DMB的雏形已经出来, 并提供下载使用(适合新手和偷懒的人高手跳过),有Bug和建议请及时发聩给我。

因为是初学,在编写DMB的时候,当中遇到一些问题,花费了不少时间来解决,这里总结下,也许能给后进者节约些宝贵的时间。

  • 涉及GUI多线程编程的时候,使用wx.CallAfter(), 如:wx.CallAfter(self.AfterRun);
  • 调用 subprocess.popen, 当子进程已经推出之后 stdin.close()调用会报错, 这时候可以用 try: process.stdin.close()  exception 来屏蔽错误;
  • gzip.GzipFile 对数据流压缩很方便,可以避免临时文件的产生,解压读取方便,效率也不错;
  • 获取硬件指纹 wmi 是个好东东;
  • 加密解密可以用 pyDES, M2Crypto;
  • 用py2exe生成.exe可执行文件的时候的icon可以用过 img2py 生成,然后在程序中设置,可以避免调用win32api,避免在 vista/win7下出错;
  • wx.wizard.Wizard的 finish按钮也可以通过 wizard.FindWindowById(wx.ID_FORWARD).Disable() 来屏蔽,这个浪费了我很长时间。

这次使用wxpython,算是对桌面程序的尝试,不过趋势还是采用B/S,也方便维护和管理人员远程监控和操作管理。如果有必要,会将DMB改造成B/S构架,准备用cherrypy提供web服务,跟系统进行交互。

【阅读全文·MySQL实验室】

分类: MySQL, news / tools, python 标签: , , ,

Web前端优化

2010年7月2日 谭俊青 没有评论

各浏览器并发下载数列表:

Browser HTTP/1.1 HTTP/1.0
IE 6,7 2 4
IE 8 6 6
Firefox 2 2 8
Firefox 3 6 6
Safari 3,4 4 4
Chrome 1,2 6 ?
Chrome 3 4 4
Opera 9.63,10.00alpha 4 4

随着宽带的普及,为充分利用用户的带宽,提升用户体验,可设置多个子域名。

Javascript和css尽可能从页面中分离出去,作为独立的文件。

为了减小header头大小,静态文件尽量用其他不带cookie的域名提供下载(当然还要兼顾到DNS解析时间)。
如:www.mysqlab.net用到

http://s0.mysqlab.net.cdn007.com/css/base.css

http://s1.mysqlab.net.cdn007.com/js/global.js

MySQL连接、memcache连接尽量在echo之前断开连接。

使用DBSession保持用户在线状态,方便负载均衡、统计、定位用户在线情况及跨域访问。

当前绝大部分memcached可以通过MySQLD来存储实现,具有更多的特性,如:安全、高可用等。
(MySQL基于主键查询可实现5000+qps每核心)

浏览器并发下载数参考:

http://www.stevesouders.com/blog/2008/03/20/roundup-on-parallel-connections/

分类: MySQL, Web前端, php 标签: , , ,

分库分表(sharding)后主键全局唯一性的解决方案

2009年3月27日 谭俊青 21 条评论

随着数据量的增大,在数据库的扩展上通常遇到切分时保证键值的唯一性问题,遇到这种情况,通常有如下几种相对简单的解决方案:

1  UUID 这种方案的优点是实现和管理简单,缺点是占用空间大,查询效率低下。

2  Sequence Number 优点是实现和管理简单,确定是有性能瓶颈和单点问题。

3  不同的集群采用的起始点或者增长间隔不同 这种方案实现简单,但是后期管理麻烦。

除了上述解决方案之外其实还有很多简单可行的办法,但是通用性不太好,在各种解决方案的接触上,本人总结出一个实现和性能上都很好的解决方案,那就是采用时间戳加毫秒数再加随机数来解决,存储字段采用bigint。
下面给出php代码实现:
function ivan_fetch_unique_bigint_id()
{
    $start_timestamp = 1238119411;
    $ivan_len = 3;
    $time = explode( ‘ ‘, microtime());
    $id = ($time[1]$start_timestamp) . sprintf(‘%06u’, substr($time[0], 2, 6));
    if ($ivan_len > 0) {
        $id .= substr(sprintf(‘%010u’, mt_rand()), 0, $ivan_len);
    }
    return $id;
}
取模测试均分性很好。
转载请注明出处,谢谢。
分类: MySQL, MySQL Innodb, php 标签: , ,