隨着數據量不斷的增加,由單台Mysql作為獨立的數據庫有的時候是不能滿足實際需求的,無論是在安全性,高可用性以及高並發等各個方面。
因此,一般來說都是通過主從復制(Master-Slave)的方式來同步數據,再通過讀寫分離(MySQL-Proxy)來提升數據庫的並發負載能力這樣的方案來進行部署與實施的。
使用mysql主從復制的好處有:
1、采用主從服務器這種架構,穩定性得以提升。如果主服務器發生故障,我們可以使用從服務器來提供服務。
2、在主從服務器上分開處理用戶的請求,可以提升數據處理效率。
3、將主服務器上的數據復制到從服務器上,保護數據免受意外的損失。
如下圖所示:
下面是我在實際工作過程中所整理的筆記,在此分享出來,以供大家參考。
一、MySQL的安裝與配置
具體的安裝過程,建議參考我的這一篇文章:http://www.yzswyl.cn/blread-1639.html
值得一提的是,我的安裝過程都是源碼包編譯安裝的,並且所有的配置與數據等都統一規划到了/opt/mysql目錄中,因此在一台服務器上安裝完成以后,可以將整個mysql目錄打包,然后傳到其它服務器上解包,便可立即使用。
二、MySQL主從復制(全部復制)
場景描述:
主數據庫服務器:192.168.10.130,MySQL已經安裝,並且無應用數據。
從數據庫服務器:192.168.10.131,MySQL已經安裝,並且無應用數據。
2.1 主服務器上進行的操作
$ vi /opt/mysql/etc/my.cnf [mysqld] log-bin=mysql-bin //[必須]啟用二進制日志 server-id=130 //[必須]服務器唯一ID,默認是1,一般取IP最后一段
#啟動mysql服務 /opt/mysql/init.d/mysql start #通過命令行登錄管理MySQL服務器 /opt/mysql/bin/mysql -uroot -p'new-password' #授權給從數據庫服務器192.168.10.131 mysql> GRANT REPLICATION SLAVE ON *.* to 'rep1'@'192.168.10.131' identified by ‘password’; #查詢主數據庫狀態 Mysql> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000005 | 261 | | | +------------------+----------+--------------+------------------+
記錄下 FILE 及 Position 的值,在后面進行從服務器操作的時候需要用到。
2.2 配置從服務器
$ vi /opt/mysql/etc/my.cnf [mysqld] log-bin=mysql-bin //[必須]啟用二進制日志 server-id=131 //[必須]服務器唯一ID,默認是1,一般取IP最后一段
#啟動mysql服務 /opt/mysql/init.d/mysql start #通過命令行登錄管理MySQL服務器 /opt/mysql/bin/mysql -uroot -p'new-password' #執行同步SQL語句 mysql> change master to master_host=’192.168.10.130’, master_user=’rep1’, master_password=’password’, master_log_file=’mysql-bin.000005’, master_log_pos=261; #正確執行后啟動Slave同步進程 mysql> start slave; #主從同步檢查 mysql> show slave status\G ============================================== **************** 1. row ******************* Slave_IO_State: Master_Host: 192.168.10.130 Master_User: rep1 Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000005 Read_Master_Log_Pos: 415 Relay_Log_File: localhost-relay-bin.000008 Relay_Log_Pos: 561 Relay_Master_Log_File: mysql-bin.000005 Slave_IO_Running: YES Slave_SQL_Running: YES Replicate_Do_DB: ……………省略若干…………… Master_Server_Id: 1 1 row in set (0.01 sec) ==============================================
其中Slave_IO_Running 與 Slave_SQL_Running 的值都必須為YES,才表明狀態正常。
注意:如果主服務器已經存在應用數據,則在進行主從復制時,需要做以下處理:
(1)主數據庫進行鎖表操作,不讓數據再進行寫入動作
mysql> FLUSH TABLES WITH READ LOCK;
(2)查看主數據庫狀態
mysql> show master status;
(3)記錄下 FILE 及 Position 的值。
將主服務器的數據文件(整個/opt/mysql/data目錄)復制到從服務器,建議通過tar歸檔壓縮后再傳到從服務器解壓。
(4)取消主數據庫鎖定
mysql> UNLOCK TABLES;
2.3 驗證主從復制效果
主服務器上的操作
#在主服務器上創建數據庫first_db mysql> create database first_db; Query Ok, 1 row affected (0.01 sec) #在主服務器上創建表first_tb mysql> create table first_tb(id int(3),name char(10)); Query Ok, 1 row affected (0.00 sec) #在主服務器上的表first_tb中插入記錄 mysql> insert into first_tb values (001,’myself’); Query Ok, 1 row affected (0.00 sec)
在從服務器上查看
mysql> show databases; ============================= +--------------------+ | Database | +--------------------+ | information_schema | | first_db | | mysql | | performance_schema | | test | +--------------------+ 5 rows in set (0.01 sec) ============================= #數據庫first_db已經自動生成 mysql> use first_db Database chaged mysql> show tables; ============================= +--------------------+ | Tables_in_first_db | +--------------------+ | first_tb | +--------------------+ 1 row in set (0.02 sec) ============================= #數據庫表first_tb也已經自動創建 mysql> select * from first_tb; ============================= +------+------+ | id | name | +------+------+ | 1 | myself | +------+------+ 1 rows in set (0.00 sec) ============================= #記錄也已經存在
由此,整個MySQL主從復制的過程就完成了。
三、MySQL主從復制復制部分庫或表
這里跟全部復制不同的是主從服務器修改/etc/my.cnf配置的地方,這里只介紹不同的情況。
3.1 主服務器的配置
#在/etc/my.cnf配置文件: log-bin=mysql-bin # 啟動二進制日志系統 server-id=130 # 本機數據庫唯一ID log-bin=/var/log/mysql/updatelog # 設定生成log文件名,這里的路徑沒有要手動創建並給它mysql用戶的權限。 binlog-do-db=test1 # 二進制需要同步的數據庫名 binlog-ignore-db=mysql,test # 避免同步mysql用戶配置,以免不必要的麻煩
3.2 從服務器的配置
#修改/etc/my.cnf 文件: server-id=131 #從服務器ID號,不要和主ID相同 master-host=192.168.20.155 #指定主服務器IP地址 master-user=replication #指定在主服務器上可以進行同步的用戶名 master-password=123456 #密碼 master-port=3306 # 同步所用端口 master-connect-retry=60 #斷點從新連接時間 replicate-ignore-db=mysql #屏蔽對mysql庫的同步 replicate-do-db=test1 #同步的數據庫的名稱 replicate_do_table = testa #同步的數據表的名稱
replicate部分也可以這樣寫:
replicate-do-table=數據庫名.表名 #如果要是復制多個表只要在下面直接添加(復制幾個就添加幾個) replicate-do-table=數據庫名.表名
mysql replication單表或多表復制時需注意的幾個問題:
1.主庫和從庫的數據庫名必須相同;
2.主庫和從庫的復制可以精確到表,但是在需要更改主庫或從庫的數據結構時需要立刻重啟slave;
3.不能在mysql配置文件里直接寫入master的配置信息,需要用change master命令來完成;
4.指定replicate_do_db必須在my.ini里配置,不能用change master命令來完成;
5.如果不及時清理,日積月累二進制日志文件可能會把磁盤空間占滿,可以在配置文件里加上expire_logs_days=7,只保留最近7天的日志,建議當slave不再使用時,通過reset slave來取消relaylog;
上面幾條是在使用過程當中發現的律,不知道是否正確,有誤之處,還望指點。
最后,編寫一shell腳本,用nagios監控slave的兩個“yes”,如發現只有一個或零個“yes”,就表明主從有問題了,發短信警報吧。
詳情參考我的另一篇文章:nagios監控mysql主從復制