[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的表
一、清理多余数据
- 节点2、3、4 上 把主从电路同步停止掉
- 垂直切分是分担写的负载,另一方面,是减少每一个节点中数据的数据量大小,删除掉原本不属于该节点模块的数据,所以要先停掉主从同步
步骤
- stop slave;
- show slave status \G ;
- 主从信息清除掉 reset slave all;
- 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
-
数据库的拆分简单明了,拆分规则明确
- 先主从复制,把拆分的数据复制到新的数据库,在通过mycat来实现拆分逻辑,对拆分好的数据库进行访问 -
应用程序模块清晰明确,整合容易
-
数据维护方便易行,容易定为
缺点
- 部分表关联无法在数据库级别完成,需要在程序中完成
- 对于访问极其频繁且数据量超大的表仍然存在性能瓶颈
- 切分达到一定程序之后,扩展性会遇到限制
解决跨分片关联的方式
- 使用Mycat全局表
- 冗余部分关键数据
- 使用API的方式获取数据,或者用程序来查询,在组合在一起
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
https://blog.csdn.net/hello_world_qwp/article/details/79551789