• MySQL读写分离


    关于MySQL的读写分离的实现,有两种方式。

        1.第一种方式即我们手动在代码层实现逻辑,来解析读请求或者写请求,分别分发到不同的数据库中,实现读写分离

        2.第二种方式就是基于MyCat中间件来实现读写分离的效果

    优劣分析

    关于这两种方式的优劣。

    代码层实现读写分离,主要的优点就是灵活,可以自己根据不同的需求对读写分离的规则进行定制化开发,但其缺点也十分明显,就是当我们动态增减主从库数量的时候,都需要对代码进行一个或多或少的修改。并且当主库宕机了,如果我们没有实现相应的容灾逻辑,那么整个数据库集群将丧失对外的写功能。

    使用MyCat中间件实现读写分离,优点十分明显,我们只需要进行配置就可以享受读写分离带来的效率的提升,不用写一行代码,并且当主库宕机时,我们还可以通过配置的方式进行主从库的自动切换,这样即使主库宕机我们的整个集群也不会丧失写的功能。其缺点可能就是我们得多付出一台服务器作为虚拟节点了吧,毕竟服务器也是需要成本的。

    两种方式如何抉择:如果你目前的项目比较小,或者干脆是一个毕业设计、课程设计之类的,不会有动态增减数据库的需求,那么自己动手实现一个数据库的读写分离会比较适合你,毕竟答辩的时候,可以一行一行代码跟你的导师和同学解(zhuang)释(bi)。如果项目比较大了,数据库节点有可能进行增减,并且需要主从切换之类的功能,那么就使用第二种方式吧。这种配置化的实现可以降低第二天洗头时候下水管堵塞的几率。

    第二种方式;

    1、创建“weibo_simple”数据库

    #创建数据库
    CREATE DATABASE weibo_simple

    2、创建表结构

     
    CREATE TABLE `t_users` (
      `user_id` varchar(64) NOT NULL COMMENT '注册用户ID',
      `user_email` varchar(64) NOT NULL COMMENT '注册用户邮箱',
      `user_password` varchar(64) NOT NULL COMMENT '注册用户密码',
      `user_nikename` varchar(64) NOT NULL COMMENT '注册用户昵称',
      `user_creatime` datetime NOT NULL COMMENT '注册时间',
      `user_status` tinyint(1) NOT NULL COMMENT '验证状态  1:已验证  0:未验证',
      `user_deleteflag` tinyint(1) NOT NULL COMMENT '删除标记  1:已删除 0:未删除',
      PRIMARY KEY (`user_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
     
     
    CREATE TABLE `t_message` (
      `messages_id` varchar(64) NOT NULL COMMENT '微博ID',
      `user_id` varchar(64) NOT NULL COMMENT '发表用户',
      `messages_info` varchar(255) DEFAULT NULL COMMENT '微博内容',
      `messages_time` datetime DEFAULT NULL COMMENT '发布时间',
      `messages_commentnum` int(12) DEFAULT NULL COMMENT '评论次数',
      `message_deleteflag` tinyint(1) NOT NULL COMMENT '删除标记 1:已删除 0:未删除',
      `message_viewnum` int(12) DEFAULT NULL COMMENT '被浏览量',
      PRIMARY KEY (`messages_id`),
      KEY `user_id` (`user_id`),
      CONSTRAINT `t_message_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `t_users` (`user_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
     

    3、 解压mycat,不要放在有中文目录的地方

      

    4、修改mycat解压目录下的conf文件夹中server.xml文件,配置账户

     
    <!DOCTYPE mycat:server SYSTEM "server.dtd">
    <mycat:server xmlns:mycat="http://org.opencloudb/">
        <!-- 添加user -->
        <user name="mycat_master">
            <property name="password">mycat_master</property>
            <property name="schemas">mycat</property>
        </user>
                
        <!-- 添加user -->
        <user name="mycat_slave">
            <property name="password">mycat_slave</property>
            <property name="schemas">mycat</property>
            <property name="readOnly">true</property>
        </user>
    
    </mycat:server>
     

     

    5、配置schema.xml文件

     
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://org.opencloudb/">
        <schema name="mycat" checkSQLschema="true" sqlMaxLimit="100">
            <table name="t_users" primaryKey="user_id" dataNode="dn1" rule="rule1"/>
            <table name="t_message" type="global" primaryKey="messages_id" dataNode="dn1" />
        </schema>
        <dataNode name="dn1" dataHost="jdbchost" database="weibo_simple" />
               
        <dataHost name="jdbchost" maxCon="1000" minCon="10" balance="1"
            writeType="0" dbType="mysql" dbDriver="native" switchType="1"
            slaveThreshold="100">
                <heartbeat>select user()</heartbeat>  
                <writeHost host="hostMaster" url="192.168.33.135:3306" user="root" password="root">
                </writeHost>
                <writeHost host="hostSlave" url="192.168.33.136:3306" user="root" password="root"/>
        </dataHost>
        
    </mycat:schema>
     

     

    6、 配置rule.xml

     
    <!DOCTYPE mycat:rule SYSTEM "rule.dtd">
    <mycat:rule xmlns:mycat="http://org.opencloudb/">
        <tableRule name="rule1">
            <rule>
                <columns>user_id</columns>
                <algorithm>func1</algorithm>
            </rule>
        </tableRule>
        <function name="func1" class="org.opencloudb.route.function.AutoPartitionByLong">
            <property name="mapFile">autopartition-long.txt</property>
        </function>
        
    </mycat:rule>
     

     

    7、 配置启动日志 log4j.xml

    <root>
        <level value="debug" />
        <appender-ref ref="FILE" />
         <!--<appender-ref ref="FILE" />-->
    </root>

     

    8、启动bin下startup_nowrap.bat

    9、 连接mycat_master主机

       

    10、 连接mycat_slave从机   (只读)

       

     特别注意

      1.在使用mycat连接SQLyog时,SQLyog版本不能太低,版本不能太低,不能太低,需要高版本!!!

  • 相关阅读:
    WP7编译问题:The application could not be launched for debugging
    cocos2dxnaTweeJump学习笔记1(都是自己看别人代码后所感所想,希望有懂的人指出我的错误或者大家交流交流)
    判断datatalbe是否为空
    SOAP协议基础(转自Ksxs's )
    那些年我还不懂:IList,ICollection,IEnumerable,IEnumerator,IQueryable(转)
    MyEclipse中 智能提示 JSP 页面的html 标记属性值
    MyEclipse中设置智能提示
    MyEclipse快捷键大全
    向朋友借钱:文章值得一读,让人思索良久
    生存逼着我成功
  • 原文地址:https://www.cnblogs.com/lowerma/p/12349476.html
Copyright © 2020-2023  润新知