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

Posted Jason_ou2021

tags:

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

前言:随着项目用户数越来越多,单机数据库已经不能满足业务需求了,为了减少单库压力,及容灾,配置读写分离。故名思意,即把写在一个数据库,读在另外的数据库。写的库叫主库(Master),读的库叫从库(Slave),读写分离的前提是把mysql配置主从复制,是基于Mysql提供的bin-log sql日志复制功能,需要配置。下面是具体操作。

1.配置主从复制

A.准备至少两台服务器,并且所有服务器安装好Docker环境(这里不写出来了),拉取Mysql5.7镜像。这里注意服务器的防火墙和云服务器的安全组是否把3306端口开放。

B.我这边用的是Docker搭建的Mysql5.7服务,3台Ubuntu服务器,分别是:主服务器(139.224.69.7:3306),从服务器1(139.224.0.119:3306),从服务器2(106.15.33.199:3306),用的Docker启动,命令:

docker run --name mysql -p 3306: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

启动后,最好用Navicat连接测试一下。

 

把剩下两台从服务器也用Docker启动Mysql,命令:

docker run --name mysql -p 3306: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

 

启动后,最好用Navicat连接测试一下。

C.配置主从库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

D.用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记录下来后面配置从库要用,记录自己的值,我这边可能与你的不一样。

到此主库配置完成。

E.用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,查看主从库如下

 

2.配置Mycat的主从复制(windows下的)

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

 

A. 下载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