经过一段时间艰苦的奋斗,终于把sql server的读写分离搞定了。大家可以下载oneproxy-for-sqlserver来使用此功能。更多消息,可以访问平民软件官网获取。或者加入群 数据库监控 521095285,或者关注oneproxy-monitor框架项目(oneproxy-for-sqlserver是在此项目下开发的,会同步更新此框架)
下面说说oneproxy-for-sqlserver读写分离的使用方法和开发中遇到的有趣问题。
一. 使用方法
为了支持读写分离,需要修改[oneproxy]标签的数据和增加[database_xxx]标签的数据以及数据库组的信息。详细如下所示:
1) 在[oneproxy]标签下面增加:passwordseparate = true和readslave=true。增加后的配置如下所示:
[oneproxy]
logfile = oneproxy_log.log
pidfile = oneproxy_pid.pid
listen_addr = 0.0.0.0
listen_port = 9999,7777,6666
httpserver_addr = 0.0.0.0
httpserver_port = 8080
log_level = error
data_dump = false
log_sql = false
clientusername = admin
clientpassword = 0000
passwordseparate = true
readSlave = true
需要注意的是:
1)如果不配置,默认情况下这两个选项也是为true。
2)如果readSlave为true,则必须配置passwordseparate为true。
如果不想使用密码分离功能,则同样也不能使用读写分离功能。
2) 在数据库配置组标签[sqlserver_9999]下面增加主数据库和从数据库的信息,比如:
[database_1433]
host = 127.0.0.1
port = 1433
username = sa
password = 0000
[database_1434]
host = 127.0.0.1
port = 1434
username = sa
password = 0000
[sqlserver_9999]
dbmastergroup = database_1433
dbslavegroup = database_1434
classname = SSProtocol
frontport = 0
需要注意点:
1)数据库的信息必须放置在[database_xxx]标签下面。这个标签必须以database开头。
2)数据库组信息放到其他名称的标签(不能是[oneproxy]和[database_xxx]的标签)下,如上配置中的[sqlserver_9999]标签。
3)主数据库配置在dbmastergroup上,从数据库配置在dbslavegroup上。
4)允许不存在从数据库,如果没有从数据库,则读写分离的功能被禁止。
完成上面的配置后,直接启动程序即可。
二. 读写分离效果
1)事务中的操作全部在主数据库执行
2)非事务中的select语句在从数据库执行(不管是statement下的还是preparedstatement下的)
三. 读写分离的故事
在开发读写分离的过程中,遇到很多问题。比如:
1) 当在同一个session中,从不同数据库得到的spid可能不同,则需要根据发送到不同的数据库重写spid。
2) 怎么透明的处理游标和prepared句柄。
3) 在事务中怎么处理非事务中创建的statement或者preparedstatement.
4) 怎么处理在事务中创建的statement和preparedstatement在非事务中使用的问题。
5)怎么处理包中的事务描述符等数据。
在开发的过程中,遇到由于没有重写事务描述符,导致一直提示不能新开始一个事务的异常。针对这个问题,我研究了很长时间,同时直连和读写分离的包数据的比较查找数据包的差异点,以及读MSDN文档等众多艰苦的过程。终于明白了处理方法。
四,关注方式
2)平民软件官网.
来源:oschina
链接:https://my.oschina.net/u/918218/blog/783761