mysql 主從同步 實(shí)現(xiàn)讀寫分離 自己記錄

1.分別在centos7 系統(tǒng)安裝 mysql 5.7? ? -----版本一致

2.master? 主服務(wù)器配置

? ? 2.1 配置 文件 my.cnf 的修改

? ? 2.2 創(chuàng)建從服務(wù)器的用戶和權(quán)限

? ? 2.3 重啟mysql 服務(wù)

? ? 2.4查看主服務(wù)器狀態(tài)

3.slave 從服務(wù)器配置

? ? 3.1 配置文件my.cnf 的修改

? ? 3.2 重啟mysql 服務(wù)

? ? 3.3 連接 master 主服務(wù)器

? ? 3.4 啟動(dòng)slave 數(shù)據(jù)同步

? ? 3.5 查看slave 信息

4.測(cè)試

5.解決問(wèn)題

大型網(wǎng)站為了軟解大量的并發(fā)訪問(wèn),除了在網(wǎng)站實(shí)現(xiàn)分布式負(fù)載均衡,遠(yuǎn)遠(yuǎn)不夠。到了數(shù)據(jù)業(yè)務(wù)層、數(shù)據(jù)訪問(wèn)層,如果還是傳統(tǒng)的數(shù)據(jù)結(jié)構(gòu),或者只是單單靠一臺(tái)服務(wù)器來(lái)處理如此多的數(shù)據(jù)庫(kù)連接操作,數(shù)據(jù)庫(kù)必然會(huì)崩潰,特別是數(shù)據(jù)丟失的話,后果更是不堪設(shè)想。這時(shí)候,我們會(huì)考慮如何減少數(shù)據(jù)庫(kù)的連接,下面就進(jìn)入我們今天的主題。

利用主從數(shù)據(jù)庫(kù)來(lái)實(shí)現(xiàn)讀寫分離,從而分擔(dān)主數(shù)據(jù)庫(kù)的壓力。在多個(gè)服務(wù)器上部署mysql,將其中一臺(tái)認(rèn)為主數(shù)據(jù)庫(kù),而其他為從數(shù)據(jù)庫(kù),實(shí)現(xiàn)主從同步。其中主數(shù)據(jù)庫(kù)負(fù)責(zé)主動(dòng)寫的操作,而從數(shù)據(jù)庫(kù)則只負(fù)責(zé)主動(dòng)讀的操作(slave從數(shù)據(jù)庫(kù)仍然會(huì)被動(dòng)的進(jìn)行寫操作,為了保持?jǐn)?shù)據(jù)一致性),這樣就可以很大程度上的避免數(shù)據(jù)丟失的問(wèn)題,同時(shí)也可減少數(shù)據(jù)庫(kù)的連接,減輕主數(shù)據(jù)庫(kù)的負(fù)載



在上面的模型中,Mysql-A就是主服務(wù)器,即master,Mysql-B就是從服務(wù)器,即slave。

在Mysql-A的數(shù)據(jù)庫(kù)事件(例如修改數(shù)據(jù)庫(kù)的sql操作語(yǔ)句),都會(huì)存儲(chǔ)到日志系統(tǒng)A中,在相應(yīng)的端口(默認(rèn)3306)通過(guò)網(wǎng)絡(luò)發(fā)送給Mysql-B。Mysql-B收到后,寫入本地日志系統(tǒng)B,然后一條條的將數(shù)據(jù)庫(kù)事件在數(shù)據(jù)庫(kù)Mysql-B中完成。

日志系統(tǒng)A,是MYSQL的日志類型中的二進(jìn)制日志,也就是專門用來(lái)保存修改數(shù)據(jù)庫(kù)表的所有動(dòng)作,即bin log,注意MYSQL會(huì)在執(zhí)行語(yǔ)句之后,釋放鎖之前,寫入二進(jìn)制日志,確保事務(wù)安全。

日志系統(tǒng)B,不是二進(jìn)制日志,由于它是從MYSQL-A的二進(jìn)制日志復(fù)制過(guò)來(lái)的,并不是自己的數(shù)據(jù)庫(kù)變化產(chǎn)生的,有點(diǎn)接力的感覺,稱為中繼日志,即relay log。

通過(guò)上面的機(jī)制,可以保證Mysql-A和Mysql-B的數(shù)據(jù)庫(kù)數(shù)據(jù)一致,但是時(shí)間上肯定有延遲,即Mysql-B的數(shù)據(jù)是滯后的。因此,會(huì)出現(xiàn)這樣的問(wèn)題,Mysql-A的數(shù)據(jù)庫(kù)操作是可以并發(fā)的執(zhí)行的,但是Mysql-B只能從relay log中一條一條的讀取執(zhí)行。若Mysql-A的寫操作很頻繁,Mysql-B很可能就跟不上了。


主從同步復(fù)制有以下幾種方式:

(1)同步復(fù)制,master的變化,必須等待slave-1,slave-2,...,slave-n完成后才能返回。

(2)異步復(fù)制,master只需要完成自己的數(shù)據(jù)庫(kù)操作即可,至于slaves是否收到二進(jìn)制日志,是否完成操作,不用關(guān)心。MYSQL的默認(rèn)設(shè)置。

(3)半同步復(fù)制,master只保證slaves中的一個(gè)操作成功,就返回,其他slave不管。這個(gè)功能,是由google為MYSQL引入的。

本文說(shuō)的是在centos 7系統(tǒng)上,實(shí)現(xiàn)的mysql5.7數(shù)據(jù)庫(kù)的主從同步配置,從而實(shí)現(xiàn)讀寫分離操作。

1 分別在兩臺(tái)centos 7系統(tǒng)上安裝mysql 5.7

本文中的兩臺(tái)服務(wù)器的IP地址分別為主服務(wù)器()和從服務(wù)器()。

分別在這兩個(gè)服務(wù)器上創(chuàng)建backend數(shù)據(jù)庫(kù),以備后面測(cè)試。

2 master主服務(wù)器的配置

2.1 配置文件my.cnf的修改

[root@localhost mysql]# vim /etc/my.cnf

#在[mysqld]中添加:

server-id=1

log_bin=master-bin

log_bin_index=master-bin.index

binlog_do_db=backend

#備注:

#server-id 服務(wù)器唯一標(biāo)識(shí)。

#log_bin 啟動(dòng)MySQL二進(jìn)制日志,即數(shù)據(jù)同步語(yǔ)句,從數(shù)據(jù)庫(kù)會(huì)一條一條的執(zhí)行這些語(yǔ)句。

#binlog_do_db 指定記錄二進(jìn)制日志的數(shù)據(jù)庫(kù),即需要復(fù)制的數(shù)據(jù)庫(kù)名,如果復(fù)制多個(gè)數(shù)據(jù)庫(kù),重復(fù)設(shè)置這個(gè)選項(xiàng)即可。

#binlog_ignore_db 指定不記錄二進(jìn)制日志的數(shù)據(jù)庫(kù),即不需要復(fù)制的數(shù)據(jù)庫(kù)名,如果有多個(gè)數(shù)據(jù)庫(kù),重復(fù)設(shè)置這個(gè)選項(xiàng)即可。

#其中需要注意的是,binlog_do_db和binlog_ignore_db為互斥選項(xiàng),一般只需要一個(gè)即可

2.2 創(chuàng)建從服務(wù)器的用戶和權(quán)限

#進(jìn)入mysql數(shù)據(jù)庫(kù)

[root@localhost mysql]# mysql -uroot -p

Enter password:

#創(chuàng)建從數(shù)據(jù)庫(kù)的masterbackup用戶和權(quán)限

mysql> grant replication slave on *.* to masterbackup@'122.51.83.*' identified by '123456';

#備注

#192.168.17.%通配符,表示0-255的IP都可訪問(wèn)主服務(wù)器,正式環(huán)境請(qǐng)配置指定從服務(wù)器IP

#若將 192.168.17.% 改為 %,則任何ip均可作為其從數(shù)據(jù)庫(kù)來(lái)訪問(wèn)主服務(wù)器

#退出mysql

mysql> exit;

2.3 重啟mysql服務(wù)

systemctl restart mysqld.service

2.4 查看主服務(wù)器狀態(tài)


#進(jìn)入mysql數(shù)據(jù)庫(kù)

[root@localhost mysql]# mysql -uroot -p

Enter password:

#查看主服務(wù)器狀態(tài)

mysql> show master status;

+-------------------+----------+--------------+------------------+-------------------+

| File? ? ? ? ? ? ? | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+-------------------+----------+--------------+------------------+-------------------+

| master-bin.000001 |? ? ? 154 | backend? ? ? ? |? ? ? ? ? ? ? ? ? |? ? ? ? ? ? ? ? ? |

+-------------------+----------+--------------+------------------+-------------------+

1 row in set (0.00 sec)


3 slave從服務(wù)器的配置

3.1?配置文件my.cnf的修改

[root@localhost mysql]# vim /etc/my.cnf

#在[mysqld]中添加:

server-id=2

relay-log=slave-relay-bin

relay-log-index=slave-relay-bin.index

#replicate-do-db=test

#備注:

#server-id 服務(wù)器唯一標(biāo)識(shí),如果有多個(gè)從服務(wù)器,每個(gè)服務(wù)器的server-id不能重復(fù),跟IP一樣是唯一標(biāo)識(shí),如果你沒設(shè)置server-id或者設(shè)置為0,則從服務(wù)器不會(huì)連接到主服務(wù)器。

#relay-log 啟動(dòng)MySQL二進(jìn)制日志,可以用來(lái)做數(shù)據(jù)備份和崩潰恢復(fù),或主服務(wù)器掛掉了,將此從服務(wù)器作為其他從服務(wù)器的主服務(wù)器。

#replicate-do-db 指定同步的數(shù)據(jù)庫(kù),如果復(fù)制多個(gè)數(shù)據(jù)庫(kù),重復(fù)設(shè)置這個(gè)選項(xiàng)即可。若在master端不指定binlog-do-db,則在slave端可用replication-do-db來(lái)過(guò)濾。

#replicate-ignore-db 不需要同步的數(shù)據(jù)庫(kù),如果有多個(gè)數(shù)據(jù)庫(kù),重復(fù)設(shè)置這個(gè)選項(xiàng)即可。

#其中需要注意的是,replicate-do-db和replicate-ignore-db為互斥選項(xiàng),一般只需要一個(gè)即可。

3.2 重啟mysql服務(wù)

systemctl restart mysqld.service

3.3 連接master主服務(wù)器


#進(jìn)入mysql數(shù)據(jù)庫(kù)

[root@localhost mysql]# mysql -uroot -p

Enter password:

#連接master主服務(wù)器

mysql> change master to master_host='192.168.17.130',master_port=3306,master_user='masterbackup',master_password='123456',master_log_file='master-bin.000001',master_log_pos=154;

#備注:

#master_host對(duì)應(yīng)主服務(wù)器的IP地址。

#master_port對(duì)應(yīng)主服務(wù)器的端口。

#master_log_file對(duì)應(yīng)show master status顯示的File列:master-bin.000001。

#master_log_pos對(duì)應(yīng)show master status顯示的Position列:154。

3.4 啟動(dòng)slave數(shù)據(jù)同步


#啟動(dòng)slave數(shù)據(jù)同步

mysql> start slave;

#停止slave數(shù)據(jù)同步(若有需要)

mysql> stop slave;

3.5 查看slave信息

mysql> show slave status\G;


Slave_IO_Running和Slave_SQL_Running都為yes,則表示同步成功。

4 測(cè)試

(1)在主服務(wù)器上登陸mysql,且進(jìn)入backend數(shù)據(jù)庫(kù),創(chuàng)建test表,且插入一條數(shù)據(jù)

提示:這里最好用數(shù)據(jù)庫(kù)管理工具(如nacicat)來(lái)操作。

5 解決錯(cuò)誤

若在主從同步的過(guò)程中,出現(xiàn)其中一條語(yǔ)句同步失敗報(bào)錯(cuò)了,則后面的語(yǔ)句也肯定不能同步成功了。例如,主庫(kù)有一條數(shù)據(jù),而從庫(kù)并沒有這一條數(shù)據(jù),然而,在主庫(kù)執(zhí)行了刪除這一條數(shù)據(jù)的操作,那么從庫(kù)沒有這么一條數(shù)據(jù)就肯定刪除不了,從而報(bào)錯(cuò)了。在此時(shí)的從數(shù)據(jù)庫(kù)的數(shù)據(jù)同步就失敗了,因此后面的同步語(yǔ)句就無(wú)法繼續(xù)執(zhí)行。

#在從數(shù)據(jù)庫(kù)上操作

mysql > stop slave;

mysql> change master to master_host='192.168.17.130',master_port=3306,master_user='masterbackup',master_password='123456',master_log_file='master-bin.000001',master_log_pos=2050;

mysql > start slave;

#備注

#master_log_file和master_log_pos可能會(huì)不同,需要在主數(shù)據(jù)庫(kù)中show master status來(lái)查看


6 總結(jié)

至此,mysql數(shù)據(jù)庫(kù)的主從同步就完成了,至于讀寫分離,我們可以通過(guò)程序來(lái)實(shí)現(xiàn),這里簡(jiǎn)單講解一下實(shí)現(xiàn)思想。

我們可以在主服務(wù)器創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)用戶(出于安全,根據(jù)需求給予相應(yīng)的權(quán)限)主要用于寫操作,在程序中通過(guò)這一用戶連接主數(shù)據(jù)庫(kù)的只用于寫操作而不用讀操作。

在從服務(wù)器上創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)用戶(出于安全,只給予讀select的權(quán)限)主要用于讀操作,在程序中通過(guò)這一用戶連接從數(shù)據(jù)庫(kù)即可。

當(dāng)然,也可以找一個(gè)組件來(lái)完成MYSQL的代理,實(shí)現(xiàn)SQL語(yǔ)句的路由,這樣就不需要我們?cè)诔绦蛏详P(guān)注哪個(gè)數(shù)據(jù)庫(kù)是寫,哪個(gè)數(shù)據(jù)庫(kù)是讀的了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,048評(píng)論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,414評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,169評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,722評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,465評(píng)論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,823評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,813評(píng)論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,000評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,554評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,513評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,722評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,125評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,430評(píng)論 1 295
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,237評(píng)論 3 398
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,482評(píng)論 2 379

推薦閱讀更多精彩內(nèi)容