MySQL主從復制


   隨着數據量不斷的增加,由單台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主從復制


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM