OneProxy :: 在SQL中透明地注入源端IP地址,负载均衡中必备的企业级功能!

OneProxy可以用来作为MySQL/PostgreSQL数据库的负载均衡软件,如同TCP四层的代理软件(如LVS/Nginx/HaProxy等)一样,在数据库后端看到的会话都是来自于代理机器的连接,真正的应用端IP地址无法直接传送给后端数据库,除非对后端数据库进行定制。当你在慢查询日志中发现一条SQL时,就难以知道这条SQL来自于哪台应用服务器,因此需要实现一个数据库层的X-Forwarded-For机制,以方便查找问题。

在OneProxy中,可以使用“proxy-forward-clientip”选项来向SQL中嵌入应用源端IP地址信息,IP地址会被以SQL注释的方式放到SQL语句中,如下所示:

mysql> show processlist \G
......
*************************** 8. row ***************************
     Id: 82
   User: test
   Host: 192.168.1.119:42445
     db: test
Command: Query
   Time: 0
  State: Writing to net
   Info: /*192.168.1.119*/ select col2 from t_binlog where id = 2
......
*************************** 20. row ***************************
     Id: 95
   User: test
   Host: 192.168.1.119:59322
     db: test
Command: Query
   Time: 0
  State: optimizing
   Info: /*192.168.1.119*/ select col2 from t_binlog where id = 6
*************************** 21. row ***************************
......
22 rows in set (0.00 sec)

这时在SQL慢日志中的语句就会包含来源IP地址信息,从而一目了然,又不需要对后端数据库进行定制。在默认情况下并不启用这个功能,需要显式在命令行指定“–proxy-forward-clientip”来启用,或者在参数配置文件中指定,如下所示:

[root@rh4srv1 data]# cat oneproxy/conf/proxy.conf
[oneproxy]
keepalive     = 1
event-threads = 4
log-file      = log/oneproxy.log
pid-file      = log/oneproxy.pid
lck-file      = log/oneproxy.lck

proxy-forward-clientip   = 1
mysql-version            = 5.6.27
proxy-address            = :3307
......

SQL中注入IP信息的功能完全由OneProxy透明地完成,不需要修改任何应用代码,这是TCP四层的代理软件(如LVS/Nginx/HaProxy等)做不到的,相信会对大家有些帮助。