MQSQL的主从复制&读写分离

分表分库的几种形式

作为了解,后续会有分库分表的。这里先了解下概念。如果不想看,可以直接跳到MySQL 主从复制

垂直拆分

   一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业务将表进行分类,
分布到不同的数据库上面,这样也就将数据或者说压力分担到不同的库上面,如下图:

   简单的说:一个服务有多个模块,每个模块对应着一个数据库,每个数据库对应着每个表

在这里插入图片描述

优点:
        1. 拆分后业务清晰,拆分规则明确。
        2. 系统之间整合或扩展容易。
        3. 数据维护简单。
 
缺点:
        1. 部分业务表无法join,只能通过接口方式解决,提高了系统复杂度。
        2. 受每种业务不同的限制存在单库性能瓶颈,不易数据扩展跟性能提高。
        3. 事务处理复杂。

水平拆分

    垂直拆分后遇到单机瓶颈,可以使用水平拆分。相对于垂直拆分的区别是:垂直拆分是把不同的表拆到不同的数据库中,
 而水平拆分是把同一个表拆到不同的数据库中。
 
    相对于垂直拆分,水平拆分不是将表的数据做分类,而是按照某个字段的某种规则来分散到多个库之中,
每个表中包含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中 
的某些行切分到一个数据库,而另外的某些行又切分到其他的数据库中,主要有分表,分库两种模式,如图:

   简单的说:一个表的数据,分别拆分到了不同的数据库

在这里插入图片描述

优点:
        1. 不存在单库大数据,高并发的性能瓶颈。
        2. 对应用透明,应用端改造较少。     
        3. 按照合理拆分规则拆分,join操作基本避免跨库。
        4. 提高了系统的稳定性跟负载能力。
 
缺点:
        1. 拆分规则难以抽象。
        2. 分片事务一致性难以解决。
        3. 数据多次扩展难度跟维护量极大。
        4. 跨库join性能较差。

水平拆分如何均匀的存放在每个数据库

加入目前有3个数据库,加入进行访问,那么此时我们该访问那个数据库呢?
在这里插入图片描述
从上面的图中,我们可以知道,当我们添加了一个值,如果我们根据传递过来的userID%数据库的数量,根据求摸的值,对应数据库的数据进行分配

MySQL 主从复制

在这里插入图片描述
主机和备机他们之间会保持一个长连接的状态,他的任何操作都会存在一个2进制SQL执行文件,当备机相同步数据的时候,主机把这个2进制SQL发送给备机,执行脚本即可保持和备机之间的数据一致性。如果备机连接不上,他此时会有重试机制的。

主从复制的配置

192.168.110.179(主服务器) 192.168.110.180(从服务器)

1:启动mysql服务器
service mysqld start
2 :关闭防火墙
service iptables stop
3:客户端连接主从服务器的Mysql (Navicat或者其他随意)
4:配置主节点信息(server_id 用于标识设置主服务器)
以下的操作为主服务器的操作

vi /etc/my.cnf  新增以下内容
server_id=177  ###服务器id
log-bin=mysql-bin   ###开启日志文件

在这里插入图片描述
然后重启mysql服务器

service mysql restart

我们在客户端进行验证server_id配置是否生效

SHOW VARIABLES LIKE 'server_id'

查询主服务的状态

show master status;

在这里插入图片描述

给从服务器授权可以连接主服务器的数据库,这个操作在主服务上进行操作

mysync为账号   q123456为密码
GRANT REPLICATION SLAVE ON *.* to 'mysync'@'%' identified by 'q123456';

如果结果为null,则主服务器my.cnf没有配置好,而这个file文件,就是在主从复制同步给从服务器的二进制sql文件
以下的修改为从服务器的操作

server_id=178  # 这个值是唯一的,不能重复
log-bin=mysql-bin  #  你要主从复制的是主的那个数据库
binlog_do_db=test

在从从服务器拉取主服务的信息

192.168.110.179 你要同步的主机
q123456  你要同步的密码
mysql-bin.000002 我们要传输的二进制sql文件
master_log_pos 通查询二进制sql文件命令显示的position值
change master to master_host='192.168.110.179',master_user='mysync',master_password='q123456',
         master_log_file='mysql-bin.000002',master_log_pos=343;

通过操作这个命令,判断是否同步成功

SHOW SLAVE STATUS

在这里插入图片描述
这要能出现两个yes,基本上就是成功啦
剩下的操作和主服务没有区啦

读写分离

读写分离的简单的含义:好比一个数据库专门做写的操作,另一个数据库做读的操作。一般主服务做读,从服务器做写。假如配置完了读写分离,如果让主服务进行写的操作的话,那么此时就会报错。类似的架构模式如下图
通过我们刚刚配置的主从复制,我们可以通过mysql核心自带的配置文件进行配置,但是读写分离,到了这里已经不能利用mysql的自带的配置文件进行配置,此时我们可以采用mycat第三方插件进行配置
在这里插入图片描述

读写分离的配置

Mycat的具体百度云下载链接为

链接:https://pan.baidu.com/s/1KUvDl12itFF9uALWQC9e1Q 
提取码:1kbs 

先看一下具体的结构目录

创建表结构
这个语句执行在主服务器就可以啦,因为有主从复制的存在,从服务不用执行这个脚本啦

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
在这里插入图片描述


	<!-- 添加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>

配置schema.xml文件

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
    <!-- 与server.xml中user的schemas名一致 -->
    <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="172.27.185.179:3306" user="root" password="root">  ##配置写的服务器
        </writeHost>
        <writeHost host="hostSlave" url="172.27.185.180:3306" user="root" password="root"/>  ## 配置从服务器
    </dataHost>
    
</mycat:schema>

配置rule.xml文件
这个可以直接粘贴替换

<?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 - - http://www.apache.org/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="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>

为了更好的发现问题 ,开启日志记录

修改log4j.xml
<level value="debug" />

此时我们启动mycat
双击startup_nowrap.bat开始启动

此时我们连接的不是主从服务啦,而是mycat的给我们虚拟的数据库,我们进行连接

在这里插入图片描述
然后进行读写操作,看看主从的数据是否同步就可完成读写分离

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值