Mysql 主從復(fù)制實戰(zhàn)(學(xué)習(xí)筆記十三)

https://www.cnblogs.com/along21/p/8011596.html

https://blog.csdn.net/qq3401247010/article/details/78754671

一主一從,一主多從薄货,雙主

① iptables -F && setenforce 清空防火墻策略勒庄,關(guān)閉selinux

② 拿兩臺服務(wù)器都使用yum 方式安裝Mysql 服務(wù)垫卤,要求版本一致

③ 分別啟動兩臺服務(wù)器mysql

2囱稽、在主master 主服務(wù)器上

① vim /etc/my.cnf 修改mysql主配置文件陶夜,對master進(jìn)行配置浦译,包括打開二進(jìn)制日志傻丝,指定唯一的servr ID

server-id=1#配置server-id甘有,讓主服務(wù)器有唯一ID號

log-bin=mysql-bin? #打開Mysql日志,日志格式為二進(jìn)制

skip-name-resolve? #關(guān)閉名稱解析葡缰,(非必須)

②?創(chuàng)建并授權(quán)slave mysql 用的復(fù)制帳號

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO slave@'192.168.%.%'IDENTIFIED BY'along';

分析:在Master的數(shù)據(jù)庫中建立一個備份帳戶:每個slave使用標(biāo)準(zhǔn)的MySQL用戶名和密碼連接master。進(jìn)行復(fù)制操作的用戶會授予REPLICATION SLAVE權(quán)限忱反。

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

在Master的數(shù)據(jù)庫執(zhí)行show master status泛释,查看主服務(wù)器二進(jìn)制日志狀態(tài),位置號

3温算、在從slave mysql1上

① 修改主配置文件

vim /etc/my.cnf 打開中繼日志怜校,指定唯一的servr ID,設(shè)置只讀權(quán)限

server-id=2#配置server-id注竿,讓從服務(wù)器有唯一ID號

relay_log = mysql-relay-bin? ? #打開Mysql日志茄茁,日志格式為二進(jìn)制

read_only =1? ? #設(shè)置只讀權(quán)限

log_bin = mysql-bin? ? ? ? #開啟從服務(wù)器二進(jìn)制日志,(非必須)

log_slave_updates =1#使得更新的數(shù)據(jù)寫進(jìn)二進(jìn)制日志中

systemctl start mariadb 開啟服務(wù)

②?啟動從服務(wù)器復(fù)制線程巩割,讓slave連接master裙顽,并開始重做master二進(jìn)制日志中的事件。

MariaDB [(none)]> change master to master_host='192.168.30.107',

? ? -> master_user='slave',

? ? -> master_password='along',

? ? -> master_log_file='mysql-bin.000001',

? ? -> master_log_pos=245;

MariaDB [(none)]>? start slave;? # 啟動復(fù)制線程宣谈,就是打開I/O線程和SQL線程愈犹;實現(xiàn)拉主的bin-log到從的relay-log上;再從relay-log寫到數(shù)據(jù)庫內(nèi)存里

③ 查看從服務(wù)器狀態(tài)

可使用SHOW SLAVE STATUS\G查看從服務(wù)器狀態(tài)闻丑,如下所示漩怎,也可用show processlist \G查看當(dāng)前復(fù)制狀態(tài):

Slave_IO_Running: Yes #IO線程正常運行

Slave_SQL_Running: Yes #SQL線程正常運行

4、測試

① 在主上創(chuàng)建一個along庫

② 從上自動生成along數(shù)據(jù)庫

5嗦嗡、若要繼續(xù)添加新salve勋锤,實現(xiàn)一主多從

假如master?已經(jīng)運行很久了,想對新安裝的slave 進(jìn)行數(shù)據(jù)同步侥祭,甚至它沒有master 的數(shù)據(jù)叁执。

(1)在主master-mysql 上

① 進(jìn)行完全備份

mysqldump --all-databases > /backup/mysql-all-backup-`date+%F-%T`.sql

把備份生成的文件發(fā)給salve-mysql2機器上scp/backup/mysql-all-backup-2017-11-20-22\:04\:06.sql @192.168.30.2:?

② 查看現(xiàn)在的二進(jìn)制文件狀態(tài)

MariaDB [(none)]> show master status;

(2)在從slave-mysql2上

① vim /etc/my.cnf 修改主配置文件,設(shè)為從

② 進(jìn)行master的完全備份恢復(fù)

mysql -uroot -p < mysql-all-backup-2017-11-20-22\:04\:06.sql

systemctl start mariadb 開啟服務(wù)

恢復(fù)完后卑硫,數(shù)據(jù)直接與主完全一致

③?啟動從服務(wù)器復(fù)制線程

MariaDB [(none)]> change master to master_host='192.168.30.107',

? ? -> master_user='slave',

? ? -> master_password='along',

? ? -> master_log_file='mysql-bin.000003',

? ? -> master_log_pos=500;

7徒恋、解除主從關(guān)系,恢復(fù)獨立的服務(wù)器

① MariaDB [(none)]> stop slave; 關(guān)閉兩個線程

② vim /etc/my.cnf 刪除3行

relay-log =mysql-relay-log

read-only =1log_slave_updates =1

③ systemctl restart mariadb 重啟服務(wù)


主從+復(fù)制過濾

1欢伏、環(huán)境準(zhǔn)備

機器名稱IP配置服務(wù)角色備注

master-mysql192.168.30.107主數(shù)據(jù)庫二進(jìn)制日志

slave-mysql1192.168.30.7從數(shù)據(jù)庫中繼日志

slave-mysql2192.168.30.2從數(shù)據(jù)庫中繼日志

2入挣、在主master 主服務(wù)器上

① vim /etc/my.cnf? 修改mysql主配置文件,對master進(jìn)行配置硝拧,打開二進(jìn)制日志径筏,指定唯一的servr ID葛假,設(shè)置復(fù)制過濾

server-id=1#配置server-id,讓主服務(wù)器有唯一ID號

log-bin=mysql-bin? #打開Mysql日志滋恬,日志格式為二進(jìn)制

skip-name-resolve? #關(guān)閉名稱解析聊训,(非必須)

binlog_ignore_db=home? #除了home數(shù)據(jù)庫,其他都允許從復(fù)制主的二進(jìn)制文件

#binlog_do_db=along? #僅允許從復(fù)制along數(shù)據(jù)庫的二進(jìn)制文件

systemctl start mariadb 開啟服務(wù)

②?創(chuàng)建并授權(quán)slave mysql 用的復(fù)制帳號

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO slave@'192.168.%.%'IDENTIFIED BY'along';

分析:在Master的數(shù)據(jù)庫中建立一個備份帳戶:每個slave使用標(biāo)準(zhǔn)的MySQL用戶名和密碼連接master恢氯。進(jìn)行復(fù)制操作的用戶會授予REPLICATION SLAVE權(quán)限带斑。

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

在Master的數(shù)據(jù)庫執(zhí)行show master status,查看主服務(wù)器二進(jìn)制日志狀態(tài)勋拟,位置號

3勋磕、在從slave mysql1上

① 修改主配置文件

vim /etc/my.cnf 打開中繼日志,指定唯一的servr ID敢靡,設(shè)置只讀權(quán)限

server-id=2#配置server-id挂滓,讓從服務(wù)器有唯一ID號

relay_log = mysql-relay-bin? ? #打開Mysql日志,日志格式為二進(jìn)制

read_only =1? ? #設(shè)置只讀權(quán)限

log_bin = mysql-bin? ? ? ? #開啟從服務(wù)器二進(jìn)制日志啸胧,(必須)

log_slave_updates =1#使得更新的數(shù)據(jù)寫進(jìn)二進(jìn)制日志中

systemctl start mariadb 開啟服務(wù)

②?啟動從服務(wù)器復(fù)制線程赶站,讓slave連接master,并開始重做master二進(jìn)制日志中的事件纺念。

MariaDB [(none)]> change master to master_host='192.168.30.107',

? ? -> master_user='slave',

? ? -> master_password='along',

? ? -> master_log_file='mysql-bin.000001',

? ? -> master_log_pos=245;

MariaDB [(none)]>? start slave;? # 啟動復(fù)制線程贝椿,就是打開I/O線程和SQL線程;實現(xiàn)拉主的bin-log到從的relay-log上柠辞;再從relay-log寫到數(shù)據(jù)庫內(nèi)存里

③ 查看從服務(wù)器狀態(tài)

可使用SHOW SLAVE STATUS\G查看從服務(wù)器狀態(tài)团秽,如下所示,也可用show processlist \G查看當(dāng)前復(fù)制狀態(tài):

Slave_IO_Running: Yes #IO線程正常運行

Slave_SQL_Running: Yes #SQL線程正常運行

4叭首、測試主從和復(fù)制過濾

(1)測試主從關(guān)系

在主上創(chuàng)建一個along习勤、home庫;從上自動生成along焙格、home數(shù)據(jù)庫

(2)測試復(fù)制過濾

① 在主上:在along庫中創(chuàng)建一個classes的表图毕;從上自動生成

MariaDB [home]> create table classes (id int not null,name varchar(20));

② 在主上:在home庫中創(chuàng)建一個classes的表;從上沒有生成

MariaDB [home]> create table classes (id int not null,name varchar(20));

slave-mysql1 上眷唉,過濾成功

5予颤、設(shè)置slave-mysql2 為slave-mysql1 的從,且在mysql2 設(shè)置復(fù)制過濾

(1)在slave-mysql1上冬阳,不用怎么設(shè)置

因為上邊主配置文件已經(jīng)開啟了自己的二進(jìn)制文件蛤虐;且slave-mysql1 是從開始就同步master的蔗草,所以授權(quán)命令也同步過了

MariaDB [home]> select user,host from mysql.user; 可以查看自己授權(quán)過的用戶

(2)slave-mysql2 上局雄,可以像上實驗一樣,先給主的完全備份在本機恢復(fù)一下

① 在主上完備

mysqldump --all-databases > /backup/mysql-all-backup-`date+%F-%T`.sqlscp/backup/mysql-all-backup-2017-11-21-11:14:59.sql @192.168.30.2:?

② 進(jìn)行master的完全備份恢復(fù)

mysql -uroot -p < mysql-all-backup-2017-11-20-22\:04\:06.sql

③ 在slave-mysql2 上

vim /etc/my.cnf? 修改主配置文件柔纵,設(shè)為從;且設(shè)置過濾

server-id=3relay-log =mysql-relay-log

read-only =1log-bin = mysql-bin

log_slave_updates =1replicate_do_dB=along? ? #只復(fù)制它的主的along數(shù)據(jù)庫

systemctl start mariadb 開啟服務(wù)

④ mysql 打開數(shù)據(jù)庫饲常,查看數(shù)據(jù)恢復(fù)成功蹲堂;

啟動從服務(wù)器復(fù)制線程,讓slave連接master贝淤,并開始重做master二進(jìn)制日志中的事件柒竞。

MariaDB [(none)]> change master to master_host='192.168.30.107',

? ? -> master_user='slave',

? ? -> master_password='along',

? ? -> master_log_file='mysql-bin.000008',

? ? -> master_log_pos=773;

MariaDB [(none)]> start slave;

⑤ MariaDB [(none)]> show slave status \G; 查看,兩個進(jìn)程打開播聪,且只復(fù)制主的along數(shù)據(jù)庫

6朽基、測試主從從和slave-mysql2的復(fù)制過濾

(1)在主上刪除job數(shù)據(jù)庫,master 和slave-mysql1 都刪除成功

MariaDB [home]> drop database job; 刪除job庫

因為slave-mysql2 只同步slave-mysql1 的along庫离陶,所以沒有刪除

(2)在主上的along數(shù)據(jù)庫踩晶,創(chuàng)建一個grade 表,master 和slave-mysql1 都刪除成功

MariaDB [along]> create table grade (id int not null,name varchar(20));

在slave-mysql2 上也自動生成成功


雙主

應(yīng)用:只適合小型公司枕磁,小并發(fā)訪問量,畢竟同時寫入易出錯

1术吝、環(huán)境準(zhǔn)備

機器名稱IP配置服務(wù)角色備注

mysql1192.168.30.107數(shù)據(jù)庫中繼日志计济、二進(jìn)制日志

mysql2192.168.30.7數(shù)據(jù)庫中繼日志、二進(jìn)制日志

2排苍、配置總配置文件沦寂,除了ID號和起始數(shù),兩邊都是一樣的

vim /etc/my/cnf

server-id=1? ? #mysql1的配置ID為1淘衙,mysql2的ID為2

relay-log =mysql-relay-log

log-bin = mysql-bin

log_slave_updates =1auto_increment_increment=2? #表示自增長字段每次遞增的量传藏,步長

auto_increment_offset=1#表示自增長字段從那個數(shù)開始,mysql1從1開始彤守;mysql2從2開始

systemctl start mariadb

3毯侦、互相設(shè)為對方的從

(1)授權(quán)遠(yuǎn)程登錄的用戶

mysql1、2 上

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO slave@'192.168.%.%'IDENTIFIED BY'along';

(2)開啟復(fù)制線程

① mysql1 上

MariaDB [(none)]> change master to master_host='192.168.30.7',

? ? -> master_user='slave',

? ? -> master_password='along',

? ? -> master_log_file='mysql-bin.000002',

? ? -> master_log_pos=245;

MariaDB [(none)]>? start slave;? # 啟動復(fù)制線程

② mysql2 上

MariaDB [(none)]> change master to master_host='192.168.30.107',

? ? -> master_user='slave',

? ? -> master_password='along',

? ? -> master_log_file='mysql-bin.000002',

? ? -> master_log_pos=245;

MariaDB [(none)]>? start slave;? # 啟動復(fù)制線程

4具垫、測試雙方互為主從的關(guān)系

在mysql1上侈离,刪除test數(shù)據(jù)庫;mysql2 上也自動刪除

在mysql2上筝蚕,創(chuàng)建xiaohei數(shù)據(jù)庫卦碾;mysql2 上也自動生成

5、設(shè)置自增長ID的表

MariaDB [along]> create table home (id int PRIMARY KEY AUTO_INCREMENT,name varchar(20));

① 在mysql1上向表中插入數(shù)據(jù)

MariaDB [along]> insert into home(name) value('mayun'),('mahuateng'),('wangjianlin');

② 在mysql2上向表中插入數(shù)據(jù)

MariaDB [along]> insert into home(name) value('dinglei'),('liyanhong'),('leijun');



場景

公司規(guī)模已經(jīng)形成起宽,用戶數(shù)據(jù)已成為公司的核心命脈洲胖,一次老王一不小心把數(shù)據(jù)庫文件刪除,通過mysqldump備份策略恢復(fù)用了兩個小時坯沪,在這兩小時中绿映,公司業(yè)務(wù)中斷,損失100萬屏箍,老王做出深刻反省绘梦,公司也因此對于數(shù)據(jù)庫的性能和可靠性提出更高要求橘忱。要求對數(shù)據(jù)庫進(jìn)行改造,使其承載力進(jìn)行提升卸奉,故障修復(fù)時間減少钝诚,有沒有能實現(xiàn)的方案呢?

數(shù)據(jù)庫常遇到的問題

一榄棵、性能問題

1凝颇、向上拓展 scale up:針對單臺服務(wù)器,提高服務(wù)器的硬件性能疹鳄,比如:內(nèi)存拧略,cpu等,個體本身 容易達(dá)到極限

2瘪弓、向外拓展 scale out:多臺服務(wù)器形成集群垫蛆,共同完成一件事情

二、可用性問題

1腺怯、數(shù)據(jù)庫服務(wù)中斷

2袱饭、誤操作數(shù)據(jù)損壞

3、硬件故障

4呛占、數(shù)據(jù)庫升級測試遭遇bug

5虑乖、黑客攻擊

數(shù)據(jù)庫高可用技術(shù)說明

高可用架構(gòu)對于互聯(lián)網(wǎng)服務(wù)基本是標(biāo)配,無論是應(yīng)用服務(wù)還是數(shù)據(jù)庫服務(wù)都需要做到高可用晾虑。雖然互聯(lián)網(wǎng)服務(wù)號稱7*24小時不間斷服務(wù)疹味,但多多少少有一些時候服務(wù)不可用,比如某些時候網(wǎng)頁打不開帜篇,百度不能搜索或者無法發(fā)微博糙捺,發(fā)微信等。一般而言坠狡,衡量高可用做到什么程度可以通過一年內(nèi)服務(wù)不可用時間作為參考继找,要做到3個9的可用性,一年內(nèi)只能累計有8個小時不可服務(wù)逃沿,而如果要做到5個9的可用性婴渡,則一年內(nèi)只能累計5分鐘服務(wù)中斷。所以雖說每個公司都說自己的服務(wù)是7*24不間斷的凯亮,但實際上能做到5個9的屈指可數(shù)边臼,甚至根本做不到,國內(nèi)互聯(lián)網(wǎng)巨頭BAT(百度假消,阿里巴巴柠并,騰訊)都有因為故障導(dǎo)致的停服問題。對于一個系統(tǒng)而言,可能包含很多模塊臼予,比如前端應(yīng)用鸣戴,緩存,數(shù)據(jù)庫粘拾,搜索窄锅,消息隊列等,每個模塊都需要做到高可用缰雇,才能保證整個系統(tǒng)的高可用入偷。對于數(shù)據(jù)庫服務(wù)而言,高可用可能更復(fù)雜械哟,對用戶的服務(wù)可用疏之,不僅僅是能訪問,還需要有正確性保證暇咆,因此锋爪,對于實現(xiàn)數(shù)據(jù)庫高可用,對互聯(lián)網(wǎng)公司來說極其重要爸业!


企業(yè)級數(shù)據(jù)庫高可用架構(gòu)圖

Mysql主從架構(gòu)技術(shù)說明

Mysql內(nèi)建的復(fù)制功能是構(gòu)建大型几缭,高性能應(yīng)用程序的基礎(chǔ)。將Mysql的數(shù)據(jù)分布到多個系統(tǒng)上去沃呢,這種分布的機制,是通過將Mysql的某一臺主機(Master)的數(shù)據(jù)復(fù)制到其它主機(slaves)上拆挥,并重新執(zhí)行一遍來實現(xiàn)的薄霜。復(fù)制過程中一個服務(wù)器充當(dāng)主服務(wù)器,而一個或多個其它服務(wù)器充當(dāng)從服務(wù)器纸兔。主服務(wù)器將更新寫入二進(jìn)制日志文件惰瓜,這些日志可以記錄發(fā)送到從服務(wù)器的更新。當(dāng)一個從服務(wù)器連接主服務(wù)器時汉矿,它通知主服務(wù)器從服務(wù)器在日志中讀取的最后一次成功更新的位置崎坊。從服務(wù)器接收從那時起發(fā)生的任何更新,然后封鎖并等待主服務(wù)器通知新的更新洲拇。

主從復(fù)制架構(gòu)圖

數(shù)據(jù)庫復(fù)制特性

Mysql復(fù)制解決的問題

MySQL復(fù)制技術(shù)有以下一些特點:

(1) 數(shù)據(jù)分布 (Data distribution )

(2) 負(fù)載平衡(load balancing)

(3) 備份(Backups)

(4) 高可用性和容錯性 High availabilityand failover

Mysql復(fù)制如何工作

Mysql的復(fù)制功能主要有3個步驟:

(1) 主服務(wù)器(master)將改變記錄到二進(jìn)制日志(binarylog)中(這些記錄叫做二進(jìn)制日志事件奈揍,binary log events)

(2) 從服務(wù)器(slave)將主服務(wù)器master的binary logevents拷貝到它的中繼日志(relay log)

(3) slave重做中繼日志中的事件,將改變反映它自己的數(shù)據(jù)赋续。

1男翰、該過程的第一部分就是master記錄二進(jìn)制日志。在每個事務(wù)更新數(shù)據(jù)完成之前纽乱,master在二進(jìn)制日志記錄這些改變蛾绎。MySQL將事務(wù)串行的寫入二進(jìn)制日志,在事件寫入二進(jìn)制日志完成后,master通知存儲引擎提交事務(wù)租冠。此后可接收slave的請求

2鹏倘、下一步就是slave將master的binary log拷貝到它自己的中繼日志。首先顽爹,slave開始一個工作線程——I/O線程纤泵。I/O線程在master上打開一個普通的連接,然后開始在主節(jié)點上binlog dump process(二進(jìn)制轉(zhuǎn)存線程)话原。Binlog dump process從master的二進(jìn)制日志中讀取事件夕吻,如果已經(jīng)跟上master,它會睡眠并等待master產(chǎn)生新的事件繁仁。I/O線程將這些事件寫入中繼日志涉馅。

3、 SQL slave thread(SQL從線程)處理該過程的最后一步黄虱。SQL線程從中繼日志讀取事件稚矿,并重放其中的事件而更新slave的數(shù)據(jù),使其與master中的數(shù)據(jù)一致捻浦。只要該線程與I/O線程保持一致晤揣,中繼日志通常會位于OS的緩存中,所以中繼日志的開銷很小朱灿。

I/O線程:將master數(shù)據(jù)庫二進(jìn)制日志拉到slave數(shù)據(jù)庫上昧识,并將二進(jìn)制日志寫到中繼日志,寫完之后盗扒,他會睡眠并等待master數(shù)據(jù)庫二進(jìn)制日志更新跪楞,一旦更新,就會寫入slave數(shù)據(jù)庫的中繼日志中

SQL線程:讀取中繼日志的事件侣灶,并在數(shù)據(jù)庫中執(zhí)行甸祭,寫入到內(nèi)存中,使slave數(shù)據(jù)庫的數(shù)據(jù)與master數(shù)據(jù)庫中的數(shù)據(jù)一致

Mysql實現(xiàn)企業(yè)級數(shù)據(jù)庫主從復(fù)制架構(gòu)實戰(zhàn)

注意:slave數(shù)據(jù)庫只能是可讀的褥影,不能是可寫的池户,如果改變了slave數(shù)據(jù)庫的數(shù)據(jù),master不能從slave數(shù)據(jù)庫上同步數(shù)據(jù)凡怎,導(dǎo)致主從數(shù)據(jù)庫數(shù)據(jù)不一致校焦。

實戰(zhàn)演練

一、環(huán)境準(zhǔn)備

centos系統(tǒng)服務(wù)器2臺统倒、一臺用戶做Mysql主服務(wù)器斟湃,一臺用于做Mysql從服務(wù)器,都在同一個網(wǎng)段中檐薯,配置好yum源凝赛、防火墻關(guān)閉注暗、各節(jié)點時鐘服務(wù)同步、各節(jié)點之間可以通過主機名互相通信

二墓猎、準(zhǔn)備步驟:

1捆昏、iptables -F && setenforce 清空防火墻策略,關(guān)閉selinux

2毙沾、拿兩臺服務(wù)器都使用yum方式安裝Mysql服務(wù)骗卜,要求版本一致

3、分別啟動兩臺服務(wù)器mysql服務(wù)左胞,確保服務(wù)正常

三寇仓、實現(xiàn)步驟:

1、配置master主服務(wù)器

對master進(jìn)行配置烤宙,包括打開二進(jìn)制日志遍烦,指定唯一的servr ID。例如躺枕,在配置文件加入如下值

vim /etc/my.cnf

server-id=1#配置server-id服猪,讓主服務(wù)器有唯一ID號(讓從服務(wù)器知道他的主服務(wù)器是誰)

log-bin=mysql-bin#打開Mysql日志,日志格式為二進(jìn)制

skip-name-resolve#關(guān)閉名稱解析拐云,(非必須)

然后重啟數(shù)據(jù)庫服務(wù)

systemctl restart mariadb

2.創(chuàng)建復(fù)制帳號

在Master的數(shù)據(jù)庫中建立一個備份帳戶:每個slave使用標(biāo)準(zhǔn)的MySQL用戶名和密碼連接master

罢猪。進(jìn)行復(fù)制操作的用戶會授予REPLICATION SLAVE權(quán)限。(給從服務(wù)器授權(quán)叉瘩,讓他能從主服務(wù)器拷貝二進(jìn)制日志)

mysql

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO slave@'192.168.10.%' IDENTIFIED BY 'magedu';

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

在Master的數(shù)據(jù)庫執(zhí)行show master status膳帕,查看主服務(wù)器二進(jìn)制日志狀態(tài)

4、配置slave從服務(wù)器

對slave進(jìn)行配置薇缅,打開中繼日志备闲,指定唯一的servr ID,設(shè)置只讀權(quán)限捅暴。在配置文件加入如下值

vim /etc/my.cnf

server-id=2#配置server-id,讓從服務(wù)器有唯一ID號

relay_log = mysql-relay-bin#打開Mysql日志咧纠,日志格式為二進(jìn)制

read_only = 1#設(shè)置只讀權(quán)限

log_bin = mysql-bin#開啟從服務(wù)器二進(jìn)制日志

log_slave_updates = 1#使得更新的數(shù)據(jù)寫進(jìn)二進(jìn)制日志中

然后重啟數(shù)據(jù)庫服務(wù)

systemctl restart mariadb

5.啟動從服務(wù)器復(fù)制線程

讓slave連接master蓬痒,并開始重做master二進(jìn)制日志中的事件。

mysql

CHANGE MASTER TO MASTER_HOST='192.168.10.190',

MASTER_USER='slave',

MASTER_PASSWORD='magedu',

MASTER_LOG_FILE='mysql-bin.000001',

MASTER_LOG_POS=278;

執(zhí)行start slave漆羔;# 啟動復(fù)制線程梧奢。

6、查看從服務(wù)器狀態(tài)

可使用SHOW SLAVE STATUS\G查看從服務(wù)器狀態(tài)演痒,如下所示亲轨,也可用show processlist \G查看前復(fù)制狀態(tài):

mysql

SHOW SLAVE STATUS\G

Slave_IO_Running: Yes #IO線程正常運行

Slave_SQL_Running: Yes #SQL線程正常運行

7.測試

理想的結(jié)果是在主服務(wù)器上添加的數(shù)據(jù),在從服務(wù)器上也會同步

在主服務(wù)器上

在從服務(wù)器上

四鸟顺、添加新slave服務(wù)器

假如master已經(jīng)運行很久了惦蚊,想對新安裝的slave進(jìn)行數(shù)據(jù)同步器虾,甚至它沒有master的數(shù)據(jù)。

此時蹦锋,有幾種方法可以使slave從另一個服務(wù)開始兆沙,例如,從master拷貝數(shù)據(jù)莉掂,從另一個slave克隆葛圃,從最近的備份開始一個slave。為了加快Slave與master同步憎妙,可用以下方式先進(jìn)行數(shù)據(jù)同步:

(1)master的某個時刻的數(shù)據(jù)快照库正;

(2)數(shù)據(jù)庫的備份數(shù)據(jù)

(3)master的二進(jìn)制日志文件。


實現(xiàn)主從從架構(gòu)

也可以搭建主從從架構(gòu)厘唾,讓從服務(wù)器之間進(jìn)行復(fù)制

就是在從服務(wù)器也開啟二進(jìn)制日志褥符,然后從的從I/O線程再將從的二進(jìn)制日志給拷貝過來寫入到自己的relay log中,然后sql線程再讀取relay log中的事件阅嘶,在數(shù)據(jù)庫中執(zhí)行属瓣,寫入到內(nèi)存中。

Mysql復(fù)制過濾器

復(fù)制過濾器:

僅復(fù)制有限一個或幾個數(shù)據(jù)庫相關(guān)的數(shù)據(jù)讯柔,而非所有抡蛙;由復(fù)制過濾器進(jìn)行;

有兩種實現(xiàn)思路:

(1) 主服務(wù)器

主服務(wù)器僅向二進(jìn)制日志中記錄有關(guān)特定數(shù)據(jù)庫相關(guān)的寫操作魂迄;

binlog_do_db=

binlog_ignore_db=

(2) 從服務(wù)器

從服務(wù)器的SQL THREAD僅重放關(guān)注的數(shù)據(jù)庫或表相關(guān)的事件粗截,并將其應(yīng)用于本地;

Replicate_Do_DB=

Replicate_Ignore_DB=

企業(yè)常見數(shù)據(jù)庫架構(gòu)

一捣炬、單一master和多slave

在實際應(yīng)用場景中熊昌,MySQL復(fù)制90%以上都是一個Master復(fù)制到一個或者多個Slave的架構(gòu)模式,主要用于讀壓力比較大的應(yīng)用的數(shù)據(jù)庫端廉價擴展解決方案湿酸。因為只要Master和Slave的壓力不是太大(尤其是Slave端壓力)的話婿屹,異步復(fù)制的延時一般都很少很少。尤其是自從Slave端的復(fù)制方式改成兩個線程處理之后推溃,更是減小了Slave端的延時問題昂利。而帶來的效益是,對于數(shù)據(jù)實時性要求不是特別高的應(yīng)用铁坎,只需要通過廉價的pcserver來擴展Slave的數(shù)量蜂奸,將讀壓力分散到多臺Slave的機器上面,即可通過分散單臺數(shù)據(jù)庫服務(wù)器的讀壓力來解決數(shù)據(jù)庫端的讀性能瓶頸硬萍,畢竟在大多數(shù)數(shù)據(jù)庫應(yīng)用系統(tǒng)中的讀壓力還是要比寫壓力大很多扩所。這在很大程度上解決了目前很多中小型網(wǎng)站的數(shù)據(jù)庫壓力瓶頸問題,甚至有些大型網(wǎng)站也在使用類似方案解決數(shù)據(jù)庫瓶頸朴乖。

單一master和多slave架構(gòu)圖

(1) 不同的slave扮演不同的作用(例如使用不同的索引祖屏,或者不同的存儲引擎)助赞;

(2) 用一個slave作為備用master,只進(jìn)行復(fù)制赐劣;#主服務(wù)器掛了之后嫉拐,可在從服務(wù)器執(zhí)行

1> 在備機上執(zhí)行STOP SLAVE 和RESET MASTER

2> 查看show slave status \G;

3> 然后修改應(yīng)用的連接地址。

(3) 用一個遠(yuǎn)程的slave魁兼,用于災(zāi)難恢復(fù)婉徘;

二、互為主從Master-Master(Master-Master in Active-Active Mode)

Master-Master復(fù)制的兩臺服務(wù)器咐汞,既是master盖呼,又是另一臺服務(wù)器的slave。這樣化撕,任何一方所做的變更几晤,都會通過復(fù)制應(yīng)用到另外一方的數(shù)據(jù)庫中。

即:在兩臺服務(wù)器上既執(zhí)行master的操作又執(zhí)行slave的操作(注意:兩臺數(shù)據(jù)庫都必須是可寫的)

互為主從復(fù)制過程

互為主從:兩個節(jié)點各自都要開啟binlog和relay log植阴;

1蟹瘾、數(shù)據(jù)不一致;

2掠手、自動增長id憾朴;

什么是自增長ID?

對于某些唯一性的字段喷鸽,可以通過設(shè)置自增長ID來實現(xiàn),自增長ID的數(shù)據(jù)众雷,代表這個表中存在一條唯一的記錄;而自增長id是肯定不會重復(fù)的做祝;

創(chuàng)建表砾省,設(shè)置ID為自增長

create table userInfo (id int PRIMARY KEY AUTO_INCREMENT,name varchar(50) NOT NULL);

兩邊插入數(shù)據(jù)看數(shù)據(jù)增長

insert into userInfo(name) value('xiao'),('da'),('lao');

定義一個節(jié)點使用奇數(shù)id

auto_increment_increment=2#表示自增長字段每次遞增的量

auto_increment_offset=1#表示自增長字段從那個數(shù)開始

另一個節(jié)點使用偶數(shù)id

auto_increment_increment=2

auto_increment_offset=2

配置:

1混槐、server_id必須要使用不同值编兄;

2、均啟用binlog和relay log声登; read only = 0(因為互為主從狠鸳,所以必須是可寫的)

3、存在自動增長id的表捌刮,為了使得id不相沖突,需要定義其自動增長方式舒岸;

服務(wù)啟動后執(zhí)行如下兩步:

4绅作、都授權(quán)有復(fù)制權(quán)限的用戶賬號;

5蛾派、各把對方指定為主節(jié)點俄认;

實驗:數(shù)據(jù)庫互為主從復(fù)制步驟

1.修改mysql配置文件

一臺數(shù)據(jù)庫服務(wù)器上

vim /etc/my.cnf

server-id = 1

log_bin = mysql_bin

relay_log = relay-log

skip-name-resolve = on

log_slave_updates = 1

auto_increment_increment=2

auto_increment_offset=1

另一臺數(shù)據(jù)庫服務(wù)器上

vim /etc/my.cnf

server-id = 2

relay_log = relay-log

log_bin = mysql-log

skip-name-resolve = on

log_slave_updates = 1

auto_increment_increment=2

auto_increment_offset=2

修改完配置文件后个少,重啟數(shù)據(jù)庫服務(wù)

systemctl restart mariadb

2.創(chuàng)建復(fù)制帳號

分別在兩臺數(shù)據(jù)庫服務(wù)器上創(chuàng)建復(fù)制賬號

mysql

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO slave@'192.168.10.%' IDENTIFIED BY 'magedu';

3.啟動從服務(wù)器復(fù)制線程

讓slave連接master,并開始重做master二進(jìn)制日志中的事件眯杏。

mysql

CHANGE MASTER TO MASTER_HOST='192.168.10.190',

MASTER_USER='slave',

MASTER_PASSWORD='magedu',

MASTER_LOG_FILE='mysql-bin.000001',

MASTER_LOG_POS=278;

執(zhí)行start slave夜焦;# 啟動復(fù)制線程。

另一臺數(shù)據(jù)庫服務(wù)器也是如此

4岂贩、查看從服務(wù)器狀態(tài)

可使用SHOW SLAVE STATUS\G查看從服務(wù)器狀態(tài)茫经,如下所示,也可用show processlist \G查看前復(fù)制態(tài):

mysql

SHOW SLAVE STATUS\G

Slave_IO_Running: Yes #IO線程正常運行

Slave_SQL_Running: Yes #SQL線程正常運行

兩臺數(shù)據(jù)庫服務(wù)器都顯示如上結(jié)果就ok萎津。

5.創(chuàng)建表卸伞,設(shè)置ID為自增長,兩邊插入數(shù)據(jù)看數(shù)據(jù)增長

在一臺數(shù)據(jù)庫服務(wù)器上

mysql

create database dnf;

use dnf;

create table userinfo (id int PRIMARY KEY AUTO_INCREMENT,name varchar(20) NOT NULL);

insert into userinfo (name) values('ni'),('wo'),('ta');

然后查看表,因為是自增長id锉屈,從1開始荤傲,步長為2,所以添加的數(shù)據(jù)id為1,3,5

然后在另一臺數(shù)據(jù)庫服務(wù)器插入數(shù)據(jù)颈渊,因為是自增長id遂黍,從2開始,步長為2俊嗽,所以新添加的數(shù)據(jù)id為6,8,10

排錯:當(dāng)配置文件中配置中繼日志格式不小心配置錯了雾家,或者讓slave連接master,執(zhí)行sql語句不小心寫錯了乌询,都有可能導(dǎo)致start slave榜贴;報錯,此時可以show slave status\G;會出現(xiàn)一大串信息妹田,里面會提示錯誤唬党。找到錯誤以后,重置slave鬼佣,reset slave;重新設(shè)置驶拱,然后再start slave;

注意:mysql的錯誤日志非常重要晶衷,可以提供錯誤信息蓝纲,從而找到錯誤原因。

互為主從容易導(dǎo)致數(shù)據(jù)不一致晌纫,此時我們可以用兩個實例來互為主從

三種復(fù)制方式

異步復(fù)制(Asynchronous replication)

MySQL默認(rèn)的復(fù)制即是異步的税迷,主庫在執(zhí)行完客戶端提交的事務(wù)后會立即將結(jié)果返給給客戶端,并不關(guān)心從庫是否已經(jīng)接收并處理锹漱,這樣就會有一個問題箭养,主如果crash掉了,此時主上已經(jīng)提交的事務(wù)可能并沒有傳到從上哥牍,如果此時毕泌,強行將從提升為主喝检,可能導(dǎo)致新主上的數(shù)據(jù)不完整

全同步復(fù)制(Fully synchronous replication)

指當(dāng)主庫執(zhí)行完一個事務(wù),所有的從庫都執(zhí)行了該事務(wù)才返回給客戶端撼泛。因為需要等待所有從庫執(zhí)行完該事務(wù)才能返回挠说,所以全同步復(fù)制的性能必然會收到嚴(yán)重的影響。需要有超時時間愿题。

半同步復(fù)制(Semisynchronous replication)

介于異步復(fù)制和全同步復(fù)制之間损俭,主庫在執(zhí)行完客戶端提交的事務(wù)后不是立刻返回給客戶端,而是等待至少一個從庫接收到并寫到relay log中才返回給客戶端抠忘。相對于異步復(fù)制撩炊,半同步復(fù)制提高了數(shù)據(jù)的安全性,同時它也造成了一定程度的延遲崎脉,這個延遲最少是一個TCP/IP往返的時間拧咳。所以,半同步復(fù)制最好在低延時的網(wǎng)絡(luò)中使用囚灼。

半同步復(fù)制

支持多種插件:/usr/lib64/mysql/plugins/

需要安裝方可使用:

mysql> INSTALL PLUGIN plugin_name SONAME 'shared_library_name';

半同步復(fù)制:

semisync_master.so

semisync_slave.so

主節(jié)點:

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

MariaDB [mydb]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';

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

| Variable_name | Value |

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

| rpl_semi_sync_master_enabled | OFF |

| rpl_semi_sync_master_timeout | 10000 |

| rpl_semi_sync_master_trace_level | 32 |

| rpl_semi_sync_master_wait_no_slave | ON |

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

MariaDB [mydb]> SET GLOBAL rpl_semi_sync_master_enabled=ON/1;

stop slave;

start slave;

從節(jié)點:

INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

MariaDB [mydb]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';

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

| Variable_name | Value |

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

| rpl_semi_sync_slave_enabled | OFF |

| rpl_semi_sync_slave_trace_level | 32 |

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

MariaDB [mydb]> STOP SLAVE IO_THREAD;

MariaDB [mydb]> SET GLOBAL rpl_semi_sync_slave_enabled = ON ;

MariaDB [mydb]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';

MariaDB [mydb]> START SLAVE IO_THREAD;

stop slave;

start slave;

可查看從庫錯誤日志觀察是否生效

master錯誤日志

slave錯誤日志

mysql優(yōu)化:

1.可以用數(shù)據(jù)緩存骆膝,常見的memcache

2.數(shù)據(jù)庫本身有很多緩存機制,可使用對應(yīng)的緩存策略

3.對數(shù)據(jù)來說灶体,竟可能使用索引

4.對請求而言阅签,可以實現(xiàn)讀寫分離,對讀請求負(fù)載均衡

5.對大數(shù)據(jù)庫或者表蝎抽,可根據(jù)業(yè)務(wù)邏輯進(jìn)行分庫分表

6.多有的優(yōu)化政钟,盡可能網(wǎng)內(nèi)存中存放

分庫分表

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市樟结,隨后出現(xiàn)的幾起案子养交,更是在濱河造成了極大的恐慌,老刑警劉巖瓢宦,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碎连,死亡現(xiàn)場離奇詭異,居然都是意外死亡驮履,警方通過查閱死者的電腦和手機鱼辙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來玫镐,“玉大人倒戏,你說我怎么就攤上這事】炙疲” “怎么了杜跷?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我葱椭,道長变勇,這世上最難降的妖魔是什么做粤? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮惠呼,結(jié)果婚禮上蔓彩,老公的妹妹穿的比我還像新娘治笨。我一直安慰自己,他們只是感情好赤嚼,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布旷赖。 她就那樣靜靜地躺著,像睡著了一般更卒。 火紅的嫁衣襯著肌膚如雪等孵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天蹂空,我揣著相機與錄音俯萌,去河邊找鬼。 笑死上枕,一個胖子當(dāng)著我的面吹牛咐熙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辨萍,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼棋恼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了锈玉?” 一聲冷哼從身側(cè)響起爪飘,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嘲玫,沒想到半個月后悦施,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡去团,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年抡诞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片土陪。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡昼汗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鬼雀,到底是詐尸還是另有隱情顷窒,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站鞋吉,受9級特大地震影響鸦做,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谓着,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一泼诱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧赊锚,春花似錦治筒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至牲平,卻和暖如春堤框,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纵柿。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工胰锌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人藐窄。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓资昧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親荆忍。 傳聞我的和親對象是個殘疾皇子格带,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355

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