使用Docker容器搭建MySql主從複製_docker

來源:互聯網
上載者:User

1. 編寫主MySQL的Docker檔案

建立檔案夾,命名為MySQL-master-v1。在檔案夾mysql-master-v1中建立檔案Dockerfile和master.cnf。筆者推薦使用的編輯器是Visual Studio Code。利用編輯器將這兩個檔案的編碼設定成UTF-8。因為本文介紹安裝到Linux系統下,所以筆者建議讀者把分行符號設定成LF,以兼顧Linux作業系統。按照如下內容編寫這兩個檔案。

Dockerfile

FROM mysql:5.7# set timezone as china/shanghaiRUN cp /usr/share/zoneinfo/PRC /etc/localtime# copy mysql config fileCOPY master.cnf /etc/mysql/conf.d/ENTRYPOINT ["docker-entrypoint.sh"]EXPOSE 3306CMD ["mysqld"]

master.cnf

user=rootpassword='123456'[mysqld]max_allowed_packet=8Mlower_case_table_names=1character_set_server=utf8max_connections=900max_connect_errors=600server-id=1log-bin=mysql-binreplicate-wild-do-table=db1.%replicate-wild-do-table=db2.%slow_query_log=1long_query_time=1log_error

2. 主MySQL的設定檔參數說明

解釋一下master.cnf。

lower_case_table_names:忽略表名、列名等資料結構的大小寫(注意:不是每行記錄內容的大小寫!)。

server-id=1: 表示此MySQL伺服器是主伺服器 。

log-bin:開啟二進位記錄。這是為了主從複製而做的設定。本文使用RBR(Row-Based Replication)模式。

replicate-wild-do-table:規定有哪些表可以從主伺服器複製到從伺服器。db1.%是指只要是資料庫db1的表,就都可以複製到從伺服器上。可以多條設定,來允許多個資料庫。

沒有使用replicate-do-db是因為replicate-do-db禁止跨資料庫的訪問。比如使用者已經使用use db2;選擇了資料庫db2,使用者還要執行update db1.t_student set c_name='stu_c' where c_id='1234c',那麼就不能使用replicate-do-db。在編程的時候雖然程式員不會用到use,但是程式員有可能把串連mysql的url寫成指定某個資料庫或沒有指定具體的資料庫。即便沒有指定資料庫,使用replicate-do-db也是不允許的。

slow_query_log=1:開啟慢查詢日誌。如果某一條SQL執行的時間超過long_query_time設定的秒數,那麼就記錄下來。記錄檔案路徑可以使用show variables;命令,在變數名是slow_query_log_file下尋找到具體的記錄檔路徑。

long_query_time=1:單位是秒。指如果某一條SQL語句執行時間超過1秒,就記錄下來。必須開啟慢查詢日誌了以後,此變數才能使用。

log_error:開啟錯誤記錄檔。show variables like 'log_error'; 就可以查詢到記錄檔的路徑。mysql的Docker官方鏡像如果設定別的取值會導致容器無法正常啟動。

3. 產生並使用主MySQL的鏡像

上傳檔案夾mysql-master-v1到Linux伺服器上。為了便於說明,用伺服器A來指代這台伺服器。筆者的Linux版本是Ubuntu14.04。通過cd命令進入目錄mysql-master-v1。然後輸入以下命令來編譯鏡像:

docker build -t zhangchao/mysql-master5.7:v1 .

注意不要落下行末尾最後一個點。

根據編譯好的鏡像,產生新的容器:

docker run --name mysql-master \-p 3306:3306 \-v /zc/mysql-master/datadir:/var/lib/mysql \-e MYSQL_ROOT_PASSWORD='123456' -d zhangchao/mysql-master5.7:v1

使用MySQL的用戶端串連MySQL主伺服器,筆者使用的是MySQL Workbench。執行如下命令:

show master status;

記錄下file和position。這裡假設file是mysql-bin.000001,post是154。

4. 編寫從MySQL的Docker檔案

建立檔案夾 mysql-slave-v1。仿照步驟1在檔案夾 mysql-slave-v1下建立 Dockerfile 和 slave.cnf 兩個檔案。下面是這兩個檔案的內容。

Dockerfile

FROM mysql:5.7# set timezone as china/shanghaiRUN cp /usr/share/zoneinfo/PRC /etc/localtime# copy mysql config fileCOPY slave.cnf /etc/mysql/conf.d/ENTRYPOINT ["docker-entrypoint.sh"]EXPOSE 3306CMD ["mysqld"]

slave.cnf

[mysqldump]user=rootpassword='123456'[mysqld]max_allowed_packet=8Mlower_case_table_names=1character_set_server=utf8max_connections=900max_connect_errors=600slow_query_log=1long_query_time=1log_error# Regard this db as a slaveserver-id=2

slave.cnf 檔案中的 server-id=2 會把MySQL伺服器設定成從伺服器。

5. 產生並使用從MySQL的鏡像

上傳 mysql-slave-v1 到第二台伺服器。用伺服器B來指代這台伺服器。

編譯鏡像:

docker build -t zhangchao/mysql-slave5.7:v1 .

利用新的鏡像建立容器:

docker run --name mysql-slave \-p 3306:3306 \-v /zc/mysql-slave/datadir:/var/lib/mysql \-e MYSQL_ROOT_PASSWORD='123456' -d zhangchao/mysql-slave5.7:v1

這時MySQL的主從伺服器都在運行中,需要讀者自行保證兩邊的資料相同。只有當兩台伺服器的資料都一樣的時候,才能建立主從複製串連。

6. 把從MySQL串連到主MySQL上

使用用戶端串連到MySQL從伺服器,假定伺服器A的IP是192.168.10.1。

執行如下命令:

change master to master_host='192.168.10.1',master_user='root',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=154;

待命令正常執行後,接著執行如下命令:

start slave;

這樣就可以主從複製了。只要在主伺服器的db1和db2資料庫插入或修改資料,就可以自動複製到從伺服器上了。

以上所述是小編給大家介紹的使用Docker容器搭建MySql主從複製,希望對大家有所協助,如果大家有任何疑問請給我留言,小編會及時回複大家的。在此也非常感謝大家對雲棲社區網站的支援!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.