一、MySQL主從複製原理
MySQL主從複製(Master-Slave)與讀寫分離(MySQL-Proxy)實踐
Mysql作爲目前世界上使用最廣泛的免費數據庫,相信所有從事系統運維的工程師都一定接觸過。但在實際的生產環境中,由單臺Mysql作爲獨立的數據庫是完全不能滿足實際需求的,無論是在安全性,高可用性以及高併發等各個方面。
因此,一般來說都是通過 主從複製(Master-Slave)的方式來同步數據,再通過讀寫分離(MySQL-Proxy)來提升數據庫的併發負載能力 這樣的方案來進行部署與實施的。
如下圖所示:
在一主多從的數據庫體系中,多個從服務器採用異步的方式更新主數據庫的變化,業務服務器在執行寫或者相關修改數據庫的操作是在主服務器上進行的,讀操作則是在各從服務器上進行。如果配置了多個從服務器或者多個主服務器又涉及到相應的負載均衡問題,關於負載均衡具體的技術細節還沒有研究過,今天就先簡單的實現一主一從的主從複製功能。
Mysql主從複製的實現原理圖大致如下:
二、主從實驗
1、實驗對象準備
主數據庫服務器:192.168.48.128,linux
從數據庫服務器:127.0.0.1,windows
2、主數據庫配置
1)修改mysql配置
找到主數據庫的配置文件my.cnf,修改配置並重啓
vi /etc/my.cnf
service mysqld restart
在[mysqld]部分插入如下兩行:
[mysqld]
#開啓二進制日誌
log-bin=mysql-bin
#設置server-id,id不能與其他mysql重複
server-id=1
#設置 Master 對哪些庫記日誌
binlog_do_db=name
#設置 Master 對哪些庫不記日誌
binlog_ignore_db=name
2)創建用於同步的用戶賬號
進入主數據庫mysql,創建用戶:repl密碼:slavepass
#創建用戶
mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'slavepass';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' ; #分配權限
mysql>flush privileges; #刷新權限
3)查看master狀態,記錄二進制文件名(mysql-bin.000001)和位置(120):
SHOW MASTER STATUS;
3、從數據庫slave修改
1)修改mysql配置
同樣找到my.ini配置文件,添加server-id,然後重啓mysql
[mysqld]
#設置server-id,必須唯一
server-id=2
# 要同步的mstest數據庫,要同步多個數據庫,就多加幾個
replicate-do-db=name
#要忽略的數據庫
replicate-ignore-db=mysql
2)執行同步SQL語句
進入從數據庫,執行同步語句,需要主服務器主機名,登陸憑據,二進制文件的名稱和位置)
mysql> CHANGE MASTER TO
MASTER_HOST='192.168.48.128',
MASTER_USER='repl',
MASTER_PASSWORD='slavepass',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=120;
3)啓動slave同步進程
mysql>start slave;
mysql>show slave status\G;
當看到Slave_IO_Running和 Slave_SQL_Running這兩項都爲YES時,說明主從已經配置成功。這樣一來,從數據庫就可以通過讀取主數據庫的binlog進行同步數據。
不過需要注意的是:如果對從數據庫進行修改,是不會同步對主數據庫進行修改的,這樣就應該用主-主同步了,方法類似,所以insert,delete update 都應該是對主數據庫的操作, 而select操作則對從表進行操作。