欧美亚洲中文,在线国自产视频,欧洲一区在线观看视频,亚洲综合中文字幕在线观看

      1. <dfn id="rfwes"></dfn>
          <object id="rfwes"></object>
        1. 站長(zhǎng)資訊網(wǎng)
          最全最豐富的資訊網(wǎng)站

          完全掌握MySQL復(fù)制架構(gòu)

          本篇文章給大家?guī)?lái)了關(guān)于mysql的相關(guān)知識(shí),其中主要介紹了關(guān)于復(fù)制架構(gòu)的相關(guān)問(wèn)題,包括了主從復(fù)制架構(gòu)、聯(lián)級(jí)復(fù)制架構(gòu)、多主從復(fù)制架構(gòu)的搭建等等,希望對(duì)大家有幫助。

          完全掌握MySQL復(fù)制架構(gòu)

          推薦學(xué)習(xí):mysql視頻教程

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

          在實(shí)際應(yīng)用場(chǎng)景中,MySQL復(fù)制90%以上都是一個(gè)Master復(fù)制到一個(gè)或者多個(gè)Slave的架構(gòu)模式。

          在主庫(kù)讀取請(qǐng)求壓力非常大的場(chǎng)景下,可以通過(guò)配置一主多從復(fù)制架構(gòu)實(shí)現(xiàn)讀寫分離,把大量的對(duì)實(shí)時(shí)性要求不是特別高的讀請(qǐng)求通過(guò)負(fù)載均衡分部到多個(gè)從庫(kù)上(對(duì)于實(shí)時(shí)性要求很高的讀請(qǐng)求可以讓從主庫(kù)去讀),降低主庫(kù)的讀取壓力,如下圖所示。

          完全掌握MySQL復(fù)制架構(gòu)

          缺點(diǎn):

          • master不能停機(jī),停機(jī)就不能接收寫請(qǐng)求
          • slave過(guò)多會(huì)出現(xiàn)延遲

          由于master需要進(jìn)行常規(guī)維護(hù)停機(jī)了,那么必須要把一個(gè)slave提成master,選哪一個(gè)是一個(gè)問(wèn)題?

          某一個(gè)slave提成master了,就存在當(dāng)前master和之前的master數(shù)據(jù)不一致的情況,并且之前master并沒(méi)有保存當(dāng)前master節(jié)點(diǎn)的binlog文件和pos位置。

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

          多主復(fù)制架構(gòu)解決了一主多從復(fù)制架構(gòu)中master的單點(diǎn)故障問(wèn)題。

          完全掌握MySQL復(fù)制架構(gòu)

          可以配合一個(gè)第三方的工具,比如keepalived輕松做到IP的漂移,這樣master停機(jī)維護(hù)也不會(huì)影響寫操作。

          級(jí)聯(lián)復(fù)制架構(gòu)

          一主多從中如果slave過(guò)多,會(huì)導(dǎo)致主庫(kù)的I/O壓力和網(wǎng)絡(luò)壓力會(huì)隨著從庫(kù)的增加而增長(zhǎng),因?yàn)槊總€(gè)從庫(kù)都會(huì)在主庫(kù)上有一個(gè)獨(dú)立的BINLOG Dump線程來(lái)發(fā)送事件,而級(jí)聯(lián)復(fù)制架構(gòu)解決了一主多從場(chǎng)景下的,主庫(kù)額外的I/O和網(wǎng)絡(luò)壓力。

          如下圖所示。

          完全掌握MySQL復(fù)制架構(gòu)

          對(duì)比一主多從的架構(gòu),級(jí)聯(lián)復(fù)制僅僅是從主庫(kù)Master復(fù)制到少量的從庫(kù),其他從庫(kù)再?gòu)倪@少量的從庫(kù)中復(fù)制數(shù)據(jù),這樣就減輕了主庫(kù)Master的壓力。

          當(dāng)然也有缺點(diǎn):MySQL的傳統(tǒng)復(fù)制是異步的,級(jí)聯(lián)復(fù)制場(chǎng)景下主庫(kù)的數(shù)據(jù)是經(jīng)歷兩次復(fù)制才到達(dá)其他從庫(kù)中,期間的延遲要比一主多從復(fù)制場(chǎng)景下只經(jīng)歷一次復(fù)制的還大。

          可以通過(guò)在二級(jí)slave上選擇表引擎為BLACKHOLE來(lái)降低級(jí)聯(lián)復(fù)制的延遲。顧名思義,BLACKHOLE引擎是一個(gè)“黑洞”引擎,寫入BLACKHOLE表的數(shù)據(jù)并不會(huì)寫會(huì)到磁盤上,BLACKHOLE表永遠(yuǎn)都是空表,INSERT、UPDATE、DELETE操作僅僅在BINLOG中記錄事件。

          下面演示下BLACKHOLE引擎:

          mysql> CREATE TABLE `user` (     -> `id` int NOT NULL AUTO_INCREMENT PRIMARY KEY,     -> `name` varchar(255) NOT NULL DEFAULT '',     -> `age` tinyint unsigned NOT NULL DEFAULT 0     -> )ENGINE=BLACKHOLE charset=utf8mb4;Query OK, 0 rows affected (0.00 sec)mysql> INSERT INTO `user` (`name`,`age`) values("itbsl", "26");Query OK, 1 row affected (0.00 sec)mysql> select * from user;Empty set (0.00 sec)

          可以看到,存儲(chǔ)引擎為BLACKHOLE的user表里沒(méi)有數(shù)據(jù)。

          多主與級(jí)聯(lián)復(fù)制結(jié)合架構(gòu)

          結(jié)合多主與級(jí)聯(lián)復(fù)制架構(gòu),這樣解決了單點(diǎn)master的問(wèn)題,解決了slave級(jí)聯(lián)延遲的問(wèn)題。

          完全掌握MySQL復(fù)制架構(gòu)

          多主復(fù)制架構(gòu)的搭建

          主機(jī)規(guī)劃:

          • master1:docker,端口3314
          • master2:docker,端口3315

          master1的配置

          配置文件my.cnf:

          $ cat /home/mysql/docker-data/3315/conf/my.cnf [mysqld] character_set_server=utf8 init_connect='SET NAMES utf8'  symbolic-links=0  lower_case_table_names=1 server-id=1403314 log-bin=mysql-bin binlog-format=ROW auto_increment_increment=2 # 幾個(gè)主庫(kù),這里就配幾 auto_increment_offset=1 # 每個(gè)主庫(kù)的偏移量需要不一致 gtid_mode=ON enforce-gtid-consistency=true binlog-do-db=order      # 要同步的數(shù)據(jù)庫(kù)

          啟動(dòng)docker:

          $ docker run --name mysql3314 -p 3314:3306 --privileged=true -ti -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=order -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -v /home/mysql/docker-data/3314/conf:/etc/mysql/conf.d -v /home/mysql/docker-data/3314/data/:/var/lib/mysql -v /home/mysql/docker-data/3314/logs/:/var/log/mysql -d mysql:5.7

          添加用于復(fù)制的用戶并授權(quán):

          mysql> GRANT REPLICATION SLAVE,FILE,REPLICATION CLIENT ON *.* TO 'repluser'@'%' IDENTIFIED BY '123456'; Query OK, 0 rows affected, 1 warning (0.01 sec)  mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.01 sec)

          開啟同步master1(這里的user來(lái)自master2):

          mysql> change master to master_host='172.23.252.98',master_port=3315,master_user='repluser',master_password='123456',master_auto_position=1; Query OK, 0 rows affected, 2 warnings (0.03 sec)  mysql> start slave; Query OK, 0 rows affected (0.00 sec)

          master2的配置

          master2的配置與master1類似。

          主要區(qū)別在于my.cnf中有一個(gè)屬性需要不一致:

          auto_increment_offset=2 # 每個(gè)主庫(kù)的偏移量需要不一致

          測(cè)試:

          在master2創(chuàng)建表,并添加數(shù)據(jù):

          mysql> create table t_order(id int primary key auto_increment, name varchar(20)); Query OK, 0 rows affected (0.01 sec)  mysql> insert into t_order(name) values("A"); Query OK, 1 row affected (0.01 sec)  mysql> insert into t_order(name) values("B"); Query OK, 1 row affected (0.00 sec)  mysql> select * from t_order; +----+------+ | id | name | +----+------+ |  2 | A    | |  4 | B    | +----+------+ 2 rows in set (0.00 sec)

          可以發(fā)現(xiàn)master2中id的步長(zhǎng)為2,且從2開始自增。

          然后在master1查詢數(shù)據(jù),并添加:

          mysql> select * from t_order; +----+------+ | id | name | +----+------+ |  2 | A    | |  4 | B    | +----+------+ 2 rows in set (0.00 sec)  mysql> insert into t_order(name) values("E"); Query OK, 1 row affected (0.00 sec)  mysql> select * from t_order; +----+------+ | id | name | +----+------+ |  2 | A    | |  4 | B    | |  5 | E    | +----+------+ 3 rows in set (0.00 sec)

          可以發(fā)現(xiàn)master1中id的步長(zhǎng)為2,且從1開始自增,再去master2中查詢能發(fā)現(xiàn)id為5的數(shù)據(jù),說(shuō)明主主復(fù)制配置沒(méi)有問(wèn)題。

          為什么兩個(gè)主中id自增的偏移量要不一致呢?當(dāng)兩個(gè)主同時(shí)接受到插入請(qǐng)求時(shí)就能保證id不沖突,其實(shí)這樣只能保證插入數(shù)據(jù)不沖突,無(wú)法保證刪除和修改導(dǎo)致的數(shù)據(jù)不一致。

          所以在實(shí)際的應(yīng)用場(chǎng)景中,只能暴露一個(gè)主給客戶端才能保證數(shù)據(jù)的一致性。

          MySQL高可用的搭建

          完全掌握MySQL復(fù)制架構(gòu)

          這里借助keepalived來(lái)對(duì)上面的多主復(fù)制架構(gòu)改造來(lái)實(shí)現(xiàn)MySQL的高可用。

          keepalived的安裝:

          $ sudo apt-get install -y keepalived

          keepalived.conf

          $ cat /etc/keepalived/keepalived3314.conf! Configuration File for keepalived#簡(jiǎn)單的頭部,這里主要可以做郵件通知報(bào)警等的設(shè)置,此處就暫不配置了;global_defs {         #notificationd LVS_DEVEL}#預(yù)先定義一個(gè)腳本,方便后面調(diào)用,也可以定義多個(gè),方便選擇;vrrp_script chk_haproxy {     script "/etc/keepalived/chkmysql.sh"  #具體腳本路徑     interval 2  #腳本循環(huán)運(yùn)行間隔}#VRRP虛擬路由冗余協(xié)議配置vrrp_instance VI_1 {   #VI_1 是自定義的名稱;     state BACKUP    #MASTER表示是一臺(tái)主設(shè)備,BACKUP表示為備用設(shè)備【我們這里因?yàn)樵O(shè)置為開啟不搶占,所以都設(shè)置為備用】     nopreempt      #開啟不搶占     interface eth0   #指定VIP需要綁定的物理網(wǎng)卡     virtual_router_id 11   #VRID虛擬路由標(biāo)識(shí),也叫做分組名稱,該組內(nèi)的設(shè)備需要相同     priority 130   #定義這臺(tái)設(shè)備的優(yōu)先級(jí) 1-254;開啟了不搶占,所以此處優(yōu)先級(jí)必須高于另一臺(tái)      advert_int 1   #生存檢測(cè)時(shí)的組播信息發(fā)送間隔,組內(nèi)一致     authentication {    #設(shè)置驗(yàn)證信息,組內(nèi)一致         auth_type PASS   #有PASS 和 AH 兩種,常用 PASS         auth_pass asd    #密碼     }     virtual_ipaddress {         172.23.252.200    #指定VIP地址,組內(nèi)一致,可以設(shè)置多個(gè)IP     }     track_script {    #使用在這個(gè)域中使用預(yù)先定義的腳本,上面定義的         chk_haproxy    }      #notify_backup "/etc/init.d/haproxy restart"   #表示當(dāng)切換到backup狀態(tài)時(shí),要執(zhí)行的腳本     #notify_fault "/etc/init.d/haproxy stop"     #故障時(shí)執(zhí)行的腳本}

          /etc/keepalived/chkmysql.sh

          $ cat /etc/keepalived/chkmysql.s.sh#!/bin/bashmysql -uroot -proot -P 3314 -e "show status;" > /dev/null 2>&1if [ $? == 0 ];then         echo "$host mysql login successfully"         exit 0else         echo "$host login failed"         killall keepalived        exit 2fi

          推薦學(xué)習(xí):mysql視頻教程

          贊(0)
          分享到: 更多 (0)
          網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)