<h2>背景:</h2>
在如今的互聯(lián)網(wǎng)時代,高并發(fā)、大數(shù)據(jù)都已經(jīng)成為其中最熱的之一。mysql不可能像redis一樣單臺機器每秒最多能處理10W次讀寫,也達不到elasticsearch一樣存儲上億幾十億數(shù)據(jù)做過濾或者簡單的聚合能在50-100ms以內(nèi)成功響應。但是據(jù)我所知在中國一些互聯(lián)網(wǎng)排名前十的公司的產(chǎn)品、訂單這種關鍵數(shù)據(jù)還是存儲在mysql中,更不要說mysql在一些更小的公司的應用,mysql重要性不言而喻。從這一講會開始我的mysql文章之路。
現(xiàn)在經(jīng)常有個詞能聽到"讀寫分離",是的讀寫分離可以降低單點機器的并發(fā)訪問壓力。從而實現(xiàn)主機器專門用于寫入,另外的一個從節(jié)點或者多個從節(jié)點來實現(xiàn)讀。
<h2>復制實現(xiàn)原理</h2>
下面貼出來其實現(xiàn)流程圖:

分為同步復制和異步復制,實際復制架構(gòu)中大部分為異步復制。 復制的基本過程如下:
(1)、Slave上面的IO進程連接上Master,并請求從指定日志文件的指定位置(或者從最開始的日志)之后的日志內(nèi)容;
(2)、Master接收到來自Slave的IO進程的請求后,通過負責復制的IO進程根據(jù)請求信息讀取制定日志指定位置之后的日志信息,返回給Slave 的IO進程。返回信息中除了日志所包含的信息之外,還包括本次返回的信息已經(jīng)到Master端的bin-log文件的名稱以及bin-log的位置;
(3)、Slave的IO進程接收到信息后,將接收到的日志內(nèi)容依次添加到Slave端的relay-log文件的最末端,并將讀取到的Master端的 bin-log的文件名和位置記錄到master-info文件中,以便在下一次讀取的時候能夠清楚的告訴Master“我需要從某個bin-log的哪個位置開始往后的日志內(nèi)容,請發(fā)給我”;
(4)、Slave的Sql進程檢測到relay-log中新增加了內(nèi)容后,會馬上解析relay-log的內(nèi)容成為在Master端真實執(zhí)行時候的那些可執(zhí)行的內(nèi)容,并在自身執(zhí)行。
其實稍微了解mysql底層一點的都知道,mysql的更新記錄都可以配置保存在binlog文件中,這個文件用處很大,有一個比較大的應用就是有些公司開發(fā)監(jiān)聽binlog變化的插件,再結(jié)合消息中間件來實現(xiàn)數(shù)據(jù)變更實時通知訂閱方。當然這次我們要講的還是slave機器怎么樣實現(xiàn)對于master機器的主從。
<h4>主從復制的配置</h4>
準備前提:
<ul>
<li>安裝兩個虛擬機 master:192.168.30.128 slave:192.168.30.131</li>
<li>分別在兩臺機器上面安裝mysql,具體的流程可以參照我之前寫的http://www.itdecent.cn/p/674f56b2fe56</li>
</ul>
當你上面兩步都做完了以后我想你已經(jīng)都把mysql 服務給起來了吧,接下來我們需要配置mysql的binlog信息。
<b>1、找到my.cnf文件。按我之前介紹的文章安裝的話是在/etc/my.cnf下面,具體是在原來的文件里面新加三個參數(shù):</b>
<pre>
server-id=128 #設置服務器唯一的id,默認是1,我們設置ip最后一段,slave設置131
log-bin=mysql-bin # 啟用二進制日志
binlog-ignore-db = mysql,information_schema #忽略寫入binlog的庫,因為這些都不是我們關心的自己創(chuàng)建的業(yè)務庫
</pre>
具體的修改如下:

完成以后重啟service mysqld start master上面的mysql服務
<b>2、master機器binlog配置好了以后還需要給slave機器授權(quán)IO讀取它啊,登錄mysql -u root -proot以后執(zhí)行命令如下:</b>
<pre>
GRANT REPLICATION SLAVE ON . to 'sync'@'192.168.30.131' identified by 'root'; //新建一個sync用戶密碼為root給slave機器使用。后面salve機器配置會使用到
</pre>
具體的修改如下:

同時也可以通過show master status 命令查看binlog信息:
<pre>
mysql> show master status;
+------------------+----------+--------------+--------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+--------------------------+
| mysql-bin.000001 | 259 | | mysql,information_schema |
+------------------+----------+--------------+--------------------------+
</pre>
看情況binlog文件名稱+position數(shù)據(jù),因為這給后面在salve機器上配置連接master機器有用到。
<b>3、配置slvae機器,直接上命令吧:</b>
<pre>
change master to
master_host='192.168.30.128', //master的ip
master_user='sync', //master授予的用戶名稱
master_password='root', //密碼
master_log_file='mysql-bin.000001', //master的binlog名稱
master_log_pos=259;//位置
</pre>
別忘記了重啟slave機器,再用mysql> show slave status \G查看執(zhí)行結(jié)果:

<b>4、測試最后的復制結(jié)果</b>
<pre>
1、master機器:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| master_slave |
| mysql |
| storm_test |
| test |
| test12 |
+--------------------+
6 rows in set (0.00 sec)
2、slave機器:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| master_slave |
| mysql |
| test |
+--------------------+
4 rows in set (0.00 sec)
3、在master機器上新建test_copy數(shù)據(jù)庫
mysql> create database test_copy;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| master_slave |
| mysql |
| storm_test |
| test |
| test12 |
| test_copy | //新建數(shù)據(jù)庫
+--------------------+
7 rows in set (0.01 sec)
4、查看salve機器結(jié)果:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| master_slave |
| mysql |
| test |
| test_copy | //復制成功
+--------------------+
5 rows in set (0.00 sec)
</pre>
是的這樣的話主從復制已經(jīng)實現(xiàn)了,簡單。下一節(jié)文章主要是講使用mysql-proxy代理來實現(xiàn)讀寫分離。