IT评测·应用市场-qidao123.com

标题: 利用Docker搭建一套Mycat2+MySQL8一主一从、读写分离的最简朴集群(保姆教 [打印本页]

作者: 灌篮少年    时间: 2024-11-7 13:53
标题: 利用Docker搭建一套Mycat2+MySQL8一主一从、读写分离的最简朴集群(保姆教
1、Mycat介绍

1.1、mycat简介

Mycat是一套布式数据库中间件(虚拟数据库类),它本身并不存储数据库。
其原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的 SQL 语句,首先对 SQL 语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、 缓存分析等,然后将此 SQL 发往后端的真实数据库,并将返回的结果做得当的处置惩罚,最终再返回给用户。



1.2、mycat重要概念


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、主从复制原理


重点理解:通过三个线程的运行过程原理

2、前提准备


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容器

  1. #docker拉取mysql8镜像
  2. docker pull mysql:8.0.25
复制代码
  1. docker run -p 3307:3306 --name mysql-vts-master1 \
  2. -v /mydata/mysql-vts-master/log:/var/log/mysql \
  3. -v /mydata/mysql-vts-master/data:/var/lib/mysql \
  4. -v /mydata/mysql-vts-master/conf:/etc/mysql \
  5. -v /mydata/mysql-vts-master/mysql-files:/var/lib/mysql-files \
  6. -e MYSQL_ROOT_PASSWORD=xxxxxxx \
  7. -d mysql:8.0.25
复制代码
  1. vim /mydata/mysql-vts-master/conf/my.cnf
复制代码
  1. [mysqld]
  2. ## 设置server_id,同一局域网中需要唯一
  3. server_id=101
  4. ## 指定不需要同步的数据库名称
  5. binlog-ignore-db=mysql  
  6. ## 开启二进制日志功能
  7. log-bin=mall-mysql-bin  
  8. ## 设置二进制日志使用内存大小(事务)
  9. binlog_cache_size=1M  
  10. ## 设置使用的二进制日志格式(mixed,statement,row)
  11. binlog_format=mixed  
  12. ## 二进制日志过期清理时间。默认值为0,表示不自动清理。
  13. expire_logs_days=7  
  14. ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
  15. ## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
  16. slave_skip_errors=1062
复制代码
  1. docker restart mysql-vts-master1
复制代码
  1. #进入容器
  2. docker exec -it mysql-vts-master1 /bin/bash
  3. mysql -uroot -p
  4. xxxxx
  5. #新建一个数据同步用户,用户名为vts_slave
  6. CREATE USER 'vts_slave'@'%' IDENTIFIED BY 'xxxxxx';
  7. #给这个用户授予权限
  8. GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'vts_slave'@'%';
  9. #考虑到我的MySQL8 ,密码密码必须修改为mysql_native_password的plugin才能被连接,不然无法连接
  10. ALTER USER 'vts_slave'@'%' IDENTIFIED WITH mysql_native_password BY 'xxxxxx';
复制代码
测试毗连乐成!

4.2、slave节点安装mysql8容器

  1. docker run -p 3308:3306 --name mysql-vts-slave1 \
  2. -v /mydata/mysql-vts-slave/log:/var/log/mysql \
  3. -v /mydata/mysql-vts-slave/data:/var/lib/mysql \
  4. -v /mydata/mysql-vts-slave/conf:/etc/mysql \
  5. -v /mydata/mysql-vts-slave/mysql-files:/var/lib/mysql-files \
  6. -e MYSQL_ROOT_PASSWORD=xxxx \
  7. -d mysql:8.0.25
复制代码
  1. vim /mydata/mysql-vts-slave/conf/my.cnf
复制代码
  1. [mysqld]
  2. ## 设置server_id,同一局域网中需要唯一
  3. server_id=102
  4. ## 指定不需要同步的数据库名称
  5. binlog-ignore-db=mysql  
  6. ## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
  7. log-bin=mall-mysql-slave1-bin  
  8. ## 设置二进制日志使用内存大小(事务)
  9. binlog_cache_size=1M  
  10. ## 设置使用的二进制日志格式(mixed,statement,row)
  11. binlog_format=mixed  
  12. ## 二进制日志过期清理时间。默认值为0,表示不自动清理。
  13. expire_logs_days=7  
  14. ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
  15. ## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
  16. slave_skip_errors=1062  
  17. ## relay_log配置中继日志
  18. relay_log=mall-mysql-relay-bin  
  19. ## log_slave_updates表示slave将复制事件写进自己的二进制日志
  20. log_slave_updates=1  
  21. ## slave设置为只读(具有super权限的用户除外)
  22. read_only=1
复制代码
  1. docker restart mysql-vts-slave1
复制代码

4.2、设置主从复制

  1. #进入主数据库 master容器
  2. docker exec -it mysql-vts-master1 /bin/bash
  3. mysql -uroot -p
  4. # xxxxxx
  5. #在主数据库master容器中查看主从状态
  6. show master status;
  7. #记着下面两个值
  8. # File mall-mysql-bin.000001
  9. # Postion 1005
复制代码

  1. #进入主数据库 slave
  2. docker exec -it mysql-vts-slave1 /bin/bash
  3. mysql -uroot -p
  4. # xxxxxx
  5. #在从数据库里面配置主从复制
  6. 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;
复制代码
  1. #在从数据库中查看主从同步状态:
  2. show slave status \G
  3. #在从数据库中开启主从同步
  4. start slave;
  5. #在从数据库中查看主从同步状态:
  6. show slave status \G
复制代码

  1.          Slave_IO_Running: Yes
  2.         Slave_SQL_Running: Yes
复制代码
这两个线程为yes,证明主从复制设置乐成。
4.3、测试主从复制设置

5、安装mycat2和设置读写分离集群

5.1、docker摆设mycat2

mycat2镜像我使用的是docker仓库中的zhangyx1619/mycat2:mysql-1.2.1,再次感谢张同学分享的mycat2镜像,我用着很不错。
  1. #拉取镜像
  2. docker pull zhangyx1619/mycat2:mysql-1.2.1
复制代码
  1. #查看镜像信息,主要查看环境变量的信息
  2. docker inspect zhangyx1619/mycat2:mysql-1.2.1
复制代码

拥有以下环境变量需要根据实际环境进行设置
  1.                 "DATA_SOURCE_URL=jdbc:mysql://127.0.0.1:6606/mysql?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
  2.                 "DATA_SOURCE_USER=mycat",
  3.                 "DATA_SOURCE_PASSWORD=!@#123",
  4.                 "MYCAT_ROOT_PASSWORD=!@#123",
  5.                 "MYCAT_HOME=/usr/local/mycat"
复制代码
这里我们先通过一下方式运行一个mycat2容器,然后进入此容器拷贝设置文件目录到宿主机
  1. #首先运行一个mycat容器
  2. 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
  3. #进入容器
  4. docker exec -it 自己的容器id /bin/bash
  5. #拷贝容器内部的mycat配置目录到宿主机
  6. docker cp 03f518d53daf:/usr/local/mycat /usr/local/mycat2
  7. #查看宿主机mycat2目录下的文件,确保conf logs两个文件夹的存在
  8. #删除刚运行的容器
  9. docker rm -f 03f518d53daf
  10. #挂载数据卷(mycat2相应目录)重新运行zhangyx1619/mycat2:mysql-1.2.1,命令如下:
  11. 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
  12. #查看运行的容器
  13. docker ps -a
复制代码

mycat2容器运行了,再次查看logs下的wrapper.log
  1. tail -f /usr/local/mycat2/logs/wrapper.log
复制代码
显示successful standlone,证明mycat2启动乐成!
5.2、navicat毗连mycat2


查看数据库,mycat2中能看到逻辑库了

5.3、设置主从集群信息实现读写分离

  1. -- 创建逻辑库
  2. CREATE  DATABASE vts_info_sys;
复制代码

此时查看 /usr/local/mycat2/conf/schemas/ 发现mycat主动创建了设置文件vts_info_sys.schema.json
  1. ll  /usr/local/mycat2/conf/schemas/
复制代码


  1. -- 修改逻辑库 指定vts_info_sys逻辑库默认的targetName, mycat会自动加载vts_info_sys下已经有的物理表或者视图作为单表.
  2. /*+ mycat:createSchema{
  3.   "customTables":{},
  4.   "globalTables":{},
  5.   "normalTables":{},
  6.   "schemaName":"vts_info_sys",
  7.   "shardingTables":{},
  8.   "targetName":"prototype"
  9. } */;
复制代码
  1. #添加数据源
  2. /*+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" } */;
  3. /*+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" } */;
  4. #查看数据源
  5. /*+ mycat:showDataSources{} */;
复制代码

  1. #创建集群
  2. /*!mycat:createCluster{"name":"vts_info_sys_rw_c","masters":["vts_master1"],"replicas":["vts_slave1"]} */;
  3. #查看集群
  4. /*+ mycat:showClusters{} */;
复制代码


  1. vim  /usr/local/mycat2/conf/schemas/vts_info_sys.schema.json
复制代码

重启Mycat
  1. docker restart mycat2
复制代码
6、测试

验证读写分离(登录Mycat)
首先,在mycat2中插入4条数据
  1. #插入4条数据
  2. INSERT INTO vts_info_sys.sys VALUES(1, "hh1");
  3. INSERT INTO vts_info_sys.sys VALUES(2, "hh2");
  4. INSERT INTO vts_info_sys.sys VALUES(3, "hh3");
  5. INSERT INTO vts_info_sys.sys VALUES(4, "hh4");
复制代码

然后,查看主数据库master1和从数据库slave1中,同时也直接了4条相同的数据


此时,我修改从数据库slave1中的第4条数据为hh444,主数据库master1中的数据不会发生改变(这符合主从复制的原理)

这时,我在mycat2中进行查询操作,可以看到查询语句在主从二个主机间切换;


至此,使用MyCat2搭建一主二从数据库集群完成。


平庸的人用热闹填补空虚,优秀的人则用独处成就本身。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4