欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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安装

  1. 下载 http://dl.mycat.io/

  2. 解压

  3. 配置修改

    • wrapper.conf
wrapper.java.additional.9=-Xmx512M
wrapper.java.additional.10=-Xms64M
  1. 启动mycat (bin目录下)

    • mycat console 在控制台输出日志,初期使用
    • mycat install 再执行 mycat start
  2. 连接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
<?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

主机

  1. 解压

  2. 修改配置文件: 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
  1. 安装为服务 进入bin目录
   `mysqld --install mysql1 --defaults-file=''D:\\java\Mycat\mysql1\my-default.ini'' `
  1. 启动服务 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; 
相关标签: 我的学习