MySQL主从复制与读写分离原理及⽤法详解
本⽂实例讲述了MySQL主从复制与读写分离原理及⽤法。分享给⼤家供⼤家参考,具体如下:
主从复制
概念
影响MySQL-A数据库的操作,在数据库执⾏后,都会写⼊本地的⽇志系统A中。
假设,实时的将变化了的⽇志系统中的数据库事件操作,在MYSQL-A的3306端⼝,通过⽹络发给MYSQL-B。
MYSQL-B收到后,写⼊本地⽇志系统B,然后⼀条条的将数据库事件在数据库中完成。
那么,MYSQL-A的变化,MYSQL-B也会变化,这样就是所谓的MYSQL的复制,即MYSQL replication。
在上⾯的模型中,MYSQL-A就是主服务器,即master,MYSQL-B就是从服务器,即slave。
⽇志系统A,其实它是MYSQL的⽇志类型中的⼆进制⽇志,也就是专门⽤来保存修改数据库表的所有动作,即bin log。【注意MYSQL会在执⾏语句之后,释放锁之前,写⼊⼆进制⽇志,确保事务安全】
⽇志系统B,并不是⼆进制⽇志,由于它是从MYSQL-A的⼆进制⽇志复制过来的,并不是⾃⼰的数据库变化产⽣的,有点接⼒的感觉,称为中继⽇志,即relay log。
可以发现,通过上⾯的机制,可以保证MYSQL-A和MYSQL-B的数据库数据⼀致,但是时间上肯定有延迟,即MYSQL-B的数据是滞后的。
【即便不考虑什么⽹络的因素,MYSQL-A的数据库操作是可以并发的执⾏的,但是MYSQL-B只能从relay log中读⼀条,执⾏下。因此MYSQL-A的写操作很频繁,MYSQL-B很可能跟不上。】
解决问题
数据如何不被丢失
备份
读写分离
数据库负载均衡
⾼可⽤
环境搭建
1.准备环境
两台windows操作系统 ip分别为: 172.27.185.1(主)、172.27.185.2(从)
2.连接到主服务(172.27.185.1)服务器上,给从节点分配账号权限。
GRANT REPLICATION SLAVE ON . TO ‘root'@‘172.27.185.2' IDENTIFIED BY ‘root';
3.在主服务my.ini⽂件新增
server-id=200
log-bin=mysql-bin
relay-log=relay-bin
relay-log-index=relay-bin-index
重启mysql服务
4.在从服务my.ini⽂件新增
server-id = 210
replicate-do-db =itmayiedu #需要同步数据库
重启mysql服务
5.从服务同步主数据库
stop slave;
change
master to master_host='172.27.185.1',master_user='root',master_password='root';
start slave;
show slave status;
注意事项
①⼀定要在同⼀个局域⽹中
②使⽤360WiFi创建局域⽹
③最好把防⽕墙全部关闭掉
什么是读写分离
在数据库集架构中,让主库负责处理事务性查询,⽽从库只负责处理select查询,让两者分⼯明确达
到提⾼数据库整体读写性能。当然,主数据库另外⼀个功能就是负责将事务性查询导致的数据变更同步到从库中,也就是写操作。
读写分离的好处
1)分摊服务器压⼒,提⾼机器的系统处理效率
读写分离适⽤于读远⽐写的场景,如果有⼀台服务器,当select很多时,update和delete会被这些select访问中的数据堵塞,等待select结束,并发性能并不⾼,⽽主从只负责各⾃的写和读,极⼤程度的缓解X锁和S锁争⽤;
假如我们有1主3从,不考虑上述1中提到的从库单⽅⾯设置,假设现在1分钟内有10条写⼊,150条读取。那么,1主3从相当于共计40条写⼊,⽽读取总数没变,因此平均下来每台服务器承担了10条写⼊和50条读取(主库不承担读取操作)。因此,虽然写⼊没变,但是读取⼤⼤分摊了,提⾼了系统性能。另外,当读取被分摊后,⼜间接提⾼了写⼊的性能。所以,总体性能提⾼了,说⽩了就是拿机器和带宽换性能;
2)增加冗余,提⾼服务可⽤性,当⼀台数据库服务器宕机后可以调整另外⼀台从库以最快速度恢复服务
主从复制原理
依赖于⼆进制⽇志,binary-log.
边框简单又漂亮简笔画图片⼆进制⽇志中记录引起数据库发⽣改变的语句
Insert 、delete、update、create table
Scale-up与Scale-out区别
Scale Out是指Application可以在⽔平⽅向上扩展。⼀般对数据中⼼的应⽤⽽⾔,Scale out指的是当添加更多的机器时,应⽤仍然可以很好的利⽤这些机器的资源来提升⾃⼰的效率从⽽达到很好的扩展性。
Scale Up是指Application可以在垂直⽅向上扩展。⼀般对单台机器⽽⾔,Scale Up值得是当某个计算节点(机器)添加更多的CPU Cores,存储设备,使⽤更⼤的内存时,应⽤可以很充分的利⽤这些资源来提升⾃⼰的效率从⽽达到很好的扩展性。MyCat
什么是 Mycat
是⼀个开源的分布式数据库系统,但是因为数据库⼀般都有⾃⼰的数据库引擎,⽽Mycat并没有属于⾃⼰的独有数据库引擎,所有严格意义上说并不能算是⼀个完整的数据库系统,只能说是⼀个在应⽤和数据库之间起桥梁作⽤的中间件。
在Mycat中间件出现之前,MySQL主从复制集,如果要实现读写分离,⼀般是在程序段实现,这样就带来了⼀个问题,即数据段和程序的耦合度太⾼,如果数据库的地址发⽣了改变,那么我的程序也要进⾏相应的修改,如果数据库不⼩⼼挂掉了,则同时也意味着程序的不可⽤,⽽对于很多应⽤来说,并不能接受;
引⼊Mycat中间件能很好地对程序和数据库进⾏解耦,这样,程序只需关注数据库中间件的地址,⽽⽆需知晓底层数据库是如何提供服务的,⼤量的通⽤数据聚合、事务、数据源切换等⼯作都由中间件来处理;
Mycat中间件的原理是对数据进⾏分⽚处理,从原有的⼀个库,被切分为多个分⽚数据库,所有的分⽚数据库集构成完成的数据库存储,有点类似磁盘阵列中的RAID0.
Mycat安装
创建表结构
CREATE DATABASE IF NOT EXISTS `weibo_simple`;
-- ------------------------------------
-- Table structure for `t_users` ⽤户表
-- ------------------------------------
DROP TABLE IF EXISTS `t_users`;
CREATE TABLE `t_users` (
laravel优缺点`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;
-- -------------------------------------
-- Table structure for `t_message`微博表
-- -------------------------------------
DROP TABLE IF EXISTS `t_message`;
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;
配置l
<!-- 添加user -->
<user name="mycat">
<property name="password">mycat</property>
<property name="schemas">mycat</property>
</user>
<!-- 添加user -->
<user name="mycat_red">
<property name="password">mycat_red</property>
<property name="schemas">mycat</property>
<property name="readOnly">true</property>
</user>
配置l
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="org.opencloudb/">
<!-- 与l中user的schemas名⼀致 -->
<schema name="mycat" checkSQLschema="true" sqlMaxLimit="100">
mysql怎么读英语<table name="t_users" primaryKey="user_id" dataNode="dn1" rule="rule1"/>
<table name="t_message" type="global" primaryKey="messages_id" dataNode="dn1" />
web安全入门书籍</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="172.27.185.1:3306" user="root" password="root">
</writeHost>
<writeHost host="hostSlave" url="172.27.185.2:3306" user="root" password="root"/>
</dataHost>
</mycat:schema>
配置l⽂件
<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License. - You
may obtain a copy of the License at - - /licenses/LICENSE-2.0
- - Unless required by applicable law or agreed to in writing, software -
distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the
License for the specific language governing permissions and - limitations
under the License. -->
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="org.opencloudb/">
<tableRule name="rule1">
<rule>
<columns>user_id</columns>
计算机计算器进制转换
<algorithm>func1</algorithm>
</rule>
</tableRule>
<function name="func1" class="ute.function.AutoPartitionByLong">
<property name="mapFile"&</property>
</function>
</mycat:rule>
为了更好地定位错误,修改l
双击startup_nowrap.bat开始启动
常见问题
SHOW MASTER STATUS 如果为,则在my.ini⽂件中添加⼀⾏
log-bin=mysql-bin
给账号分配权限
grant all privileges on . to ‘root'@‘172.27.185.1' identified by ‘root';
更多关于MySQL相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》及《》希望本⽂所述对⼤家MySQL数据库计有所帮助。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论