目錄
#1.1MySQL主從復制原理
? 1.1.1MySQL支持的復制類型
? 1.1.2復制的工作過程
#2.1MySQL讀寫分離原理
? 2.1.1常見的MySQL讀寫分離為為兩種
#3.1主從復制+讀寫分離的實驗案例
1.1MySQL主從復制的原理
? ? ? ? MySQL 主從復制是一種常用的數據同步機制,用于將主數據庫(Master)的數據變更同步到一個或多個從數據庫(Slave),實現數據冗余、讀寫分離和高可用性。?
?1.1.1MySQL支持的復制類型
? ? 1.基于語句的復制:在主服務器上執行的SQL語句,在從服務器上執行同樣的語句,MySQL默認采用基于語句的復制,效率比較高。
? ? 2.基于行的復制:把改變的內容復制過去,而不是把命令在從服務器上執行一遍。
? ? 3.混合類型的復制:默認采用基于語句的復制,一旦發現基于語句無法精確復制時,就會采用基于行的復制。
?1.1.2復制的工作過程
? 1. 在每個事務更新數據完成之前,Master 將這些改變記錄進二進制日志。寫入二進制日志完成后,Master 通知存儲引擎提交事務。
? 2.? Slave 將 Master 的 Binary log 復制到其中繼日志(Relay log)。首先,Slave 開始一個工作線程 ——I/O 線程,I/O 線程在 Master 上打開一個普通的連接,然后開始 Binlog dump process。Binlog dump process 從 Master 的二進制日志中讀取事件,如果已經跟上 Master,它會睡眠并等待 Master 產生新的事件。I/O 線程將這些事件寫入中繼日志。
? ? 3. SQL slave thread(SQL 從線程)處理該過程的最后一步。SQL 線程從中繼日志讀取事件,并重放其中的事件而更新 Slave 數據,使其與 Master 中的數據保持一致。只要該線程與 I/O 線程保持一致,中繼日志通常會位于 OS 的緩存中,所以中繼日志的開銷很小。復制過程有一個很重要的限制,即復制在 Slave 上是串行化的,也就是說 Master 上的并行更新操作不能在 Slave 上并行操作。
2.1MySQL讀寫分離原理
??MySQL 讀寫分離是優化數據庫負載、提升系統性能與可用性的常用方案,核心圍繞?“分離讀寫壓力,利用主從復制保障數據一致”。
?2.1.1常見的MySQL讀寫分離分為兩種??
? ?(1)基于程序代碼內部實現
? ? ?在代碼中根據 select、insert 進行路由分類,這類方法也是目前生產環境應用最廣泛的。優點是性能較好,因為在程序代碼中實現,不需要增加額外的設備作為硬件開支;缺點是需要開發人員來實現,運維人員無從下手。
? ?(2)基于中間代理層實現
? ? ? 代理一般位于客戶端和服務器之間,代理服務器接到客戶端請求后通過判斷后轉發到后端數據庫,有兩個代表性程序。
3.1主從復制+讀寫分離的實驗案例
配置Master主服務器
1.vim /etc/my.cnf
log-bin=/usr/local/mysql/data/mysql-bin
binlog_format = MIXED
server-id=1
2.重啟MySQL服務
3.登錄MySQL程序,給從服務器授權
?配置Slave從服務器
? 1.slave1,slave2上的server-id不能一致,slave1為server-id=2,而slave2為server-id=3,在vim /etc/my.cnf中配置。
? 2.重啟mysqld服務
? 3.登錄mysqld,配置同步
? 4.驗證主從復制效果
?搭建MySQL讀寫分離
? 安裝Mycat2
? ?安裝并配置mycat軟件
? ?創建Mycat2工作所必須得賬號
? ?啟動Mycat2
? ?第一步:Mycat增加數據源
?查看數據源信息
? ?第二步:創建Mycat集群
? ?查看并修改集群配置
? ?修改負載均衡的默認策略為輪詢
? ?修改配置后需要重啟mycat?
? ?登錄mycat集群,創建測試庫和測試表
? 停止slave1和slave2的主從同步
? ??slave1:
[root@localhost ~]# mysql -uroot -p
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)
? ?slave2:
[root@localhost ~]# mysql -uroot -p
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)
? 在master和slave1,slave2創建測試數據
? ? ??Master 上操作:
mysql> use test;
Database changed
mysql> insert into test.zang values ('1','zhang','this_is_master');
Query OK, 1 row affected (0.01 sec)
? ? ?slave1上操作:
mysql> use test;
Database changed
mysql> insert into test.zang values ('2','zhang','this_is_slave1');
Query OK, 1 row affected (0.01 sec)
? ? ?slave2上操作:
mysql> use test;
Database changed
mysql> insert into test.zang values ('3','zhang','this_is_slave2');
Query OK, 1 row affected (0.01 sec)
? ?登錄mycat集群,查詢tets.zang的數據
[root@localhost ~]# mysql -uroot -p123456 -P8066 -h192.168.10.101
mysql> select * from test.zang;
+----+-------+----------------+
| id | name | address |
+----+-------+----------------+
| 2 | zhang | this_is_slave1 |
+----+-------+----------------+
1 row in set (0.01 sec)mysql> select * from test.zang; #第二次查詢
+----+-------+----------------+
| id | name | address |
+----+-------+----------------+
| 3 | zhang | this_is_slave2 |
+----+-------+----------------+
1 row in set (0.01 sec)
mysql> select * from test.zang;
+----+-------+----------------+
| id | name | address |
+----+-------+----------------+
| 2 | zhang | this_is_slave1 |
+----+-------+----------------+
1 row in set (0.01 sec)[root@localhost ~]# mysql -uroot -p123456 -P8066 -h192.168.10.101
MySQL [(none)]>insert into zang values('4','zhang','write_test');
Query OK, 1 row affected (0.08 sec)