MySQL 主从复制架构

主从复制结构

在实际应用场景中,MySQL 复制 90% 以上都是一个 Master 复制到一个或者多个Slave 的架构模式
在这里插入图片描述
缺点:
1、master不能停机,停机就不能接收写请求
2、slave过多会出现延迟

Replication 机制

在这里插入图片描述
master 里的 binlog 里的 position 是在不断变化的,slave 的 relay-log 日志知道应该从哪个 position 开始读。

AFTER_COMMIT 是老版本的半同步通知,在 commit 之后。

AFTER_SYNC 是现在的半同步通知,在 commit 之前。

“半同步”的“半”我有三种解读:

  1. 虽然会阻塞,但是一定时间内没有通知,就会采用异步机制。如果后续又有通知,又会转为半同步。
  2. 写 relay-log 成功就会应答,而不是等 SQL thread 执行成功。
  3. 只等一定数量的 slave 应答,默认是 1.

默认是异步的,没有通知。

配置

不用 Docker 也行,分别在两台虚拟机上分别开启 MySQL 就行了

MySQL 的 Docker 安装

安装 Docker
CentOS7 下 Docker 安装

用以下命令分别在主从机上执行,以后主从机上的 3310 端口,就可以访问 mysql 镜像。
此命令还创建了一个名为 enjoy 的数据库。

docker run --name mysql3310 -p 3310:3306 --privileged=true -ti -e MYSQL_ROOT_PASSWORD=YourPassWord -e MYSQL_DATABASE=enjoy -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -v /home/mysql/docker-data/3310/conf:/etc/mysql/conf.d -v /home/mysql/docker-data/3310/data/:/var/lib/mysql -v /home/mysql/docker-data/3310/logs/:/var/log/mysql -d mysql:5.7

如果有报错:

docker: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).

多尝试几次。
成功后,就可以用 Navicat 或其它软件访问了。
在这里插入图片描述

分别配置 my.conf

各自进入 conf 目录:

 cd /home/mysql/docker-data/3310/conf
vim my.conf

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html

[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
#datadir=/home/mysql/docker-data/3310/data
#socket=/home/mysql/docker-data/3310/mysql.sock

character_set_server=utf8
init_connect='SET NAMES utf8'

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

#log-error=/home/mysql/docker-data/3307/logs/mysqld.log
#pid-file=/home/mysql/docker-data/3307/mysqld.pid

#rpl_semi_sync_master_enabled=1
#rpl_semi_sync_master_timeout=10000

#master配置
server-id=135
#开启复制功能
log-bin=mysql-bin
#id:1 3 5 7
auto_increment_increment=2
auto_increment_offset=1
lower_case_table_names=1
#binlog-do-db=mstest      #要同步的mstest数据库,要同步多个数据库
#binlog-ignore-db=mysql   #要忽略的数据库

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html

[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
#datadir=/home/mysql/docker-data/3310/data
#socket=/home/mysql/docker-data/3310/mysql.sock

character_set_server=utf8
init_connect='SET NAMES utf8'

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

#log-error=/home/mysql/docker-data/3307/logs/mysqld.log
#pid-file=/home/mysql/docker-data/3307/mysqld.pid

#rpl_semi_sync_master_enabled=1
#rpl_semi_sync_master_timeout=10000

#slave配置
server-id=133
#开启复制功能
log-bin=mysql-bin
#id:2 4 6 8
auto-increment-increment=2
auto-increment-offset=2
lower_case_table_names=1
#binlog-do-db=mstest      //要同步的mstest数据库,要同步多个数据库
#binlog-ignore-db=mysql  //要忽略的数据库

主从分别重启 mysql3310

docker restart mysql3310

登录 MySQL

mysql -uroot -pYourPassWord -h 192.168.100.14 -P 3310

赋权限

创建了一个用户 repluser,密码 123456

GRANT REPLICATION SLAVE,FILE,REPLICATION CLIENT ON *.* TO 'repluser'@'%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;

查看日志文件位置和位置

show  master status;

在这里插入图片描述
slave 就是从上面的 File 和 Position 开始同步数据

mysql -uroot -pYourPassWord -h 192.168.100.15 -P 3310

设置主机

change master to master_host='192.168.100.14',master_port=3310,master_user='repluser',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=621;

查看状态

show slave status\G

在这里插入图片描述
IO 进程和 SQL 进程并没有开启

启动 IO 进程和 SQL 进程

start slave;

查看状态

show slave status\G

在这里插入图片描述
关闭这两个线程:

stop slave;

查看进程信息

SHOW PROCESSLIST;

在这里插入图片描述

SHOW PROCESSLIST;

在这里插入图片描述

验证

主机上创建表(主键自动递增)
在这里插入图片描述
从机上也有了
在这里插入图片描述

日志分析

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
有关 master 的信息是通过 master.info 得到的
在这里插入图片描述

半同步配置

安装插件

登陆 mysql 安装

install plugin rpl_semi_sync_master soname 'semisync_master.so';
install plugin rpl_semi_sync_slave soname 'semisync_slave.so';  

检查是否安装成功

show plugins;

在这里插入图片描述

启用半同步

 set global rpl_semi_sync_slave_enabled = 1;

set global rpl_semi_sync_master_enabled = 1;   # 1:启用,0:禁止
set global rpl_semi_sync_master_timeout = 10000;       # 单位为ms

查看半同步状态

show global status like "%sync%";

在这里插入图片描述
主机不是 slave 所以最下面的那个状态是 OFF

show global variables like "%sync%";

在这里插入图片描述

show global status like "%sync%";

在这里插入图片描述

都是 OFF ,看不出来什么,看下面这行命令

show global variables like "%sync%";

在这里插入图片描述

主从数据库不一致如何解决?

场景

对于主从库,读写分离,如果主从库更新同步有时差,就会导致主从库数据的不一致。

解决方式

1、忽略这个数据不一致,在数据一致性要求不高的业务下,未必需要实时一致性。
2、对于需要实时一致性的数据,强制读主库,数据库读写都在主库。当然,要加缓存。
3、利用“半同步”复制,可以让主库在提交前等待从库写完 relay-log 日志。但没有等待 SQL Thread 的工作时间,还是有延时。

©️2020 CSDN 皮肤主题: 岁月 设计师: pinMode 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值