<h2>背景:</h2>
在如今的互聯(lián)網(wǎng)時代详拙,高并發(fā)、大數(shù)據(jù)都已經(jīng)成為其中最熱的之一。mysql不可能像redis一樣單臺機器每秒最多能處理10W次讀寫褒傅,也達不到elasticsearch一樣存儲上億幾十億數(shù)據(jù)做過濾或者簡單的聚合能在50-100ms以內(nèi)成功響應(yīng)捧存。但是據(jù)我所知在中國一些互聯(lián)網(wǎng)排名前十的公司的產(chǎn)品粪躬、訂單這種關(guān)鍵數(shù)據(jù)還是存儲在mysql中,更不要說mysql在一些更小的公司的應(yīng)用昔穴,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文件中音半,這個文件用處很大,有一個比較大的應(yīng)用就是有些公司開發(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.reibang.com/p/674f56b2fe56</li>
</ul>
當你上面兩步都做完了以后我想你已經(jīng)都把mysql 服務(wù)給起來了吧物延,接下來我們需要配置mysql的binlog信息。
<b>1仅父、找到my.cnf文件叛薯。按我之前介紹的文章安裝的話是在/etc/my.cnf下面,具體是在原來的文件里面新加三個參數(shù):</b>
<pre>
server-id=128 #設(shè)置服務(wù)器唯一的id笙纤,默認是1耗溜,我們設(shè)置ip最后一段,slave設(shè)置131
log-bin=mysql-bin # 啟用二進制日志
binlog-ignore-db = mysql,information_schema #忽略寫入binlog的庫省容,因為這些都不是我們關(guān)心的自己創(chuàng)建的業(yè)務(wù)庫
</pre>
具體的修改如下:
完成以后重啟service mysqld start master上面的mysql服務(wù)
<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)讀寫分離蔓腐。