读写分离|分库分表

MyCat读写分离.分库分表

分库分表概述

1.互联网大数据时代,如何解决数据库性能瓶颈
2.读多写少的情况,采用读写分离
3.海量数据的情况,采用数据切分
数据切分方式1: 垂直切分
数据切分方式2: 水平切分
4.实现读写分离和数据切分的两种模式:
模式一:中间层代理(例如Mycat)
模式二:客户端模式(例如Sharding-jdbc)

《阿里巴巴java开发手册》:
【推荐】单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表。
说明:如果预计三年后的数据量根本达不到这个级别,请不要在创建表时就分库分表。

如何选择垂直切分/水平切分

建议:先选择垂直拆分再考虑水平拆分
在这里插入图片描述

垂直拆分

1.按照业务去切分
2.每种业务一个数据库(比如:用户库,订单库,商品库)
3.不同业务之间,禁止跨库join联查

优点:
1.拆分后业务清晰,拆分规则明确
2.系统之间容易扩展和整合
3.数据维护简单

缺点:
1.部分业务表无法join,只能通过接口调用,提升了系统的复杂度
2.跨库事务难以处理
3.垂直切分后,某些业务数据过于庞大,仍然存在单体性能瓶颈-----考虑水平拆分

水平切分

1.将一张表的数据按照某种规则分到不同的数据库
2.需确定分片的规则
3.使用分片字段查询时,可确定实体库,其它字段查询,查询所有表

优点:
1.解决了单库大数据,高并发的性能瓶颈
2.拆分规则封装好,对应用端几乎透明,开发人员无需关心拆分细节
3.提高了系统的稳定性和负载能力

缺点:
1.拆分规则很难抽象
2.分片事务一致性难以解决
3.二次扩展时,数据迁移,维护难度大

Mycat安装

mycat安装

mycat中的分库分表、读写分离的配置

server.xml

1.配置Mycat的用户名、密码、权限、Schema等
2.如同给Mysql新建用户一样
3.客户端连接Mycat与连接Mysql无异

<mycat:server>
	.....
	<user name="root" defaultAccount="true">
		<property name="password">123456</property>
		<property name="schemas">user</property>
		</privileges>
	</user>
</mycat:server>
schema.xml(核心配置文件)

1.配置dataHost(节点主机),包括读host、写host
2.配置dataNode(数据节点),指定到具体的数据库
3.配置schema,表名、数据节点、分片规则等
4.schema标签中,checkSQLschema是否去掉SQL中的schema
5.sqlMaxLimit:select默认的limit值,仅对分片表有效.
6.table标签,定义表, name属性,定义逻辑表的表名;dataNode属性,定义逻辑表的数据节点,
rule属性:定义分片表的分片规则,必须与rule.xml中的tableRule对应;ruleRequired属性,是否绑定分片规则,如果为true,没有绑定分.
配规则,程序报错

<mycat:schema>
		<schema name="user" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="dn1">
			<table name="user" dataNode="dn1,dn2" rule="auto-sharding-long" splitTableNames ="true"/>
		</schema>
		<dataNode name="dn1" dataHost="mysqlone" database="user" />
		<dataNode name="dn2" dataHost="mysqltwo" database="user" />
		<dataHost name="mysqlone" maxCon="1000" minCon="10" balance="0" 
		          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
 				  <heartbeat>select user()</heartbeat>
 				  <writeHost host="hostM1" url="192.168.1.106:3306" user="root"
                                   password="123456">
                  </writeHost>
        </dataHost>
        <dataHost name="mysqltwo" maxCon="1000" minCon="10" balance="0"
                  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                  <heartbeat>select user()</heartbeat>
                  <writeHost host="hostM1" url="192.168.1.110:3306" user="root"
                                   password="123456">
                  </writeHost>
         </dataHost> 
</mycat:schema>

mycat的2个端口

8066 数据访问端口,即进行 DML 和 DDL 操作;
9066数据库管理端口,即 mycat 服务管理控制功能,用于管理mycat的整个集群状态;

管理端口的命令使用

Mysql主从配置

1.	主 配置log-bin,指定文件的名字
2.	主 配置server-id,默认为1
3.	从 配置server-id,与主不能重复	
.................下面步骤主要是创建备份账号,将主的数据导出(主的数据库要进行锁表,防止新插入数据),并导入到从的数据库中.............
4.	主 创建备份账户并授权 REPLICATION SLAVE
5.	主 进行锁表  FLUSH TABLES WITH READ LOCK;
6. 主 找到log-bin的位置 SHOW MASTER STATUS;
7. 主 备份数据  mysqldump --all-databases --master-data >dbdump.db
8. 主 进行解锁 UNLOCK TABLES;
9. 从 导入dump的数据;
...............................................................................................................................
10.在 从上设置主的配置
mysql > CHANGE MASTER TO 
          >MASTER_HOST='master_host_name',
          >MASTER_USER='replication_user_name',
          >MASTER_PASSWORD='replication_password',
          >MASTER_LOG_FILE='recorded_log_file_name',
          > MASTER_LOG_POS=recorded_log_position;
[mysql主从配置](https://www.cnblogs.com/zhoujie/p/mysql1.html)

分片规则

枚举分片

枚举分片
1.schema.xml

 <table name="user" dataNode="dn1,dn2" **rule="sharding-by-intfile"** splitTableNames ="true"/>

2.rule.xml

<tableRule name="sharding-by-intfile">
      <rule>
           <columns>sharding_id</columns>
           <algorithm>hash-int</algorithm>
      </rule>
</tableRule>
<function name="hash-int" class="io.mycat.route.function.PartitionByFileMap">
        <property name="mapFile">partition-hash-int.txt</property>
</function>

3.partition-hash-int.txt

取模

1.schema.xml

 <table name="user" dataNode="dn1,dn2" **rule="mod-long"** splitTableNames ="true"/>

2.rule.xml

<tableRule name="mod-long">
     <rule>
           <columns>id</columns>
           <algorithm>mod-long</algorithm>
     </rule>
 </tableRule>

 <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
          <!-- how many data nodes -->
          <property name="count">2</property>
 </function>

全局表

全局表
schema.xml
type属性:global为全局表,不指定则为分片表

<table name="province" dataNode="dn1,dn2" type="global"/>

子表

避免关联表跨库
1.childTable标签,定义分片子表
2.name属性,子表名称
3.joinKey属性,标志子表中的列,用于与父表做关联
4.parentKey标签,标志父表中的列,于joinKey对应
5.primaryKey属性,子表主键,同table标签
6.needAddLimit属性,同table标签

<table name="o_order" dataNode="dn1,dn2" rule="auto-sharding-long">
        <childTable name="order_item" joinKey="order_id" parentKey="id"/>
</table>

Mycat的HA

1.互联网时代,对系统可靠性要求高
2.避免单点故障
3.系统应用、数据库、缓存都是双节点
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值