APP下载

Myql主从复制与读写分离

消息来源:baojiabao.com 作者: 发布时间:2024-06-15

报价宝综合消息Myql主从复制与读写分离

主从复制

概念

影响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` (

`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;

配置server.xml

mycat

mycat

mycat_red

mycat

true

配置schema.xml

writeType="0" dbType="mysql" dbDriver="native" switchType="1"

slaveThreshold="100">

select user()

配置rule.xml档案

user_id

func1

autopartition-long.txt

为了更好地定位错误,修改log4j.xml

双击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’;

2019-08-29 02:56:00

相关文章