当前位置: 代码迷 >> 综合 >> mycat 垂直切分
  详细解决方案

mycat 垂直切分

热度:29   发布时间:2024-01-26 04:04:53.0
[root@bogon conf]# pwd
/usr/local/mycat/conf
[root@bogon conf]# vim schema.xml

把商品的表、订单的表,放到各子的数据库里面

mycat访问后端的,mysql数据节点的连接信息的

#在slave机子上,随机的读请求
balance=“3”

检测对后端的服务器进行检测 ,后端的可用性
select user()

mycat连接后端数据库的用户
user=“im_mycat”

set global validate_password_policy=LOW

#在master 192.168.194.154 创建 账户

create user im_mycat@'192.168.194.%' identified by '12345678';

#授权

grant select,insert,update,delete on *.* to im_mycat@'192.168.194.%';

3台slave服务器

  <dataHost name="mysql0155" maxCon="1000" minCon="10" balance="3"writeType="0" dbType="mysql" dbDriver="native" switchType="1"><heartbeat>select user()</heartbeat><writeHost host="192.168.194.155" url="192.168.194.155:3306" user="im_mycat" password="12345678"/></dataHost><dataHost name="mysql0157" maxCon="1000" minCon="10" balance="3"writeType="0" dbType="mysql" dbDriver="native" switchType="1"><heartbeat>select user()</heartbeat><writeHost host="192.168.194.157" url="192.168.194.157:3306" user="im_mycat" password="12345678"/></dataHost><dataHost name="mysql0158" maxCon="1000" minCon="10" balance="3"writeType="0" dbType="mysql" dbDriver="native" switchType="1"><heartbeat>select user()</heartbeat><writeHost host="192.168.194.158" url="192.168.194.158:3306" user="im_mycat" password="12345678"/></dataHost>

3个节点 对应的数据库

           <dataNode name="custdb" dataHost="mysql0158" database="customer_db" /><dataNode name="ordb" dataHost="mysql0155" database="order_db" /><dataNode name="prodb" dataHost="mysql0157" database="product_db" />

逻辑表和物理表的名字和主键是一致的

逻辑表

        		<schema name="imooc_db" checkSQLschema="false" sqlMaxLimit="100"><table name="order_master" primaryKey="order_id" dataNode="ordb" /><table name="order_detail" primaryKey="order_detail_id" dataNode="ordb" /><table name="order_cart" primaryKey="cart_id" dataNode="ordb" /><table name="order_customer_addr" primaryKey="customer_addr_id" dataNode="ordb" /><table name="region_info" primaryKey="region_id" dataNode="ordb" /><table name="shipping_info" primaryKey="ship_id" dataNode="ordb" /><table name="warehouse_info" primaryKey="w_id" dataNode="ordb" /><table name="warehouse_proudct" primaryKey="wp_id" dataNode="ordb" /><table name="product_brand_info" primaryKey="brand_id" dataNode="prodb" /><table name="product_category" primaryKey="category_id" dataNode="prodb" /><table name="product_comment" primaryKey="comment_id" dataNode="prodb" /><table name="product_info" primaryKey="product_id" dataNode="prodb" /><table name="product_supplier_info" primaryKey="supplier_id" dataNode="prodb" /><table name="product_pic_info" primaryKey="product_pic_id" dataNode="prodb" /></schema>
[root@bogon conf]# pwd
/usr/local/mycat/conf

对外提供服务端口 serverPort
mycat管理端口 managerPort 通过mycat管理命令,状态信息监控
mycat登录是否需要用户密码验证 、0是需要密码 1不需要密码
监控ip bindIP
前端写队列的大小 frontWriteQueueSize 2048
默认隔离级别 txIsolation 2(读已提交) 读未提交 读已经提交 可重复读 序列化读
mycat进程数量 processors 8
前端应用多长时间没有访问,就主动断开 idleTimeout 1800000秒
mycat访问数据集的大小,分布式中间件 ,返回数据集的限制 100 要不然浪费资源
maxPacketSIze 包的大小

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/"><schema name="immoc_db" checkSQLschema="false" sqlMaxLimit="100"><table name="order_master" primaryKey="order_id" dataNode="ordb" /><table name="order_detail" primaryKey="order_detail_id" dataNode="ordb" /><table name="order_cart" primaryKey="cart_id" dataNode="ordb" /><table name="order_customer_addr" primaryKey="customer_addr_id" dataNode="ordb" /><table name="region_info" primaryKey="region_id" dataNode="ordb" /><table name="shipping_info" primaryKey="ship_id" dataNode="ordb" /><table name="warehouse_info" primaryKey="w_id" dataNode="ordb" /><table name="warehouse_proudct" primaryKey="wp_id" dataNode="ordb" /><table name="product_brand_info" primaryKey="brand_id" dataNode="prodb" /><table name="product_category" primaryKey="category_id" dataNode="prodb" /><table name="product_comment" primaryKey="comment_id" dataNode="prodb" /><table name="product_info" primaryKey="product_id" dataNode="prodb" /><table name="product_supplier_info" primaryKey="supplier_id" dataNode="prodb" /><table name="product_pic_info" primaryKey="product_pic_id" dataNode="prodb" /></schema><dataNode name="custdb" dataHost="mysql0158" database="customer_db" /><dataNode name="ordb" dataHost="mysql0155" database="order_db" /><dataNode name="prodb" dataHost="mysql0157" database="product_db" /><dataHost name="mysql0155" maxCon="1000" minCon="10" balance="3"writeType="0" dbType="mysql" dbDriver="native" switchType="1"><heartbeat>select user()</heartbeat><writeHost host="192.168.194.155" url="192.168.194.155:3306" user="im_mycat" password="12345678"/></dataHost><dataHost name="mysql0157" maxCon="1000" minCon="10" balance="3"writeType="0" dbType="mysql" dbDriver="native" switchType="1"><heartbeat>select user()</heartbeat><writeHost host="192.168.194.157" url="192.168.194.157:3306" user="im_mycat" password="12345678"/></dataHost><dataHost name="mysql0158" maxCon="1000" minCon="10" balance="3"writeType="0" dbType="mysql" dbDriver="native" switchType="1"><heartbeat>select user()</heartbeat><writeHost host="192.168.194.158" url="192.168.194.158:3306" user="im_mycat" password="12345678"/></dataHost></mycat:schema>

#密码加密

[root@bogon lib]# java -cp Mycat-server-1.6.5-release.jar io.mycat.util.DecryptUtil 0:app_imooc:12345678

0是明问加密

开发接口 ,做数据的冗余

[root@bogon conf]# pwd
/usr/local/mycat/conf
[root@bogon conf]# vim server.xml 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/"><system><property name="serverPort">8077</property><property name="managerPort">9066</property><property name="nonePasswordLogin">0</property><property name="bindIp">0.0.0.0</property><property name="frontWriteQueueSize">2048</property><property name="charset">utf8</property><property name="txIsolation">2</property><property name="processors">8</property><property name="idleTimeout">1800000</property><property name="sqlExecuteTimeout">300</property><property name="useSqlStat">0</property><property name="useGlobleTableCheck">0</property><property name="sequnceHandlerType">1</property><property name="defaultMaxLimit">100</property><property name="maxPacketSize">104857600</property></system><user name="app_imooc" defaultAccount="true"><property name="usingDecrypt">1</property><property name="password">I2LskkzmyIwIUiKU4UC8oDXVkz84k7sHuwoZlewVXM+6+jACm884c6sK7VdvtddwW/nwzEjdZJ69/Ujk0BELWw==</property><property name="schemas">imooc_db</property></user></mycat:server>
~                   

数据冗余的方式,把这个省市取的信息,冗余到我们商品模块,供应商信息表中

全局表
跨分片关联操作的

[root@bogon conf]# vim server.xml
下的是app_imooc的用户 能访问到的是逻辑数据库,而不是物理数据库(order_db,product_db,customer_db)

[root@bogon ~]# mysql -uapp_imooc -p12345678 -P8077 -h192.168.194.154

在这里插入图片描述

这下面都是逻辑库,包含逻辑表
可以通过逻辑库,来访问后端3台物理数据库中的物理表
逻辑库模拟物理imooc_db的表

一、清理多余数据

  1. 节点2、3、4 上 把主从电路同步停止掉
  2. 垂直切分是分担写的负载,另一方面,是减少每一个节点中数据的数据量大小,删除掉原本不属于该节点模块的数据,所以要先停掉主从同步

步骤

  1. stop slave;
  2. show slave status \G ;
  3. 主从信息清除掉 reset slave all;
  4. show slave status \G ;

#删除表的名字
drop table 表的名字

二、跨分片的查询

mysql -uapp_imooc -p12345678 -h192.168.194.154 -P8077

在逻辑库中的表并没有减少,看到的是确实逻辑库中的表,不是物理表

尽量的要把,经常一起关联的表,放到同一个分片节点上 ,mycat跨分片的支持非常差的 –全局表

全局表 来处理 跨分片关联操作的 ,所有分片都会存在全局表 region_info这个表以相同的数据存储在三个物理节点中

192.168.194.155的节点region_info的表拷贝到其它两个节点当中

导出

 mysqldump -uroot -p order_db region_info > region_info;

在复制到其它服务器上

[root@bogon ~]# scp region_info root@192.168.194.158:/root

导入

mysql -uroot -p customer_db < region_info

在所有的节点中都存在这个表region_info 才叫做全局表

全局表也是逻辑表

[root@bogon conf]# pwd
/usr/local/mycat/conf
[root@bogon conf]# vim schema.xml 

全局表 在192.168.194.154的master上
在这里插入图片描述

#在192.168.194.158

[root@bogon ~]# mysql -uapp_imooc -p12345678 -P8077 -h192.168.194.154
mysql> select supplier_name,b.region_name as '省',c.region_name as '市',d.region_name as '区' from product_supplier_info a -> join region_info b on b.region_id=a.province-> join region_info c on c.region_id = a.city-> join region_info d on d.region_id=a.district;

在这里插入图片描述

注意 全局表必须通过mycat来操作,要不然就会导致数据不一致了,每个服务器

show variables like 'read_only';
set global read_only=off;

三、优缺点

一个物理DB,拆分多个DB

  1. 数据库的拆分简单明了,拆分规则明确
    - 先主从复制,把拆分的数据复制到新的数据库,在通过mycat来实现拆分逻辑,对拆分好的数据库进行访问

  2. 应用程序模块清晰明确,整合容易

  3. 数据维护方便易行,容易定为

缺点

  1. 部分表关联无法在数据库级别完成,需要在程序中完成
  2. 对于访问极其频繁且数据量超大的表仍然存在性能瓶颈
  3. 切分达到一定程序之后,扩展性会遇到限制

解决跨分片关联的方式

  1. 使用Mycat全局表
  2. 冗余部分关键数据
  3. 使用API的方式获取数据,或者用程序来查询,在组合在一起

ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
https://blog.csdn.net/hello_world_qwp/article/details/79551789