mycat的使用
程序员文章站
2022-03-20 13:36:16
...
2020年7月2日
复习
-
消息确认机制
- 发送确认
- confirm mq确认收到消息
- return 发送队列时失败
- 消费确认
- ack: 手动(ack / nack requeue) | 自动
- 代码:
- 发送确认: channel.confirmSelect / confirmListener / returnListener
- autoAck / channel.basicAck / basicNack
- 发送确认
-
spring-boot集成rabbitmq
- starter-amqp
- application.yml
- rabbitmq链接
- mq配置
- 交换机+队列+绑定
- 发送 RabbitTemplate
- 消费端配置
- SimpleMessageListenerContainer
- @RabbitListener(队列名)
-
秒杀
- 解决方案
- 静态化+cdn 加速
- js 禁用按钮
- 限流,流控组件
- redis缓存 判断库存
- redis预减
- 发送到队列
- 取出消息,存入数据库
- 查询订单状态
- 分布式session
- 解决方案
数据量大的几种解决方案
- mysql集群, 主从,读写分离
- 冷热分离,部分冷数据(不经常使用的数据)移到另一个表中备份,减少主表的数据量
- 分库分表 mycat/ shadingjdbc
- NewSQL数据库,hbase
Mycat
- 逻辑库 / 逻辑表 mycat维护的虚拟的库和表
- 物理库 / 物理表 真实的mysql数据库和表
- 数据主机 数据库所在的主机
- 数据节点 一个数据库的实例
mycat安装
-
下载 http://dl.mycat.io/
-
解压
-
配置修改
- wrapper.conf
wrapper.java.additional.9=-Xmx512M
wrapper.java.additional.10=-Xms64M
-
启动mycat (bin目录下)
- mycat console 在控制台输出日志,初期使用
- mycat install 再执行 mycat start
-
连接mycat 默认端口 8066
- 设定 用户名 和密码 (conf/server.xml)
<user name="mycat" defaultAccount="true">
<property name="password">abc123</property>
<property name="schemas">TESTDB</property>
<property name="defaultSchema">TESTDB</property>
</user>
mycat使用
-
server.xml 修改user的schema,把TESTDB改成miaosha
-
schema.xml 配置逻辑库逻辑表等
- schema name
- table
- dataNode
- dataHost
- writeHost
- schema name
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- 逻辑库 -->
<schema name="miaosha" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="dn1">
<!-- auto sharding by id (long) -->
<!--splitTableNames 启用<table name 属性使用逗号分割配置多个表,即多个表使用这个配置-->
<!-- <table name="travelrecord,address" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" splitTableNames ="true"/> -->
<!-- 逻辑表 -->
<!-- name: 逻辑表名 -->
<!-- dataNode: 指向数据节点 -->
<!-- subTables: 子表 -->
<!-- primaryKey: 主键 -->
<!-- rule: 如何拆分数据,规则从rule.xml中获取 -->
<table name="sk_product" dataNode="dn1" subTables="sk_product_$1-3" primaryKey="product_id" rule="product-mod-long"/>
</schema>
<!-- 数据节点 -->
<!-- dataHost:指向下面的数据主机配置 -->
<!-- database:物理的数据库 -->
<dataNode name="dn1" dataHost="dev" database="mycattest" />
<!-- 数据主机 -->
<dataHost name="dev" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- 写主机的配置:指向你的数据库 jdbc:mysql://localhost:3306/ -->
<writeHost host="hostM1" url="localhost:3306" user="root"
password="root123">
</writeHost>
<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>
</mycat:schema>
rule.xml
- tableRule 对用某一张表所使用的规则 ,算法由function提供
<!-- 产品表规则 -->
<tableRule name="product-mod-long">
<rule>
<!-- 对应到数据库的列 -->
<columns>product_id</columns>
<!-- 对应到分片的算法function -->
<algorithm>maiz-mod-long</algorithm>
</rule>
</tableRule>
function
<!-- 分片的算法 -->
<function name="maiz-mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">3</property>
</function>
-
重启mycat
-
编写程序访问
- 数据库配置指向mycat
spring:
datasource:
url: jdbc:mysql://localhost:8066/miaosha
username: mycat
password: abc123
driver-class-name: com.mysql.jdbc.Driver
实体类与逻辑表对应
package com.woniuxy.mycat.mycatdemo34.entity;
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "sk_product")
@Data
public class Product {
@Id
private int productId;
private String productName;
private double price;
private int stock;
private int salesCount;
}
主从搭建:
常用命令
mycat start
mycat install
mycat restart
sc delete mysqlm1
主机
-
解压
-
修改配置文件: my-default.ini
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
server_id=2
log_bin=master-bin
log_bin-index=master-bin.index
# These are commonly set, remove the # and set as required.
# basedir = .....
# datadir = .....
# port = .....
# server_id = .....
basedir ="D:\\java\Mycat\mysql1"
datadir ="D:\\java\Mycat\mysql1\\data"
port =23306
- 安装为服务 进入bin目录
`mysqld --install mysql1 --defaults-file=''D:\\java\Mycat\mysql1\my-default.ini'' `
- 启动服务 net start mysqlm1
从机
配置不同,其他一样
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
server_id=3
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin
# These are commonly set, remove the # and set as required.
# basedir = .....
# datadir = .....
# port = .....
# server_id = .....
basedir ="D:\\java\Mycat\mysql2"
datadir ="D:\\java\Mycat\mysql2\\data"
port =23307
`mysqld --install mysql2 --defaults-file="D:\\java\Mycat\mysql2\my-default.ini" `
启动服务 `net start mysql2
主从关联
– 主从配置
– 主机
show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 | 120 | | | |
+-------------------+----------+--------------+------------------+-------------------+
-- 从机
show slave status;
CHANGE MASTER TO
MASTER_HOST='localhost',
MASTER_USER='root',
master_port=23306,
MASTER_PASSWORD='',
MASTER_LOG_FILE='master-bin.000001',
MASTER_LOG_POS=120;
stop slave;
start slave ;
show slave status;