一、mysql主从复制原理

(1)Master的更新事件(update insert delete)会按照顺序写入bin-log中。当slave连接到master的后,master机器会为slave开启binlog dump线程,改线程会去读取bin-log日志

(2)Slave连接到Master后,Slave库有一个I/O线程,通过请求binlog dump thread 读取bin-log 日志,然后写入从库的relay log 日志中。

(3)Slave还有一个SQL线程,实时监控relay-log日志内容是否有更新,解析文件中的sql语句,在Slave数据库中去执行

二、mysql复制的优点 如果主库出现问题,可以快速切换到从库提供服务 可以在从库执行查询操作,降低主库的访问压力 可以在从库进行备份,以免备份期间影响主库的服务

三、mysql复制解决的问题

数据分布

负载平衡

数据备份,

保证数据安全

高可用性和容错行

实现读写分离,

缓解数据库压力,在开发工作中,有时候会遇见某个sql语句需要锁表,导致暂时不能使用读的服务,这样就会影响现有业务,使用 主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作

四、搭建主服务器

4.1、创建MYSQL数据卷目录

mkdir -p /databak/mysql-master/conf

4.2、创建容器并运行

docker run --privileged=true -p 3307:3306 --name mysql-master -v /databak/mysql-master/log:/var/log/mysql -v /databak/mysql-master/data:/var/lib/mysql -v /databak/mysql-master/conf:/etc/mysql -v /databak/mysql-master/mysql-files:/var/lib/mysql-files -e MYSQL_ROOT_PASSWORD=123456 --restart=unless-stopped -d mysql

docker run --privileged=true -p 3307:3306 --name mysql-master -v /databak/mysql-master/log:/var/log/mysql -v /databak/mysql-master/data:/var/lib/mysql -v /databak/mysql-master/conf:/etc/mysql/conf.d -v /databak/mysql-master/mysql-files:/var/lib/mysql-files -e MYSQL_ROOT_PASSWORD=123456 -d mysql

docker run --privileged=true -p 3307:3306 --name mysql-master -v /databak/mysql-master/log:/var/log/mysql -v /databak/mysql-master/data:/var/lib/mysql -v /databak/mysql-master/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql

4.3、配置文件my.cnf

cd /databak/mysql-master/conf

touch my.cnf

[client]

default_character_set=utf8

[mysql]

default-character-server=uft8mb4

[mysqld]

server_id = 101

binlog-ignore-db=mysql

log-bin=mall-mysql-bin

binlog_cache_size=1M

binlog_format=mixed

expire_logs_days=7

slave_skip_errors=1062

collation_server=utf8_general_ci

character_set_server=utf8

default_authentication_plugin=mysql_native_password

4.4、重启容器 docker restart mysql-master

4.5、检查是否启动成功 docker ps -a

有running说明mysql启动成功

4.6、容器内配置

1、docker exec -it mysql-master /bin/bash

2、mysql -uroot -p

3、若密码失效,则重置密码

4、远程连接工具连接

use mysql;

update use set host='%' where user='root';

grant all privileges on root .* to 'root'@'%';

alter user root identified with mysql_native_password by '123456';

FLUSH PRIVILEGES;

show variables like 'character%';

5、创建从服务器连接用户

create user 'slave'@'%' identified by '123456';

grant replication slave on . to 'slave'@'%';

flush privileges;

show master status;

五、从服务器搭建

5.1创建mysql数据卷 mkdir -p /databak/mysql-slave/conf

5.2创建容器并运行

docker run -d -p 3308:3306 --provileged=true -v /databak/mysql-slave/log:/var/log/mysql -v /databak/mysql-slave/data:/var/lib/mysql -v /databak/mysql-slave/conf:/etc/mysql/conf.d -v /databak/mysql-slave/mysql-files:/var/lib/mysql-files -e MYSQL_ROOT_PASSWORD=123456 --name mysql-slave mysql

5.3配置文件my.cnf

cd /databak/mysql-slave/conf touch my.cnf

[client]

default_character_set=utf8

[mysql]

default-character-server=uft8mb4

[mysqld]

server_id = 102

binlog-ignore-db=mysql

log-bin=mall-mysql-slave1-bin

binlog_cache_size=1M

binlog_format=mixed

expire_logs_days=7

slave_skip_errors=1062

relay_log=mall-mysql-relay-bin

log_slave_updates=1

read_only=1

collation_server=utf8_general_ci

character_set_server=utf8

default_authentication_plugin=mysql_native_password

5.4重启容器 docker restart mysql-slave

5.5查看主从复制状态 进入主服务器查看主从复制状态 docker exec -it mysql-master /bin/bash mysql -uroot -p123456 show master status;

5.6配置主从连接关系 docker exec -it mysql-slave /bin/bash

mysql -uroot -p123456

change master to master_port='主机ip',master_user='slave',master_password='123456',master_port=3307,mster_log_pos=820,master_connect_retry=30;

5.7开启主从复制

show slave status \G;

5.8 启动主从复制和查看从数据库状态 docker exec -it mysql-slave /bin/bash

mysql -uroot -p123456

start slave;

stop slave;

show slave status \G;

slave_io_running: YES

slave_sql_running: YES