目录
主从复制结构
在实际应用场景中,MySQL 复制 90% 以上都是一个 Master 复制到一个或者多个Slave 的架构模式

缺点:
1、master不能停机,停机就不能接收写请求
2、slave过多会出现延迟
Replication 机制

master 里的 binlog 里的 position 是在不断变化的,slave 的 relay-log 日志知道应该从哪个 position 开始读。
AFTER_COMMIT 是老版本的半同步通知,在 commit 之后。
AFTER_SYNC 是现在的半同步通知,在 commit 之前。
“半同步”的“半”我有三种解读:
- 虽然会阻塞,但是一定时间内没有通知,就会采用异步机制。如果后续又有通知,又会转为半同步。
- 写 relay-log 成功就会应答,而不是等 SQL thread 执行成功。
- 只等一定数量的 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 的工作时间,还是有延时。


被折叠的 条评论
为什么被折叠?



