MySQL主從複制(Master-Slave)與讀寫分離(MySQL-Proxy)實踐
Mysql作為目前世界上使用最廣泛的免費資料庫,相信所有從事系統運維的工程師都一定接觸過。但在實際的生産環境中,由單台Mysql作為獨立的資料庫是完全不能滿足實際需求的,無論是在安全性,高可用性以及高并發等各個方面。
是以,一般來說都是通過 主從複制(Master-Slave)的方式來同步資料,再通過讀寫分離(MySQL-Proxy)來提升資料庫的并發負載能力 這樣的方案來進行部署與實施的。
如下圖所示:
下面是我在實際工作過程中所整理的筆記,在此分享出來,以供大家參考。
一、MySQL的安裝與配置
值得一提的是,我的安裝過程都是源碼包編譯安裝的,并且所有的配置與資料等都統一規劃到了/opt/mysql目錄中,是以在一台伺服器上安裝完成以後,可以将整個mysql目錄打包,然後傳到其它伺服器上解包,便可立即使用。
二、MySQL主從複制
場景描述:
主資料庫伺服器:192.168.10.130,MySQL已經安裝,并且無應用資料。
從資料庫伺服器:192.168.10.131,MySQL已經安裝,并且無應用資料。
2.1 主伺服器上進行的操作
啟動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 的值,在後面進行從伺服器操作的時候需要用到。
##如果show master status;不顯示輸出,show variables like '%log_bin%';檢視log-bin打開沒有,如果沒打開
更改配置檔案my.cnf裡的mysqld下添加log-bin,重新開機mysql
2.2 配置從伺服器
修改從伺服器的配置檔案/opt/mysql/etc/my.cnf
将 server-id = 1修改為 server-id = 10,并確定這個ID沒有被别的MySQL服務所使用。
如果沒有此配置資訊 直接加在mysqld下面
執行同步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歸檔壓縮後再傳到從伺服器解壓。
注意傳過去data的權限問題,不然進入mysql可能無權限操作
(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’);
在從伺服器上檢視
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主從複制的過程就完成了
本文轉自 轉身撞牆角 51CTO部落格,原文連結:http://blog.51cto.com/chentianwang/1709070