日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

Mysql 主从复制实战(学习笔记十三)

發(fā)布時(shí)間:2024/1/8 数据库 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mysql 主从复制实战(学习笔记十三) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

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

一主一從,一主多從,雙主

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

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

③ 分別啟動(dòng)兩臺(tái)服務(wù)器mysql

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

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

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

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

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

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

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

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

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

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

3、在從slave mysql1上

① 修改主配置文件

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

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

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ù)

②?啟動(dòng)從服務(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;? # 啟動(dòng)復(fù)制線程,就是打開I/O線程和SQL線程;實(shí)現(xiàn)拉主的bin-log到從的relay-log上;再?gòu)膔elay-log寫到數(shù)據(jù)庫(kù)內(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線程正常運(yùn)行

Slave_SQL_Running: Yes #SQL線程正常運(yùn)行

4、測(cè)試

① 在主上創(chuàng)建一個(gè)along庫(kù)

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

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

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

(1)在主master-mysql 上

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

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

把備份生成的文件發(fā)給salve-mysql2機(jī)器上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ù)直接與主完全一致

③?啟動(dòng)從服務(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ù)獨(dú)立的服務(wù)器

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

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

relay-log =mysql-relay-log

read-only =1log_slave_updates =1

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


主從+復(fù)制過(guò)濾

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

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

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

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

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

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

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

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

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

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

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

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

systemctl start mariadb 開啟服務(wù)

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

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

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

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

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

3、在從slave mysql1上

① 修改主配置文件

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

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

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ù)

②?啟動(dòng)從服務(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;? # 啟動(dòng)復(fù)制線程,就是打開I/O線程和SQL線程;實(shí)現(xiàn)拉主的bin-log到從的relay-log上;再?gòu)膔elay-log寫到數(shù)據(jù)庫(kù)內(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線程正常運(yùn)行

Slave_SQL_Running: Yes #SQL線程正常運(yùn)行

4、測(cè)試主從和復(fù)制過(guò)濾

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

在主上創(chuàng)建一個(gè)along、home庫(kù);從上自動(dòng)生成along、home數(shù)據(jù)庫(kù)

(2)測(cè)試復(fù)制過(guò)濾

① 在主上:在along庫(kù)中創(chuàng)建一個(gè)classes的表;從上自動(dòng)生成

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

② 在主上:在home庫(kù)中創(chuàng)建一個(gè)classes的表;從上沒(méi)有生成

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

slave-mysql1 上,過(guò)濾成功

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

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

因?yàn)樯线呏髋渲梦募呀?jīng)開啟了自己的二進(jìn)制文件;且slave-mysql1 是從開始就同步master的,所以授權(quán)命令也同步過(guò)了

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

(2)slave-mysql2 上,可以像上實(shí)驗(yàn)一樣,先給主的完全備份在本機(jī)恢復(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è)置過(guò)濾

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

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

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

systemctl start mariadb 開啟服務(wù)

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

啟動(dòng)從服務(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; 查看,兩個(gè)進(jìn)程打開,且只復(fù)制主的along數(shù)據(jù)庫(kù)

6、測(cè)試主從從和slave-mysql2的復(fù)制過(guò)濾

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

MariaDB [home]> drop database job; 刪除job庫(kù)

因?yàn)閟lave-mysql2 只同步slave-mysql1 的along庫(kù),所以沒(méi)有刪除

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

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

在slave-mysql2 上也自動(dòng)生成成功


雙主

應(yīng)用:只適合小型公司,小并發(fā)訪問(wèn)量,畢竟同時(shí)寫入易出錯(cuò)

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

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

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

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

2、配置總配置文件,除了ID號(hào)和起始數(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? #表示自增長(zhǎng)字段每次遞增的量,步長(zhǎng)

auto_increment_offset=1#表示自增長(zhǎng)字段從那個(gè)數(shù)開始,mysql1從1開始;mysql2從2開始

systemctl start mariadb

3、互相設(shè)為對(duì)方的從

(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;? # 啟動(dòng)復(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;? # 啟動(dòng)復(fù)制線程

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

在mysql1上,刪除test數(shù)據(jù)庫(kù);mysql2 上也自動(dòng)刪除

在mysql2上,創(chuàng)建xiaohei數(shù)據(jù)庫(kù);mysql2 上也自動(dòng)生成

5、設(shè)置自增長(zhǎng)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');



場(chǎng)景

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

數(shù)據(jù)庫(kù)常遇到的問(wèn)題

一、性能問(wèn)題

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

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

二、可用性問(wèn)題

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

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

3、硬件故障

4、數(shù)據(jù)庫(kù)升級(jí)測(cè)試遭遇bug

5、黑客攻擊

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

高可用架構(gòu)對(duì)于互聯(lián)網(wǎng)服務(wù)基本是標(biāo)配,無(wú)論是應(yīng)用服務(wù)還是數(shù)據(jù)庫(kù)服務(wù)都需要做到高可用。雖然互聯(lián)網(wǎng)服務(wù)號(hào)稱7*24小時(shí)不間斷服務(wù),但多多少少有一些時(shí)候服務(wù)不可用,比如某些時(shí)候網(wǎng)頁(yè)打不開,百度不能搜索或者無(wú)法發(fā)微博,發(fā)微信等。一般而言,衡量高可用做到什么程度可以通過(guò)一年內(nèi)服務(wù)不可用時(shí)間作為參考,要做到3個(gè)9的可用性,一年內(nèi)只能累計(jì)有8個(gè)小時(shí)不可服務(wù),而如果要做到5個(gè)9的可用性,則一年內(nèi)只能累計(jì)5分鐘服務(wù)中斷。所以雖說(shuō)每個(gè)公司都說(shuō)自己的服務(wù)是7*24不間斷的,但實(shí)際上能做到5個(gè)9的屈指可數(shù),甚至根本做不到,國(guó)內(nèi)互聯(lián)網(wǎng)巨頭BAT(百度,阿里巴巴,騰訊)都有因?yàn)楣收蠈?dǎo)致的停服問(wèn)題。對(duì)于一個(gè)系統(tǒng)而言,可能包含很多模塊,比如前端應(yīng)用,緩存,數(shù)據(jù)庫(kù),搜索,消息隊(duì)列等,每個(gè)模塊都需要做到高可用,才能保證整個(gè)系統(tǒng)的高可用。對(duì)于數(shù)據(jù)庫(kù)服務(wù)而言,高可用可能更復(fù)雜,對(duì)用戶的服務(wù)可用,不僅僅是能訪問(wèn),還需要有正確性保證,因此,對(duì)于實(shí)現(xiàn)數(shù)據(jù)庫(kù)高可用,對(duì)互聯(lián)網(wǎng)公司來(lái)說(shuō)極其重要!


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

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

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

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

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

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

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

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

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

(3) 備份(Backups)

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

Mysql復(fù)制如何工作

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

(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、該過(guò)程的第一部分就是master記錄二進(jìn)制日志。在每個(gè)事務(wù)更新數(shù)據(jù)完成之前,master在二進(jìn)制日志記錄這些改變。MySQL將事務(wù)串行的寫入二進(jìn)制日志,在事件寫入二進(jìn)制日志完成后,master通知存儲(chǔ)引擎提交事務(wù)。此后可接收slave的請(qǐng)求

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

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

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

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

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

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

實(shí)戰(zhàn)演練

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

centos系統(tǒng)服務(wù)器2臺(tái)、一臺(tái)用戶做Mysql主服務(wù)器,一臺(tái)用于做Mysql從服務(wù)器,都在同一個(gè)網(wǎng)段中,配置好yum源、防火墻關(guān)閉、各節(jié)點(diǎn)時(shí)鐘服務(wù)同步、各節(jié)點(diǎn)之間可以通過(guò)主機(jī)名互相通信

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

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

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

3、分別啟動(dòng)兩臺(tái)服務(wù)器mysql服務(wù),確保服務(wù)正常

三、實(shí)現(xiàn)步驟:

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

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

vim /etc/my.cnf

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

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

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

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

systemctl restart mariadb

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

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

。進(jìn)行復(fù)制操作的用戶會(huì)授予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ù)庫(kù)執(zhí)行show master status,查看主服務(wù)器二進(jìn)制日志狀態(tài)

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

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

vim /etc/my.cnf

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

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ù)庫(kù)服務(wù)

systemctl restart mariadb

5.啟動(dòng)從服務(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;# 啟動(dòng)復(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線程正常運(yùn)行

Slave_SQL_Running: Yes #SQL線程正常運(yùn)行

7.測(cè)試

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

在主服務(wù)器上

在從服務(wù)器上

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

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

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

(1)master的某個(gè)時(shí)刻的數(shù)據(jù)快照;

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

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


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

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

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

Mysql復(fù)制過(guò)濾器

復(fù)制過(guò)濾器:

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

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

(1) 主服務(wù)器

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

binlog_do_db=

binlog_ignore_db=

(2) 從服務(wù)器

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

Replicate_Do_DB=

Replicate_Ignore_DB=

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

一、單一master和多slave

在實(shí)際應(yīng)用場(chǎng)景中,MySQL復(fù)制90%以上都是一個(gè)Master復(fù)制到一個(gè)或者多個(gè)Slave的架構(gòu)模式,主要用于讀壓力比較大的應(yīng)用的數(shù)據(jù)庫(kù)端廉價(jià)擴(kuò)展解決方案。因?yàn)橹灰狹aster和Slave的壓力不是太大(尤其是Slave端壓力)的話,異步復(fù)制的延時(shí)一般都很少很少。尤其是自從Slave端的復(fù)制方式改成兩個(gè)線程處理之后,更是減小了Slave端的延時(shí)問(wèn)題。而帶來(lái)的效益是,對(duì)于數(shù)據(jù)實(shí)時(shí)性要求不是特別高的應(yīng)用,只需要通過(guò)廉價(jià)的pcserver來(lái)擴(kuò)展Slave的數(shù)量,將讀壓力分散到多臺(tái)Slave的機(jī)器上面,即可通過(guò)分散單臺(tái)數(shù)據(jù)庫(kù)服務(wù)器的讀壓力來(lái)解決數(shù)據(jù)庫(kù)端的讀性能瓶頸,畢竟在大多數(shù)數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)中的讀壓力還是要比寫壓力大很多。這在很大程度上解決了目前很多中小型網(wǎng)站的數(shù)據(jù)庫(kù)壓力瓶頸問(wèn)題,甚至有些大型網(wǎng)站也在使用類似方案解決數(shù)據(jù)庫(kù)瓶頸。

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

(1) 不同的slave扮演不同的作用(例如使用不同的索引,或者不同的存儲(chǔ)引擎);

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

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

2> 查看show slave status \G;

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

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

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

Master-Master復(fù)制的兩臺(tái)服務(wù)器,既是master,又是另一臺(tái)服務(wù)器的slave。這樣,任何一方所做的變更,都會(huì)通過(guò)復(fù)制應(yīng)用到另外一方的數(shù)據(jù)庫(kù)中。

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

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

互為主從:兩個(gè)節(jié)點(diǎn)各自都要開啟binlog和relay log;

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

2、自動(dòng)增長(zhǎng)id;

什么是自增長(zhǎng)ID?

對(duì)于某些唯一性的字段,可以通過(guò)設(shè)置自增長(zhǎng)ID來(lái)實(shí)現(xiàn),自增長(zhǎng)ID的數(shù)據(jù),代表這個(gè)表中存在一條唯一的記錄;而自增長(zhǎng)id是肯定不會(huì)重復(fù)的;

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

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

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

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

定義一個(gè)節(jié)點(diǎn)使用奇數(shù)id

auto_increment_increment=2#表示自增長(zhǎng)字段每次遞增的量

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

另一個(gè)節(jié)點(diǎn)使用偶數(shù)id

auto_increment_increment=2

auto_increment_offset=2

配置:

1、server_id必須要使用不同值;

2、均啟用binlog和relay log; read only = 0(因?yàn)榛橹鲝?#xff0c;所以必須是可寫的)

3、存在自動(dòng)增長(zhǎng)id的表,為了使得id不相沖突,需要定義其自動(dòng)增長(zhǎng)方式;

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

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

5、各把對(duì)方指定為主節(jié)點(diǎn);

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

1.修改mysql配置文件

一臺(tái)數(shù)據(jù)庫(kù)服務(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

另一臺(tái)數(shù)據(jù)庫(kù)服務(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ù)庫(kù)服務(wù)

systemctl restart mariadb

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

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

mysql

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

3.啟動(dòng)從服務(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;# 啟動(dòng)復(fù)制線程。

另一臺(tái)數(shù)據(jù)庫(kù)服務(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線程正常運(yùn)行

Slave_SQL_Running: Yes #SQL線程正常運(yùn)行

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

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

在一臺(tái)數(shù)據(jù)庫(kù)服務(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');

然后查看表,因?yàn)槭亲栽鲩L(zhǎng)id,從1開始,步長(zhǎng)為2,所以添加的數(shù)據(jù)id為1,3,5

然后在另一臺(tái)數(shù)據(jù)庫(kù)服務(wù)器插入數(shù)據(jù),因?yàn)槭亲栽鲩L(zhǎng)id,從2開始,步長(zhǎng)為2,所以新添加的數(shù)據(jù)id為6,8,10

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

注意:mysql的錯(cuò)誤日志非常重要,可以提供錯(cuò)誤信息,從而找到錯(cuò)誤原因。

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

三種復(fù)制方式

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

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

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

指當(dāng)主庫(kù)執(zhí)行完一個(gè)事務(wù),所有的從庫(kù)都執(zhí)行了該事務(wù)才返回給客戶端。因?yàn)樾枰却袕膸?kù)執(zhí)行完該事務(wù)才能返回,所以全同步復(fù)制的性能必然會(huì)收到嚴(yán)重的影響。需要有超時(shí)時(shí)間。

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

介于異步復(fù)制和全同步復(fù)制之間,主庫(kù)在執(zhí)行完客戶端提交的事務(wù)后不是立刻返回給客戶端,而是等待至少一個(gè)從庫(kù)接收到并寫到relay log中才返回給客戶端。相對(duì)于異步復(fù)制,半同步復(fù)制提高了數(shù)據(jù)的安全性,同時(shí)它也造成了一定程度的延遲,這個(gè)延遲最少是一個(gè)TCP/IP往返的時(shí)間。所以,半同步復(fù)制最好在低延時(shí)的網(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é)點(diǎn):

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é)點(diǎn):

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;

可查看從庫(kù)錯(cuò)誤日志觀察是否生效

master錯(cuò)誤日志

slave錯(cuò)誤日志

mysql優(yōu)化:

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

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

3.對(duì)數(shù)據(jù)來(lái)說(shuō),竟可能使用索引

4.對(duì)請(qǐng)求而言,可以實(shí)現(xiàn)讀寫分離,對(duì)讀請(qǐng)求負(fù)載均衡

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

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

分庫(kù)分表

總結(jié)

以上是生活随笔為你收集整理的Mysql 主从复制实战(学习笔记十三)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。