Mycat2【java提高】2

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
简介: 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:进行主从切换
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
Java 关系型数据库 MySQL
Mycat2【java提高】3
Mycat2【java提高】3
110 0
|
SQL 算法 Java
Mycat2【java提高】5
Mycat2【java提高】5
202 0
|
存储 算法 Java
Mycat2【java提高】4
Mycat2【java提高】4
174 0
|
Java 中间件 关系型数据库
Mycat2【java提高】1
Mycat2【java提高】1
165 0
|
9天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
18天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?
|
5天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
25 9
|
8天前
|
存储 安全 Java
Java多线程编程的艺术:从基础到实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及其实现方式,旨在帮助开发者理解并掌握多线程编程的基本技能。文章首先概述了多线程的重要性和常见挑战,随后详细介绍了Java中创建和管理线程的两种主要方式:继承Thread类与实现Runnable接口。通过实例代码,本文展示了如何正确启动、运行及同步线程,以及如何处理线程间的通信与协作问题。最后,文章总结了多线程编程的最佳实践,为读者在实际项目中应用多线程技术提供了宝贵的参考。 ####
|
5天前
|
监控 安全 Java
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin
|
8天前
|
Java
JAVA多线程通信:为何wait()与notify()如此重要?
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是实现线程间通信的核心机制。它们通过基于锁的方式,使线程在条件不满足时进入休眠状态,并在条件满足时被唤醒,从而确保数据一致性和同步。相比其他通信方式,如忙等待,这些方法更高效灵活。 示例代码展示了如何在生产者-消费者模型中使用这些方法实现线程间的协调和同步。
22 3