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

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

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

        采用读写分离技术的目标:有效减轻Master库的压力,又可以把用户查询数据的请求分发到不同的Slave库,从而保证系统的健壮性。我们看下采用读写分离的背景。 wzX(]BG  
),cozN=NM  
X% JQ_Z  
   随着网站的业务不断扩展,数据不断增加,用户越来越多,数据库的压力也就越来越大,采用传统的方式,比如:数据库或者SQL的优化基本已达不到要求,这个时候可以采用读写分离的策 略来改变现状。 }\ kLh(  
]rC2jB\,M  
5>CmWMQ  
  具体到开发中,如何方便的实现读写分离?目前常用的有两种方式: W3Gg<!*Uo  
Yx#?lA2gx  
;|yd}q=p  
  1 )第一种方式是我们最常用的方式,就是定义2个sessionFactory,一个是MasterSessionFactory,另一个是SlaveSessionFactory。更新数据时我们读取MasterSessionFactory,查询数据时我们读取SlaveSessionFactory。 c?(;6$A  
_EHz>DJ9  
AUk-[i  
  2 )第二种方式动态数据源切换,就是在程序运行时,把数据源动态织入到程序中,从而选择读取主库还是从库。主要使用的技术是:annotation,spring AOP ,反射。具体请移步 springMvc +hibernate 实现多数据源动态切换  http://www.52itstyle.com/thread-24647-1-1.html }`fFzb  
M$J{clr  
&BOq%*+  
WzinEo{ f  
上一篇文章讲到mysql主从复制的配置https://bbs.aliyun.com/read/285830.html mH`K~8pRg  
bqPaXH n  
今天要给大家分享的是基于Mycat开源数据库中间件MySQL读写分离。当然首先你要己做好主从复制,Mycat可是不支持主从复制的。 &JUHm_wd&S  
r< MW8  
一、MySQL主从复制状态绑定的读写分离机制,使用如下配置:
etw.l~y   
yV.E+~y  
wqnrN6$jf  
  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>
二、参数说明 sOVbz2 \yb  
wn1` 9  
t/$:g9V%FA  
(1)        设置 balance="1"与writeType="0"Balance参数设置: #3~hF)u&/  
1. balance=“0”, 所有读操作都发送到当前可用的writeHost上。2. balance=“1”,所有读操作都随机的发送到readHost。 W^e"()d/Z  
3. balance=“2”,所有读操作都随机的在writeHost、readhost上分发WriteType参数设置: hnYL<<AA  
1. writeType=“0”, 所有写操作都发送到可用的writeHost上。2. writeType=“1”,所有写操作都随机的发送到readHost。 XfZ^,' z  
3. writeType=“2”,所有写操作都随机的在writeHost、readhost分上发。“readHost是从属于writeHost的,即意味着它从那个writeHost获取同步数据,因此,当它所属的writeHost宕机了,则它也不会再参与到读写分离中来,即“不工作了”,这是因为此时,它的数据已经“不可靠”了。基于这个考虑,目前mycat 1.3和1.4版本中,若想支持MySQL一主一从的标准配置,并且在主节点宕机的情况下,从节点还能读取数据,则需要在Mycat里配置为两个writeHost并设置banlance=1。” ~7 w"$H8  
y|b&Rup  
'G)UIjl  
|YnT;q  
(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主从复制时延。“ 8pXului  
Dve+ #H6N  
$eu-8E'  
XG!s+ShFV  
dy' J~Eo7  
三、测试功能 L,\wB7t  
1)首先要在myca-web界面配置好mycat服务,测试数据库为itstyle。myca-web 安装教程:https://bbs.aliyun.com/read/285832.html <*Bk.>f!  
< $>Jsv  
|Y tZOQu  
}!_ofe  
b+#A=Z+Pr  
BcaX:C?f  
UJ?qGOM3x>  
4:0y\M5u  
190 主数据库 写入 c'}dsq\  
mysql> use itstyle; *Dhy a g  
mysql> select * from person; h0z>dLA#2  
+-----+------+ `#3FvP@&  
| age | NAME | ;RzbPlkl  
+-----+------+ 7x''V5*j  
|   1 | zhangsan | oYmLJzCf  
+-----+------+ Y;"rJxHD  
1 row in set (0.00 sec) Sg+0w7:2  
ZnNl3MKV  
;^DG P  
YIn H8Ex  
MO-7y p:K  
显示用户姓名为zhangsan 9g~"Y[ ]  
_ %gu<Ys  
`G_k~ %  
180 从数据库 读取 Bm$(4  
mysql> use itstyle; n\w2e_g;N  
mysql> select * from person; ] ^ s,  
+-----+------+ $'%.w|MJp  
| age | NAME | J.Fy0W@+k4  
+-----+------+ L/KiE+Y  
|   1 |lisi | UAEu.AT  
+-----+------+ Ba#wW E  
1 row in set (0.00 sec) 0K'^g0G  
sL!+&Id|  
hF^y4v|5  
rv<_'yj  
cnraNq1  
显示用户姓名为lisi w#^z:7fI  
uA;vW\fHr  
[ f;o3  
二)测试读取是否分离 jxqKPMf>@%  
HY2*5 #T  
3L^]J}|  
测试程序类 MycatJdbc.java L0X/  
  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. }
t.pn07$  
执行main方法 显示结果正确 8)bqN$*h  
y Q-{ CJ,  
wfQ^3HL  
<`?V:};Q  
*W-:]t3CR  
i_f\dkol  
SIZZFihcYh  
如果有条件(钱)其实可以购买阿里的RDS,默认部署主备架构且提供了容灾、备份、恢复、监控、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼! RdqB^>X  
https://www.aliyun.com/product/rds/     9Q>85IiT  
[ 此帖被小柒2012在2016-06-24 21:59重新编辑 ]
发表主题 回复主题
« 返回列表上一主题下一主题

限100 字节
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
验证问题: ECS是阿里云提供的什么服务? 正确答案:云服务器
上一个 下一个
      ×
      全新阿里云开发者社区, 去探索开发者的新世界吧!
      一站式的体验,更多的精彩!
      通过下面领域大门,一起探索新的技术世界吧~ (点击图标进入)