不懂編程如何做網(wǎng)站萬(wàn)能推廣app
當(dāng)一臺(tái)數(shù)據(jù)庫(kù)服務(wù)器出現(xiàn)負(fù)載的情況下,需要擴(kuò)展服務(wù)器服務(wù)器性能擴(kuò)展方式有向上擴(kuò)展,垂直擴(kuò)展。向外擴(kuò)展,橫向擴(kuò)展。通俗的講垂直擴(kuò)展是將一臺(tái)服務(wù)器擴(kuò)展為性能更強(qiáng)的服務(wù)器。橫向擴(kuò)展是增加幾臺(tái)服務(wù)器。
主從復(fù)制好比存了1000塊錢(qián)在主上,在從上查不到,主從復(fù)制就是主和從數(shù)據(jù)一致。
復(fù)制的功能:負(fù)載均衡讀操作,備份,高可用和故障切換,數(shù)據(jù)分布,MySQL升級(jí)。
一、主從復(fù)制架構(gòu)和原理
1.1 mysql主從復(fù)制
讀寫(xiě)分離
復(fù)制:每個(gè)節(jié)點(diǎn)都有相同的數(shù)據(jù)集,向外擴(kuò)展,基于二進(jìn)制日志的單向復(fù)制
1.2 復(fù)制的功能
負(fù)載均衡讀操作
備份
高可用和故障切換
數(shù)據(jù)分布
MySQL升級(jí)
1.3復(fù)制結(jié)構(gòu)和主從復(fù)制原理
一主一從,和一主多從。
主從復(fù)制的相關(guān)程序。
1.3.1 兩個(gè)日志三個(gè)線程:
日志:二進(jìn)制日志,中繼日志(主上的二進(jìn)制日志)
線程:dump線程,io線程,sql線程
主服務(wù)器:mysqldump線程,傳輸二進(jìn)制日志給從
從服務(wù)器:io線程:接收主的二進(jìn)制日志,寫(xiě)入中繼日志;sql線程:讀取中繼日志,寫(xiě)入數(shù)據(jù)庫(kù)。
1.3.2 原理:
1.主節(jié)點(diǎn)負(fù)責(zé)用戶的寫(xiě)操作,用戶發(fā)起寫(xiě)操作,會(huì)修改數(shù)據(jù)庫(kù)
2.數(shù)據(jù)庫(kù)修改后,會(huì)更新主節(jié)點(diǎn)上的二進(jìn)制日志
3.主服務(wù)器會(huì)產(chǎn)生一個(gè)dump線程,一邊讀取二進(jìn)制日志一邊將二進(jìn)制日志通過(guò)網(wǎng)絡(luò)傳給從服務(wù)器
4.從服務(wù)器會(huì)開(kāi)啟io線程,接收主服務(wù)器的二進(jìn)制日志
5.io線程會(huì)將主服務(wù)器的二進(jìn)制日志寫(xiě)入中繼日志,這時(shí)只是生成了一個(gè)文件,并沒(méi)有同步
6.從服務(wù)器再開(kāi)啟sql線程將中繼日志中操作寫(xiě)入數(shù)據(jù)庫(kù)完成更新
主從數(shù)據(jù)就保持一致了!
主從復(fù)制相關(guān)線程:
dump Thread:為每個(gè)slave的I/O Thread啟動(dòng)一個(gè)dump線程,用于向其發(fā)送binary log events從節(jié)點(diǎn)
I/O?Thread:向master請(qǐng)求二進(jìn)制日志事件,并保存于中繼日志中
SQL Thread:從中繼日志中讀取日志事件,在本地完成同步操作。
主數(shù)據(jù)更新 -> 寫(xiě)入bin log -> slave服務(wù)器線程 -> io Thread -> 寫(xiě)入Relay Log -> SQL Thread -> 從數(shù)據(jù)庫(kù)更新。這樣就主從一致了。
yum安裝數(shù)據(jù)庫(kù):
二、主從復(fù)制
2.1 主-從復(fù)制
Node3作為主192.168.114.30,Node4作為從192.168.114.40
2.2 主節(jié)點(diǎn)配置:
(1)啟用二進(jìn)制日志
主節(jié)點(diǎn)配置:啟用二進(jìn)制日志
(2)為當(dāng)前節(jié)點(diǎn)設(shè)置一個(gè)全局唯一的ID號(hào)
[mysqld]
server-id=? ? ? ? ? ? ? ? ? ? ? ? #區(qū)分自己的日志和別人的日志
log-basename=master? ? ? ? #可選項(xiàng),設(shè)置datadir中日志名稱,確保不依賴主機(jī)名
(3)查看從二進(jìn)制日志的文件和位置開(kāi)始進(jìn)行復(fù)制
show master status;
(4)創(chuàng)建有復(fù)制權(quán)限的用戶賬號(hào)
grant replication slave on *.* 'repluser'@'HOST' identified by 'repluser';
2.3 從節(jié)點(diǎn)配置:
(1)啟動(dòng)中繼日志
[mysqld]
server-id=
log-bin=
(2) 使用有復(fù)制權(quán)限的用戶賬號(hào)連接至主服務(wù)器,并啟用復(fù)制線程
mysql> CHANGE MASTER TO
?MASTER_HOST='192.168.114.10',
?MASTER_USER='test',
?MASTER_PASSWORD='ABC123',
?MASTER_PORT=3306,
?MASTER_LOG_FILE='mysql-bin.000002',
?MASTER_LOG_POS=448;show slave status;
2.4 實(shí)際操作:一主一從
Node3作為主:
在文件最后添加兩條配置。
[root@Node3 ~]#:vim /etc/my.cnf
......
server-id=30
log-bin=/data/mysql/mysql-bin
建立目錄并修改權(quán)限:
[root@Node3 ~]#:mkdir -p /data/mysql
[root@Node3 ~]#:chown -R mysql.mysql /data
重啟數(shù)據(jù)庫(kù):
systemctl restart mysqld
登錄并新建同步用戶:
mysql -uroot -pabc123
master狀態(tài),查看同步文件和同步位置:763
Node4作為從:
[root@Node4 ~]#:vim /etc/my.cnf
......
server-id=40
log-bin=/data/mysql/mysql-bin
建立目錄:
[root@Node4 ~]#:mkdir /data/mysql -p
[root@Node4 ~]#:chown -R mysql.mysql /data
重啟:systemctl start mysqld
主上查看節(jié)點(diǎn):449
主上查看二進(jìn)制文件,我們指定了在/data/mysql/下:
[root@Node3 ~]#:ls /data/mysql/
mysql-bin.000001 ?mysql-bin.000002 ?mysql-bin.index
這個(gè)是最新的。
登錄數(shù)據(jù)庫(kù)添加主的信息,有模版,注意修改:
help change master to;
mysql> help change master to;
......
CHANGE MASTER TOMASTER_HOST='source2.example.com',MASTER_USER='replication',MASTER_PASSWORD='password',MASTER_PORT=3306,MASTER_LOG_FILE='source2-bin.001',MASTER_LOG_POS=4,MASTER_CONNECT_RETRY=10;
#這里是模版,要根據(jù)自己環(huán)境修改
開(kāi)啟IO線程以及SQL線程:start slave;
?查看從服務(wù)器的狀態(tài):都是yes就是正常狀態(tài)。如果有錯(cuò)就清空主從配置:reset slave all;
這里還有個(gè)狀態(tài):Seconds_Behind_Master: 0? ?代表與主服務(wù)器的信息差,0代表同步
2.5 驗(yàn)證
先看從上的數(shù)據(jù)庫(kù):
在主上創(chuàng)建一個(gè)數(shù)據(jù)庫(kù),看從上是否也有這個(gè)數(shù)據(jù)庫(kù):
mysql> create database test;
Query OK, 1 row affected (0.00 sec)
在從上查看:
也有了test數(shù)據(jù)庫(kù)。實(shí)現(xiàn)主從復(fù)制!
可以看到主從建立了連接
三、案例:(主從復(fù)制+完備)
假設(shè)主節(jié)點(diǎn)的數(shù)據(jù)庫(kù)已經(jīng)運(yùn)行了一段時(shí)間,產(chǎn)生了一定量的數(shù)據(jù),主從復(fù)制只能復(fù)制開(kāi)啟后數(shù)據(jù),那之前的數(shù)據(jù)如何處理?
把之前的那些數(shù)據(jù)做好完全備份。之后的數(shù)據(jù)通過(guò)主從復(fù)制實(shí)現(xiàn)備份。再結(jié)合在一起。(快照,重新還原到mysql)
安裝好數(shù)據(jù)庫(kù)之后,把一個(gè)數(shù)據(jù)庫(kù)文件拖進(jìn)來(lái)/data/下。把數(shù)據(jù)庫(kù)hellodb_innodb.sql文件導(dǎo)進(jìn)數(shù)據(jù)庫(kù)中。
?進(jìn)入數(shù)據(jù)庫(kù)查看:
開(kāi)啟二進(jìn)制日志:
[root@Node3 ~]#:vim /etc/my.cnf
......
server-id=30
log-bin=/data/mysql/log/mysql-bin
建立路徑:
[root@Node3 ~]#:mkdir /data/mysql/log -p
[root@Node3 ~]#:chown -R mysql.mysql /data
[root@Node3 ~]#:systemctl restart mysqld
?完全備份:-A是把所有的數(shù)據(jù)庫(kù)都備份在/data/下取名為all.sql。-F備份前滾動(dòng)日志,鎖定表完成后,執(zhí)行flush logs命令,生成新的二進(jìn)制日志文件。
mysqldump -uroot -pabc123 -A -F --master-data=1 --single-transaction > /data/all.sql
創(chuàng)建個(gè)登錄用戶,并授權(quán):
由于之前在備份的時(shí)候加入了--master-data=1選項(xiàng),就添加了主從復(fù)制的選項(xiàng)000002文件的619位置往后開(kāi)始主從復(fù)制
000002文件619位置之前的配置由備份文件自行實(shí)現(xiàn)
接下來(lái)把備份的文件遠(yuǎn)程拷貝到Node4主機(jī)上:
scp /data/all.sql 192.168.114.40:/opt
從Node4上:
開(kāi)啟二進(jìn)制日志:
[root@Node4 ~]#:vim /etc/my.cnf
......
server-id=40
log-bin=/data/mysql/log/mysql-bin
建立路徑并重啟數(shù)據(jù)庫(kù):
[root@Node4 ~]#:mkdir /data/mysql/log/ -p
[root@Node4 ~]#:chown -R mysql.mysql /data
[root@Node4 ~]#:systemctl restart mysqld
這時(shí)先看一下數(shù)據(jù)庫(kù):是沒(méi)有hellodb數(shù)據(jù)庫(kù)的。
修改備份腳本:
vim /opt/all.sql
找到CHANGE MASTER TO這一行,做以下修改:
進(jìn)入數(shù)據(jù)庫(kù):把/opt/all.sql備份文件導(dǎo)入進(jìn)來(lái):source /opt/all.sql
開(kāi)啟從。查看從節(jié)點(diǎn)的狀態(tài)
再次查看數(shù)據(jù)庫(kù):
模擬故障:
我們?cè)趶纳辖o數(shù)據(jù)庫(kù)中的表teachers插入一條數(shù)據(jù):那么是第5條數(shù)據(jù)了
在主上也插入同樣的數(shù)據(jù):
按說(shuō)這一條應(yīng)該是第6條數(shù)據(jù)。
在從上查看節(jié)點(diǎn)狀態(tài):發(fā)現(xiàn)主從復(fù)制就失敗了。出現(xiàn)了一個(gè)錯(cuò)誤!
這時(shí)在主上再插入一條數(shù)據(jù):
這里的err按說(shuō)是第6條數(shù)據(jù),lisi是第7條數(shù)據(jù)。
由于前面的錯(cuò)誤,導(dǎo)致在從上就不會(huì)再顯示了,提示主鍵重復(fù),整個(gè)都down掉了。需要解決故障問(wèn)題。先看一下從上的表數(shù)據(jù):
通過(guò)show slave status\G;查看,顯示主鍵重復(fù)!
重啟一下,就是兩個(gè)yes了:start slave;
在主上插入一條數(shù)據(jù):
mysql> insert into teachers values(null,'lisi2',20,'M');
Query OK, 1 row affected (0.00 sec)
查看主上的數(shù)據(jù):
在從上查看是否有l(wèi)isi2:
mysql> select * from teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 93 | F |
| 5 | err | 24 | F |
| 6 | lisi | 21 | M |
| 7 | lisi2 | 20 | M |
+-----+---------------+-----+--------+
同步了!
四、級(jí)聯(lián)
級(jí)聯(lián)與一主一從一樣,就在從后面再加一臺(tái)服務(wù)器。作為從
主1--主2--從1
主2上要做的操作:在/etc/my.cnf中最下面添加一個(gè):
[root@Node2 ~]#:vim /etc/my.cnf
......
log_slave_updates? ? #級(jí)聯(lián)操作必須加
由于中間的服務(wù)器是前面的從也是后面的主,對(duì)于后面來(lái)說(shuō),中間的這個(gè)也需要建立一個(gè)用戶:
mysql> grant replication slave on *.* to test@'192.168.114.%' identified by 'Admin@123';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
這樣是為了給后面從服務(wù)器指定節(jié)點(diǎn)。
后面可以跟兩臺(tái)從服務(wù)器:
在/etc/my.cnf中只需要配置一個(gè)server-id即可:
7-3:7-2上:show master stauts;
CHANGE MASTER TOMASTER_HOST='192.168.114.20',MASTER_USER='test',MASTER_PASSWORD='Admin@123',MASTER_PORT=3306,MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=154;
start slave;
7-4:7-2上:show master stauts;
CHANGE MASTER TOMASTER_HOST='192.168.114.20',MASTER_USER='test',MASTER_PASSWORD='Admin@123',MASTER_PORT=3306,MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=449;
start slave;
驗(yàn)證:
在Node1主上創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)lxd;
在中間的從服務(wù)器(也是后面兩臺(tái)的主)也同步了Node1主的數(shù)據(jù):
Node1主創(chuàng)建數(shù)據(jù)庫(kù):
mysql> create database lxd;
Query OK, 1 row affected (0.00 sec)mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| lxd |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
Node2從:(也是后面兩臺(tái)的主)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| lxd |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
實(shí)現(xiàn)級(jí)聯(lián)同步!
---end---