基于docker,mysql,mycat2 的主从复制,读写分离

1.理解MySQL主从复制原理。

MySQL的主从复制是指将一个MySQL数据库实例(即主库)上的数据变更,通过二进制日志的方式复制到另一个MySQL数据库实例(即从库)上的过程,以达到数据同步的目的。

具体来说,在主从复制中,主库会在进行数据更新操作时,将更新操作的内容记录在二进制日志(binlog)中,并且通知从库这一操作。从库在接收到主库通知后,就会开启一个I/O线程,从主库的二进制日志中读取事件,并将这些事件写入自己的中继日志(relay log)中。随后,从库会开启一个SQL线程,执行中继日志中的事件来更新自己的数据。

主从复制的好处是可以增加系统的可用性和扩展性,同时也可以提高系统的性能。但同时也存在一些缺点,比如从库可能会有数据延迟

2.完成MySQL主从复制(一主两从)。

1.启用三个docker容器

docker run --name master -p 3311:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 --lower_case_table_names=1
docker run --name slave1 -p 3312:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 --lower_case_table_names=1
docker run --name slave2 -p 3313:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 --lower_case_table_names=1  

2:开始写入配置文件

法1: 直接进入容器中写入

1.docker exec -it master bash
2. cd /etc/mysql/conf.d/
3. vi docker.cnf
此法问题颇多,不建议用

法2:将配置文件复制出来,修改完后再复制到容器

1. 复制出来
	 docker cp master:/etc/mysql/conf.d/docker.cnf master.cnf
	docker cp slave1:/etc/mysql/conf.d/docker.cnf slave1.cnf
  	docker cp slave2:/etc/mysql/conf.d/docker.cnf slave2.cnf
  	如果提示找不到文件则自己创建相关文件再将其写入对应内容后cp到容器
  	
 2:修改完后写回去
 	 docker cp master.cnf master:/etc/mysql/conf.d/docker.cnf 
	docker cp slave1.cnf slave1:/etc/mysql/conf.d/docker.cnf 
  	docker cp slave2.cnf slave2:/etc/mysql/conf.d/docker.cnf 

以下是写入的内容

主机:
skip-host-cache
skip-name-resolve
server-id = 1 
#服务器的唯一标识
log_bin = master.bin 
# 开启日志功能
从机:
 server-id = 2 #服务器的唯一标识

3. 重启容器并完成相关配置

进入主机:

create user 'master'@'%' identified by '123456'; 
grant replication slave on *.* to 'master'@'%';
flush privileges;
show master status;
//记住file名和position,从服务器配置要用
//如在下图中的 master.000001 和 154

基于docker,mysql,mycat2 的主从复制,读写分离_第1张图片

从机:

change master to
master_host="192.168.128.132",master_port=3307,
// host 是主机的ip地址,port是映射的端口号,从服务器的配置相同
master_user="master",
master_password="123456",
master_log_file="master.000001",
master_log_pos=154;

4:启动成功

基于docker,mysql,mycat2 的主从复制,读写分离_第2张图片

3.基于MySQL一主两从配置,完成MySQL读写分离配置

正在做

错误合集

1:show master status; 显示为空

原因:配置文件错误,二进制日志没配置好
解决:重新写入配置文件

2. MySQL 时遇到了 Found option without preceding group in config file

原因: MySQL 配置文件中存在语法错误,在配置文件的某个位置缺少一个有效的组声明而导致的。每个配置文件中都必须包含至少一个有效的组声明,例如 [mysqld],用于指定应用哪些设置。

错误演示

skip-host-cache
skip-name-resolve
server-id = 1 
log_bin = master.bin 

正确写法:

[mysqld]
skip-host-cache
skip-name-resolve
server-id = 1 
log_bin = master.bin 

3:docker msyql Exited (1)

如图:
在这里插入图片描述
原因:输入MYSQL_ROOT_PASSWORD的时候少打了个字母
在这里插入图片描述

4:在docker的/etc/mysql/con.f/下没有docker.cnf

原因: MySQL 官方 Docker 镜像中已经取消了 docker.cnf 文件,取而代之的是 /etc/mysql/conf.d 目录下的 .cnf 配置文件。
解决办法:直接自己创建一个就好了

5:you need (at least one of) the SUPER, REPLICATION CLIENT privilege(s) for this operation

原因:当前用户权限不够用,需要SUPER, REPLICATION权限
SUPER:允许用户执行需要超级用户特权的操作
REPLICATION:允许用户查看关于复制状态的信息。
解决办法:
法1:切换root用户
法2:给当前用户权限,设当前用户的名称为:libai(我没试过,但理论上可行)

GRANT SUPER ON *.* TO 'libai'@'host';
GRANT REPLICATION CLIENT ON *.* TO 'libai'@'host';

6:Mycat启动不了

基于docker,mysql,mycat2 的主从复制,读写分离_第3张图片
原因:JDK没有按照

你可能感兴趣的:(云原生,docker,mysql)