MySQL 数据库的读写分离和负载均衡通常是经过第三方软件来实现的。 也能够经过mysql驱动程序来实现,如com.mysql.jdbc.ReplicationDriver。html
详细文档参见:http://dev.mysql.com/doc/refman/5.5/en/connector-j-info.htmljava
import java.sql.Connection; import java.sql.ResultSet; import java.util.Properties; import com.mysql.jdbc.ReplicationDriver; public class ReplicationDriverDemo { public static void main(String[] args) throws Exception { ReplicationDriver driver = new ReplicationDriver(); Properties props = new Properties(); // We want this for failover on the slaves props.put("autoReconnect", "true"); // We want to load balance between the slaves props.put("roundRobinLoadBalance", "true"); props.put("user", "foo"); props.put("password", "bar"); // // Looks like a normal MySQL JDBC url, with a // comma-separated list of hosts, the first // being the 'master', the rest being any number // of slaves that the driver will load balance against // Connection conn = driver.connect("jdbc:mysql:replication://master,slave1,slave2,slave3/test", props); // // Perform read/write work on the master // by setting the read-only flag to "false" // conn.setReadOnly(false); conn.setAutoCommit(false); conn.createStatement().executeUpdate("UPDATE some_table ...."); conn.commit(); // // Now, do a query from a slave, the driver automatically picks one // from the list // conn.setReadOnly(true); ResultSet rs = conn.createStatement().executeQuery("SELECT a,b FROM alt_table"); ....... } }
jdbc:mysql:replication://master:3306,slave1:3306,slave2:3306/dbnamemysql
When using the following connection string: jdbc:mysql:replication://dbmaster:3306,dbslave1:3306,dbslave2:3306/dbnamesql
dbmaster is used for all write connections as expected and dbslave1 is used for all read connections, but dbslave2 is never used. I would have expected distributed reads between dbslave1 and dbslave2.数据库
原理是:ReplicationDriver生成代理的connection对象,当设置这个connection.readOnly=true时,链接slave,当connection.readOnly=false时,链接master服务器
jdbc:mysql:loadbalance://master:3306,slave1:3306,slave2:3306/dbname负载均衡
问题:this
读写分离时可能会碰到刚写完master,再立刻到slave进行查询的状况,而主从复制的时候有延迟,这时怎么解决呢?有两个办法:url
1. 好比增长页面保存数据后立刻跳转到列表页面,这时可能出不来数据,由于复制还没完成,这时能够在前台添加一些成功的提示,成功页面等进行一些页面跳转延迟处理,让服务器有时间去复制(复制延迟通常在毫秒级,而这种提示处理在秒级,因此时间上通常是足够的)spa
2. 第1种办法可能部分场景是可行的,可是有些场景要求比较高,须要实时的,这时能够在读取的时候进行处理,强制从master中读取,能够经过注解,加参数/标识等来指定从master读取数据