MySQL Master Slave replication

實做MySQL master slave replication

MySQL  master slave replication 主要架構如下

1. 首先需要在主從資料庫中同時開啟mysql的binlog功能
2. 前端只要有任何新增修改刪除即insert,update,delete,create,drop,alter的操作時
3. 除了到資料庫中執行正常的sql之外,它同時也會把sql往binlog中寫一份

注意,binlog是有大小限制的,預設最大到1.1G,超過後就會自動再新增一個
另外,還有有個單獨的索引文件,是用來存放binlog的,後續主要根據它來命中對應的binlog文件中的sql

4. 最後master會起一個IO thread,主要用用來和slave的IO thread進行資料傳輸
1. 再來說明slave,slave中此時會起兩個thread,一個是IO thread,主要用來到master中去拿sql
2. 每拿一次就會在本地的master.info中update下對應的索引位置
3. 另一个則是SQL thread,主要用來執行master過來的sql,它並不是立刻執行,而是先放到slave本地的relay-log中
4. SQL thread會一直循環從那裡面讀取執行

在開始進行master/slave同步時,請務必記得要同步兩邊的資料庫,如果不一致

需要先將master DB dump出來,import到slave中

DB server O.S : CentOS 7

master : 10.0.1.7

slave : 10.0.1.5

1. 安裝兩台mysql ,並設定好DB root密碼

yum install mariadb-server -y
mysqladmin -u root password '你的密碼'

2. 在master資料庫中

vi /etc/my.cnf    在[mysqld]區塊中加入以下

log_bin = master_bin	
server_id = 1

3. 在slave資料庫中

vi /etc/my.cnf    在slave[mysqld]區塊下加入以下,此處的id務必不同於master
 
log_bin = slave_bin	
server_id = 2
log-slave-updates
expire_logs_days = 10

4. 啟動mysql DB

systemctl start mariadb

mysql -uroot -p
mysql> show variables like 'log_bin';	 查看binlog功能有無開啟
mysql> show variables like "server_id";  查看server_id是不是剛剛設置好的

5. 在master DB中新增一個同步帳號 : rep

mysql> grant replication slave on *.* to 'rep'@'10.0.1.%' identified by 'password';
mysql> flush privileges;
mysql> show grants for rep@'10.0.1.%';	查看指定帳號權限
mysql> show master status; 查看目前索引位置

 

6. 在slave DB中開啟同步

# mysql -uroot -p
mysql> CHANGE MASTER TO
-> MASTER_HOST='10.0.1.7',	         master IP
-> MASTER_PORT=3306,		             DB port
-> MASTER_USER='rep',		             sync account
-> MASTER_PASSWORD='password',   	     sync account password
-> MASTER_LOG_FILE='master_bin.000001',  Binlog id
-> MASTER_LOG_POS=120;		             Binlog 目前位置是多少

7. 開啟slave同步功能

mysql> start slave;

8. 在master資料庫新增一個DB並且檢查slave是否也一樣新增了

9. 如果要加入第二台slave DB,只要將master DB資料庫完整打包匯入,並記錄下來目前bin log index

     編輯/etc/my.cnf

vi /etc/my.cnf  加入以下

log_bin = slave1_bin
server_id = 3

    在master DB確認目前binlog index

# mysql -uroot -p
mysql> show variables like 'log_bin';

10. 在第二台slave DB上修改檔案

# mysql -uroot -padmin
mysql> CHANGE MASTER TO
-> MASTER_HOST='10.0.1.7',	         master IP
-> MASTER_PORT=3306,		             DB port
-> MASTER_USER='rep',		             sync account
-> MASTER_PASSWORD='password',   	     sync account password
-> MASTER_LOG_FILE='master_bin.000003',  Binlog id
-> MASTER_LOG_POS=120;		             Binlog 目前位置是多少

11. 第二台slave DB啟動同步

mysql> start slave;