天天看點

MySQL操作系列之基于docker的log-bin模式的主從複制(十四)(一)看log的主從複制原理圖(二)搭建步驟

本篇講解的是基于docker+mysql底層的log日志完成的主從複制(暫沒有使用到mycat做)

(一)看log的主從複制原理圖

MySQL操作系列之基于docker的log-bin模式的主從複制(十四)(一)看log的主從複制原理圖(二)搭建步驟

(二)搭建步驟

0.省略docker操作mysql容器等步驟...

1.啟動主從兩台mysql

啟動主機:docker run -p 3307:3306 --name mysql-master -v $PWD/mysql-master/conf:/etc/mysql/conf.d -v $PWD/mysql-master/logs:/logs -v $PWD/mysql-master/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6

啟動從機:docker run -p 3306:3306 --name mysql-slave -v $PWD/mysql-salve/conf:/etc/mysql/conf.d -v $PWD/mysql-salve/logs:/logs -v $PWD/mysql-salve/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6

注:啟動容器後,可以使用:docker inspect mysql-master|grep IP 指令查詢目前容器的IPAddress,在後面需要使用到

2.進入mysql-master容器中: docker exec -it mysql-master /bin/bash 

  2.1 複制my-default.cnf檔案:cp /usr/share/mysql/my-default.cnf /etc/my.cnf

  2.2 編輯my.cnf檔案:

      在此檔案的#logbin内容下面指定兩個語句:

      #指定目前mysql主機的唯一id

      server_id=1

      #指定(打開)目前mysql主機的二進制日志檔案(看mysql主從複制原理圖)

      log-bin=mysql-bin

  2.3 重新啟動mysql伺服器 systemctl restart mysql

3.進入mysql-slave容器中: docker exec -it mysql-slave /bin/bash 

  3.1 複制my-default.cnf檔案:cp /usr/share/mysql/my-default.cnf /etc/my.cnf

  3.2 編輯my.cnf檔案:

      在此檔案的#logbin内容下面指定一個語句:

      #指定目前mysql主機的唯一id

      server_id=2

      [上面為單向主從複制,如果執行為雙向主從複制,就要将與主機中一樣,指定二進制日志檔案]

  2.3 重新啟動mysql伺服器 systemctl restart mysql

接下來的4與5步是:打通主從兩台機之間的通道,進行二進制檔案之間的複制傳輸資料  

 4 打通主機通道

  4.1 進入mysql-master容器中: docker exec -it mysql-master /bin/bash

  4.2 登入進mysql中:mysql -uroot -p123456

  4.3 建立用于管理傳輸通道的一個使用者:mysql> create user 'repl'@'172.17.0.%' identified by '123456';

      [注:172.17.0.%為上面查詢到的IPAddress,%為通配符,此句的意思就是172.17.00.%這個網段下的所有機器都能使用到這個repl使用者]

  4.4 賦權限給此使用者:mysql> grant replication slave on *.* to 'repl'@'172.17.0.%' identified by '123456';

  4.5 把權限重新重新整理下:mysql>flush privileges;

  4.6 mysql>exit

  4.7 在容器中重新開機mysql

  [注:兩種方式重新開機mysql:

  第一種:由于目前mysql容器的系統是Ubuntu,是以需要使用service mysql restart重新開機mysql,但這樣會自動退出目前容器,是以需要重新建立容器;

  第二種(這種方式較為極端):

  打開一個新的視窗,以mysql-master容器的基礎上使用commit建構一個新的鏡像,然後再在此新的鏡像my-mysql-master,

  并在此鏡像上建立新的容器my-mysql-master的基礎上操作,同時可以删除原先的mysql-master容器

  ]

  檢查是否成功:mysql>show master status;/G

 5 打通從機通道

  5.1 打開一個新的視窗,以mysql-slave容器的基礎上使用commit建構一個新的鏡像,然後再在此新的鏡像my-mysql-slave,

      并在此鏡像上建立新的容器my-mysql-slave的基礎上操作,同時可以删除原先的mysql-slave容器

  5.2 進入my-mysql-slave容器後,先停止從機通道 mysql>stop slave;  

  5.3 mysql>change master to master_host='172.17.2.4',master_user='repl',master_password='123456',master_log_file='mysql-bin.000004',master_log_pos=120;

      [注:master_host的值為主機的IPAddress,master_log_file與master_log_pos就是在主機容器中使用mysql>show master status;/G查出來的結果]

  5.4 重新開機:mysql>start slave; 

  5.5 mysql>show slave status \G;

6.mysql檢查建立的使用者是否存在;

列:SELECT EXISTS(SELECT 1 FROM mysql.user WHERE user = 'username');

如:SELECT EXISTS(SELECT 1 FROM mysql.user WHERE user = 'repl');

7.增加注意:

mysql的主從複制在高并發的情況下會有錯誤,因為mysql底層主從複制是采用的單線程來進行二進制流檔案的複制,而在多線程的情況下它是無法處理的了的。

也就是資料量大的情況下,一定要将底層單線程模式設定為多線程模式去做主從複制。

繼續閱讀