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读写分离的主要内容,如果未能解决你的问题,请参考以下文章