0

我的生产设置是两台运行 Tomcat 7.0 的物理服务器和两台运行 MySQL 5.6 的物理服务器。MySQL 服务器处于主/副本配置中。创建两个数据库连接池(一个用于主数据库,一个用于副本)并在适当的情况下在应用程序级别选择性地选择它们并不是什么大问题。

我不会假装这不是一个有很多微妙之处的复杂话题——让我试着把它分解成两个基本问题。

  1. 在一般情况下,我是否只想写入主服务器并仅从副本读取?

  2. 由于复制延迟不可预测,如果我需要在写入后立即读取,我可以从 master 读取吗?

提前致谢-Hal50000

4

1 回答 1

0

经过一番研究,我回到了已经在 MySQL Connector/J 中实现的解决方案。对 context.xml 文件的 Resource 进行了相当简单的更改,driverClassName例如:url

<Resource name="jdbc/my_db"
              auth="Container"
              type="javax.sql.DataSource"
              username="db_user"
              password="db_password"
              driverClassName="com.mysql.jdbc.ReplicationDriver"
              url="jdbc:mysql:replication://192.168.100.51:3306,192.168.100.52:3306/my_schema"
              maxActive="200"
              maxIdle="100"
              maxWait="20000"
              initialSize="20"
              removeAbandoned="true"
              removeAbandonedTimeout="60"
              logAbandoned="true"
            />

效果很好。无论您拥有多少副本,url 的顺序都是 master/replica/replica/...。然后,您可以将 Connection 实例设置为 setReadOnly(true) 以从其中一个副本读取,或将 setReadOnly(false) 设置为从主服务器读取。显然副本之间的负载平衡由驱动程序处理,但由于只有一个副本,我无法确认。

文档中更好地描述了所有内容: https ://dev.mysql.com/doc/refman/5.6/en/connector-j-reference-replication-connection.html

于 2013-10-18T15:31:11.697 回答