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ù)垫卤,要求版本一致
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、測試
5嗦嗡、若要繼續(xù)添加新salve勋锤,實現(xiàn)一主多從
假如master?已經(jīng)運行很久了,想對新安裝的slave 進(jìn)行數(shù)據(jù)同步侥祭,甚至它沒有master 的數(shù)據(jù)叁执。
① 進(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;
① vim /etc/my.cnf 修改主配置文件,設(shè)為從
mysql -uroot -p < mysql-all-backup-2017-11-20-22\:04\:06.sql
systemctl start mariadb 開啟服務(wù)
恢復(fù)完后卑硫,數(shù)據(jù)直接與主完全一致
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)閉兩個線程
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ù)庫中繼日志
① 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)限带斑。
在Master的數(shù)據(jù)庫執(zhí)行show master status,查看主服務(wù)器二進(jìn)制日志狀態(tài)勋拟,位置號
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)存里
可使用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線程正常運行
在主上創(chuàng)建一個along习勤、home庫;從上自動生成along焙格、home數(shù)據(jù)庫
① 在主上:在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));
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));
雙主
應(yīng)用:只適合小型公司枕磁,小并發(fā)訪問量,畢竟同時寫入易出錯
機器名稱IP配置服務(wù)角色備注
mysql1192.168.30.107數(shù)據(jù)庫中繼日志计济、二進(jìn)制日志
mysql2192.168.30.7數(shù)據(jù)庫中繼日志、二進(jìn)制日志
2排苍、配置總配置文件沦寂,除了ID號和起始數(shù),兩邊都是一樣的
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開始
(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ù)制線程
在mysql1上侈离,刪除test數(shù)據(jù)庫;mysql2 上也自動刪除
在mysql2上筝蚕,創(chuàng)建xiaohei數(shù)據(jù)庫卦碾;mysql2 上也自動生成
MariaDB [along]> create table home (id int PRIMARY KEY AUTO_INCREMENT,name varchar(20));
MariaDB [along]> insert into home(name) value('mayun'),('mahuateng'),('wangjianlin');
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)的方案呢?
1凝颇、向上拓展 scale up:針對單臺服務(wù)器,提高服務(wù)器的硬件性能疹鳄,比如:內(nèi)存拧略,cpu等,個體本身 容易達(dá)到極限
2瘪弓、向外拓展 scale out:多臺服務(wù)器形成集群垫蛆,共同完成一件事情
企業(yè)級數(shù)據(jù)庫高可用架構(gòu)圖
(1) 數(shù)據(jù)分布 (Data distribution )
(4) 高可用性和容錯性 High availabilityand failover
(1) 主服務(wù)器(master)將改變記錄到二進(jìn)制日志(binarylog)中(這些記錄叫做二進(jìn)制日志事件奈揍,binary log events)
(2) 從服務(wù)器(slave)將主服務(wù)器master的binary logevents拷貝到它的中繼日志(relay log)
(3) slave重做中繼日志中的事件,將改變反映它自己的數(shù)據(jù)赋续。
Mysql實現(xiàn)企業(yè)級數(shù)據(jù)庫主從復(fù)制架構(gòu)實戰(zhàn)
1捆昏、iptables -F && setenforce 清空防火墻策略,關(guān)閉selinux
2毙沾、拿兩臺服務(wù)器都使用yum方式安裝Mysql服務(wù)骗卜,要求版本一致
3、分別啟動兩臺服務(wù)器mysql服務(wù)左胞,確保服務(wù)正常
對master進(jìn)行配置烤宙,包括打開二進(jìn)制日志遍烦,指定唯一的servr ID。例如躺枕,在配置文件加入如下值
server-id=1#配置server-id服猪,讓主服務(wù)器有唯一ID號(讓從服務(wù)器知道他的主服務(wù)器是誰)
log-bin=mysql-bin#打開Mysql日志,日志格式為二進(jìn)制
skip-name-resolve#關(guān)閉名稱解析拐云,(非必須)
在Master的數(shù)據(jù)庫中建立一個備份帳戶:每個slave使用標(biāo)準(zhǔn)的MySQL用戶名和密碼連接master
罢猪。進(jìn)行復(fù)制操作的用戶會授予REPLICATION SLAVE權(quán)限。(給從服務(wù)器授權(quán)叉瘩,讓他能從主服務(wù)器拷貝二進(jìn)制日志)
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO slave@'192.168.10.%' IDENTIFIED BY 'magedu';
在Master的數(shù)據(jù)庫執(zhí)行show master status膳帕,查看主服務(wù)器二進(jìn)制日志狀態(tài)
對slave進(jìn)行配置薇缅,打開中繼日志备闲,指定唯一的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)制日志中
讓slave連接master蓬痒,并開始重做master二進(jìn)制日志中的事件。
CHANGE MASTER TO MASTER_HOST='192.168.10.190',
MASTER_LOG_FILE='mysql-bin.000001',
執(zhí)行start slave漆羔;# 啟動復(fù)制線程梧奢。
可使用SHOW SLAVE STATUS\G查看從服務(wù)器狀態(tài)演痒,如下所示亲轨,也可用show processlist \G查看前復(fù)制狀態(tài):
Slave_IO_Running: Yes #IO線程正常運行
Slave_SQL_Running: Yes #SQL線程正常運行
理想的結(jié)果是在主服務(wù)器上添加的數(shù)據(jù),在從服務(wù)器上也會同步
假如master已經(jīng)運行很久了惦蚊,想對新安裝的slave進(jìn)行數(shù)據(jù)同步器虾,甚至它沒有master的數(shù)據(jù)。
(1)master的某個時刻的數(shù)據(jù)快照库正;
也可以搭建主從從架構(gòu)厘唾,讓從服務(wù)器之間進(jìn)行復(fù)制
僅復(fù)制有限一個或幾個數(shù)據(jù)庫相關(guān)的數(shù)據(jù)讯柔,而非所有抡蛙;由復(fù)制過濾器進(jìn)行;
主服務(wù)器僅向二進(jìn)制日志中記錄有關(guān)特定數(shù)據(jù)庫相關(guān)的寫操作魂迄;
從服務(wù)器的SQL THREAD僅重放關(guān)注的數(shù)據(jù)庫或表相關(guān)的事件粗截,并將其應(yīng)用于本地;
(1) 不同的slave扮演不同的作用(例如使用不同的索引祖屏,或者不同的存儲引擎)助赞;
(2) 用一個slave作為備用master,只進(jìn)行復(fù)制赐劣;#主服務(wù)器掛了之后嫉拐,可在從服務(wù)器執(zhí)行
1> 在備機上執(zhí)行STOP SLAVE 和RESET MASTER
(3) 用一個遠(yuǎn)程的slave魁兼,用于災(zāi)難恢復(fù)婉徘;
二、互為主從Master-Master(Master-Master in Active-Active Mode)
即:在兩臺服務(wù)器上既執(zhí)行master的操作又執(zhí)行slave的操作(注意:兩臺數(shù)據(jù)庫都必須是可寫的)
互為主從:兩個節(jié)點各自都要開啟binlog和relay log植阴;
對于某些唯一性的字段喷鸽,可以通過設(shè)置自增長ID來實現(xiàn),自增長ID的數(shù)據(jù)众雷,代表這個表中存在一條唯一的記錄;而自增長id是肯定不會重復(fù)的做祝;
create table userInfo (id int PRIMARY KEY AUTO_INCREMENT,name varchar(50) NOT NULL);
insert into userInfo(name) value('xiao'),('da'),('lao');
auto_increment_increment=2#表示自增長字段每次遞增的量
auto_increment_offset=1#表示自增長字段從那個數(shù)開始
2、均啟用binlog和relay log声登; read only = 0(因為互為主從狠鸳,所以必須是可寫的)
3、存在自動增長id的表捌刮,為了使得id不相沖突,需要定義其自動增長方式舒岸;
4绅作、都授權(quán)有復(fù)制權(quán)限的用戶賬號;
修改完配置文件后个少,重啟數(shù)據(jù)庫服務(wù)
分別在兩臺數(shù)據(jù)庫服務(wù)器上創(chuàng)建復(fù)制賬號
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO slave@'192.168.10.%' IDENTIFIED BY 'magedu';
讓slave連接master,并開始重做master二進(jìn)制日志中的事件眯杏。
CHANGE MASTER TO MASTER_HOST='192.168.10.190',
MASTER_LOG_FILE='mysql-bin.000001',
執(zhí)行start slave夜焦;# 啟動復(fù)制線程。
可使用SHOW SLAVE STATUS\G查看從服務(wù)器狀態(tài)茫经,如下所示,也可用show processlist \G查看前復(fù)制態(tài):
Slave_IO_Running: Yes #IO線程正常運行
Slave_SQL_Running: Yes #SQL線程正常運行
兩臺數(shù)據(jù)庫服務(wù)器都顯示如上結(jié)果就ok萎津。
5.創(chuàng)建表卸伞,設(shè)置ID為自增長,兩邊插入數(shù)據(jù)看數(shù)據(jù)增長
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
注意:mysql的錯誤日志非常重要晶衷,可以提供錯誤信息蓝纲,從而找到錯誤原因。
互為主從容易導(dǎo)致數(shù)據(jù)不一致晌纫,此時我們可以用兩個實例來互為主從
異步復(fù)制(Asynchronous replication)
全同步復(fù)制(Fully synchronous replication)
半同步復(fù)制(Semisynchronous replication)
支持多種插件:/usr/lib64/mysql/plugins/
mysql> INSTALL PLUGIN plugin_name SONAME 'shared_library_name';
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
MariaDB [mydb]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';
+------------------------------------+-------+
+------------------------------------+-------+
| 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;
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
MariaDB [mydb]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';
+---------------------------------+-------+
+---------------------------------+-------+
| 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;
1.可以用數(shù)據(jù)緩存骆膝,常見的memcache
2.數(shù)據(jù)庫本身有很多緩存機制,可使用對應(yīng)的緩存策略
4.對請求而言阅签,可以實現(xiàn)讀寫分離,對讀請求負(fù)載均衡
5.對大數(shù)據(jù)庫或者表蝎抽,可根據(jù)業(yè)務(wù)邏輯進(jìn)行分庫分表