MyCat2介绍以及部署和读写分离/分库分表(MyCat2.0)


请添加图片描述
请添加图片描述

一,MyCat入门

1.什么是mycat

官网:http://www.mycat.org.cn/

​ mycat是数据库中间件

它可以干什么?

  1. 读写分离
  2. 数据分片:垂直拆分,水平拆分
  3. 多数据源整合

2.数据库中间件

​ 中间件:是一类连接软件组件和应用的计算机软件,以便于软件各部件之间的沟通。

​ 例子:tomcat,kafka,redis等中间件

3.为什么使用macat

  1. java与数据库紧耦合
  2. 高访问量高并发对数据库的压力
  3. 读写请求数据不一致

4.常见数据库中间件对比

  1. cobar:属于阿里B2B事业群,始于2008年,在阿里服役3年多,接管3000+个MySQL数据库的shema,集群日处理在线SQL请求50亿次以上,由于cobar发起人的离职,cobar停止维护
  2. mycat:开源社区在阿里cobar基础上进行二次开发,解决了cobar存在的问题,并且加入了许多新的功能在其中
  3. oneproxy:基于MySQL官网的proxy思想利用c进行开发的,oneproxy是一款商业收费的中间件。舍去了一些功能,专注在性能和稳定性上。
  4. kingshard:由小团队用go语言开发,需要不断完善
  5. viress:是YouTube生产在使用,结构很复杂。不支持MySQL原生协议,使用需要改造成本。
  6. atllas:是360团队基于MySQL proxy改写,功能还需完善,高并发下不稳定
  7. maxscale:是mariadb研发的中间件
  8. MySQLroute:是MySQL官网oracle公司发布的中间件

5.mycat原理

​ mycat的原理中最重要的一个动词是‘拦截’,它拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析:如分片分析,路由分析,读写分离分析,缓存分析等,然后将此SQL发往后端的真实数据库,并将返回的结构做适当的处理,最终再返回给用户。
请添加图片描述

6.mycat1.X与mycat2.X的功能对比

功能1.62.x
多语句不支持支持
blob值支持一部分支持
全局二级索引不支持支持
任意跨库join(包含复杂查询)catlet支持支持
分片表与分片表JOIN查询ER表支持支持
关联子查询不支持支持一部分
分库同时分表不支持支持
存储过程支持固定形式的支持更多
支持逻辑视图不支持支持
支持物理视图支持支持
批量插入不支持支持
执行计划管理不支持支持
路由注释支持支持
集群功能支持支持更多集群类型
自动hash分片算法不支持支持
支持第三方监控支持mycat-web支持普罗米斯,kafka日志等监控
流式合拼结果集支持支持
范围查询支持支持
单表映射物理表不支持支持
XA事务弱XA支持,事务自动恢复
支持MySQL8需要更改mysql8的服务器配置支持支持
虚拟表不支持支持
joinClustering不支持支持
union all语法不支持支持
BKAJoin不支持支持
优化器注释不支持支持
ER表支持支持
全局序列号支持支持
保存点不支持支持
离线迁移支持支持(实验)
增量迁移CRC32算法支持BINLOG追平(实验)
安全停机不支持支持(实验)
HAProxy协议不支持支持
会话粘滞update后select会粘滞update后select会粘滞且支持设置时间
全局表插入支持全局序列号不支持支持
全局表插入支持主表插入自增结果作为序列号不支持支持
外部调用的分片算法不支持但可定制支持

二,MyCat安装和管理命令

提前安装JDK

[root@localhost ~]# tar -zxf jdk-8u171-linux-x64.tar.gz
[root@localhost ~]# ls
anaconda-ks.cfg  jdk-8u171-linux-x64.tar.gz        mysql80-community-release-el7-7.noarch.rpm
jdk1.8.0_171     mycat2-install-template-1.20.zip  original-ks.cfg
[root@localhost ~]# mv jdk1.8.0_171/ /usr/local/java
[root@localhost ~]# vi /etc/profile
PATH=$PATH:/usr/local/java/bin

[root@localhost ~]# source /etc/profile
[root@localhost ~]# java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)

1.下载安装包

tar(zip)包 :
http://dl.mycat.org.cn/2.0/install-template/mycat2-install-template1.20.zip

jar 包 :
http://dl.mycat.org.cn/2.0/1.21-release/ (下载最新的 jar 包)

请添加图片描述

2.上传服务器解压

[root@localhost ~]# ls
anaconda-ks.cfg                                mycat2-install-template-1.20.zip            original-ks.cfg
mycat2-1.21-release-jar-with-dependencies.jar  mysql80-community-release-el7-7.noarch.rpm
[root@localhost ~]# unzip mycat2-install-template-1.20.zip
[root@localhost ~]# mv mycat /usr/local/
[root@localhost mycat]# ls
bin  conf  lib  logs
[root@localhost mycat]# mv /root/mycat2-1.21-release-jar-with-dependencies.jar ./lib/
[root@localhost mycat]# chmod 777 -R ./lib/

3.为mycat连接的MySQL添加用户

#直接将root改为所有地址可以登录,方便,但是在真实环境中需要根据权限来创建用户
mysql> 

4.修改mycat的portotype的配置

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

[root@localhost mycat]# vi conf/datasources/prototypeDs.datasource.json
{
        "dbType":"mysql",
        "idleTimeout":60000,
        "initSqls":[],
        "initSqlsGetConnection":true,
        "instanceType":"READ_WRITE",
        "maxCon":1000,
        "maxConnectTimeout":3000,
        "maxRetryCount":5,
        "minCon":1,
        "name":"prototypeDs",
        "password":"1234.Com",
        "type":"JDBC",
        "url":"jdbc:mysql://localhost:3306/mysql?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
        "user":"root",
        "weight":0
}

5.启动MyCat

[root@localhost mycat]# cd bin/
[root@localhost bin]# chmod 555 *
[root@localhost bin]# ./mycat start

6.MyCat管理

./mycat start #开启
./mycat stop	#关闭
./mycat restart 	#重启
./mycat status	#查看状态
./mycat console	#前台运行
./mycat pause	#暂停

7.mycat登录

[root@localhost bin]# mysql -uroot -p1234.Com -P 8066 -h 192.168.2.1
选项:
-u:用户名
-p:密码
-P:端口
-h:IP地址
[root@localhost bin]# mysql -uroot -p1234.Com -P 9066	#后台管理端口

三,MyCat名词概念描述

1.分库分表

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

解读:

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

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

2.逻辑库

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

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

3.逻辑表

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

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

4.物理库

​ 数据库代理连接的数据库中的库,比如mysql上的information_schema

​ 解读:MySQL 真实的数据库

5.物理表

​ 数据库代理连接的数据库中的表,比如mysql上的information_schema.TABLES

​ 解读:MySQL 真实的数据库中的真实数据表。

6.分库分表中间件

​ 实现了分库分表功能的中间件,功能上相当于分库分表型数据库中的计算节点

7.分库分表型数据库

​ 以分库分表技术构建的数据库,在组件上一般有计算节点,存储节点.它的存储节点一般是一个可独立部署的数据库产品,比如mysql

8.拆分键

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

​ 解读:比如订单表可以按照归属的用户 id 拆分,用户 id 就是

9.分区

​ 一般指数据分区,计算节点上,水平分片表拆分数据的最小区域

10.分区键

​ 当使用等值查询的时候,能直接映射一个分区的拆分键

11.系统表,元数据表

​ 一般指mysql中的information_schema,performance_schema,mysql三个库下的表

12.物理分表

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

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

13.物理分库

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

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

14.单库分表

​ 在同一个数据库下同一个库表拆分成多个物理分表

15.分库

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

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

16.分片表,水平分片表

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

17.单表

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

​ 解读:没有拆分数据,也没有复制数据到别的库的表。

18.全局表,广播表

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

​ 它通过表数据冗余,使分片表的分区与该表的数据在同一个数据库实例里,达到join运算能够直接在该数据库实例里执行.它的数据一致一般是通过数据库代理分发SQL实现.也有基于集群日志的实现.

​ 解读:例如系统中翻译字段的字典表,每个分片表都需要完整的字典数据翻译字段。

19.集群

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

​ 解读:集群就是高可用、负载均衡的代名词

20.数据源

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

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

21.schema(库)

​ 在mycat2中配置表逻辑,视图等的配置

22.物理视图

​ 后端数据库中的视图

23.逻辑视图

​ 在mycat2中的逻辑视图是把一个查询语句视为逻辑表的功能

24.前端会话

​ 一般指Mycat服务器中,该会话指向连接mycat的客户端

25.后端会话

​ 一般指Mycat服务器中,该会话指向连接数据库的客户端

26.后端数据库

​ 在数据库代理中,数据库代理连接的数据库

27.透传SQL

​ 在数据库代理中,指从客户端接收的SQL,它不经过改动,在代理中直接发送到后端数据库

28.透传结果集

​ 在数据库代理中,指从后端数据库返回的结果集,不经过改动,转换,写入到前端会话

29.ER表

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

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

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

30.原型库(prototype)

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

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

四,MyCat配置文件介绍

1.配置文件

[root@localhost ~]# cd /usr/local/mycat/conf/
[root@localhost conf]# ll
总用量 32
drwxr-xr-x 2 root root   36 628 2021 clusters
drwxr-xr-x 2 root root   41 529 11:01 datasources
-rw-r--r-- 1 root root 3338 35 2021 dbseq.sql
-rw-r--r-- 1 root root  316 112 2021 logback.xml
-rw-r--r-- 1 root root    0 35 2021 mycat.lock
drwxr-xr-x 2 root root   31 628 2021 schemas
drwxr-xr-x 2 root root    6 628 2021 sequences
-rw-r--r-- 1 root root  776 1228 2021 server.json
-rw-r--r-- 1 root root 1643 35 2021 simplelogger.properties
drwxr-xr-x 2 root root  233 628 2021 sql
drwxr-xr-x 2 root root    6 628 2021 sqlcaches
-rw-r--r-- 1 root root   49 35 2021 state.json
drwxr-xr-x 2 root root   28 628 2021 users
-rw-r--r-- 1 root root  211 35 2021 version.txt
-rw-r--r-- 1 root root 4165 113 2022 wrapper.conf

clusters:集群
datasources:数据源
server.json:服务配置
user:用户目录

2.用户(user)

​ 配置用户相关信息

1.所在目录

​ mycat /conf/users

2.命名方式

​ {用户名}.user.json

3.配置内容
[root@localhost conf]# vi users/root.user.json
{
        "dialect":"mysql",
        "ip":null,
        "password":"123456",
        "transactionType":"xa",
        "username":"root"
}

#字段含义:
#username:用户名
#password:密码
#isolation:设置初始化的事务隔离级别
#transactionType:事务类型
可选值:
	proxy 本地事务,在涉及大于 1 个数据库的事务,commit 阶段失败会导致不一致,但是兼容性最好
xa 事务,需要确认存储节点集群类型是否支持 XA
	可以通过语句实现切换
	set transaction_policy = 'xa'
	set transaction_policy = 'proxy' 可以通过语句查询
	SELECT @@transaction_policy

3.数据源(datasource)

​ 配置mycat连接的数据源信息

1.所在目录

​ mycat /conf/datasources

2.命名方式

​ {数据源名字}.datasource.json

3.配置内容
[root@localhost conf]# vi datasources/prototypeDs.datasource.json
{
        "dbType":"mysql",
        "idleTimeout":60000,
        "initSqls":[],
        "initSqlsGetConnection":true,
        "instanceType":"READ_WRITE",
        "maxCon":1000,
        "maxConnectTimeout":3000,
        "maxRetryCount":5,
        "minCon":1,
        "name":"prototypeDs",
        "password":"1234.Com",
        "type":"JDBC",
        "url":"jdbc:mysql://localhost:3306/mysql?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
        "user":"root",
        "weight":0
}

字段含义:
dbtype:数据库类型,mysql
name:用户名
password:密码
type:数据源类型,默认JDBC
url:访问数据库地址
idletimeout:空闲连接超时时间
initsqls:初始化sql
initsqlsgetconnection:对于JDBC每次获取连接是否都执行initSqls
instanceType:配置实例只读还是读写 可选值:READ_WRITE,READ,WRITE

4.集群(cluster)

​ 配置集群信息

1.所在目录

​ mycat /conf/clusters

2.命名方式

​ {集群名字}.clusteer.json

3.配置内容
[root@localhost conf]# vi clusters/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:单一节点
		master_slave:普通主从
		garela_cluster:garela cluster /PXC 集群
		MHAMHA集群
		MGRMGR集群
readBalanceType:查询负责均衡策略
	可选值:
		BALANCE_ALL(默认值):获取集群中所有数据源
		BALANCE_ALL_READ:获取集群中允许读的数据源
		BALANCE_READ_WEITE:获取集群中允许读写的数据源,但允许读的数据源优先
		BALANCE——NODE:获取集群中允许写数据源,即主节点中选择
switchType:切换类型
	可选值:
		NOT_SWITCH:不进行主从切换
		SWITCH:进行主从切换

5.逻辑库表(schema)

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

1.所在目录

​ mycat /conf/shemas

2.命名方式

​ {库名}.schema.json

3.配置内容
[root@localhost conf]# vi schemas/mysql.schema.json

#库配置
 "locality":{
                                "schemaName":"mysql",
                                "tableName":"spm_baseline",
                                "targetName":"prototype"
                        }
#schemaName:逻辑库名
#targetName:目的数据源或集群
targetName自动从prototype目标加载test库下的物理表或者视图作为单表,prototype必须是MySQL服务器

#单表配置
{
"schemaName": "mysql-test",
"normalTables": {
"role_edges": {
"createTableSQL":null,//可选
"locality": {
"schemaName": "mysql",//物理库,可选
"tableName": "role_edges",//物理表,可选
"targetName": "prototype"//指向集群,或者数据源
}
}

五,搭建读写分离

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

请添加图片描述

1.搭建一主一从

​ 一个主机用于处理所有写请求,一台从机负责所有读请求

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

1.主MySQL配置
[root@localhost ~]# vi /etc/my.cnf
server-id=1
log-bin=mysql-bin
[root@localhost ~]# systemctl restart mysqld
2.其他配置
#设置不要复制的数据库(可以设置为多个)
binlog-ignore-db=dbname
binlog-ignore-db=information_schema
#设置需要复制的数据库
binlog-do-db=dbname
#设置binlog格式
binlog_format=statement
2.从MySQL配置
[root@localhost ~]# vi /etc/my.cnf
server-id=2
log-bin=mysql-bin
[root@localhost ~]# systemctl restart mysqld
3.主MySQL添加授权用户和二进制日志信息
mysql> grant replication slave on *.* to slave@'%' identified by '1234.Com';
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 |      438 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

4.在从机上做主从
mysql> change master to master_host='192.168.2.1',master_user='slave',master_password='1234.Com',master_log_pos=438,master_log_file='mysql-bin.000002';
Query OK, 0 rows affected, 2 warnings (0.00 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G
 			Slave_IO_Running: Yes		#数据传输
            Slave_SQL_Running: Yes		#SQL执行

5.测试验证(主MySQL)
mysql> create database mydb1;
Query OK, 1 row affected (0.00 sec)

mysql> use mydb1;
Database changed
mysql> create table mytb1(id int,name varchar(50));
Query OK, 0 rows affected (0.00 sec)

mysql> insert into
    -> mytb1 values(1,'zhangsan');
Query OK, 1 row affected (0.03 sec)

mysql> insert into  mytb1 values(2,'lisi');
Query OK, 1 row affected (0.00 sec)

mysql> select * from mytb1;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
|    2 | lisi     |
+------+----------+
2 rows in set (0.00 sec)

2.配置mycat读写分离

1.创建数据源

[root@localhost mycat]# mysql -uroot -p123456 -P8066 -h192.168.2.1
mysql> create database mydb1;

[root@localhost mycat]# vi conf/schemas/mydb1.schema.json
{
        "customTables":{},
        "globalTables":{},
        "normalProcedures":{},
        "normalTables":{},
        "schemaName":"mydb1",
        "targetName": "prototype",
        "shardingTables":{},
        "views":{}
}

2.登录mycat添加数据源

[root@localhost mycat]# mysql -uroot -p123456 -P8066 -h192.168.2.1

mysql> /*+ mycat:createDataSource{ "name":"rwSepw","url":"jdbc:mysql://192.168.2.1:3306/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true", "user":"root","password":"1234.Com" } */;
Query OK, 0 rows affected (0.02 sec)

mysql>
mysql> /*+ mycat:createDataSource{ "name":"rwSepr","url":"jdbc:mysql://192.168.2.2:3306/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true", "user":"root","password":"1234.Com" } */;
Query OK, 0 rows affected (0.03 sec)
#查询配置数据源结果
mysql> /*+ mycat:showDataSources{} */\G

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

mysql> /*!mycat:createCluster{"name":"prototype","masters":["rwSepw"],"replicas":["rwSepr"]} */;
Query OK, 0 rows affected (0.03 sec)

mysql> /*+ mycat:showClusters{} */;		#查看集群配置文件
+-----------+-------------+-------------------+-------------+----------+---------------+-------------------------------------------+-------------------------------------------+-----------+
| NAME      | SWITCH_TYPE | MAX_REQUEST_COUNT | TYPE        | WRITE_DS | READ_DS       | WRITE_L                                   | READ_L                                    | AVAILABLE |
+-----------+-------------+-------------------+-------------+----------+---------------+-------------------------------------------+-------------------------------------------+-----------+
| prototype | SWITCH      | 2000              | BALANCE_ALL | rwSepw   | rwSepw,rwSepr | io.mycat.plug.loadBalance.BalanceRandom$1 | io.mycat.plug.loadBalance.BalanceRandom$1 | true      |
+-----------+-------------+-------------------+-------------+----------+---------------+-------------------------------------------+-------------------------------------------+-----------+
1 row in set (0.01 sec)
ava.lang.RuntimeException: java.lang.IllegalArgumentException: ignored rw
Sepr

​ 修改集群配置文件

[root@localhost mycat]# vi /usr/local/mycat/conf/clusters/prototype.cluster.json
{
        "clusterType":"MASTER_SLAVE",
        "heartbeat":{
                "heartbeatTimeout":1000,
                "maxRetryCount":3,
                "minSwitchTimeInterval":300,
                "showLog":false,
                "slaveThreshold":0.0
        },
        "masters":[
                "rwSepw"
        ],
        "replicas":[
                "rwSepr"
        ],
        "maxCon":2000,
        "name":"prototype",
        "readBalanceType":"BALANCE_ALL",
        "switchType":"SWITCH"
}


readBalanceType
查询负载均衡策略
	可选值:
	BALANCE_ALL(默认值)
	获取集群中所有数据源
	BALANCE_ALL_READ
	获取集群中允许读的数据源
	BALANCE_READ_WRITE
	获取集群中允许读写的数据源,但允许读的数据源优先
	BALANCE_NONE
	获取集群中允许写数据源,即主节点中选择
	
switchType
NOT_SWITCH:不进行主从切换
SWITCH:进行主从切换

4.重启mycat

[root@localhost mycat]# ./bin/mycat restart
Stopping mycat2...
Stopped mycat2.
Starting mycat2...

5.验证读写分离

在从MySQL上修改数据
mysql> update mytb1 set name='wangwu' where id=2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

然后使用mycat登录
查询来查看数据不同

六,双主双从读写分离

​ 一个主机 m1 用于处理所有写请求,它的从机 s1 和另一台主机 m2 还有它的从机 s2 负责所有读请求。当 m1 主机宕机后,m2 主机负责写请求,m1、m2 互为备机。架构图 如下

请添加图片描述

1.环境

角色IP地址
master1192.168.2.1
slave1192.168.2.2
master2192.168.2.3
slave2192.168.2.4

2.搭建双主双从

1.一主一从

根据上面的读写分离的步骤做两遍

2.双主双从

​ master1与master2互作主从

1.master1配置
mysql> change master to master_host='192.168.2.3',master_user='slave',master_password='1234.Com',master_log_pos=438,master_log_file='mysql-bin.000001';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
2.master2配置
mysql> change master to master_host='192.168.2.1',master_user='slave',master_password='1234.Com',master_log_pos=6394,master_log_file='mysql-bin.000001';
Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
3.测试
查看是否master1创建库,四台同步

3.实现多种主从

1.双主双从

*m1:主机
*m2:备机,也负责读
*s1,s2:从机

2.添加两个数据源

​ 注意:如果不是从一主一从做的需要添加四个数据源

1.登录mycat操作
/*+ mycat:createDataSource{ "name":"rwSepw2","url":"jdbc:mysql://192.168.2.3:3306/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true", "user":"root","password":"1234.Com" } */;

/*+ mycat:createDataSource{ "name":"rwSepr2","url":"jdbc:mysql://192.168.2.4:3306/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true", "user":"root","password":"1234.Com" } */;
2.修改集群配置文件
[root@localhost mycat]# vi /usr/local/mycat/conf/clusters/prototype.cluster.json
{
        "clusterType":"MASTER_SLAVE",
        "heartbeat":{
                "heartbeatTimeout":1000,
                "maxRetryCount":3,
                "minSwitchTimeInterval":300,
                "showLog":false,
                "slaveThreshold":0.0
        },
        "masters":[
                "rwSepw","rwSepw2"
        ],
         "replicas":[
                "rwSepr","rwSepr2","rwSepw2"
        ],
        "maxCon":2000,
        "name":"prototype",
        "readBalanceType":"BALANCE_ALL",
  
        "switchType":"SWITCH"
}

七,分库分表

1.分库分表原理

​ 一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业 务将表进行分类,分布到不同 的数据库上面,这样也就将数据或者说压力分担到不同 的库上面,如下图:

请添加图片描述

​ 系统被切分成了,用户,订单交易,支付几个模块

2.如何分库

​ 一个问题:在两台主机上的两个数据库中的表,能否关联查询?

​ 答案:不可以关联查询。

分库的原则:有紧密关联关系的表应该在一个库里,相互没有关联关系的表可以分到 不同的库里。

例子:

#客户表 rows:20万
CREATE TABLE customer(
	id INT AUTO_INCREMENT
	NAME VARCHAR(200),
	PRIMARY KEY(id)
);
#订单表 rows:600万
CREATE TABLE orders(
	id INT AUTO_INCREMENT,
	order_type INT,
	customer_id INT,
	amount DECIMAL(10,2),
	PRIMARY KEY(id)
);
#订单详细表 rows:600万
CREATE TABLE orders_detail(
	id INT AUTO_INCREMENT,
	detail VARCHAR(2000),
	order_id INT,
	PRIMARY KEY(id)
);
#订单状态字典表 rows:20
CREATE TABLE dict_order_type(
	id INT AUTO_INCREMENT,
	order_type VARCHAR(200),
	PRIMARY KEY(id)				
);

​ 以上四个表如何分库?客户表分在一个数据库,另外三张都需要关联查询,分在另外 一个数据库。

3.如何分表

1.选择要拆分的表

​ MySQL 单表存储数据条数是有瓶颈的,单表达到 1000 万条数据就达到了瓶颈,会 影响查询效率,需要进行水平拆分(分表)进行优化。

​ 例如:例子中的 orders、orders_detail 都已经达到 600 万行数据,需要进行分表 优化。

2.分库字段

​ 以 orders 表为例,可以根据不同自字段进行分表

分表字段效果
id(主键,或创建时间)查询订单注重是时效,历史订单被查询的次数少,如此分片会造成一个节点访问多,一个访问少,不平均
customer_id(客户id)根据客户id去分,两个节点访问平均,一个客户的所有订单都在同一个节点

4.实现分库分表

​ Mycat2 一大优势就是可以在终端直接创建数据源、集群、库表,并在创建时指定 分库、分表。与 1.6 版本比大大简化了分库分表的操作

1.添加数据库,存储数据源

/*+ mycat:createDataSource{
"name":"dw0",
"url":"jdbc:mysql://192.168.2.1:3306",
"user":"root",
"password":"1234.Com"
} */;

/*+ mycat:createDataSource{
"name":"dr0",
"url":"jdbc:mysql://192.168.2.1:3306",
"user":"root",
"password":"1234.Com"
} */;

/*+ mycat:createDataSource{
"name":"dw1",
"url":"jdbc:mysql://192.168.2.2:3306",
"user":"root",
"password":"1234.Com"
} */;

/*+ mycat:createDataSource{
"name":"dr1",
"url":"jdbc:mysql://192.168.2.2:3306",
"user":"root",
"password":"1234.Com"
} */;

2.添加集群配置

​ 把新添加的数据源配置成集群

    /*!mycat:createCluster{"name":"c0","masters":["dw0"],"replicas":["dr0"]} */;

/*!
{mycat:createCluster{"name":"c1","masters":["dw1"],"replicas":["dr1"]}
*/;


3.创建全局表

#添加数据库db1
CREATE DATABASE db1;
#在建表语句中加上关键字 BROADCAST(广播,即为全局表)
CREATE TABLE db1.`travelrecord` (
`id` bigint NOT NULL AUTO_INCREMENT,
`user_id` varchar(100) DEFAULT NULL,
`traveldate` date DEFAULT NULL,
`fee` decimal(10,0) DEFAULT NULL,
`days` int DEFAULT NULL,
`blob` longblob,
PRIMARY KEY (`id`),
KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 BROADCAST


4.创建分片表(分库分表)

#在 Mycat 终端直接运行建表语句进行数据分片
CREATE TABLE db1.orders(
id BIGINT NOT NULL AUTO_INCREMENT,
order_type INT,
customer_id INT,
amount DECIMAL(10,2),
PRIMARY KEY(id),
KEY `id` (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
dbpartition BY mod_hash(customer_id) tbpartition BY mod_hash(customer_id)
tbpartitions 1 dbpartitions 2;

#数据库分片规则,表分片规则,以及各分多少片
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(1,101,100,100100);
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(2,101,100,100300);
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(3,101,101,120000);
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(4,101,101,103000);
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(5,102,101,100400);
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(6,102,100,100020);
SELECT * FROM orders;

#同样可以查看生成的配置信息
#进入相关目录查看 schema 配置
vim /usr/local/mycat/conf/schemas/db1.schema.json

ongblob,
PRIMARY KEY (id),
KEY id (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 BROADCAST


#### 	4.创建分片表(分库分表)

```sql
#在 Mycat 终端直接运行建表语句进行数据分片
CREATE TABLE db1.orders(
id BIGINT NOT NULL AUTO_INCREMENT,
order_type INT,
customer_id INT,
amount DECIMAL(10,2),
PRIMARY KEY(id),
KEY `id` (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
dbpartition BY mod_hash(customer_id) tbpartition BY mod_hash(customer_id)
tbpartitions 1 dbpartitions 2;

#数据库分片规则,表分片规则,以及各分多少片
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(1,101,100,100100);
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(2,101,100,100300);
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(3,101,101,120000);
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(4,101,101,103000);
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(5,102,101,100400);
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(6,102,100,100020);
SELECT * FROM orders;

#同样可以查看生成的配置信息
#进入相关目录查看 schema 配置
vim /usr/local/mycat/conf/schemas/db1.schema.json

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/36436.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

十五、flex弹性元素的样式

目录&#xff1a; 1. 基本布局 2. 弹性元素的属性&#xff1a;flex-grow 3. 弹性元素的属性&#xff1a;flex-shrink 4. 弹性元素的属性&#xff1a;flex-basis 5. flex 统一设置这3个属性&#xff08;常用&#xff09; 6. order 一、基本布局 <style>*{margin: 0;paddin…

Arcgis之Python的Arcpy的点线面对象的创建处理和通过pandas读取txt中的经纬度坐标创建几何对象

前言 本节将介绍点线面对象的创建和处理。创建点对象有三个类&#xff0c;分别是Point、Multipoint、PointGeometry&#xff0c;创建线对象的类为Polyline&#xff0c;创建面对象的类为Polygon。 一、点对象的创建——Point 点对象经常与光标配合使用。点要素将返回单个点对…

抖音seo矩阵系统源码|需求文档编译说明(技术)

1.抖音seo矩阵系统文档开发流程 抖音SEO矩阵指的是一系列通过搜索引擎优化&#xff08;SEO&#xff09;技术和策略来提升抖音账号在搜索结果中排名的方法和工具。在抖音上&#xff0c;用户可以通过搜索关键词来查找与其相关的视频和账号。因此&#xff0c;抖音SEO矩阵的主要目…

Java阶段四Day11

Java阶段四Day11 文章目录 Java阶段四Day11Spring AOPElasticsearch1. 关于各种数据库的使用2. 关系型数据库中的索引3. 安装与启动elasticsearch4. 访问elasticsearch5. 使用elasticsearch分词6. elasticsearch文档的相关概念7. 使用elasticsearch添加数据7.1. 添加文档7.2. 查…

QT登录界面

1.效果图 2.代码 #include "widget.h" #include "ui_widget.h" #include <QApplication> #include <QWidget> #include <QtWidgets>Widget::Widget(QWidget *parent): QMainWindow(parent), ui(new Ui::Widget) {ui->setupUi(this);…

【CSS】浮动

&#x1f4dd;个人主页&#xff1a;爱吃炫迈 &#x1f48c;系列专栏&#xff1a;HTMLCSS &#x1f9d1;‍&#x1f4bb;座右铭&#xff1a;道阻且长&#xff0c;行则将至&#x1f497; 文章目录 浮动浮动的规则浮动的案例浮动的清除 浮动 float属性可以指定一个元素应沿其容器的…

deeplabv3+源码之慢慢解析 第二章datasets文件夹(1)voc.py--voc_cmap函数和download_extract函数

系列文章目录&#xff08;更新中&#xff09; 第一章deeplabv3源码之慢慢解析 根目录(1)main.py–get_argparser函数 第一章deeplabv3源码之慢慢解析 根目录(2)main.py–get_dataset函数 第一章deeplabv3源码之慢慢解析 根目录(3)main.py–validate函数 第一章deeplabv3源码之…

亚马逊云科技推出的一项完全托管的生成式AI服务——Amazon Bedrock

在全球生成式AI浪潮兴起之际&#xff0c;以“智联世界&#xff0c;生成未来”为主题的2023世界人工智能大会&#xff08;WAIC 2023&#xff09;于7月6日在上海世博中心拉开帷幕。大会首日&#xff0c;亚马逊云科技携生成式AI产品Amazon Bedrock亮相大会现场&#xff0c;亚马逊云…

Linux发行版Gentoo被发现有漏洞,在SQL注入方面存在安全风险

近日有消息表明&#xff0c;Gentoo Linux发行版中存在漏洞CVE-2023-28424&#xff0c;并且极有可能被黑客利用该漏洞进行SQL注入攻击。 据悉&#xff0c;研究人员从 GentooLinux的Soko搜索组件中找到了这个漏洞&#xff0c;并且该漏洞的CVSS风险评分为 9.1&#xff0c;属于特别…

使用Pytorch加载预训练模型及修改网络结构

Pytorch有自带的训练好的AlexNet、VGG、ResNet等网络架构。详见官网 1.加载预训练模型 import torch import torchvision import torch.nn as nn import torch.optim as optim import torch.nn.functional as F import torchvision.transforms as transforms import torchvis…

【QQ好友列表-设置HeaderView Objective-C语言】

一、咱们一起来看 刚才咱们是不是给大家说到 创建好模型了 是不是单元格,我们需要自定义单元格了 自定义单元格的步骤: 我相信大家现在脑子里,应该有那个代码的思路了吧 1)首先,是不是要新建一个类型啊 这个类型应该建在哪个里面 是不是应该建在我们的View里面 View…

linux常见指令下

接下来我们就聊聊linux的后面十条指令。 一:echo 作用是往显示器输出内容&#xff0c;和printf类型&#xff0c;但是该指令最核心的是与之相关的一些概念 概念1.输出重定向&#xff1a; echo不仅可以向显示打印内容&#xff0c;还可以向文件输出内容&#xff0c;本应该输出到…

图片视频抹除算法总结Inpaint

基本是从图片抹水印和视频抹水印两个方向 Video Inpainting&#xff1a;https://paperswithcode.com/task/video-inpaintingImage Inpainting&#xff1a;https://paperswithcode.com/task/image-inpainting 请根据目录查看 图片 Partial Conv 部分卷积层 源自于Image In…

人工智能时代如何加强网络安全

人工智能正在为软件开发人员赋予以前被认为难以想象的新能力。新的生成式人工智能可以提供复杂、功能齐全的应用程序、调试代码或使用简单的自然语言提示添加内嵌注释。 它已准备好以指数方式推进低代码自动化。但与此同时&#xff0c;新一代人工智能可能会为不良行为者提供帮…

vue中控制element表格列的显示与隐藏

背景 根据‘执行进度计算方式’的单选框里面的选项不同&#xff0c;展示不同的column 按最小制剂单位统计: 按含量统计: 实现方式 就是拿到选项框里面的值&#xff0c;再根据里面的值来判断哪些column显示和隐藏&#xff1b;关于显示和隐藏可以设置变量&#xff1b; <…

比对Excel数据

以a个为准绳比对b表数据&#xff0c;添加比对结果列输出。 (本笔记适合初通 Python 的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础那么…

训练自己的ChatGPT 语言模型(一).md

0x00 Background 为什么研究这个&#xff1f; ChatGPT在国内外都受到了广泛关注&#xff0c;很多高校、研究机构和企业都计划推出类似的模型。然而&#xff0c;ChatGPT并没有开源&#xff0c;且复现难度非常大&#xff0c;即使到现在&#xff0c;没有任何单位或企业能够完全复…

【内控版】BLM 战略方法论:战略意图篇

目录 介绍 战略意图 专栏列表 详细内容 配图 介绍 欢迎大家继续来到华为战略方法论的系列内容。 今天就来讲讲 BLM 模型中的战略意图篇。 战略意图在 BLM 模型中的位置,大家可以看这张图。 战略意图</

Redis 主从复制 哨兵 集群

Redis 主从复制 哨兵 集群 一、Redis 主从复制1.1 Redis 主从复制介绍1.2 主从复制的作用1.3 主从复制的流程 二、搭建Redis 主从复制2.1 安装 Redis2.2 创建redis工作目录2.3 环境变量2.4 定义systemd服务管理脚本2.5 修改 Redis 配置文件&#xff08;Master节点操作&#xff…

基于TF-IDF+Tensorflow+PyQt+孪生神经网络的智能聊天机器人(深度学习)含全部Python工程源码及模型+训练数据集

目录 前言总体设计系统整体结构图系统流程图孪生神经网络结构图 运行环境Python 环境TensorFlow 环境 模块实现1. 数据预处理2. 创建模型并编译3. 模型训练及保存4. 模型应用 系统测试1. 训练准确率2. 测试效果3. 模型生成 工程源代码下载其它资料下载 前言 本项目利用TF-IDF&…