阿里云
阿里云多端小程序中小企业获客首选
发表主题 回复主题
  • 4835阅读
  • 0回复

[数据库]基于Mycat开源数据库中间件MySQL数据库主从读写分离

级别: 论坛版主
发帖
3414
云币
8980

        采用读写分离技术的目标:有效减轻Master库的压力,又可以把用户查询数据的请求分发到不同的Slave库,从而保证系统的健壮性。我们看下采用读写分离的背景。 ^+Stvj:N  
|PW.CV0,  
6R%N jEW:  
   随着网站的业务不断扩展,数据不断增加,用户越来越多,数据库的压力也就越来越大,采用传统的方式,比如:数据库或者SQL的优化基本已达不到要求,这个时候可以采用读写分离的策 略来改变现状。 K7gqF~5x~  
~JxAo\2i  
ryoD 1OE  
  具体到开发中,如何方便的实现读写分离?目前常用的有两种方式: aT%6d@g  
}TAHVcX*p  
# >L^W7^  
  1 )第一种方式是我们最常用的方式,就是定义2个sessionFactory,一个是MasterSessionFactory,另一个是SlaveSessionFactory。更新数据时我们读取MasterSessionFactory,查询数据时我们读取SlaveSessionFactory。 FVS@z5A8<=  
9Y-6e0B:  
d(j|8/tpA  
  2 )第二种方式动态数据源切换,就是在程序运行时,把数据源动态织入到程序中,从而选择读取主库还是从库。主要使用的技术是:annotation,spring AOP ,反射。具体请移步 springMvc +hibernate 实现多数据源动态切换  http://www.52itstyle.com/thread-24647-1-1.html {w|KWGk2  
s9}VnNr  
Dh{sVRA  
vaUUesytt  
上一篇文章讲到mysql主从复制的配置https://bbs.aliyun.com/read/285830.html E7UYJ)6]  
dzwto;  
今天要给大家分享的是基于Mycat开源数据库中间件MySQL读写分离。当然首先你要己做好主从复制,Mycat可是不支持主从复制的。 zWEt< `1M  
c<j  +"  
一、MySQL主从复制状态绑定的读写分离机制,使用如下配置:
by%k*y  
[X|KXlNfm  
ImVHX~ qHJ  
  1. <schema name="itstyle" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
  2. </schema>
  3. <dataNode name="dn1" dataHost="localhost1" database="itstyle" />
  4. <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
  5.   writeType="0" dbType="mysql" dbDriver="native" switchType="2"  slaveThreshold="100">
  6.   <heartbeat>show slave status</heartbeat>  
  7.   <!-- can have multi write hosts-->
  8.   <writeHost host="hostM1" url="192.16.1.190:3306" user="root"
  9.    password="123456">
  10.         <readHost host="hostS1" url="192.16.1.180:3306" user="root"
  11.    password="123456"/>
  12.   </writeHost>
  13. </dataHost>
二、参数说明 ia}V8i  
7ZRLSq'S  
nXnO]wXC  
(1)        设置 balance="1"与writeType="0"Balance参数设置: u4p){|x7s  
1. balance=“0”, 所有读操作都发送到当前可用的writeHost上。2. balance=“1”,所有读操作都随机的发送到readHost。 WF0[/Y  
3. balance=“2”,所有读操作都随机的在writeHost、readhost上分发WriteType参数设置: ON/U0V:v  
1. writeType=“0”, 所有写操作都发送到可用的writeHost上。2. writeType=“1”,所有写操作都随机的发送到readHost。 "vG~2J  
3. writeType=“2”,所有写操作都随机的在writeHost、readhost分上发。“readHost是从属于writeHost的,即意味着它从那个writeHost获取同步数据,因此,当它所属的writeHost宕机了,则它也不会再参与到读写分离中来,即“不工作了”,这是因为此时,它的数据已经“不可靠”了。基于这个考虑,目前mycat 1.3和1.4版本中,若想支持MySQL一主一从的标准配置,并且在主节点宕机的情况下,从节点还能读取数据,则需要在Mycat里配置为两个writeHost并设置banlance=1。” C [h^bBq  
EzDQoN7Em  
4Sxt<7[f  
;+h-o  
(2)        设置 switchType="2" 与slaveThreshold="100"“Mycat心跳检查语句配置为 show slave status ,dataHost 上定义两个新属性: switchType="2" 与slaveThreshold="100",此时意味着开启MySQL主从复制状态绑定的读写分离与切换机制。Mycat心跳机制通过检测 show slave status 中的 "Seconds_Behind_Master", "Slave_IO_Running", "Slave_SQL_Running" 三个字段来确定当前主从同步的状态以及Seconds_Behind_Master主从复制时延。“ geB]~/-p  
c_YP#U  
>m;*Zk`  
J|A:C[7 2  
9!06R-h  
三、测试功能 7v^V]&&s  
1)首先要在myca-web界面配置好mycat服务,测试数据库为itstyle。myca-web 安装教程:https://bbs.aliyun.com/read/285832.html XY1e eB-  
HQO z  
X}s}E ;v9  
&^4E)F  
 + Y  
f^63<gqY  
hRvj iK\  
{KO +t7'Q  
190 主数据库 写入 Q7-d]xJ^  
mysql> use itstyle; lZa L=HS#L  
mysql> select * from person; Z7t-{s64  
+-----+------+ T8ftBIOi  
| age | NAME | dUg| {l  
+-----+------+ ZdP2}w  
|   1 | zhangsan | Fl'+ C  
+-----+------+ ,:e##g~k  
1 row in set (0.00 sec) v3vQfcxR  
`Ko6;s#  
u(!@6%?-  
.s)z?31  
/v,H%8S  
显示用户姓名为zhangsan n 7Bua  
X_0Ta_u?T  
e(NpX_8  
180 从数据库 读取 V!Q1o!J  
mysql> use itstyle; rg^  
mysql> select * from person; pg%'_+$~m  
+-----+------+ %j3 *j  
| age | NAME | _m+64qG_8'  
+-----+------+ KF#,Q  
|   1 |lisi | OEN!~-u  
+-----+------+ V>`xTQG  
1 row in set (0.00 sec) h* to%N  
~HH#aXh*  
I<'wZJRRa  
`n# {}%  
5+gSpg]i  
显示用户姓名为lisi Q[+o\{ O  
+s}"&IV%  
UoLvc~n7  
二)测试读取是否分离 YuZxKuGy  
@} 61D  
ZPT6 p J  
测试程序类 MycatJdbc.java O+Zt*jN;  
  1. public class MycatJdbc {
  2.     private static final String URL = "jdbc:mysql://192.168.1.180:8066/itstyle?characterEncoding=UTF-8";
  3.     private static final String USERNAME = "test";
  4.     private static final String PASS = "test";
  5.     public static void main(String[] args) {
  6.         mysql();
  7.     }
  8.     public static  void  mysql(){
  9.         Connection conn = null;
  10.         Statement stmt = null;
  11.         ResultSet rs = null;
  12.         try{
  13.             conn = JDBCConnect.getConnect(URL,USERNAME,PASS);
  14.             stmt = conn.createStatement();
  15.             String sql = "SELECT * FROM person";
  16.             rs = stmt.executeQuery(sql);
  17.             while(rs.next()){
  18.                 String name = rs.getString(2);
  19.                 System.out.println("姓名为:"+name);
  20.             }
  21.         }catch(Exception e){
  22.             e.printStackTrace();
  23.         }finally{
  24.             if(rs!=null){
  25.                 try {
  26.                     rs.close();
  27.                 } catch (SQLException e) {
  28.                     e.printStackTrace();
  29.                 }
  30.             }
  31.             if(stmt!=null){
  32.                 try {
  33.                     stmt.close();
  34.                 } catch (SQLException e) {
  35.                     e.printStackTrace();
  36.                 }
  37.             }
  38.             if(conn!=null){
  39.                 try {
  40.                     conn.close();
  41.                 } catch (SQLException e) {
  42.                     e.printStackTrace();
  43.                 }
  44.             }
  45.         }
  46.     }
  47. }
W+&w'~M  
执行main方法 显示结果正确 2\Vzfca  
Z>)(yi9+  
`|1#Vuk  
R(?g+:eCpM  
JO4rU- n  
VFZ_Vw  
36<PI'l#~  
如果有条件(钱)其实可以购买阿里的RDS,默认部署主备架构且提供了容灾、备份、恢复、监控、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼! z8SrZ#mg  
https://www.aliyun.com/product/rds/     A{5^A)$  
[ 此帖被小柒2012在2016-06-24 21:59重新编辑 ]
发表主题 回复主题
« 返回列表上一主题下一主题

限100 字节
批量上传需要先选择文件,再选择上传
 
验证问题: ECS是阿里云提供的什么服务? 正确答案:云服务器
上一个 下一个
      ×
      全新阿里云开发者社区, 去探索开发者的新世界吧!
      一站式的体验,更多的精彩!
      通过下面领域大门,一起探索新的技术世界吧~ (点击图标进入)