MySQL读写分离

Posted 流氓大队长

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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版本不能太低,版本不能太低,不能太低,需要高版本!!!

以上是关于MySQL读写分离的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中间件proxysql实现MySQL读写分离

mysql读写分离

Zend Framework中如何实现MySQL的读写分离 - PHP框架开发

mysql读写分离

MySQL主从复制与读写分离

mysql中间件proxysql实现mysql读写分离