北京SEO

MySQL数据库实现读写分离与负载均衡

2019/10/10/17:32:15  阅读:1823  来源:谷歌SEO算法  标签: 1号店SEO

最近在一个群里老看到有一个朋友问游戏数据充值如何实现读写分享了,在此小编正好看到了一篇文章下面整理与各位看看,MySQL 数据库的读写分离和负载均衡一般是通过第三方软件来实现的,也可以通过mysql驱动程序来实现,如com.mysql.jdbc.ReplicationDriver.

详细文档参见:http://dev.mysql.com/doc/refman/5.5/en/connector-j-info.html

代码如下:

  1. importjava.sql.Connection;
  2. importjava.sql.ResultSet;
  3. importjava.util.Properties;
  4. importcom.mysql.jdbc.ReplicationDriver;
  5. publicclassReplicationDriverDemo{
  6. //开源软件:phpfensi.com
  7. publicstaticvoidmain(String[]args)throwsException{
  8. ReplicationDriverdriver=newReplicationDriver();
  9. Propertiesprops=newProperties();
  10. //Wewantthisforfailoverontheslaves
  11. props.put("autoReconnect","true");
  12. //Wewanttoloadbalancebetweentheslaves
  13. props.put("roundRobinLoadBalance","true");
  14. props.put("user","foo");
  15. props.put("password","bar");
  16. //
  17. //LookslikeanormalMySQLJDBCurl,witha
  18. //comma-separatedlistofhosts,thefirst
  19. //beingthe'master',therestbeinganynumber
  20. //ofslavesthatthedriverwillloadbalanceagainst
  21. //
  22. Connectionconn=
  23. driver.connect("jdbc:mysql:replication://master,slave1,slave2,slave3/test",
  24. props);
  25. //
  26. //Performread/writeworkonthemaster
  27. //bysettingtheread-onlyflagto"false"
  28. //
  29. conn.setReadOnly(false);
  30. conn.setAutoCommit(false);
  31. conn.createStatement().executeUpdate("UPDATEsome_table....");
  32. conn.commit();
  33. //
  34. //Now,doaqueryfromaslave,thedriverautomaticallypicksone
  35. //fromthelist
  36. //
  37. conn.setReadOnly(true);
  38. ResultSetrs=
  39. conn.createStatement().executeQuery("SELECTa,bFROMalt_table");
  40. .......
  41. }
  42. }

读写分离,代码如下:

  1. jdbc:mysql:replication:
  2. //master:3306,slave1:3306,slave2:3306/dbname
  3. Whenusingthefollowingconnectionstring:jdbc:mysql:replication://dbmaster:3306,dbslave1:3306,dbslave2:3306/dbname
  4. dbmasterisusedforallwriteconnectionsasexpectedanddbslave1isusedforallreadconnections,butdbslave2isneverused.Iwouldhaveexpecteddistributedreadsbetweendbslave1anddbslave2.

原理是:ReplicationDriver生成代理的connection对象,当设置这个connection.readOnly=true时,连接slave,当connection.readOnly=false时,连接master.

负载均衡:

  1. jdbc:mysql:loadbalance:
  2. //master:3306,slave1:3306,slave2:3306/dbname
  3. Whenusingthefollowingconnectionstring:jdbc:mysql:loadbalance://dbmaster:3306,dbslave1:3306,dbslave2:3306/dbname
  4. connectionsareload-balancedbetweenallthreeserversforbothreadandwriteconnections.

问题:读写分离时可能会碰到刚写完master,再马上到slave进行查询的情况,而主从复制的时候有延迟,这时怎么解决呢?有两个办法:

1.比如增加页面保存数据后马上跳转到列表页面,这时可能出不来数据,因为复制还没完成,这时可以在前台添加一些成功的提示,成功页面等进行一些页面跳转延迟处理,让服务器有时间去复制,复制延迟一般在毫秒级,而这种提示处理在秒级,所以时间上一般是足够的.

2.第1种办法可能部分场景是可行的,但是有些场景要求比较高,需要实时的,这时可以在读取的时候进行处理,强制从master中读取,可以通过注解,加参数/标识等来指定从master读取数据.

ps 这种做法小编觉得还不是最好的要实现负载均衡我们可以实现服务器集群来实现.

广告内容

MySQL数据库实现读写分离与负载均衡 MySQL数据库实现读写分离与负载均衡 MySQL数据库实现读写分离与负载均衡

相关阅读

热门评论

SEO探索者团队 SEO探索者团队

SEO服务&网站优化

总篇数182

精选文章

RMAN中catalog和nocatalog区别介绍 小技巧:为Linux下的文件分配多个权限 zimbra8.5.1安装第三方签名ssl证书的步骤 解决mysql不能远程连接数据库方法 windows服务器mysql增量备份批处理数据库 mysql中slow query log慢日志查询分析 JavaScript跨域问题总结 Linux下负载均衡软件LVS配置(VS/DR)教程 mysql中权限参数说明 MYSQL(错误1053)无法正常启动

SEO最新算法