天天看點

mysql主從線上的搭建 MySQL同步概念及配置 一、同步機制與群集的差別 二、同步機制實作概念 三、MySQL同步的設定 四、同步資料方法

同步功能在MySQL 3.23.15就開始引進了,它可以把一個MySQL伺服器上的資料複制到另一個伺服器上去。單向同步的好處是穩健,高速,系統易管理:

 有了master/slave機制後,就更穩健了。當master上發生問題時,可以把slave作為備用切換過去。

 可以在slave和master之間分擔一些查詢,這就能加速響應時間。SELECT 查詢就可以在slave上執行以減少master的負載。更新資料的語句則要放在mater上執行以保持master和slave的同步。當非更新操作占多數時,負載均衡就很有效了,不過這隻是普通情況而言。

 另一個好處是可以在slave上備份資料,無需幹擾master。備份資料時master照樣繼續運作。

mysql叢集和mysql主從複制有什麼差別

複制的隻有主節點能接受 insert,update,drop,delete 等操作,叢集不存在此類限制。

不過,說實話,叢集和複制不是一個級别的概念,在某些情況中,複制是叢集的組成部分。

mysql 叢集 減少資料中心結點壓力和大資料量處理,采用把 mysql 分布,一個或多個 application 對應一個 mysql 資料庫。把幾個 mysql 資料庫公用的資料做出共享資料,例如購物車,使用者對象等等,存在資料結點裡面。其他不共享的資料還維持在各自分布的 mysql 資料庫本身中

具體根據架構環境來選擇,總體性能的提高的是效率的增加。我公司用的是讀寫分離,5台從的負載讀,主的負載寫。

MySQL同步機制基于master把所有對資料庫的更新、删除等)都記錄在二進制日志裡。是以,想要啟用同步機制,在master就必須啟用二進制日志。每個slave接受來自master上在二進制日志中記錄的更新操作,是以在slave上執行了這個操作的一個拷貝。

所有的slave必須在啟用二進制日志時把master上已經存在的資料拷貝過來。如果運作同步時slave上的資料和master上啟用二進制日志時的資料不一緻的話,那麼slave同步就會失敗。(拷貝方法見後面)

slave上已經完整拷貝master資料後,就可以連接配接到master上然後等待處理更新了。如果master當機或者slave連接配接斷開,slave會定期嘗試連接配接到master上直到能重連并且等待更新。重試的時間間隔由--master-connect-retry選項來控制,它的預設值是60秒。

每個slave都記錄了它關閉時的日志位置。msater是不知道有多少個slave連接配接上來或者哪個slave從什麼時候開始更新。

注:啟用同步後,所有要同步的更新操作都必須在master上執行。否則,必須注意不要造成使用者在master上的更新和在slave上的更新引起沖突。

步驟一:MySQL同步功能由3個線程(master上1個,slave上2個)來實作。執行START SLAVE語句後,SLAVE就建立一個I/O線程。

步驟二:I/O線程連接配接到master上,并請求master發送二進制日志中的語句。

步驟三:master建立一個線程來把日志的内容發送到slave上。這個線程在master上執行SHOW PROCESSLIST 語句後的結果中的 Binlog Dump 線程便是。

步驟四:slave上的I/O線程讀取master的 Binlog Dump 線程發送的語句,并且把它們拷貝到其資料目錄下的中繼日志(relay logs)中。

步驟五:第三個是SQL線程,salve用它來讀取中繼日志,然後執行它們來更新資料。

可參見下圖圖示:

<a target="_blank" href="http://blog.51cto.com/attachment/201101/115509527.jpg"></a>

每個master/slave上都有三個程序,master有多個線程,他為每個slave連接配接都建立一個線程,而每個slave隻有I/O和SQL線程。

slave有2個線程的好處:把讀日志和執行分開成2個獨立的任務。執行任務如果慢的話,讀日志任務不會跟着慢下來。

如:slave停止了一段時間,那麼I/O線程可以在slave啟動後很快地從master上讀取全部日志,盡管SQL線程可能落後I/O線程好幾的小時。如果slave在SQL線程沒全部執行完就停止了,但I/O線程卻已經把所有的更新日志都讀取并且儲存在本地的中繼日志中了,是以在slave再次啟動後就會繼續執行它們了。這就允許在master上清除二進制日志,因為slave已經無需去master讀取更新日志了。

在master上,執行下面的指令,可以看到運作狀态

Mysq &gt; SHOW PROCESSLIST\G;

Mysql &gt; show master status\G;

在slave上,可以執行以下指令

Mysql &gt; show slave status\G;

中繼日志

預設地,中繼日志的名字格式為 `host_name-relay-bin.nnn`,host_name 是伺服器的主機名,nnn 是序号,如:sumi2-relay-bin.000008。

索引中繼日志

slave上用一個索引檔案來跟蹤目前正在使用的中繼日志,這個檔案的檔案名是 `host_name-relay-bin.index`,如:sumi2-relay-bin.index。

在下列條件中會建立一個新的中繼日志:

(1)slave啟動後,I/O線程第一次啟動(在MySQL 5.0中,每次I/O線程啟動後都會建立一個中繼日志,而不隻是第一次啟動時)。

(2)重新整理日志時;例如,執行flush logs語句或運作mysqladmin flush-logs指令(從 MySQL 4.0.14開始才會建立新中繼日志)。

(3)目前的中繼日志大小太大了,“太大了”是這麼判斷的:

max_relay_log_size, 如果 max_relay_log_size &gt; 0 的話

max_binlog_size, 如果 max_relay_log_size = 0 或 MySQL 低于 4.0.14

狀态檔案

狀态檔案,名字預設為 `master.info` and `relay-log.info`。slave關閉後,會保留他們。當下一次slave啟動時,就會讀取這兩個檔案來判斷從master讀取到二進制日志的什麼位置了,進行中繼日志到什麼位置了。

 4、檢視同步狀态

Master伺服器

Mysql&gt; show master status\G;

*************************** 1. row ***************************

            File: mysql-bin.000003

        Position: 111052

    Binlog_Do_DB: sumi_test1

Binlog_Ignore_DB: mysql

1 row in set (0.00 sec)

ERROR: 

No query specified

Slave伺服器

Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.0.32

Master_User: sum

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysql-bin.000003

Read_Master_Log_Pos: 111052

Relay_Log_File: sumi2-relay-bin.000014

Relay_Log_Pos: 251

Relay_Master_Log_File: mysql-bin.000003

Slave_IO_Running: Yes                      //如果都是yes,那代表已經在同步

Slave_SQL_Running: Yes

Replicate_Do_DB: sumi_test1

Replicate_Ignore_DB: mysql

準備兩台伺服器192.168.0.32(master)和192.168.0.25(slave)。兩個MySQL的basedir目錄都是/usr/local/mysql,資料存放路徑/usr/local/mysq/data/。

建立資料庫sumi_test1為同步資料庫,添加使用者sum為專用同步的使用者。

注:Master的MySQL版本和Slave的版本相同或者更低,Master的版本一定不能高于Slave版本。

建立一個MySQL帳号為同步專用:

Mysql &gt; grant  replication slave,reload,super, on *.* to [email protected] identified by 'sum123' ;

Mysql &gt; FLUSH PRIVILEGES ;

修改my.cnf檔案

# cat /etc/my.cnf

[mysqld]                          //在mysqd中添加以下配置

log-bin = mysql-bin

server-id = 1

binlog-do-db = hou                     //需要同步的資料庫

binlog-ignore-db = mysql              //忽略此資料庫同步,若還有其他資料庫不需要同步,在下

binlog-ignore-db = otherdb           面一一列出;

然後,将hou資料庫導出,并導入slave資料庫中,在啟動同步之前,兩邊的資料要一緻。

# vi /etc/my.cnf

[mysqld]                   //在mysqd中添加以下配置

server-id = 2

master-host = 192.168.0.32

master-user = user

master-password =  passwd

master-port = 3306

replicate-ignore-db = mysql            //需要同步的資料庫

replicate-do-db = hou     //忽略此資料庫同步,若還有其他資料庫不需要同步,在下

replicate-do-db = otherdb        面一一列出

如上圖所示:

進行資料同步,網上的方法是将master資料庫檔案拿過來,勢必要終止往主資料庫寫入,可以參考:

<a href="http://vps.15099.net/2009/01/mysql-replication-in-two-vps-hosting-546.html">http://vps.15099.net/2009/01/mysql-replication-in-two-vps-hosting-546.html</a>

但是這樣從資料庫們也不能使用了,王總的方法,可以不影響主資料庫寫入,從一個從資料庫中将資料表拷貝到新slave伺服器或問題伺服器上來。

環境

Slave1資料庫IP:211.103.156.201  hostname:C2.xywy.com

Slave2資料庫IP:211.103.156.203  hostname:C6.xywy.com

步驟

1、先在新的slave上配置好mysql

配置方法見上面章節

2、停止slave 資料庫 slave IP:211.103.156.201

# /usr/local/mysq/bin/mysqladmin -uroot -p shutdown

# cd /usr/local/mysql/var/

3、隻拷貝需要同步的資料庫(club)及需要的日志檔案

# tar -zcvf club.tar.gz club

需要備份的日志檔案

relay-log.info 

c2-relay-bin.index 

c2-relay-bin.000122  //目前執行到的日志

master.info

# tar -zcvf daillog.tar.gz relay-log.info c2-relay-bin.index c2-relay-bin.000122 master.info

4、在slave2上解壓資料庫club及修改日志名

# tar -zxvf club.tar.gz -C /usr/local/mysql/data/

# tar -zcvf daillog.tar.gz -C /usr/local/mysql/data/

relay-log= /usr/local/mysql/data/c6-relay-bin

注:這裡要檢視一下本機的mysql配置中,relay-log的名字

# cd /usr/local/mysql/data/

# vi relay-log.info

data/mysqldata/c6-relay-bin.000139 //修改日志的名字為配置中設定的

10836749

mysql-bin.000017

366167395

# mv c2-relay-bin.index c6-relay-bin.index

# vi vi c6-relay-bin.index

/data/mysqldata/c6-relay-bin.000138

/data/mysqldata/c6-relay-bin.000139

# mv c2-relay-bin.000122 c6-relay-bin.000122

5、啟動新的slave伺服器即可。

本文轉自 houzaicunsky 51CTO部落格,原文連結:http://blog.51cto.com/hzcsky/481396