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