mysql AB複制搭建以及常見故障排查
MySQL主從複制(Master-Slave)也叫AB複制,Mysql作為目前世界上使用最廣泛的免費資料庫,相信所有從事系統運維的工程師都一定接觸過。但在實際的生産環境中,由單台Mysql作為獨立的資料庫是完全不能滿足實際需求的,無論是在安全性,高可用性以及高并發等各個方面。是以,一般來說都是通過主從複制(Master-Slave)的方式來同步資料,再通過讀寫分離(MySQL-Proxy)來提升資料庫的并發負載能力這樣的方案來進行部署與實施的。
如下圖所示:
<a href="http://s3.51cto.com/wyfs02/M02/12/51/wKioL1MDErPyUeK1AAO22EHGl5I963.jpg" target="_blank"></a>
拓撲圖畫的不是很好,大家見諒哈;今天我們來學習下如何搭建mysql的AB複制,其實呢很簡單,大家不要被它的表面所迷惑。
首先呢我先給大家描述下環境:
環境描述:
mysql主伺服器:系統rhel5.5;192.168.1.10;mysql呢是我用本機yum源安裝的,資料庫裡面什麼東西都沒有。
mysql從伺服器:系統rhel5.5;192.168.1.11;這個機器的mysql跟上面的一樣。
好了,環境描述完畢,下面給大家講解下步驟。
一、在主伺服器上操作
1.修改/etc/my.cnf
添加log-bin=mysql-bin //啟用二進制日志
server-id=1 //資料庫ID号,為1時表示為Master,其中master_id必須為1到231之間的一個正整數值,每個同步伺服器都必須設定一個唯一的編号,否則同步就不能正常運作了;
2.啟動mysql服務
/etc/init.d/mysqld start
3.然後登入進去mysql資料庫
mysql -u root
授權給從mysql資料庫伺服器192.168.1.11;
mysql> GRANT REPLICATION SLAVE ON *.* to 'ha'@'192.168.1.11'identified by ‘password’;
<a href="http://s3.51cto.com/wyfs02/M02/12/51/wKioL1MDFZ6ws-iiAABfJYJZBDY128.jpg" target="_blank"></a>
查詢主資料庫狀态
<a href="http://s3.51cto.com/wyfs02/M02/12/51/wKiom1MDFgzQWWRrAACwwLtRwzA644.jpg" target="_blank"></a>
記錄下 FILE 及 Position 的值,在後面進行從伺服器操作的時候需要用到。
二、配置從伺服器
跟上面一樣也是先修改下/etc/my.cnf
4.執行同步sql語句然後啟動slave同步程序
<a href="http://s3.51cto.com/wyfs02/M01/12/51/wKioL1MDFoyQGXQeAADOVbTNxS0635.jpg" target="_blank"></a>
5.主從同步檢查
<a href="http://s3.51cto.com/wyfs02/M00/12/51/wKiom1MDFv7xzpWKAAJTgdF2njo445.jpg" target="_blank"></a>
其中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
三、驗證主從AB複制效果
在主伺服器上建立一個庫
<a href="http://s3.51cto.com/wyfs02/M02/12/51/wKiom1MDF_ezEZDrAABZ6YfWqLE188.jpg" target="_blank"></a>
在從伺服器上檢視下
<a href="http://s3.51cto.com/wyfs02/M01/12/51/wKiom1MDGDvDmZO8AACB_FAadXs797.jpg" target="_blank"></a>
由此,整個MySQL主從複制的過程就完成了,接下來,我們進行MySQL讀寫分離的安裝與配置。
常見故障總結以及處理方法
1.可能是/usr/local/mysql/data/***.pid檔案沒有寫的權限
解決方法 :給予權限,執行 “chown -R mysql:mysql /var/data” “chmod -R 755 /usr/local/mysql/data” 然後重新啟動mysqld!
2.可能程序裡已經存在mysql程序
解決方法:用指令“ps -ef|grep mysqld”檢視是否有mysqld程序,如果有使用“kill -9 程序号”殺死,然後重新啟動mysqld!
3.可能是第二次在機器上安裝mysql,有殘餘資料影響了服務的啟動。
解決方法:去mysql的資料目錄/data看看,如果存在mysql-bin.index,就趕快把它删除掉吧,它就是罪魁禍首了。本人就是使用第三條方法解決的 !http://blog.rekfan.com/?p=186
4.mysql在啟動時沒有指定配置檔案時會使用/etc/my.cnf配置檔案,請打開這個檔案檢視在[mysqld]節下有沒有指定資料目錄(datadir)。
解決方法:請在[mysqld]下設定這一行:datadir = /usr/local/mysql/data
5.skip-federated字段問題
解決方法:檢查一下/etc/my.cnf檔案中有沒有沒被注釋掉的skip-federated字段,如果有就立即注釋掉吧。
###
主要是從伺服器會出現錯誤
由于一些錯誤操作或者中途改變了master,而導緻CHANGE MASTER指令後SLAVE服務無法啟動,系統報錯如下:
Could not initialize master info structure; more error messages can be found in the MySQL error log.
無法初始化master info結構;MySQL錯誤日志記錄了更詳細的錯誤資訊.
兩種解決方法:
第一種:
1.檢視MySQL錯誤日志,檢視原因.
如:同步的上一個Position是多少.
很多情況下無法啟動服務是由于mysql識别的同步始終停留在上一個Position上.
2.檢視master.info和relay-log.info
master.info 記錄MASTER相關資訊
mysql-bin.000030
391156558
192.168.1.1
user_rep
rep123
3306
60
relay-log.info 記錄目前同步日志資訊
235
3.停止myslq服務,删除master.info和relay-log.info
# service mysql stop
/data/datafile/ # rm master.info
/data/datafile/ # rm relay-log.info
4.啟動mysql服務
# service mysql start
5.重新CHANGE MASTER,重新啟動SLAVE服務.
問題應該就可以解決了.
第二種方法比較簡單,也常用
mysql> slave stop;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> reset slave;
Query OK, 0 rows affected,(0.00 sec)
#############
主從mysql不同步首先在Master上用
show processlist; 檢視下程序是否Sleep太多。發現很正常。
show master status; 也正常。
再跑到Slave上檢視
show slave status;
錯誤提示:
Error 'Duplicate entry '1' for key 1' on query. Default database: 'movivi1'. Query: 'INSERT INTO `v1vid0_user_samename` VALUES(null,1,'123','11','4545','123')'
Slave_SQL_Running 為 NO
Seconds_Behind_Master 為 (null)
可見是Slave不同步
解決:
stop slave;
set global sql_slave_skip_counter =1 ;
start slave;
########
1.網絡的延遲
由于mysql主從複制是基于binlog的一種異步複制,通過網絡傳送binlog檔案,理所當然網絡延遲是主從不同步的絕大多數的原因,特别是跨機房的資料同步出現這種幾率非常的大,是以做讀寫分離,注意從業務層進行前期設計。
2.主從兩台機器的負載不一緻
由于mysql主從複制是主上面啟動1個io線程,而從上面啟動1個sql線程和1個io線程,當中任何一台機器的負載很高,忙不過來,導緻其中的任何一個線程出現資源不足,都将出現主從不一緻的情況。
3.max_allowed_packet設定不一緻
主上面設定的max_allowed_packet比從大,當一個大的sql語句,能在主上面執行完畢,從上面設定過小,無法執行,導緻的主從不一緻。
4.key自增鍵開始的鍵值跟自增步長設定不一緻引起的主從不一緻。
5.mysql異常當機情況下,如果未設定sync_binlog=1或者innodb_flush_log_at_trx_commit=1很有可能出現binlog或者relaylog檔案出現損壞,導緻主從不一緻。
6.mysql本身的bug引起的主從不同步。
7.版本不一緻,特别是高版本是主,低版本為從的情況下,主上面支援的功能,從上面不支援該功能。
以上是我遇到的一些主從不同步的情況。或許還有其他的一些不同步的情況,請說出你所遇到的主從不一緻的情況。
基于以上情況,先保證max_allowed_packet,自增鍵開始點和增長點設定一緻,再者犧牲部分性能在主上面sync開啟_binlog,對于采用innodb的庫,推薦配置下面的内容
1.innodb_flush_logs_at_trx_commit = 1
2.innodb-support_xa = 1 # Mysql 5.0 以上
3.innodb_safe_binlog # Mysql 4.0
同時在從上面推薦加入下面兩個參數
1.skip_slave_start
2.read_only
重新CHANGE MASTER,重新啟動SLAVE服務.這樣就搞定了O(∩_∩)O
本文轉自Devin 51CTO部落格,原文連結:http://blog.51cto.com/devingeng/1360162