sql server 中间件支持读写分离

原创
2016/11/08 14:21
阅读数 1.3W

    经过一段时间艰苦的奋斗,终于把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文档等众多艰苦的过程。终于明白了处理方法。

四,关注方式

1)数据库监控 521095285

2)平民软件官网

3)oneproxy-monitor项目

 

 

展开阅读全文
打赏
1
6 收藏
分享
加载中
更多评论
打赏
0 评论
6 收藏
1
分享
返回顶部
顶部