分表分库的几种形式
作为了解,后续会有分库分表的。这里先了解下概念。如果不想看,可以直接跳到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的给我们虚拟的数据库,我们进行连接
然后进行读写操作,看看主从的数据是否同步就可完成读写分离