文章目录
1、Mycat介绍
1.1、mycat简介
Mycat是一套布式数据库中间件(虚拟数据库类),它本身并不存储数据库。
其原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的 SQL 语句,首先对 SQL 语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、 缓存分析等,然后将此 SQL 发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。
1.2、mycat重要概念
- 逻辑库schema、逻辑表:虚拟的逻辑上的库表 业务开发人员通常在实际应用中并不需要知道中间件的存在,只需 要关注数据库,所以数据库中间件可以被当作一个或多个数据库集 群构成的逻辑库;逻辑库,与MySQL中的Database(数据库)对应,⼀个逻辑库中定义了所包括的Table。
- 全局表
- 数据源:真实的mysql数据库
- 集群配置json
1.3、Mycat1.x与Mycat2功能对比
功能1.6版本2 版本多语句不支持支持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会粘滞且支持设置时间全局表插入支持全局序列号不支持支持全局表插入支持主表插入自增结果作为序列号不支持支持外部调用的分片算法不支持但可定制支持
Mycat1.x跟Mycat2的配置完全不一样了。
1.2、主从复制原理
重点理解:通过三个线程的运行过程原理
- 主服务将数据的更新记录保存到二进制日志–主服务器线程
- 从服务将主服务的二进制日志复制到本地中继日志–从服务IO线程
- 从服务读取中继日志,更新本地数据–从服务SQL线程
2、前提准备
- 两台Linux服务器,配置为:8c32g5m/ CentOS Linux release 7.9.2009
- 都安装docker,docker版本信息如下:
- 其中一台安装配置好jdk1.8 java环境,因为mycat是用java语言编写的,运行需要jdk环境。
3、集群规划
主机名公网ip内网地址端口号角色用户名密码newvts-a39.xxx.xxx.232192.168.1.938066mycatrootxxxxxxxxnewvts-a39.xxx.xxx.232192.168.1.933307masterrootxxxxxxxxnewvts-b39.xxx.xxx.190192.168.1.943308slaverootxxxxxxxx
其中 newvts-a这台机子安装mycat2和mysql8, newvts-b只安装mysql8。
4、安装和配置mysql主从复制
4.1、master节点安装mysql8容器
- 拉取mysql8镜像。
#docker拉取mysql8镜像
docker pull mysql:8.0.25
- master节点安装mysql,容器名称为:mysql-vts-master1
docker run -p 3307:3306 --name mysql-vts-master1 \
-v /mydata/mysql-vts-master/log:/var/log/mysql \
-v /mydata/mysql-vts-master/data:/var/lib/mysql \
-v /mydata/mysql-vts-master/conf:/etc/mysql \
-v /mydata/mysql-vts-master/mysql-files:/var/lib/mysql-files \
-e MYSQL_ROOT_PASSWORD=xxxxxxx \
-d mysql:8.0.25
- 修改/mydata/mysql-vts-master/conf目录下的my.cnf,注意server_id为101。
vim /mydata/mysql-vts-master/conf/my.cnf
[mysqld]## 设置server_id,同一局域网中需要唯一server_id=101## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小(事务)binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。expire_logs_days=7## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致slave_skip_errors=1062
- 重启mysq-vts-master1容器
docker restart mysql-vts-master1
- master节点的mysql数据库中新建一个数据同步用户
#进入容器
docker exec -it mysql-vts-master1 /bin/bash
mysql -uroot -p
xxxxx
#新建一个数据同步用户,用户名为vts_slave
CREATE USER'vts_slave'@'%' IDENTIFIED BY 'xxxxxx';#给这个用户授予权限
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'vts_slave'@'%';#考虑到我的MySQL8 ,密码密码必须修改为mysql_native_password的plugin才能被连接,不然无法连接
ALTER USER'vts_slave'@'%' IDENTIFIED WITH mysql_native_password BY 'xxxxxx';
- 通过navicat连接master-mysql
测试连接成功!
4.2、slave节点安装mysql8容器
- 运行slave节点mysql8容器,端口号为3308;容器名:mysql-vts-slave1。
docker run -p 3308:3306 --name mysql-vts-slave1 \
-v /mydata/mysql-vts-slave/log:/var/log/mysql \
-v /mydata/mysql-vts-slave/data:/var/lib/mysql \
-v /mydata/mysql-vts-slave/conf:/etc/mysql \
-v /mydata/mysql-vts-slave/mysql-files:/var/lib/mysql-files \
-e MYSQL_ROOT_PASSWORD=xxxx \
-d mysql:8.0.25
- 修改/mydata/mysql-vts-slave/conf目录下的my.cnf,注意server_id为102
vim /mydata/mysql-vts-slave/conf/my.cnf
[mysqld]## 设置server_id,同一局域网中需要唯一server_id=102## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin
## 设置二进制日志使用内存大小(事务)binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。expire_logs_days=7## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致slave_skip_errors=1062## relay_log配置中继日志relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志log_slave_updates=1## slave设置为只读(具有super权限的用户除外)read_only=1
- 重启mysq-vts-slave1
docker restart mysql-vts-slave1
- navicat连接slave节点的mysql8 测试连接成功!!
4.2、配置主从复制
- 进入主数据库 master容器,查看日志文件信息和位置标号。
#进入主数据库 master容器
docker exec -it mysql-vts-master1 /bin/bash
mysql -uroot -p
# xxxxxx#在主数据库master容器中查看主从状态
show master status;#记着下面两个值# File mall-mysql-bin.000001# Postion 1005
- 进入从数据库 slave容器 .在从数据库里面配置主从复制
#进入主数据库 slave
docker exec -it mysql-vts-slave1 /bin/bash
mysql -uroot -p
# xxxxxx#在从数据库里面配置主从复制
change master to master_host='192.168.1.93', master_user='vts_slave', master_password='xxxxx', master_port=3307, master_log_file='mall-mysql-bin.000001', master_log_pos=1005, master_connect_retry=30;
- 在从数据库slave中开启主从同步、查看主从状态
#在从数据库中查看主从同步状态:
show slave status \G
#在从数据库中开启主从同步
start slave;#在从数据库中查看主从同步状态:
show slave status \G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
这两个线程为yes,证明主从复制配置成功。
4.3、测试主从复制配置
- 在主数据库中创建库和表,从数据库中也相应自动创建跟主数据库一样的库和表;
- 主数据库中的表操作更新,删除,新增时,从数据库中的表也自动更新;
- 从数据库操作更新,删除,新增操作时,主数据库不会发生变化。
5、安装mycat2和配置读写分离集群
5.1、docker部署mycat2
mycat2镜像我使用的是docker仓库中的zhangyx1619/mycat2:mysql-1.2.1,再次感谢张同学分享的mycat2镜像,我用着很不错。
#拉取镜像
docker pull zhangyx1619/mycat2:mysql-1.2.1
#查看镜像信息,主要查看环境变量的信息
docker inspect zhangyx1619/mycat2:mysql-1.2.1
拥有以下环境变量需要根据实际情况进行设置
"DATA_SOURCE_URL=jdbc:mysql://127.0.0.1:6606/mysql?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
"DATA_SOURCE_USER=mycat",
"DATA_SOURCE_PASSWORD=!@#123",
"MYCAT_ROOT_PASSWORD=!@#123",
"MYCAT_HOME=/usr/local/mycat"
这里我们先通过一下方式运行一个mycat2容器,然后进入此容器拷贝配置文件目录到宿主机
#首先运行一个mycat容器
docker run -d -p 8066:8066 -e DATA_SOURCE_URL=jdbc:mysql://192.168.1.93:3307/mysql -e DATA_SOURCE_USER=root -e DATA_SOURCE_PASSWORD=xxxxx -e MYCAT_ROOT_PASSWORD=xxxxx --name mycat2 zhangyx1619/mycat2:mysql-1.2.1
#进入容器
docker exec -it 自己的容器id /bin/bash
#拷贝容器内部的mycat配置目录到宿主机
docker cp 03f518d53daf:/usr/local/mycat /usr/local/mycat2
#查看宿主机mycat2目录下的文件,确保conf logs两个文件夹的存在#删除刚运行的容器
docker rm -f 03f518d53daf
#挂载数据卷(mycat2相应目录)重新运行zhangyx1619/mycat2:mysql-1.2.1,命令如下:
docker run -d -p 8066:8066 -e DATA_SOURCE_URL=jdbc:mysql://192.168.1.93:3307/mysql -e DATA_SOURCE_USER=root -e DATA_SOURCE_PASSWORD=xxxxx -e MYCAT_ROOT_PASSWORD=xxxxx -v /usr/local/mycat2/conf/:/usr/local/mycat/conf/ -v /usr/local/mycat2/logs/:/usr/local/mycat/logs/ --name mycat2 zhangyx1619/mycat2:mysql-1.2.1
#查看运行的容器
docker ps -a
mycat2容器运行了,再次查看logs下的wrapper.log
tail -f /usr/local/mycat2/logs/wrapper.log
显示successful standlone,证明mycat2启动成功!
5.2、navicat连接mycat2
查看数据库,mycat2中能看到逻辑库了
5.3、配置主从集群信息实现读写分离
- mycat2中创建逻辑库
-- 创建逻辑库
CREATE DATABASE vts_info_sys;
此时查看 /usr/local/mycat2/conf/schemas/ 发现mycat自动创建了配置文件vts_info_sys.schema.json
ll /usr/local/mycat2/conf/schemas/
- customTables放置的是mycat默认的表的配置
- globalTables放置的是全局表的配置
- shardingTables放置分片表的配置
- normalTables放置普通表的配置
- 修改逻辑库json
-- 修改逻辑库 指定vts_info_sys逻辑库默认的targetName, mycat会自动加载vts_info_sys下已经有的物理表或者视图作为单表.
/*+ mycat:createSchema{"customTables":{},
"globalTables":{},
"normalTables":{},
"schemaName":"vts_info_sys",
"shardingTables":{},
"targetName":"prototype"} */;
- 创建数据源、查看数据源
#添加数据源
/*+mycat:createDataSource{"name":"vts_master1","url":"jdbc:mysql://192.168.1.93:3307/?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true","user":"root","password":"xxxx"} */;
/*+mycat:createDataSource{"name":"vts_slave1","url":"jdbc:mysql://192.168.1.94:3308/?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true","user":"root","password":"xxxx"} */;#查看数据源
/*+ mycat:showDataSources{} */;
- 创建修改集群
#创建集群
/*!mycat:createCluster{"name":"vts_info_sys_rw_c","masters":["vts_master1"],"replicas":["vts_slave1"]} */;#查看集群
/*+ mycat:showClusters{} */;
- 查询负载均衡策略readBalanceType
- BALANCE_ALL( 默认值 ):获取集群中所有数据源
- BALANCE_ALL_READ:获取集群中允许读的数据源
- BALANCE_READ_WRITE:获取集群中允许读写的数据源 , 但允许读的数据源优先
- BALANCE_NONE:获取集群中允许写数据源 , 即主节点中选择
- switchType NOT_SWITCH: 不进行主从切换 SWITCH: 进行主从切换
- 在逻辑库中配置数据源(集群名称)
vim /usr/local/mycat2/conf/schemas/vts_info_sys.schema.json
重启Mycat
docker restart mycat2
6、测试
验证读写分离(登录Mycat)
首先,在mycat2中插入4条数据
#插入4条数据
INSERT INTO vts_info_sys.sys VALUES(1, "hh1");
INSERT INTO vts_info_sys.sys VALUES(2, "hh2");
INSERT INTO vts_info_sys.sys VALUES(3, "hh3");
INSERT INTO vts_info_sys.sys VALUES(4, "hh4");
然后,查看主数据库master1和从数据库slave1中,同时也直接了4条相同的数据
此时,我修改从数据库slave1中的第4条数据为hh444,主数据库master1中的数据不会发生改变(这符合主从复制的原理)
这时,我在mycat2中进行查询操作,可以看到查询语句在主从二个主机间切换;
至此,使用MyCat2搭建一主二从数据库集群完成。
平庸的人用热闹填补空虚,优秀的人则用独处成就自己。
版权归原作者 hhzz 所有, 如有侵权,请联系我们删除。