参考:https://blog.csdn.net/weixin_34221332/article/details/94051340
1、购买了的云数据库UDB。位于广东区。
2、Mysql云数据库可以很容易的建立Slave库(需另外购买从库),自动实现读写分离和负载均衡。因为从库属于主库,课用同一个ip访问,平台底层自动实现读写分离。
3、云数据库UDB没有外网IP不能直接访问。可以找一个有外网IP的云主机UHost,安装mysql-proxy,通过mysql-proxy将云主机的某一端口上访问请求转发给后面的云数据库UDB。
4、必须找同一平台、同一可用区的云主机UHost安装。比如云数据库UDB位于广东区,云主机UHost最好也要位于广东区,因为其内网要能ping通。我有一个上海区的UHost,怎么装都无法启动mysql-proxy,最终是因为这个云主机无法连接到广东区的云数据库UDB。
5、mysql-proxy只支持http方式连接数据库。不支持jdbc那种socket连接的方式。
https://stackoverflow.com/questions/6544635/mysql-connect-via-proxy-in-java
Try using socksProxyHost
and socksProxyPort
system properties. Look here at chapter "2.4) SOCKS" and here. (The http.proxyHost will not work with JDBC.)
1、安装mysql-proxy(以CentOS 7.6为例)
[root@10-13-4-243 ~]# yum install mysql-proxy
安装结束后,可通过如下命令查看相关信息
[root@10-13-4-243 ~]# mysql-proxy -V
mysql-proxy 0.8.5
chassis: 0.8.5
glib2: 2.36.3
libevent: 2.0.21-stable
LUA: Lua 5.1.4
package.path: /usr/lib64/mysql-proxy/lua/?.lua
package.cpath: /usr/lib64/mysql-proxy/lua/?.so
-- modules
proxy: 0.8.5
2、配置mysql-proxy
此服务默认缺省端口为4040
可以使用命令行开启,最好使用配置文件,配置文件内容如下:此配置只配置了代理功能,并没有配置读写分离
[root@10-13-4-243 ~]# vim /etc/mysql-proxy.cnf
[mysql-proxy]
daemon = true
pid-file = /var/run/mysql-proxy.pid
log-file = /var/log/mysql-proxy.log
log-level = debug
max-open-files = 1024
plugins = admin,proxy
user = mysql-proxy
#
#Proxy Configuration
#proxy-address = 0.0.0.0:3307 # 这里我们注释这一行,代理端口就默认改为了4040,也可以不改,后面连接端口就改为3307就可以了。
proxy-backend-addresses = 10.13.7.185 # 内网的数据库地址,默认3306端口
#proxy-read-only-backend-addresses =
#proxy-lua-script =
#proxy-skip-profiling = true
#
# Admin Configuration
# admin-address = 0.0.0.0:4041 # 监听端口是4041
admin-lua-script = /usr/lib64/mysql-proxy/lua/admin.lua
admin-username = name # 数据库用户名
admin-password = pwd # 数据库密码
配置文件保存后需要改变权限:
chmod 0660 /etc/mysql-proxy.cnf
3、启动:
[root@10-13-4-243 ~]# mysql-proxy --defaults-file=/etc/mysql-proxy.cnf
查看是否启动成功:
[root@10-13-4-243 ~]# netstat -anplut|grep mysql-proxy
tcp 0 0 0.0.0.0:4040 0.0.0.0:* LISTEN 1641/mysql-proxy
tcp 0 0 0.0.0.0:4041 0.0.0.0:* LISTEN 1641/mysql-proxy
4、报错情况
[root@localhost ~]# mysql-proxy --defaults-file=/etc/mysql-proxy.cnf
2018-12-28 20:49:35: (critical) Key file contains key 'daemon' which has value that cannot be interpreted.
2018-12-28 20:49:35: (message) Initiating shutdown, requested from mysql-proxy-cli.c:367
2018-12-28 20:49:35: (message) shutting down normally, exit code is: 1
可能的原因
1、云主机的4040端口要开
2、云主机可以连接到UDB,或ping通
3、配置有问题。如果采用了ucloud文档里面的配置,启动肯定是失败的,会报上面的错误。ucloud的配置如下
[mysql-proxy]
admin-username=root #admin用户名
admin-password=123fsck #admin密码
admin-lua-script=/usr/lib64/mysql-proxy/lua/admin.lua #lua位置,参见上面的版本信息
daemon=true # mysql-proxy以守护进程方式运行
keepalive=true #保持连接启动进程会有2个, 一号进程用来监视二号进程
proxy-backend-addresses=10.6.X.XX #目标地址,udb内网地址,默认端口3306
log-file=/var/log/mysql-proxy.log
log-level=debug
5、后来需要安装docker。在 yum update 更新了yum包,并安装了docker后,mysql-proxy就无法启动了
2020-08-09 20:31:04: (critical) plugin admin 0.8.5 started
2020-08-09 20:31:04: (critical) plugin proxy 0.8.5 started
2020-08-09 20:31:04: (debug) max open file-descriptors = 1024
2020-08-09 20:31:04: (message) admin-server listening on port :4041
2020-08-09 20:31:04: (message) proxy listening on port :4040
2020-08-09 20:31:04: (critical) getaddrinfo("10.13.7.185 # 内网的数据库地址,默认3306端口") failed: Name or service not known (-2)
2020-08-09 20:31:04: (critical) chassis-mainloop.c:270: applying config of plugin proxy failed
2020-08-09 20:31:04: (critical) mysql-proxy-cli.c:599: Failure from chassis_mainloop. Shutting down.
2020-08-09 20:31:04: (message) Initiating shutdown, requested from mysql-proxy-cli.c:600
在getaddrinfo时,解析失败,看了很长时间,感觉是这个方法把mysql-proxy.cnf文件里的,地址和后面的文字都作为地址来解析了,所以才失败。然后把“#内网的数据库地址,默认3306端口” 这段文字去掉,就能成功启动了。