Docker Mysql5.7 + Mycat1.6.7.1主从复制读写分离+水平分库分表配置

Posted Jason_ou2021

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker Mysql5.7 + Mycat1.6.7.1主从复制读写分离+水平分库分表配置相关的知识,希望对你有一定的参考价值。

前言:前面写了一篇Docker mysql5.7 + Mycat1.6.7.1主从复制读写分离的了,再写一篇分库分表的。读写分离为的是解决数据库读写压力,将读写操作分离,但是对于单表数据量大却无能为力了,单表数据量大,势必造成查询慢,查询费服务器资源,或者直接挂掉,像西安健康码一样,访问量大就崩。那就得用上分库分表加上数据节点读写分离,把一张表的数据按某种算法分在不同数据库的不同表里。这篇是水平拆分的,后面还会写一篇垂直拆分的。

1.准备四个MySQL服务器,安装docker环境,拉取MySQL5.7镜像,启动MySQL服务

#拉取镜像
docker pull mysql:5.7

#启动mycat1的MySQL服务
docker run --name mycat1 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 --restart=always -v /root/data/mysql/conf:/etc/mysql -v /root/data/mysql/logs:/var/log/mysql -v /root/data/mysql/data:/var/lib/mysql -d mysql:5.7

#启动mycat2的MySQL服务
docker run --name mycat2 -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 --restart=always -v /root/data/mysql/conf:/etc/mysql -v /root/data/mysql/logs:/var/log/mysql -v /root/data/mysql/data:/var/lib/mysql -d mysql:5.7

#启动mycat3的MySQL服务
docker run --name mycat3 -p 3309:3306 -e MYSQL_ROOT_PASSWORD=123456 --restart=always -v /root/data/mysql/conf:/etc/mysql -v /root/data/mysql/logs:/var/log/mysql -v /root/data/mysql/data:/var/lib/mysql -d mysql:5.7

#启动mycat4的MySQL服务
docker run --name mycat4 -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --restart=always -v /root/data/mysql/conf:/etc/mysql -v /root/data/mysql/logs:/var/log/mysql -v /root/data/mysql/data:/var/lib/mysql -d mysql:5.7

分别启动所有服务器的MySQL服务,我这边用的是自己电脑上的docker起了4个MySQL容器,端口不一样,也可以在4台不同IP的主机上启动4个同3306端口的MySQL服务。

 Navicat连接测试

 

2.两两分组,mycat1和mycat2一组,mycat1为主,mycat2为从。mycat3和mycat4一组,mycat3为主,mycat4为从,配置读写分离,同上篇的。

配置主从库Mysql的配置文件,如下:

主库的(注意要同步复制的数据库名称)

[client]
port = 3306
default-character-set = utf8mb4
 
[mysql]
port = 3306
default-character-set = utf8mb4
 
[mysqld]
##########################
# summary
##########################
#bind-address = 0.0.0.0
#port = 3306
 
##########################
# log bin
##########################
server-id = 100				#必须唯一
log_bin = mysql-bin 		#开启及设置二进制日志文件名称
binlog_format = MIXED
sync_binlog = 1
expire_logs_days =7			#二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
 
#binlog_cache_size = 128m
#max_binlog_cache_size = 512m
#max_binlog_size = 256M
 
binlog-do-db = test 		#要同步的数据库名,只有这个名称会同步复制数据,按需更改
 
binlog-ignore-db = mysql 	#不需要同步的数据库 
binlog_ignore_db = information_schema
binlog_ignore_db = performation_schema
binlog_ignore_db = sys
			
 
##########################
# character set
##########################
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
explicit_defaults_for_timestamp = ON
sql_mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

从库的

[client]
port = 3306
default-character-set = utf8mb4
 
[mysql]
port = 3306
default-character-set = utf8mb4
 
[mysqld]
##########################
# summary
##########################
#bind-address = 0.0.0.0
#port = 3306
 
##########################
# log bin
##########################
server-id = 110  #尽量不要与其他库的值相同,同一局域网会冲突
		
 
##########################
# character set
##########################
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
explicit_defaults_for_timestamp = ON
sql_mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

使用dockers在宿主机上的/root/data/mysql/conf这个目录下用Vim创建my.cnf文件,并把上面主库内容粘贴到主库所在的主机上的Vim编辑器中,从库相同的,把从库配置文件贴在从库所在的主机上的Vim编辑器中,Shift+zz保存退出,再用docker命令重启mysql,主从库都需要进行重启操作,不然配置文件不生效。

docker restart mysql

用docker命令进入主库的mysql容器,登陆MySQL,命令如下

docker exec -it mysql bash
 
 
mysql -u root -p

 命令创建同步复制用户,授予复制同步访问的权限,

#创建用户
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
 
#授权
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

slave是用户名,123456是密码,根据自身需求赋值

Mysql命令查看log-bin是否开启

show variables like 'log_bin';

 ON为开启

MySQL命令查看主库Master的状态

show master status

 把File的名称mysql-bin-log.000006和Position 154记录下来后面配置从库要用,记录自己的值,我这边可能与你的不一样。

到此主库配置完成。

用docker命令进入从库的mysql容器,登陆MySQL,命令如下

docker exec -it mysql bash
 
 
mysql -u root -p

 MySQL命令配置从库的复制主库

#从库的复制主库信息
CHANGE MASTER TO MASTER_HOST='139.224.69.7',
MASTER_PORT=3306,
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin-log.000006',
MASTER_LOG_POS=154; 
 
#启用同步复制
start slave;

 MASTER_HOST='139.224.69.7', //主库IP

MASTER_PORT=3306,    // 主库端口
MASTER_USER='slave',   //主库复制授权用户名
MASTER_PASSWORD='123456', //主库授权密码
MASTER_LOG_FILE='mysql-bin-log.000006',  //主库bin-log文件名 主库show master status返回结果
MASTER_LOG_POS=154;   // 主库bin-log文件中的位置 主库show master status返回结果

注意:如果主库信息配置错误,先用stop slave;命令停止,再用reset slave;重置主库信息,或者主从同步过程中发生意外停止,也可以stop slave;再reset slave;再进行MySQL命令配置从库的复制主库(上面的命令)

 MySQL命令查看从库同步状态

show slave status \\G

 

 Slave_IO_Running:Yes,Slave_SQL_Running:Yes说明配置成功,如果没有成功,检查MySQL服务器外部是否能连接,用Navicat连接。安全组,防火墙等等。

检查主从复制是否生效,用Navicat连接Master主库,建一个数据库test,必须是test,因为my.cnf中配置同步的数据库只有test,也可以改,再重启MySQL。

在主库创建一个test数据库,在创建一个user表,字段id,name,age,新增一条数据,id=8,name=Jason123,age=26,查看主从库如下

 两组都配置好,测试好

3.配置Mycat(windows下)

尽管在写这篇Blog时Mycat已经有2.0Release版,但是考虑到Bug较多不稳定,且国内大部分公司还在使用1.6,所以我这边也使用1.6的配置。Mycat的来源功能特性用途自行百度。配置windows下的,Linux的配置一样的,启动方式命令行启动在bin目录下执行mycat install,mycat start即可

下载Mycat,解压

 进入conf目录,找到server.xml,用编辑器打开,我用Vscode,

 配置访问Mycat的用户名密码和数据库名,保存

再找到schema.xml,修改如图

 再到Mycat的bin目录,找到startup_nowrap.bat,双击启动

 收工,请点个赞再走

以上是关于Docker Mysql5.7 + Mycat1.6.7.1主从复制读写分离+水平分库分表配置的主要内容,如果未能解决你的问题,请参考以下文章

Docker Mysql5.7 + Mycat1.6.7.1主从复制读写分离+水平分库分表配置

Docker Mysql5.7 + Mycat1.6.7.1主从复制读写分离配置

Docker Mysql5.7 + Mycat1.6.7.1主从复制读写分离配置

Docker Mysql5.7 + Mycat1.6.7.1主从复制读写分离配置

Mycat1.6.7连接Mysql8

使用docker安装mysql5.7