国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 數(shù)據(jù)庫(kù) > MySQL > 正文

怎么掌握MySQL復(fù)制架構(gòu)

2024-07-24 12:33:13
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
  本文小編為大家詳細(xì)介紹“怎么掌握MySQL復(fù)制架構(gòu)”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“怎么掌握MySQL復(fù)制架構(gòu)”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。
 
  一主多從復(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)讀寫(xiě)分離,把大量的對(duì)實(shí)時(shí)性要求不是特別高的讀請(qǐng)求通過(guò)負(fù)載均衡分部到多個(gè)從庫(kù)上(對(duì)于實(shí)時(shí)性要求很高的讀請(qǐng)求可以讓從主庫(kù)去讀),降低主庫(kù)的讀取壓力,如下圖所示。
 
  缺點(diǎn):
 
  master不能停機(jī),停機(jī)就不能接收寫(xiě)請(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ì)影響寫(xiě)操作。
 
  級(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線(xiàn)程來(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è)“黑洞”引擎,寫(xiě)入BLACKHOLE表的數(shù)據(jù)并不會(huì)寫(xiě)會(huì)到磁盤(pán)上,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)題。
 
  多主復(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ù)制的用戶(hù)并授權(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)
  開(kāi)啟同步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類(lèi)似。
 
  主要區(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開(kāi)始自增。
 
  然后在master1查詢(xún)數(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開(kāi)始自增,再去master2中查詢(xún)能發(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è)主給客戶(hù)端才能保證數(shù)據(jù)的一致性。
 
  MySQL高可用的搭建

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

(編輯:武林網(wǎng))

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 兴城市| 文成县| 吉林省| 宁远县| 河津市| 长沙县| 那坡县| 马关县| 威宁| 突泉县| 柘荣县| 万荣县| 托克托县| 万全县| 德钦县| 徐闻县| 和平区| 蓬安县| 平武县| 志丹县| 新和县| 孙吴县| 陇南市| 昌吉市| 梅州市| 平乐县| 哈密市| 亚东县| 卢氏县| 公主岭市| 灵武市| 阿拉尔市| 英超| 罗源县| 彭山县| 临桂县| 安化县| 斗六市| 湛江市| 沙坪坝区| 吴桥县|