?? 一、mysql 同步復制有關概述
? 前言、何為主從復制
一般數(shù)據(jù)庫都是讀取壓力大于寫數(shù)據(jù)壓力,主從復制即為了實現(xiàn)數(shù)據(jù)庫的負載均衡和讀寫分離。通過將Mysql的某一臺主機的數(shù)據(jù)復制到其它主機(slaves)上,主服務器只負責寫,而從服務器只負責讀。
如生產(chǎn)環(huán)境中,使用redis數(shù)據(jù)庫作為緩存數(shù)據(jù)庫,用戶訪問業(yè)務數(shù)據(jù)時,先從緩存數(shù)據(jù)庫查詢,如果緩存數(shù)據(jù)庫沒有,再從業(yè)務數(shù)據(jù)庫讀取。
? 1.1 mysql支持的復制方式
-
基于語句的復制--Statement(Statement-Based Replication,SBR)
: 在主服務器上執(zhí)行的sql
語句,在從服務器上執(zhí)行同樣的語句。mysql默認采用基于語句的復制,效率比較高。一旦發(fā)現(xiàn)沒法精確復制時,會自動選擇基于行的復制,每一條會修改數(shù)據(jù)的sql
都會記錄在 binlog 中。 -
基于行的復制--Row(Row-Based Replication,RBR)
:把改變的內(nèi)容復制過去,僅保存哪條記錄被修改。而不是把命令在從服務器上執(zhí)行一遍, 從mysql5.0開始支持。 -
混合類型的復制--Mixed(Mixed-Based Replication,MBR)
: 默認采用基于語句的復制,一旦發(fā)現(xiàn)基于語句的無法精確的復制時,就會采用基于行的復制,Statement 和 Row 的混合體。 -
通過
alter user root identified by '新密碼';
? 1.2 mysql支持的復制類型
1.2.1??異步復制
-
mysql
數(shù)據(jù)庫默認的復制方式 - 異步復制指主庫以異步的方式同步數(shù)據(jù)到一個從庫或多個從庫中。
- 主節(jié)點
不會主動推送數(shù)據(jù)
到從節(jié)點,主庫在執(zhí)行完客戶端提交的事務后會立即將結果返給給客戶端,并不關心從庫是否已經(jīng)接收并處理。 - 主節(jié)點如果掉了,此時主節(jié)點上已經(jīng)提交的事務可能并沒有傳到從節(jié)點上,如果此時,強行將從節(jié)點提升為主節(jié)點,可能導致新主節(jié)點上的
數(shù)據(jù)不完整
。
1.2.2??同步復制
- 同步復制是
mysql
主節(jié)點特有的復制方式,當主庫執(zhí)行完一個事務,然后所有的從庫都復制了該事務并成功執(zhí)行完才返回成功信息給客戶端。
1.2.3??半同步復制
- 介于異步復制和全同步復制之間,主庫在執(zhí)行完客戶端提交的事務后不是立刻返回給客戶端,而是等待至少一個從庫接收到并寫到
relay log
中才返回成功信息給客戶端 - 只能保證主庫的
Binlog
至少傳輸?shù)搅艘粋€從節(jié)點上,否則需要等待直到超時時間,然后切換成異步模式再提交。
1.2.4??[圖解]-異步復制 / 同步復制 / 半同步復制
? 1.3 mysql復制解決的問題
-
數(shù)據(jù)分布 (Data distribution )
—提高數(shù)據(jù)操作自然并行度,以達到最優(yōu)的執(zhí)行效率的目的 -
負載平衡(load balancing)
—主服務器只負責寫,而從服務器只負責讀 -
備份(Backups)
—災難恢復,對損壞的數(shù)據(jù)進行恢復和還原 -
高可用性和容錯行( High availability and failover)
—確保 mysql 數(shù)據(jù)庫在故障和異常情況下仍然能夠提供可靠的服務
? 1.4 mysql復制是如何工作的
復制整體來說有 3
個步驟:
-
master
將改變記錄到二進制日志(binary log)中(這些記錄叫做二進制日志事件,binary log events) -
slave
將master
的binary log events拷貝到它的中繼日志(relay log) -
slave
重做中繼日志中的事件,將改變反映它自己的數(shù)據(jù)
?? 二、mysql 同步復制搭建
? 2.1 主從節(jié)點準備
克隆兩臺安裝好mysql8.0的虛擬機,并修改復制的db-server02(從節(jié)點)mysql server的UUID。
[root@db-server ~]# vi /var/lib/mysql/auto.cnf
####修改UUID
[auto]
server-uuid=83822642-0030-11ee-a2cc-000c29c2e1ad
####重啟mysql服務
[root@db-server ~]# systemctl restart mysqld
mysql服務器 | Ip |
---|---|
db-server(主節(jié)點) | 192.168.181.101 |
db-server02(從節(jié)點) | 192.168.181.102 |
? 2.2 主節(jié)點配置
2.2.1 ?? 創(chuàng)建log-bin二進制日志存儲路徑
###創(chuàng)建二進制日志存儲路徑
[root@db-server /]# mkdir -p -v /var/log/mysql/mysql-bin
mkdir: created directory ‘/var/log/mysql/mysql-bin’
###賦權mysql用戶組合mysql用戶
[root@db-server ~]# chown -R mysql:mysql /var/log/mysql
[root@db-server ~]# chown -R mysql:mysql /var/log/mysql/mysql-bin
2.2.2 ?? 修改my.cnf配置文件
【必須參數(shù)】:
####添加內(nèi)容
[mysqld]
#配置唯一的服務器ID,一般使用IP最后一位
server-id=1
# 設置需要復制的數(shù)據(jù)庫,默認全部記錄。比如: binlog-do-db=db_master_slave
binlog-do-db=db_master_slave
#開啟log-bin二進制日志,指名路徑。如: 本地的路/var/log/mysql/mysql-bin
log-bin=/var/log/mysql/mysql-bin
#設置binlog格式
binlog_format=STATEMENT
【可選參數(shù)】:
# 0表示讀寫 (主機),1表示只讀(從機)
read-only=0
#設置日志文件保留的時長,單位是秒
binlog_expire_logs_seconds=6000
#控制單個二進制日志大小。此參數(shù)的最大和默認值是1GB
max_binlog_size=20
#設置不要復制的數(shù)據(jù)庫
binlog-ignore-db=test
#設置需要復制的數(shù)據(jù)庫,默認全部記錄。比如: binlog-do-db=dbtest01
binlog-do-db=需要復制的主數(shù)據(jù)庫名字
#設置binlog格式
binlog_format=STATEMENT
2.2.3 ?? 重啟mysql服務,檢查是否生效
[root@db-server mysql]# systemctl restart mysqld
[root@db-server mysql]# systemctl status mysqld
[root@db-server mysql]# mysql -u root -p
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 1 |
+---------------+-------+
1 row in set (0.02 sec)
mysql>
###開啟log-bin二進制日志
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row in set (0.00 sec)
mysql>
##skip_networking--tcp/ip協(xié)議通信,默認是OFF關閉狀態(tài),啟用后主從將無法通信
mysql> show variables like '%skip_networking%';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| skip_networking | OFF |
+-----------------+-------+
1 row in set (0.00 sec)
mysql>
2.2.4 ?? 主節(jié)點創(chuàng)建主從復制賬號
- mysql5.7版本:
mysql> grant replication slave on *.* to 'slave1'@'%' identified by 'Zyl@123456'; ###用戶地址可以指定從機IP192.168.181.102
- mysql8.0版本:
mysql> create user 'slave1'@'%' identified by 'Zyl@123456';
Query OK, 0 rows affected (0.02 sec)
mysql>grant replication slave on *.* to 'slave1'@'%';
Query OK, 0 rows affected (0.01 sec)
mysql>alter user 'slave1'@'%' identified with mysql_native_password by 'Zyl@123456';
Query OK, 0 rows affected (0.02 sec)
mysql>flush privileges;
Query OK, 0 rows affected (0.02 sec)
2.2.5 ?? 查看主節(jié)點的二進制日志的名稱
- File和Position兩個參數(shù)需要在從庫配置中使用。
mysql> show master status;
+------------------+----------+-----------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+-----------------+------------------+-------------------+
| mysql-bin.000004 | 157 | db_master_slave | | |
+------------------+----------+-----------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql>
? 2.3 從節(jié)點配置
2.3.1 ?? 修改my.cnf配置文件
【必須參數(shù)】:
[mysqld]
#配置唯一的服務器ID,一般使用IP最后一位
server-id=2
###開啟中繼日志,從主服務器上同步日志文件記錄到本地
relay-log=relay-log-bin
【可選參數(shù)】:
[mysqld]
###定義中繼日志文件的位置和名稱
relay-log-index=slave-relay-bin.index
2.3.2 ?? 在從節(jié)點配置需要復制的主機
####語法##
change master to
master_host='主節(jié)點IP',
master_user='主節(jié)點用戶名',
master_password='用戶密碼',
master_log_file='mysql-bin.具體數(shù)字',
master_log_pos=具體值;
####本環(huán)境配置##
mysql> change master to master_host='192.168.181.101',master_user='slave1',master_password='Zyl@123456',master_log_file='mysql-bin.000004',master_log_pos=157 ;
Query OK, 0 rows affected, 8 warnings (0.06 sec)
mysql>
2.3.3 ?? 在從節(jié)點開啟slave同步,查看同步狀態(tài)
####開啟slave同步
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.05 sec)
####查看同步狀態(tài)
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for source to send event
Master_Host: 192.168.181.101
Master_User: slave1
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 157
Relay_Log_File: relay-log-bin.000006
Relay_Log_Pos: 373
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
mysql>
? 主要看這兩個參數(shù),兩個參數(shù)的值都為Yes
,即主從配置搭建成功:
-
Slave_IO_Running
:IO線程,負責與主機的io通信 -
Slave_SQL_Running
:SQL線程,責自己的slave MySQL進程
如果報錯Slave failed to initialize relay_log info structure from the repository
,需要清理之前的relay_log,重新啟用新的relay_log即可。
reset slave;
? 2.4 主節(jié)點創(chuàng)建數(shù)據(jù)庫測試
- 主節(jié)點配置的
db_master_slave
庫
####主節(jié)點創(chuàng)建數(shù)據(jù)庫db_master_slave
mysql> create database db_master_slave;
Query OK, 1 row affected (0.01 sec)
mysql> use db_master_slave
Database changed
mysql>
####創(chuàng)建表
mysql> CREATE TABLE `tab1` (
-> `id` int NOT NULL,
-> `name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
-> `class` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
-> PRIMARY KEY (`id`) USING BTREE
-> ) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = Dynamic;
Query OK, 0 rows affected, 6 warnings (0.02 sec)
mysql>
####插入測試數(shù)據(jù)
mysql> INSERT INTO `tab1` VALUES (1001, '曹操', '1班');
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO `tab1` VALUES (1002, '張飛', '1班');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO `tab1` VALUES (1003, '項羽', '3班');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO `tab1` VALUES (1004, '劉備', '2班');
Query OK, 1 row affected (0.00 sec)
mysql>
? 2.5 從節(jié)點查看同步數(shù)據(jù)
2.5.1 ?? 數(shù)據(jù)測試-主節(jié)點插入數(shù)據(jù),從節(jié)點查看
mysql> show databases;
###查看tab1表數(shù)據(jù)
mysql> select * from tab1;
+------+--------+-------+
| id | name | class |
+------+--------+-------+
| 1001 | 曹操 | 1班 |
| 1002 | 張飛 | 1班 |
| 1003 | 項羽 | 3班 |
| 1004 | 劉備 | 2班 |
+------+--------+-------+
4 rows in set (0.00 sec)
mysql>
2.5.2 ?? 數(shù)據(jù)測試-主節(jié)點刪除數(shù)據(jù),從節(jié)點查看
? 2.6 主從同步關閉和開啟
- ?? 停止主從服務復制的功能------
從機執(zhí)行
####開啟slave同步
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.05 sec)
####關閉slave同步
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.03 sec)
?? 三、mysql 同步復制延遲問題
? 3.1 從節(jié)點配置主從同步要求
- ?? 讀庫與寫庫數(shù)據(jù)一致(最終一致)
- ?? 寫數(shù)據(jù)必須寫到寫庫
- ?? 讀數(shù)據(jù)不一定必須到讀庫
主從同步復制的內(nèi)容是二進制文件,在傳輸過程中會存在主從延遲
的情況,會導致用戶在從庫讀取的數(shù)據(jù)不是最新數(shù)據(jù)
----->即數(shù)據(jù)不一致性
問題。文章來源:http://www.zghlxwxcb.cn/news/detail-475717.html
? 3.2 如何解決【數(shù)據(jù)不一致性】問題
- ?? 異步復制—
master
執(zhí)行操作后直接返回給client
結果,不再等待slave
反饋同步信息,但這種方式數(shù)據(jù)一致性最弱。 - ?? 半同步復制—只要有一個
slave
復制了該事務并成功執(zhí)行完就返回成功信息給client
,這種方式提高了數(shù)據(jù)一致性,但是增加了網(wǎng)絡延遲時間,降低了主庫寫的效率。 - 組復制(MGR)----mysql 5.7.17 推出的新的數(shù)據(jù)復制技術,基于Paxos協(xié)議復制,很好的彌補了前面兩種復制的不足。
文章來源地址http://www.zghlxwxcb.cn/news/detail-475717.html
??四、總結—溫故知新
? 了解何為主從復制
? mysql支持的復制類型之間區(qū)別,以及解決的問題
? mysql主從復制搭建
? mysql主從復制延遲及解決方案
??【上一篇】 |
??The End?? 點點關注,收藏不迷路??
|
【下一篇】?? |
到了這里,關于Mysql數(shù)據(jù)庫--實現(xiàn)主從復制搭建與同步的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!