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