1. 程式人生 > >mysql主從複製和並行複製

mysql主從複製和並行複製

Mysql的主從複製和並行複製

  1. 複製概述
    mysql內建的複製功能是構建大型,高效能應用程式的基礎。將Mysql的資料分佈到多個系統上去,這種分佈的機制,是通過將Mysql的某一臺主機的資料複製到其它主機(slaves)上,並重新執行一遍來實現的。複製過程中一個伺服器充當主伺服器,而一個或多個其它伺服器充當從伺服器。主伺服器將更新寫入二進位制日誌檔案,並維護檔案的一個索引以跟蹤日誌迴圈。這些日誌可以記錄傳送到從伺服器的更新。當一個從伺服器連線主伺服器時,它通知主伺服器從伺服器在日誌中讀取的最後一次成功更新的位置。從伺服器接收從那時起發生的任何更新,然後封鎖並等待主伺服器通知新的更新。
    請注意當你進行復制時,所有對複製中的表的更新必須在主伺服器上進行。否則,你必須要小心,以避免使用者對主伺服器上的表進行的更新與對從伺服器上的表所進行的更新之間的衝突
  2. 複製工作過程:
    (1) master將改變記錄到二進位制日誌(binary log)中(這些記錄叫做二進位制日誌事件,binary log events);
    (2) slave將master的binary log events拷貝到它的中繼日誌(relay log);

    (3) slave重做中繼日誌中的事件,將改變反映它自己的資料。
    下圖描述了複製的過程:
    這裡寫圖片描述

    該過程的第一部分就是master記錄二進位制日誌。在每個事務更新資料完成之前,master在二日誌記錄這些改變。MySQL將事務序列的寫入二進位制日誌,即使事務中的語句都是交叉執行的。在事件寫入二進位制日誌完成後,master通知儲存引擎提交事務。
    下一步就是slave將master的binary log拷貝到它自己的中繼日誌。首先,slave開始一個工作執行緒——I/O執行緒。I/O執行緒在master上開啟一個普通的連線,然後開始binlog dump process。Binlog dump process從master的二進位制日誌中讀取事件,如果已經跟上master,它會睡眠並等待master產生新的事件。I/O執行緒將這些事件寫入中繼日誌。
    SQL slave thread(SQL從執行緒)處理該過程的最後一步。SQL執行緒從中繼日誌讀取事件,並重放其中的事件而更新slave的資料,使其與master中的資料一致。只要該執行緒與I/O執行緒保持一致,中繼日誌通常會位於OS的快取中,所以中繼日誌的開銷很小。
    此外,在master中也有一個工作執行緒:和其它MySQL的連線一樣,slave在master中開啟一個連線也會使得master開始一個執行緒。複製過程有一個很重要的限制——複製在slave上是序列化的,也就是說master上的並行更新操作不能在slave上並行操作。

實驗環境:
Mater 172.25.64.3
Slave 172.25.64.4

Mysql的主從複製:

Redhat6.5自帶mysql,直接yum安裝

yum install mysql-server –y ##主從都需要安裝

Master主機配置:

Vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql

symbolic-links=0
log-bin=mysql-bin #啟動二進位制日至系統 ##以下四行為新新增的引數
binlog-do-db=test ##二進位制需要同步的資料庫名,如果需要同步多個庫,按照這個引數,再新增,然後修改後面的資料庫名字就行
server-id=1 ##主伺服器的id值,
binlog-ignore-db=mysql ##禁止同步mysql資料庫

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

/etc/init.d/mysqld start ##開啟資料庫

建立複製帳號1,在master的資料庫中建立一個備用賬戶,每個slave使用使用者名稱和密碼連線master,進行復制操作的使用者會授予replicati on slave許可權,使用者名稱的密碼都會儲存在slave伺服器的master.info中。
mysql> GRANT REPLICATION SLAVE,RELOAD,SUPER ON . TO [email protected]’172.25.64.4’ DENTIFIED BY ‘westos’; ##建立一個賬戶westos,並且只能允許172.25.64.4這個地址來登陸,密碼是westos
mysql>Flush privileges;
除錯:
在master上面用下面命令檢視日至檔案和更新值的在日至中的位置。這個後面配置從伺服器的時候要用到,從伺服器從主伺服器的日誌檔案中的更新位置開始進行復制。

mysql> show master status
-> ;
+——————+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000003 | 346 | test | mysql |
+——————+———-+————–+——————+

Master伺服器配置好了,接下來我們配置slave伺服器:

vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql

symbolic-links=0
server-id=2 #從伺服器 ID 號,不要和主 ID 相同,如果設定多個從伺服器,每個從伺服器必須有一個唯一的 server-id 值,必須與主伺服器的以及其它從伺服器的不相同。可以認為 server-id 值類似於 IP 地址:這些 ID 值能唯一識別複製伺服器群集
中的每個伺服器例項。

/etc/init.d/mysqld start ##開啟slave資料庫

在slave上面執行下面命令

mysql> change master to master_host=’172.25.64.3’, master_user=’westos’,
master_password=’westos’, master_log_file=’mysql-bin.000003’, master_log_pos=346;
引數解釋:MASTER_HOST : 設定要連線的主伺服器的ip地址
     MASTER_USER : 設定要連線的主伺服器的使用者名稱
     MASTER_PASSWORD : 設定要連線的主伺服器的密碼
    MASTER_LOG_FILE : 設定要連線的主伺服器的bin日誌的日誌名稱,即檢視master伺服器上面資料庫的show master status;所顯示的檔名稱
MASTER_LOG_POS : 設定要連線的主伺服器的bin日誌的記錄位置,即show master status中的postion,(這裡注意,最後一項不需要加引號。否則配置失敗)

Query OK, 0 rows affected (0.28 sec)
mysql> slave start; ##開啟從伺服器
mysql> show slave status\G;
Slave_IO_State: Waiting for master to send event
Master_Host: 172.25.64.3 ##主伺服器地址
Master_User: westos ##授權賬戶名
Master_Port: 3306 ##資料庫埠
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 346 ##同步讀取二進位制日誌的位置
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 251
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes ##IO和SQL必須是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:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 346
Relay_Log_Space: 407
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
1 row in set (0.00 sec)

測試:

Master上面再test庫裡面新建表然後插入資料,然後在slave伺服器上面檢視有沒有複製過來

Master伺服器上面:
mysql> use test;
mysql> create table test;
mysql> create table yiyi(id int(3),name char(10));
mysql> insert into yiyi values(001,’yiyi’);
mysql> select * from yiyi;
mysql> select * from yiyi;
+——+——+
| id | name |
+——+——+
| 1 | yiyi |
+——+——+
1 row in set (0.00 sec)

Slave伺服器上面:
mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from yiyi
-> ;
+——+——+
| id | name |
+——+——+
| 1 | yiyi |
+——+——+

Mysql並行複製:

為什麼需要並行複製:
  一般主從複製,有三個執行緒參與,都是單執行緒:Binlog Dump(主) —–>IO Thread (從) —–> SQL Thread(從)。複製出現延遲一般出在兩個地方
1)SQL執行緒忙不過來(可能需要應用資料量較大,可能和從庫本身的一些操作有鎖和資源的衝突;主庫可以併發寫,SQL執行緒不可以;主要原因)
2)網路抖動導致IO執行緒複製延遲(次要原因)。
MySQL從5.6開始有了SQL Thread多個的概念,可以併發還原資料,即並行複製技術。
  在MySQL 5.7中,引入了基於組提交的並行複製(Enhanced Multi-threaded Slaves),設定引數slave_parallel_workers>0並且global.slave_parallel_type=‘LOGICAL_CLOCK’,
即可支援一個schema下,slave_parallel_workers個的worker執行緒併發執行relay log中主庫提交的事務。其核心思想:一個組提交的事務都是可以並行回放(配合binary log group commit);
slave機器的relay log中 last_committed相同的事務(sequence_num不同)可以併發執行。
  其中,變數slave-parallel-type可以有兩個值:DATABASE 預設值,基於庫的並行複製方式;LOGICAL_CLOCK:基於組提交的並行複製方式

安裝5.7版本的資料庫:
tar xf mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar ##解開tar包
yum remove mysql-libs -y ##首先需要解除安裝當前版本資料庫的庫
yum install mysql-community-common-5.7.17-1.el6.x86_64.rpm -y
yum install mysql-community-libs-5.7.17-1.el6.x86_64.rpm mysql-community-client-5.7.17-1.el6.x86_64.rpm mysql-community-server-5.7.17-1.el6.x86_64.rpm -y ##安裝資料庫

主從伺服器都需要安裝5.7版本的資料庫。
mysql_secure_installation ##資料庫安全認證修改資料庫密碼
由於5.7版本的資料庫安裝的時候就會生成密碼,密碼在/var/log/mysql.log裡面

master伺服器配置與授權與主從複製的一樣,由於並行複製是再5.7版本加入的,5.7版本對資料庫的密碼健壯性要求比較高,所以我們在授權的時候需要對密碼進行修改,slave伺服器的配置檔案需要新增以下幾行:
server-id=2
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16 ##並行複製執行緒數
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=ON ##從機要求重新同步master日誌

測試:在master裡面插入資料,然後在slave上面檢視:
Master插入:
mysql> create table bushe;
mysql> create table bushe(name char(10));
mysql> insert into bushe values (‘kang’);

Slave檢視mysql> show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| mysql |
| performance_schema |
| sys |
| yiyi |
+——————–+
5 rows in set (0.00 sec)

mysql> use yiyi;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
mysql> show tables;
+—————-+
| Tables_in_yiyi |
+—————-+
| bushe |
+—————-+
1 row in set (0.00 sec)

mysql> select * from bushe;
+——+
| name |
+——+
| kang |
+——+
1 row in set (0.00 sec)

可以看到在master中的資料複製到了slave

相關推薦

mysql主從複製並行複製

Mysql的主從複製和並行複製 複製概述 mysql內建的複製功能是構建大型,高效能應用程式的基礎。將Mysql的資料分佈到多個系統上去,這種分佈的機制,是通過將Mysql的某一臺主機的資料複製到其它主機(slaves)上,並重新執行一遍來實現的。複製

MySQL主從複製並行複製,半同步複製複製

主從複製 主從複製過程存在三個執行緒,Master端的I/O執行緒,Slave的I/O執行緒與SQL執行緒。Master端需要開啟binlog日誌,Slave端需要開啟relaylog。 1、Slave端的I/O讀取master.info檔案,獲取binlog檔名和位置點,然後向Mast

mysql 主從複製 基於gtid的同步複製並行複製,半同步複製

一、mysql 主從複製 1.主從形式 mysql主從複製 靈活 一主一從 主主複製 一主多從---擴充套件系統讀取的效能,因為讀是在從庫讀取的; 多主一從---5.7開始支援 聯級複製--- 2.主從複製的用途及部署條件 mysql主從複製用途 實時災備,

mysql主從複製,基於GTID主從複製並行複製,半同步複製

複製方式: 主–從複製(A-B一主一從或者A-BC一主多從) 基於GTID複製 非同步複製 半同步複製 複製原理: Mysql中有一種日誌叫做bin日誌(二進位制日誌)。這個日誌會記錄下所有修改了資料庫的SQL語句 主從複製的原理其實就是把主伺服器上的bin日

mysql主從複製,基於GTID的主從、半同步複製並行複製

環境: 實驗環境: rhel6.5 , selinux和iptables均為disabled狀態,mysql均為5.7.17,或者slave比master版本高 實驗主機: 172.25.254.2 server2:master 172.25.254.3 server3:s

Mysql主從複製、半同步複製並行複製

一、主從複製 1.主從複製原理 MySQL之間資料複製的基礎是二進位制日誌檔案(binary log file)。一臺MySQL資料庫一旦啟用二進位制日誌後,其作為master,它的資料庫中所有操作都會以“事件”的方式記錄在二進位制日誌中,其他資料庫作為

mysql主主及並行複製的搭建

兩臺機器互為主從。 機器1:192.168.1.160 機器2:192.168.1.164 修改兩臺機器的my.cnf檔案,server-id,log-bin,auto-increment-increment,auto-increment-offset   後面兩個引

Mysql 半同步複製非同步複製

mysql 半同步複製和非同步複製 -- 在主庫中安裝半同步外掛,開啟半同步複製功能 install plugin rpl_semi_sync_master soname 'semisync_master.so'; set global rpl_semi_sync_master_enab

MySQL傳統複製GTID複製參考

1.mysqldump或者xtrabackup匯出資料庫scp到需要需要的備庫上,然後倒入到資料庫中,本例子使用mysqldump,xtrabacup請參考另外部落格http://blog.51cto.com/1937519/2283779 mysqldump -uroot -p --single_tran

【docker】效能優化-redis之【主從複製】全量複製部分複製

概念: 全量複製:用於初次複製或其它無法進行部分複製的情況,將主節點中的所有資料都發送給從節點,是一個非常重型的操作,當資料量較大時,會對主從節點和網路造成很大的開銷 部分複製:用於處理在主從複製中因網路閃斷等原因造成的資料丟失場景,當從節點再次連上主節點後,如果條件允許,主節點會補發丟

mysql5.7的主從複製,基於GTID複製並行複製,半同步複製

一 最簡單的AB主從複製 MySQL之間資料複製的基礎是二進位制日誌檔案(binary log file)。一臺MySQL資料庫一旦啟用二進位制日誌後,其作為master,它的資料庫中所有操作都會以“事件”的方式記錄在二進位制日誌中,其他資料庫作為slave通

Mysql半同步與並行複製

一、Mysql半同步複製 條件:GTID配置完成 1、Master端配置 <1>安裝外掛、開啟半同步 mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';

Mysql主從配置跳過事務

mysql主從配置和跳過事務Mysql主從配置和跳過事務一、介紹:大型網站中數據層還是原來那種傳統的數據架構,或者只是淡淡靠一臺服務器來扛,如此多的數據庫連接操作,數據必然會崩潰,數據丟失的話,可想而知後果不堪設想。所以我們想到很多解決方法·:一方面采用優秀的代碼框架,進行代碼的優化,采用優秀的數據緩存技術如

MySQL主從分割槽讀寫分離

MySQL主從分割槽、讀寫分離、負載均衡 一個MySQL的伺服器的承載連線的數量是有限的,當超出最大連線數之後,MySQL伺服器就會出現異常或者宕機。 再者,伺服器也可能會壞掉(比如硬碟壞了),這時資料會丟失,所以我們需要考慮資料庫的主從分割槽。 一般大型網站都是讀多寫少,實現讀寫分

C 深複製複製

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

複製複製

Python中,複製有以下幾種方法 1.賦值複製 >>>a = [1, 2, 3] >>>b = a >>>b [1, 2, 3] 此時的複製,b僅僅是指向了a所在的記憶體空間,在記憶體中,並沒有申請一處新的空間來儲存列表b,a和b在

企業級Redis開發運維從入門到實踐 (21)— 全量複製部分複製

全量複製 對於一個儲存了很多資料的 master(主節點),slave(從節點)去做一個複製,想要的想過是把 master 的資料全部同步過來,在同步過程中 master 寫入的新資料也需要同步過來,這

淺談物件的深複製複製的區別。

  場景   當你的元件裡需要用到同一個資料,但身負不同的責任。   舉個例子:vue的雙向繫結   你在與後端的互動中請求回來的資料,res,  let a = res; let b = res;  因為是會用到checkbox,在外層的列表裡選中資

CentOS7,MySQL主從配置讀寫分離(MySQL主從、讀寫分離、分散式、資料庫讀寫分離、主從配置)

一、實驗目標搭建兩臺MySQL伺服器,一臺作為主伺服器,一臺作為從伺服器,主伺服器進行寫操作,從伺服器進行讀操作。二、測試環境主資料庫: CentOS7, MySQL15.1 , 192.168.1.233從資料庫: CentOS7, MySQL15.1 , 192.168.

mysql主從搭建測試步驟

主從配置步驟:  假設兩臺機器分別為192.168.0.202, 192.168.0.203,其中202做主,203做從。 1. 在兩臺mysql上建立同步使用者。202執行: GRANT ALL PRIVILEGES ON *.* TO 'repl'@'192.168