使用docker構建雙主mysql

  我們有的時候需要雙主mysql, 這樣無論哪個數據庫出現了問題的話都可以繼續使用數據庫。把兩個數據庫掛到一個代理上面,這樣哪個服務出問題了,另外一個就可以繼續服務了。當然本文不是主要談代理的,所以這個不做細說。

  因為我們的電腦資源有限,所有我們繼續采用docker的形式進行處理。

  首先我的電腦是mac且安裝了docker的,如果有同學沒有安裝的話需要提前安裝上。加上國內加速鏡像站,這樣拉取鏡像服務的時候我們就會很快完成,否則鏡像需要從國外拉取很慢。這個我之前遇到的問題,后來就把docker放置了很久,現在配置了國內加速鏡像站,拉取鏡像很快了。

  docker的基礎知識之前在我的博文中已經說了,不太清除的可以用“飛機票”過去。

  好了,咱們進入正題,大家的docker環境已經準備好了。我們拉取鏡像 mysql 5.7版本,拉取完成后可以看一下自己有哪些鏡像。

docker pull mysql:5.7
docker images

  接下來我們需要創建一個網絡環境,讓主從機器在相同的環境中??梢醞ü睿篸ocker network ls 查看自己創建了哪些網絡。咱們下面創建了以mysql為名網絡。

docker network create --driver=bridge mysql

  咱們把主從的機器開始啟動。

docker run -p 3366:3306 --network=mysql -h "mysql_master"  --name mysql_master -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
docker run -p 3367:3306 --network=mysql -h "mysql_slave"  --name mysql_slave -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

  上邊的參數大概解釋一下 -p 是將機器內部的端口暴露出來,這個就可以從外邊連接mysql機器了。 -h 是主機名, --name 用于指定啟動的容器的名字,這個就可以在后續中用于重啟鏡像了,比如:docker restart mysql_master。-e 用于創建的時候指定環境變量,因為mysql容器必須指定root的密碼,所以通過-e進行設置,把密碼設置為root。 -d 這個是deamon的意思,就是守護進程,也就是在后臺運行。最后指定mysql及版本號用于啟動。

  接下來咱們需要進入到mysql_master機器中。docker exec是用于進入正在運行的機器中,-it是交互的方式,最后指定腳本類型bash。

docker exec -it mysql_master /bin/bash

  進入到機器以后,因為mysql的進行很干凈,里邊沒有我們需要的工具。這個鏡像的內核是debian,我們需要安裝vim及ping工具。我們需要首先把apt的源更改,首先把源文件備份,然后設置了163的源作為我們的apt源。當然大家可以搜索其他云apt的源都是可以的。

cp /etc/apt/sources.list /etc/apt/sources_init.list

echo "deb //mirrors.163.com/debian/ buster main non-free contrib
deb http://mirrors.163.com/debian/ buster-updates main non-free contrib
deb http://mirrors.163.com/debian/ buster-backports main non-free contrib
deb http://mirrors.163.com/debian-security/ buster/updates main non-free contrib

deb-src http://mirrors.163.com/debian/ buster main non-free contrib
deb-src http://mirrors.163.com/debian/ buster-updates main non-free contrib
deb-src http://mirrors.163.com/debian/ buster-backports main non-free contrib
deb-src http://mirrors.163.com/debian-security/ buster/updates main non-free contrib" > /etc/apt/sources.list

  我們更新一下apt-get,然后安裝vim及ping,執行完了工具也就安裝好了。

apt-get update
apt-get install vim
apt-get install iputils-ping

  這些更新apt即安裝工具的方法也需要再slave中執行一遍,我就不單獨發步驟了。我們可以測試一下ping命令,我們執行  “ping mysql_slave” 有返回值,說明網絡是通著的。我們繼續編輯mysql的配置文件。

vim /etc/mysql/mysql.conf.d/mysqld.cnf

  我們配置上server-id和log-bin,mysql是通過bin log進行同步的,這個也就是開啟log-bin。每個機器的server-id是不一樣的,用于標志不同的機器。

server-id=1
log-bin=mysql-bin

  保存后我們退出鏡像,然后重啟鏡像使其配置生效。

docker restart mysql_master

  我們也需要把slave的機器文件也改一下。這里進入機器的命令為: docker exec -it mysql_slave /bin/bash 。執行一下上邊的更新和安裝配置,配置好了之后記得重啟一下slave : docker restart mysql_slave 。

server-id=2
log-bin=mysql-bin
binlog_format=mixed

  我們在master的機器里邊進入mysql, 執行的命令如下。輸入密碼root即可進入。

mysql -uroot -p

  我們需要授權root用戶的replication及slave權限。如果不授權的話,從庫是不能連接主庫的。

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'root'@'%';

  看一下master的日志文件即位置。我們看到了master機器的文件名及其位置。

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

  我們也需要開啟一個slave的機器,并且進入到mysql里邊。因為可能需要來回切換。我們在從庫里邊執行如下命令。里邊配置設置了master的主機名,主機端口號,主機用戶名,密碼,主機器的文件名字以及位置。

change master to master_host='mysql_master',master_port=3306, master_user='root',master_password='root',master_log_file='mysql-bin.000001',master_log_pos=154;

  接下來我們來啟動slave,并且查看slave的線程命令。

start slave;
show slave status \G;

  

 

    里邊的yes說明已經開啟成功并且連通,如果沒有連通的話就是NO,這個時候需要檢查上邊配置的主機的host 用戶名和密碼,這些都需要檢查一遍。

  我們在master的機器上建一個數據庫test - create database test; 然后我們在從庫里邊查看,已經有了。說明從庫已經創建好了。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| slavetest          |
| sys                |
| test               |
+--------------------+
6 rows in set (0.00 sec)

  接下來我們我們在mysql_slave機器的庫把用戶root進行授權。

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'root'@'%';

  然后看一下mysql_slave機器的日志文件名及位置。

show master status \G;

  我們找到對應的文件名及位置,看一下下面的命令著兩個值是否正確,不正確的話替換即可,正確的話進入mysql_master機器上執行。

change master to master_host='mysql_slave',master_port=3306, master_user='root',master_password='root',master_log_file='mysql-bin.000001',master_log_pos=154;

  執行完了之后在mysql_master上執行。

start slave;

  然后看一下slave的狀態。如果剛才像上圖那樣的都是Yes的話說明成功。

show slave status \G;

  接下來咱們在mysql_slave的機器上創建一張表。create database slavetest; 這個時候我們進入mysql_master機器上查看一下。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| slavetest          |
| sys                |
| test               |
+--------------------+

  這個時候也有了,說明雙主mysql搭建完成。

 

  

 

  

  

posted @ 2020-03-29 17:00  黃青石  閱讀(...)  評論(...編輯  收藏