我的日常

登录/注册
您现在的位置:论坛 资料库 开源社区 > 基于Mycat开源数据库中间件MySQL数据库主从读写分离
总共48087条微博

动态微博

查看: 3328|回复: 2

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

[复制链接]
admin    

1244

主题

544

听众

1万

金钱

管理员

  • TA的每日心情

    2021-2-2 11:21
  • 签到天数: 36 天

    [LV.5]常住居民I

    管理员

    跳转到指定楼层
    楼主
    发表于 2016-06-21 13:51:21 |只看该作者 |正序浏览
            采用读写分离技术的目标:有效减轻Master库的压力,又可以把用户查询数据的请求分发到不同的Slave库,从而保证系统的健壮性。我们看下采用读写分离的背景。


       随着网站的业务不断扩展,数据不断增加,用户越来越多,数据库的压力也就越来越大,采用传统的方式,比如:数据库或者SQL的优化基本已达不到要求,这个时候可以采用读写分离的策 略来改变现状。


      具体到开发中,如何方便的实现读写分离呢?目前常用的有两种方式:


      1 )第一种方式是我们最常用的方式,就是定义2个sessionFactory,一个是MasterSessionFactory,另一个是SlaveSessionFactory。更新数据时我们读取MasterSessionFactory,查询数据时我们读取SlaveSessionFactory。


      2 )第二种方式动态数据源切换,就是在程序运行时,把数据源动态织入到程序中,从而选择读取主库还是从库。主要使用的技术是:annotation,spring AOP ,反射。具体请移步 springMvc +hibernate 实现多数据源动态切换  http://www.52itstyle.top/thread-24647-1-1.html


    但是以上两种方式也有一定的缺陷,就是要改变项目的业务逻辑。增加代码量不说,维护起来也不是很方便。


    上一篇文章讲到mysql主从复制的配置。 http://www.52itstyle.top/thread-25128-1-1.html


    今天要给大家分享的是基于Mycat开源数据库中间件MySQL读写分离。当然首先你要自己做好主从复制,Mycat可是不支持主从复制的。


    一、MySQL主从复制状态绑定的读写分离机制,使用如下配置:
    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>
    复制代码

    二、参数说明


    (1)        设置 balance="1"与writeType="0"
    Balance参数设置:
    1. balance=“0”, 所有读操作都发送到当前可用的writeHost上。
    2. balance=“1”,所有读操作都随机的发送到readHost。
    3. balance=“2”,所有读操作都随机的在writeHost、readhost上分发
    WriteType参数设置:
    1. writeType=“0”, 所有写操作都发送到可用的writeHost上。
    2. writeType=“1”,所有写操作都随机的发送到readHost。
    3. writeType=“2”,所有写操作都随机的在writeHost、readhost分上发。
    “readHost是从属于writeHost的,即意味着它从那个writeHost获取同步数据,因此,当它所属的writeHost宕机了,则它也不会再参与到读写分离中来,即“不工作了”,这是因为此时,它的数据已经“不可靠”了。基于这个考虑,目前mycat 1.3和1.4版本中,若想支持MySQL一主一从的标准配置,并且在主节点宕机的情况下,从节点还能读取数据,则需要在Mycat里配置为两个writeHost并设置banlance=1。”


    (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主从复制时延。“


    三、测试功能
    1)首先要在myca-web界面配置好mycat服务,测试数据库为itstyle。



    190 主数据库 写入
    mysql> use itstyle;
    mysql> select * from person;
    +-----+------+
    | age | NAME |
    +-----+------+
    |   1 | zhangsan |
    +-----+------+
    1 row in set (0.00 sec)


    显示用户姓名为zhangsan

    190 从数据库 读取
    mysql> use itstyle;
    mysql> select * from person;
    +-----+------+
    | age | NAME |
    +-----+------+
    |   1 |lisi |
    +-----+------+
    1 row in set (0.00 sec)


    显示用户姓名为lisi


    二)测试读取是否分离

    测试程序类 MycatJdbc.java

    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. }
    复制代码

    执行main方法 显示结果正确



    科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、科帮网管理员和版主有权不事先通知发贴者而删除本文


    JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

    2021-2-2 11:21
  • 签到天数: 36 天

    [LV.5]常住居民I

    管理员

    板凳
    发表于 2017-10-06 19:10:00 |只看该作者
    狗贼 发表于 2017-1-10 01:55
    190 主数据库 写入
    mysql> use itstyle;
    mysql> select * from person;

    为了测试 读写 分离 从库 删掉了
    回复

    使用道具 举报

    2

    主题

    0

    听众

    661

    金钱

    四袋长老

    该用户从未签到

    沙发
    发表于 2017-01-10 09:55:00 |只看该作者

    190 主数据库 写入
    mysql> use itstyle;
    mysql> select * from person;
    +-----+------+
    | age | NAME |
    +-----+------+
    |   1 | zhangsan |
    +-----+------+
    1 row in set (0.00 sec)


    显示用户姓名为zhangsan

    190 从数据库 读取
    mysql> use itstyle;
    mysql> select * from person;
    +-----+------+
    | age | NAME |
    +-----+------+
    |   1 |lisi |
    +-----+------+
    1 row in set (0.00 sec)


    显示用户姓名为lisi


    那原来从库的 李四 去哪了
    回复

    使用道具 举报

    快速回复
    您需要登录后才可以回帖 登录 | 立即注册

       

    关闭

    站长推荐上一条 /1 下一条

    发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
    快速回复 返回顶部 返回列表