2015年2月15日 星期日

MySQL Master Slave Replication

我使用使用docker 的ubuntu 14.04 image產生的container來實做

我們為什麼要使用Master/Slave模式?
1.物理服务器增加,负荷增加
2.主从只负责各自的写和读,极大程度的缓解X锁( insert, update, delete )和S锁(select)争用
3.从库可配置myisam引擎,提升查询性能以及节约系统开销
4.从库同步主库的数据和主库直接写还是有区别的,通过主库发送来的binlog恢复数据,但是,最重要区别在于主库向从库发送binlog是异步的,从库恢复数据也是异步的
5.读写分离适用与读远大于写的场景,如果只有一台服务器,当select很多时,update和delete会被这些select访问中的数据堵塞,等待select结束,并发性能不高。 对于写和读比例相近的应用,应该部署双主相互复制
6.MySQL复制另外一大功能是增加冗余,提高可用性,当一台数据库服务器宕机后能通过调整另外一台从库来以最快的速度恢复服务,因此不能光看性能,也就是说1主1从也是可以的。

基本安裝套件:
# apt-get install vim screen bash-completion openssh-server openssh-client wget
安裝MySQL:
# apt-get install mysql-server mysql-client

commit後分別run兩個container來實做,Master IP:172.17.0.2,Slave IP:172.17.0.5

一、設定Master Database

1. 編輯 /etc/mysql/my.cnf
bind-address = 127.0.0.1 => 改成你的Master IP
bind-address = 172.17.0.2
server-id = 1 # 移除註解
log_bin            = /var/log/mysql/mysql-bin.log # 移除註解
binlog_do_db = newdatabase # 移除註解,並設定你須要同步的db名字

2. 重啟MySQL,並登錄設定
# service mysql restart
# mysql -u root -p
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'password'; #記得改slave_user 和password
mysql> FLUSH PRIVILEGES;
mysql> USE newdatabase;
mysql> FLUSH TABLES WITH READ LOCK; # lock資料庫,避免新的更變
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 |     1882 | newdatabase  |                  |
+------------------+----------+--------------+------------------+
在另一個tty上備份資料庫
# mysqldump -u root -p --opt newdatabase > newdatabase.sql
mysql> UNLOCK TABLES; # unlock資料庫,讓他再度能寫入

二、設定Slave Database

1. 建立資料庫
mysql> CREATE DATABASE newdatabase;
2. 匯入剛剛在Master Database的資料庫
# mysql -u root -p newdatabase < /path/to/newdatabase.sql
3. 編輯 /etc/mysql/my.cnf
server-id = 2 # 必須與Master不一樣
relay-log = /var/log/mysql/mysql-relay-bin.log
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = newdatabase
4. 重啟資料庫
# service mysql restart
5. 設定Slave Database的Master DB
mysql> CHANGE MASTER TO 
MASTER_HOST='172.17.0.2',MASTER_USER='slave_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS= 1882;  # 請參考在Master Database執行 SHOW MASTER STATUS; 的結果設定
mysql> START SLAVE; # 啟動Slave
mysql> SHOW SLAVE STATUS\G #檢查slave 狀態
如果遇到連線問題,試著用下面指令啟動Slave(我沒做這步)
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; SLAVE START;

檢測:
在Master上,insert, update, delete後,Slave的資料庫也會跟著同步

後記:
我用docker container去實做,基本上沒遇到什麼問題,貼貼指令就結束了。如何讓php讀寫分離,和檢測是否真的讀寫分離,之後再測試。

參考資料:
https://www.digitalocean.com/community/tutorials/how-to-set-up-master-slave-replication-in-mysql
http://segmentfault.com/q/1010000000304576 # 為什麼要使用M/S 架構
http://blog.longwin.com.tw/2008/03/mysql_replication_master_slave_set_2008/ # Master/Slave 設定方法 中文版
http://blog.wu-boy.com/2008/12/mysql-%E5%AF%A6%E5%81%9A-mysql-master-master-replication-%E5%90%8C%E6%AD%A5/ # Master/Slave 設定方法 中文版

沒有留言:

張貼留言