Mycat2【java提高】2

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Mycat2【java提高】2

2.2 启动

1、在mycat连接的mysql数据库里添加用户

创建用户·,用户名为mycat,密码为123456,赋权限,如下:’

….
CREATE USER 'mycat'@'%' IDENTIFIED BY '123456';
--必须要赋的权限mysql8才有的
GRANT XA_RECOVER_ADMIN  ON *.* TO 'root'@'%';
--视情况赋权限
GRANT ALL PRIVILEGES ON *.* TO 'mycat'@'%' ;
flush privileges;
···

2、修改mycat的prototype的配置

启动mycat之前需要确认prototype数据源所对应的mysal数据库配置,修改对应的user(用户) , password(密码), url中的ip

cd /usr/local/mycat
cd conf
vim prototypeDs.datasource.json
{
        "dbType":"mysql",
        "idleTimeout":60000,
        "initSqls":[],
        "initSqlsGetConnection":true,
        "instanceType":"READ_WRITE",
        "maxCon":1000,
        "maxConnectTimeout":3000,
        "maxRetryCount":5,
        "minCon":1,
        "name":"prototypeDs",
        "password":"123456",  #密码
        "type":"JDBC",
        "url":"jdbc:mysql://localhost:3306/mydb1?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",  #ip:localhost 提前创建原型库mydb1
        "user":"root",       #用户名
        "weight":0
}

3、验证数据库访问情况

Mycat 作为数据库中间件要和数据库部署在不同机器上,所以要验证远程访问情况。

mysql -uroot -p123456 -h 192.168.253.139 -P3306
mysql -uroot -p123456 -h 192.168.253.140 -P3306
#如远程访问报错,请建对应用户c
grant all privileges on *.* to root@'缺少的host' identified by '123456';

4、启动mycat

linux启动命令

cd mycat/bin
./mycat· start
./mycat status
./mycat start 启动
./mycat stop 停止
./mycat console 前台运行
./mycat install 添加到系统自动启动(暂未实现)
./mycat remove 取消随系统自动启动(暂未实现)
./mycat restart 重启服务
./mycat pause 暂停
./mycat status 查看启动状态…



2.3 登录

1、登录后台管理窗口

此登录方式用于管理维护 Mycat

mysql -umycat -p123456 -P 9066 -h 192.168.253.132
#常用命令如下:
show database
help;



第三章 Mycat2相关概念

3.1 概念描述

1、分库分表

按照一定规则把数据库中的表拆分为多个带有数据库实例,物理库,物理表访问路径的分表。

解读:

分库:一个电商项目,分为用户库、订单库等等。

分表:一张订单表数据数百万,达到MySQL单表瓶颈,分到多个数据库中的多张表
2、逻辑库

数据库代理中的数据库,它可以包含多个逻辑表。

解读:Mwcat.里定义的库,在逻辑上存在,物理上在MySQL里并不存在。有可能是多个MySQL 数据库共同组成I一个逻辑库。类似多个小孩叠罗汉穿上外套,扮演一个大人。
3、逻辑表

数据库代理中的表,它可以映射代理连接的数据库中的表(物理表)

解读:Mycat里定义的表,在逻辑上存在,可以映射真实的MySQL数据库的表。可以一对一,也可以一对多。
4、物理库

数据库代理连接的数据库中的库已解读:MySQL真实的数据库。

5、物理表

数据库代理连接的数据库中的表

解读:MySQL真实的数据库中的真实数据表。
6、拆分键

即分片键,描述拆分逻辑表的数据规则的字段

解读:比如订单表可以按照归属的用户id拆分,用户 id就是拆分键
7、物理分表

指已经进行数据拆分的,在数据库上面的物理表,是分片表的一个分区

解读:多个物理分表里的数据汇总就是逻辑表的全部数据

8、物理分库

一般指包含多个物理分表的库

解读:参与数据分片的实际数据库
9、分库

一般指通过多个数据库拆分分片表,每个数据库一个物理分表,物理分库名字相同

解读:分库是个动作,需要多个数据库参与。就像多个数据库是多个盘子,分库就是把一串数据葡萄,分到各个盘子里,而查询数据时,所有盘子的葡萄又通过Mycat2组成了完整的一串葡萄。

10、分片表,水平分片表

按照一定规则把数据拆分成多个分区的表,在分库分表语境下,它属于逻辑表的一种

解读:按照规则拆分数据,上个例子中的那串葡萄。
11、单表

没有分片,没有数据冗余的表,

解读:没有拆分数据,也没有复制数据到别的库的表。
12、全局表,广播表

每个数据库实例都冗余全量数据的逻辑表.

它通过表数据冗余,使分片表的分区与该表的数据在同一个数据库实例里,达到 join运算能够直接在该数据库实例里执行.它的数据一致一般是通过数据库代理分发SQL实现.也有基于集群日志的实现解读:例如系统中翻译字段的字典表,每个分片表都需要完整的字典数据翻译字段。

13、ER表

狭义指父子表中的子表,它的分片键指向父表的分片键,而且两表的分片算法相同

广义指具有相同数据分布的一组表

解读:关联别的表的子表,例如:订单详情表就是订单表的ER表

14、集群

多个数据节点组成的逻辑节点.在mycat2里,它是把对多个数据源地址视为一个数据源地址(名称),并提供自动故障恢复,转移,即实现高可用,负载均衡的组件。

解读:集群就是高可用、负载均衡的代名词
15、数据源

连接后端数据库的组件,它是数据库代理中连接后端数据库的客户端

解读:Mycat通过数据源连接MySQL数据库

16、原型库(prototype)

原型库是Mycat2后面的数据库,比如mysql库

解读:原型库就是存储数据的真实数据库,配置数据源时必须指定原型库

3.2 配置文件

1、服务(server)

服务相关配置

(1)->所在目录

mycat/conf

默认配置即可

2、用户(user )

→配置用户相关信息

(1)→所在自录

mycat/conf/users

(2)→命名方式

(用户名}.user.json

(3)→配置内容

vim root.user.json 
{
        "dialect":"mysql",
        "ip":null,
        "password":"123456",
        "transactionType":"xa",
        "username":"root"
}
#字段含义
#ip:客户端访问ip,建议为空,填写后会对客户端的ip进行限制
#username:用户名
#password:密码
#isolation:设置初始化的事务隔离级别
READ_UNCOMMITTED :1
READ_COMMITTED :2
REPEATED_READ:3,默认
SERIALIZABLE:4
#tractionType:事务类型
可选值
proxy 本地事务,在涉及大于1个数据库的事务, commit阶段失败会导致不一致,但是兼容性最好
ea事务,需要确认存储节点集群类型是否支持XA
可以通过语句实现切换<
set transaction policy ='xa'
set transaction.policy ='proxy'
可以通过语句查询
SELECT @@transaction_policy

3、数据源( datasource)

→配置Mycat连接的数据源信息

(1)→所在目录

mycat/conf/datasources

(2)→命名方式

{数据源名字} . datasource.json

(3)→配置内容

vim prototypeDs.datasource.json 
{
        "dbType":"mysql",
        "idleTimeout":60000,
        "initSqls":[],
        "initSqlsGetConnection":true,
        "instanceType":"READ_WRITE",
        "maxCon":1000,
        "maxConnectTimeout":3000,
        "maxRetryCount":5,
        "minCon":1,
        "name":"prototypeDs",
        "password":"123456",
        "type":"JDBC",
        "url":"jdbc:mysql://localhost:3306/mydb1?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
        "user":"root",
        "weight":0
}
#字段含义
#dbType:数据库类型,mysal
#name:用户名
#password:密码
#type:数据源类型,默认JDBC
#url:访问数据库地址
#idleTimeout:空闲连接超时时间 
#initSqls:初始化sql
#initSqlsGetConnection:对于jdbc每次获取连接是否都执行initSqls
#·nstanceType:配置实例只读还是读写(可选值:
READ_WRITE,READ,WRITE
#weight:负载均衡权重
#连接相关配置
"maxCon": 100,
"maxConnectTimeout" : 3000,
"RetryCount" : 5,
"minCon": 1,

4、集群(cluster)

→配置集群信息

(4)→所在目录

mxcat/conf/clusters

(5)→命名方式

{集群名字} . cluster.json

(6)→配置内容.

vim prototype.cluster.json 
{
        "clusterType":"MASTER_SLAVE",
        "heartbeat":{
                "heartbeatTimeout":1000,
                "maxRetry":3,
                "minSwitchTimeInterval":300,
                "slaveThreshold":0
        },
        "masters":[
                "prototypeDs"
        ],
        "maxCon":200,
        "name":"prototype",
        "readBalanceType":"BALANCE_ALL",
        "switchType":"SWITCH"
}
#字段含义
#clusterType:集群类型
可选值:
SINGLE_NODE:单一节点
PMASTER_SLAVE:普通主从
JSTER:garela- cluster/PXC 集群
MHA: MHA集群
MGR: MGR集群
#readBalanceType:查询负载均衡策略
可选值:
BALANCE_ALL(默认值)
获取集群中所有数据源
BALANCE_ALL_READ
获取集群中允许读的数据源
BALANCE_READ_WRITE
获取集群中允许读写的数据源,但允许读的数据源优先
BALANCE_NONE
获取集群中允许写数据源,即主节点中选择
#switchType:切换类型
可选值:
NOT_SWITCH:不进行主从切换
SWITCH:进行主从切换

4、逻辑库表(schema)

→配置逻辑库表,实现分库分表

(7)→所在目录

mycat/conf/schemas

(8)→命名方式

{库名} . schema.json

(9)→配置内容

vim mysql.schema.json
#库配置
{
  "schemaName": "mydb",
  "targetName": "prototype" 
#schemaName:逻辑库名
#targetName:目的数据源或集群
targetName自动从prototype目标加载test库下的物理表或者视图作为单表, prototype必须是mysql服务器
#单表配置
"schemaName" :  "mxsal-test" ,
"normalTables" : {
  "role edges" :{
    "createTableSQL" :null,//可选
    "locality" :  {
      "schemaName": "mysal",//物理库,可选<
      "role edges", //物理表,可选心
      "targetName": "prototype"//指向集群,或者数据源
    }
  }
  ...
}
#详细配置见分库分表

第四章 搭建读写分离

我们通过 Mycat 和 MySQL 的主从复制配合搭建数据库的读写分离, 实现 MySQL 的高可用性。我们将搭建:一主一从、双主双从两种读写分离模式。

4.1 一主一从

一个主机用于处理所有写请求,一台从机负责所有读请求,架构图如下

1、 搭建 MySQL 数据库主从复制

① MySQL 主从复制原理

如果你是克隆虚拟机
请把mysql服务的UUID修改一下

vim /var/lib/mysql/auto.cnf
systemctl restart mysqld

否则会报错


② 主机配置(mysql1)

修改配置文件: vim /etc/my.cnf
#主服务器唯一ID
server-id=1
#启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库
binlog-do-db=mydb1#需要复制的主数据库名字(还没创建的)
#设置logbin格式
binlog_format=STATEMENT

binlog 日志三种格式



③ 从机配置(mysqlS1)

修改配置文件: vim /etc/my.cnf
#从服务器唯一ID
server-id=2
#启用中继日志
relay-log=mysql-relay

④ 主机、从机重启 MySQL 服务

 systemctl restart mysqld
 systemctl status mysqld

⑤ 主机从机都关闭防火墙

systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)
[root@centos7-mysql-2 bin]# 

⑥ 在主机上建立帐户并授权 slave

#在主机MySQL里执行授权命令
CREATE USER 'slave2'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'slave2'@'%';
#此语句必须执行。否则见下面。<
ALTER USER 'slave2'@'%' IDENTIFIED WITH mysql_native_password  BY '123456';
flush privileges;  
#查询master的状态
show master status;

#记录下File和Position的值
#执行完此步骤后不要再操作主服务器MySQL,防止主服务器状态值变化

⑦ 在从机上配置需要复制的主机

#复制主机的命令
CHANGE MASTER TO MASTER_HOST='主机的IP地址',
MASTER_USER='slave',
MASTER_PASSWORD='123123',
MASTER_LOG_FILE='mysql-bin.具体数字',MASTER_LOG_POS=具体值;
#复制主机的命令
CHANGE MASTER TO MASTER_HOST='192.168.253.139',
MASTER_USER='slave2',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=156;


如果出现以下错误,说明已经过配置主从复制

#先结束
stop slave;
#再重新启动
reset slave;
#再去执行
复制主机的命令



#启动从服务器复制功能
start slave;
#查看从服务器状态
show slave status\G;

#下面两个参数都是Yes,则说明主从配置成功!
# Slave_IO_Running: Yes
# Slave_SQL_Running: Yes

如果出现以下错误

我的是克隆虚拟机,所以mysql的服务uuid一样


必须先停止

stop slave

修改MySQL Server 的UUID方式:

vim /var/lib/mysql/auto.cnf
systemctl restart mysqld

⑧ 主机新建库、新建表、 insert 记录, 从机复制

主机

mysql> create database mydb1;
Query OK, 1 row affected (0.00 sec)
mysql> use mydb1;
Database changed
mysql>  create table mytbl(id int,name varchar(50));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into mytbl values (1,'zhang3');
Query OK, 1 row affected (0.01 sec)
mysql> select * from mytbl;
+------+--------+
| id   | name   |
+------+--------+
|    1 | zhang3 |
+------+--------+
1 row in set (0.00 sec)
mysql> 

从机

mysql> show databases;
+----------------------+
| Database             |
+----------------------+
| atguigu_master_slave |
| atguigudb1           |
| atguigudb2           |
| atguigudb3           |
| atguigudb33          |
| dbtest1              |
| dbtest2              |
| information_schema   |
| mydb1                |
| mysql                |
| performance_schema   |
| sys                  |
| testdb               |
+----------------------+
13 rows in set (0.01 sec)
mysql> use mydb1;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from mytbl;
+------+--------+
| id   | name   |
+------+--------+
|    1 | zhang3 |
+------+--------+
1 row in set (0.00 sec)
mysql> 

⑨ 如何停止从服务复制功能

stop slave;

⑩ 如何重新配置主从

stop slave;
reset master;

2、配置 Macat读写分离

登录Mycat,创建逻辑库,配置数据源

mysql -uroot -p123456 -P8066 -h192.168.253.139 #一定加-h


或者使用sqlyog

#在Mycat里创建数据库mydb1
#创建db2逻辑库
create database mydb1; 
#修改mydb1.schema.json·指定数据源 "targetName" : "prototype",配置主机数据源
vim /usr/local/mycat/conf/schemas/mydb1.schema.json



使用注解方式添加数据源

#登录Mycat,注解方式添加数据源,指向从机
/*+ mycat:createDataSource { "name" :" rwSepw" ,"url" :"jdbc:mysql://192.168.253.139:3306/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true" , "user" "root", "password":"123456"}*/ ;
/*+ mycat:createDataSource { "name" : "rwSepr" ,"ur1" :"jdbc:mysql://192.168.253.140:3306/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true" , "user":"root", "password":"123456"}·*/ ;
#查询配置数据源结果
/*+·mycat:showDataSources {0}*/ ;

手动配置

/usr/local/mycat/conf/datasources

{
  "dbType":"mysql",
  "idleTimeout":60000,
  "initSqls":[],
  "initSqlsGetConnection":true,
  "instanceType":"READ_WRITE",
  "maxCon":1000,
  "maxConnectTimeout":3000,
  "maxRetryCount":5,
  "minCon":1,
  "name":"rwSepw",  #一定要看好
  "password":"123456",
  "type":"JDBC",
  "url":"jdbc:mysql://192.168.253.140:3306/mydb1?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true",
  "user":"root",
  "weight":0
}

更新集群信息,添加dr0从节点.实现读写分离

#更新集群信息,添加dr0从节点.-
/*! mycat:createCluster{"name" :"prototype","masters" :["rwSepw"],"replicas":["rwSepr"]}  */ ;
#查看配置集群信息(
/*+ mycat:showClusters {} */;
#查看集群配置文件
vim /usr/local/mvcat/conf/clusters/prototype.clust

手动配置

/usr/local/mycat/conf/clusters

{
  "clusterType":"MASTER_SLAVE",
  "heartbeat":{
    "heartbeatTimeout":1000,
    "maxRetry":3,
    "minSwitchTimeInterval":300,
    "slaveThreshold":0
  },
  "masters":[
    "rwSepw"
  ],
  "maxCon":200,
  "name":"prototype",
  "readBalanceType":"BALANCE_ALL",
  "replicas":[
    "rwSepr"
  ],
  "switchType":"SWITCH"
}
readBalanceTvpe查询负载均衡策略
可选值:
BALANCE_ALL(默认值)
获取集群中所有数据源
BALANCE_ALL_READ
获取集群中允许读的数据源
BALANCE_READ_WRITE
获取集群中允许读写的数据源,但允许读的数据源优先
BALANCE_NONE
获取集群中允许写数据源,即主节点中选择
switchType
NOT_SWITCH:不进行主从切换
SWITCH:进行主从切换
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
Java 关系型数据库 MySQL
Mycat2【java提高】3
Mycat2【java提高】3
118 0
|
SQL 算法 Java
Mycat2【java提高】5
Mycat2【java提高】5
218 0
|
存储 算法 Java
Mycat2【java提高】4
Mycat2【java提高】4
184 0
|
Java 中间件 关系型数据库
Mycat2【java提高】1
Mycat2【java提高】1
194 0
|
18天前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
80 17
|
29天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
14天前
|
缓存 安全 算法
Java 多线程 面试题
Java 多线程 相关基础面试题
|
1月前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。
|
1月前
|
消息中间件 缓存 安全
Java多线程是什么
Java多线程简介:本文介绍了Java中常见的线程池类型,包括`newCachedThreadPool`(适用于短期异步任务)、`newFixedThreadPool`(适用于固定数量的长期任务)、`newScheduledThreadPool`(支持定时和周期性任务)以及`newSingleThreadExecutor`(保证任务顺序执行)。同时,文章还讲解了Java中的锁机制,如`synchronized`关键字、CAS操作及其实现方式,并详细描述了可重入锁`ReentrantLock`和读写锁`ReadWriteLock`的工作原理与应用场景。
|
1月前
|
安全 Java 编译器
深入理解Java中synchronized三种使用方式:助您写出线程安全的代码
`synchronized` 是 Java 中的关键字,用于实现线程同步,确保多个线程互斥访问共享资源。它通过内置的监视器锁机制,防止多个线程同时执行被 `synchronized` 修饰的方法或代码块。`synchronized` 可以修饰非静态方法、静态方法和代码块,分别锁定实例对象、类对象或指定的对象。其底层原理基于 JVM 的指令和对象的监视器,JDK 1.6 后引入了偏向锁、轻量级锁等优化措施,提高了性能。
58 3