檢驗mysql主從備份,讀寫分離

jopen 8年前發布 | 8K 次閱讀 MySQL 數據庫服務器

先說背景:mysql的主從部署,讀寫分離,負載均衡之后;需要簡單測試和校驗一下,在實踐中寫了個簡單的php腳本和校驗過程,mark一下,方便再次部署校驗。

數據庫部署和實踐

數據庫在實踐中,往往需要進行多機主從備份保證安全,這個毋庸置疑;進行讀寫分離和負載均衡可以極大的提升mysql的讀寫性能。作者在實踐中采用阿里的ameoba進行了讀寫分離和負載均衡操作。細節步驟參考小拽文章: mysql主從備份,讀寫分離和負載均衡實踐

那么問題來了,部署完了,校驗也需慎重,下面是簡單的校驗過程。

php簡單讀寫庫腳本

上碼:能用代碼說的,最好不用文字說話!

<?php
/**
 * 進行讀寫分離的校驗
 * @notice :需要關閉主從備份的情況下進行
 * 原理:打開主從,寫主庫,從庫獲取數據,校驗主從備份;關閉主從寫ameoba,校驗讀寫分離和負載
 *
 * @author: cuixiaohuan
 * Date: 15/12/29
 * Time: 下午9:10
 */

class ReadAndWriteTest {

    // ameoba 設定端口,校驗讀寫時,放主庫配置
    const IP   ="ip:port";
    const PWD  ="pwd";
    const USER ="user";
    const DB   ="db";

    public function __construct(){
        error_reporting(E_ALL ^ E_DEPRECATED);

        $this->initDb();
        $this->_writeTest();
        $this->_selectTest();
    }


    /**
     * 進行10次讀操作
     */
    public function _selectTest(){
        for ($i = 0; $i < 10; $i++) {
            $read_sql = 'select * from test limit 10';
            $g_result = mysql_query($read_sql);
            var_dump($g_result);
            mysql_free_result($g_result);
        }
    }

    /**
     * 進行10次寫操作
     */
    public function _writeTest(){
        for ($i = 0; $i < 10; $i++) {
            $id        = uniqid();
            $content   = "pingce" . uniqid();
            $write_sql = 'INSERT INTO `test`(`test`, `test1`) VALUES ("' . $id . '","' . $content . '")';
            $g_result = mysql_query($write_sql);
            var_dump($g_result);
        }
    }

    /**
     * 初始化數據庫連接信息 info
     */
    private function initDb()
    {
        $crowd_conn = mysql_pconnect(self::IP, self::USER, self::PWD);
        if (!$crowd_conn) {
            die("Could not connect:" . mysql_error());
        }

        $crowd_db = mysql_select_db(self::DB, $crowd_conn);
    }
}

$rw = new ReadAndWriteTest();

主從備份校驗

  • 開啟slave

  • 調整數據庫信息為mysql,主庫信息,運行腳本。

  • 查看從庫的log,有如下寫入操作,說明實時主從備份成功。

151231 15:36:21 4 Query start slave
14 Connect Out pingce@10.95.112.120:3666
15 Query BEGIN
15 Query INSERT INTO `test`(`test`, `test1`) VALUES ("5684d957e5c85","pingce5684d957e5cf2")
15 Query COMMIT /* implicit, from Xid_log_event */
15 Query BEGIN
15 Query INSERT INTO `test`(`test`, `test1`) VALUES ("5684d957e7937","pingce5684d957e7982")
15 Query COMMIT /* implicit, from Xid_log_event */
15 Query BEGIN
15 Query INSERT INTO `test`(`test`, `test1`) VALUES ("5684d957e8e96","pingce5684d957e8ee4")
15 Query COMMIT /* implicit, from Xid_log_event */
15 Query BEGIN
15 Query INSERT INTO `test`(`test`, `test1`) VALUES ("5684d957ea2c2","pingce5684d957ea2eb")
15 Query COMMIT /* implicit, from Xid_log_event */
15 Query BEGIN
15 Query INSERT INTO `test`(`test`, `test1`) VALUES ("5684d957eb565","pingce5684d957eb5b3")
15 Query COMMIT /* implicit, from Xid_log_event */
15 Query BEGIN
15 Query INSERT INTO `test`(`test`, `test1`) VALUES ("5684d957ec7ee","pingce5684d957ec83e")
15 Query COMMIT /* implicit, from Xid_log_event */
15 Query BEGIN
15 Query INSERT INTO `test`(`test`, `test1`) VALUES ("5684d957eda2f","pingce5684d957eda78")
15 Query COMMIT /* implicit, from Xid_log_event */
15 Query BEGIN
15 Query INSERT INTO `test`(`test`, `test1`) VALUES ("5684d957eeca4","pingce5684d957eecf0")
15 Query COMMIT /* implicit, from Xid_log_event */
15 Query BEGIN
15 Query INSERT INTO `test`(`test`, `test1`) VALUES ("5684d957eff16","pingce5684d957eff61")
15 Query COMMIT /* implicit, from Xid_log_event */
15 Query BEGIN
15 Query INSERT INTO `test`(`test`, `test1`) VALUES ("5684d957f121e","pingce5684d957f126d")
15 Query COMMIT /* implicit, from Xid_log_event */

檢驗讀寫分離

  • 讀寫分離,首先需要關閉從機器上的slave。原因:存在主從的話,無法通過log查看出讀寫分離操作。

mysql> stop slave;
Query OK, 0 rows affected (0.08 sec)
  • 運行腳本:如下信息標示,運行成功。

[cuixiaohuan TestScript]$ /home/work/lamp/php5/bin/php ReadAndWriteTest.php
INSERT INTO `test`(`test`, `test1`) VALUES ("5684d957e5c85","pingce5684d957e5cf2")bool(true)
INSERT INTO `test`(`test`, `test1`) VALUES ("5684d957e7937","pingce5684d957e7982")bool(true)
INSERT INTO `test`(`test`, `test1`) VALUES ("5684d957e8e96","pingce5684d957e8ee4")bool(true)
INSERT INTO `test`(`test`, `test1`) VALUES ("5684d957ea2c2","pingce5684d957ea2eb")bool(true)
INSERT INTO `test`(`test`, `test1`) VALUES ("5684d957eb565","pingce5684d957eb5b3")bool(true)
INSERT INTO `test`(`test`, `test1`) VALUES ("5684d957ec7ee","pingce5684d957ec83e")bool(true)
INSERT INTO `test`(`test`, `test1`) VALUES ("5684d957eda2f","pingce5684d957eda78")bool(true)
INSERT INTO `test`(`test`, `test1`) VALUES ("5684d957eeca4","pingce5684d957eecf0")bool(true)
INSERT INTO `test`(`test`, `test1`) VALUES ("5684d957eff16","pingce5684d957eff61")bool(true)
INSERT INTO `test`(`test`, `test1`) VALUES ("5684d957f121e","pingce5684d957f126d")bool(true)
resource(5) of type (mysql result)
resource(6) of type (mysql result)
resource(7) of type (mysql result)
resource(8) of type (mysql result)
resource(9) of type (mysql result)
resource(10) of type (mysql result)
resource(11) of type (mysql result)
resource(12) of type (mysql result)
resource(13) of type (mysql result)
resource(14) of type (mysql result)
  • 查詢讀寫庫的log

解釋:之所以主庫放一個讀寫庫,是因為有些要求超高一致性的數據,備份可能會有延遲;所以,主庫承擔讀寫操作,和高負載。

#讀寫機器log:  進行了10次寫和 四次讀
151231 15:29:27 19 Query set names gbk^@
19 Query INSERT INTO `test`(`test`, `test1`) VALUES ("5684d957e5c85","pingce5684d957e5cf2")
19 Query INSERT INTO `test`(`test`, `test1`) VALUES ("5684d957e7937","pingce5684d957e7982")
19 Query INSERT INTO `test`(`test`, `test1`) VALUES ("5684d957e8e96","pingce5684d957e8ee4")
19 Query INSERT INTO `test`(`test`, `test1`) VALUES ("5684d957ea2c2","pingce5684d957ea2eb")
19 Query INSERT INTO `test`(`test`, `test1`) VALUES ("5684d957eb565","pingce5684d957eb5b3")
19 Query INSERT INTO `test`(`test`, `test1`) VALUES ("5684d957ec7ee","pingce5684d957ec83e")
19 Query INSERT INTO `test`(`test`, `test1`) VALUES ("5684d957eda2f","pingce5684d957eda78")
19 Query INSERT INTO `test`(`test`, `test1`) VALUES ("5684d957eeca4","pingce5684d957eecf0")
19 Query INSERT INTO `test`(`test`, `test1`) VALUES ("5684d957eff16","pingce5684d957eff61")
19 Query INSERT INTO `test`(`test`, `test1`) VALUES ("5684d957f121e","pingce5684d957f126d")
19 Query select * from test limit 10
151231 15:29:28 19 Query select * from test limit 10
19 Query select * from test limit 10
19 Query select * from test limit 10
19 Query select * from test limit 10
  • 查看讀庫的log

# 只進行了讀操作,校正了數據庫的讀寫分離操作。
151231 15:29:20 4 Query stop slave
151231 15:29:27 3 Query set names gbk^@
3 Query select * from test limit 10
3 Query select * from test limit 10
3 Query select * from test limit 10
3 Query select * from test limit 10
3 Query select * from test limit 10
3 Query select * from test limit 10

最后

一句話:打開slave,校驗主從備份;關閉slave,校驗讀寫分離。

【轉載請注明: 檢驗mysql主從備份,讀寫分離 | 靠譜崔小拽

來自: http://segmentfault.com/a/1190000004239415

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!