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 的工作時間,還是有延時。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章