首页 > MySQL > A new MySQL proxy written in Go — LegendBase Proxy for MySQL

A new MySQL proxy written in Go — LegendBase Proxy for MySQL

今天很高兴得知Go1 release, 其实我一只在等它正式发布,因为我用go语言自己实现了一个MySQL代理,命名为LegendBase Proxy for MySQL(LPM),等Go1 release之后,我也可以尽快release出来了.

代码摘录:

        case COM_STMT_EXECUTE, COM_QUERY:
                /* if we get a OK in the first packet there will be no result-set */
                switch *qStage {
                case PARSE_COM_QUERY_INIT:
                        switch pkt[4] {
                        case 0xff, 0×00: // ERR, OK, NULL
                                /* ERR: e.g. SELECT * FROM dual -> ERROR 1096 (HY000): No tables used */
                                /* OK:  e.g. DELETE FROM tbl */
                                finished = true
                                break
                        case 0xfb: // NULL
                                *qStage = PARSE_COM_QUERY_LOAD_DATA
                                finished = true
                                break
                        case 0xfe: // EOF
                                err = errors.New(fmt.Sprintf("COM_(0x%02x), packet should not be (NULL|EOF), got %02x", cmd, pkt[4]))
                                break
                        default:
                                *qStage = PARSE_COM_QUERY_FIELD
                                break
                        }
                        break

                case PARSE_COM_QUERY_FIELD:
 

写这个的初衷是因为除了部分程序开发者自己实现了读写分离或者采用sharding方式之外,还有大量的程序是针对单一的MySQL数据库接口. 然而随着业务量的增加,db压力增大,单台db没法承载,需要扩展MySQL数据库为主从架构,这时候需要代理层来分发读写,因为改造程序的代价往往太大.

新开发的MySQL proxy的配置如下:

[proxy]
port = 3307
sock = /tmp/proxy.sock
fetch_schemas_interval = 10  # seconds

# For management
admin_user      = admin
admin_password  = 100c4e57374fc998e57164d4c0453bd3a4876a58   # sha1
admin_port      = 8288

# For connecting to proxy
proxy_user      = ivan
proxy_password  = 100c4e57374fc998e57164d4c0453bd3a4876a58   # sha1

# For proxy to connect backend mysql server
mysql_user      = ivan
mysql_password  = 100c4e57374fc998e57164d4c0453bd3a4876a58    #sha1
mysql_dbname    = test # default db

# connections setting
connections_per_weight_max = 32

# master and slaves setting. ip:port:w  w: weight of load
master          = 127.0.0.1:3306
#slaves         = 127.0.0.1:3306:1|192.168.2.200:3306:2|192.168.2.203:3306:1
slaves          = 127.0.0.1:3306:1
 

其中配置的密码是明文密码的sha1, 防止非相关人员获取数据库的密码,安全性能得到一定的保障.
通过其他的配置也可以看出proxy实现的功能,即能够配置多个slave,并且能够指定它们的权重.

Related posts:

  1. Golang 实现的 mysql-proxy
  2. lbmysqlping (LegendBase MySQL Ping)
  3. 发布自己的DbSession类(for php)
  4. MySQL vs NoSQL 效率与成本之争
  5. 6.0.11 will be the last release of MySQL 6.0
  6. 由CSDN泄密想到的:MySQL数据库验证过程的改进、密码存储及验证方法的总结
  7. MySQL driver(驱动) liblbmysql for Go1
分类: MySQL 标签:
  1. 2012年3月29日16:58 | #1

    对Google Go语言有兴趣的,请加QQ群: 223643074
    申请请注明 “Go” 等相关字样

  2. vinchen
    2012年3月30日09:32 | #2

    对比官方的MySQL Proxy有什么不同?

    • 2012年3月30日10:32 | #3

      官方的proxy需要lua脚本来实现需要的功能。而这个只实现读写分离和slave上读取的负载均衡。

  3. 2012年4月10日13:54 | #4

    记得,只要有密码的sha1就已经可以登录了吧。。。

  4. 2012年4月10日17:08 | #5

    @神仙
    是的,如果自己实现登陆,只需要sha1即可. 好比在上篇blog中提到的,很多时候用md5存储密码, 获取cookie中的md5也可以模拟登陆.

  5. 2012年5月9日17:23 | #6

    update: 2012-05-09

    proxy命名为: LegendBase Proxy for MySQL(LPM)
    下载地址: http://legendbase.com/products/lbpm/

  6. 王崇
    2012年12月14日11:26 | #7

    @谭俊青
    这个下载地址无效啊。。。求源码下载~~~~

  7. 小龙
    2012年12月28日14:19 | #8

    @谭俊青
    源码 下不了。。谭叔

  1. 2012年11月28日10:46 | #1