本文MySQL集群采用一主多從的架構(gòu),即一個(gè)master節(jié)點(diǎn)多個(gè)slave節(jié)點(diǎn),master負(fù)責(zé)寫數(shù)據(jù),slave節(jié)點(diǎn)負(fù)責(zé)讀操作。使用mycat作為MySQL中間件向外提供讀寫服務(wù)。使用phpmyadmin提供外部服務(wù),整體架構(gòu)如下:

1 搭建MySQL集群
這里采用1主2從的結(jié)構(gòu),一般在一主多從的結(jié)構(gòu)中,slave節(jié)點(diǎn)在2-4個(gè)之間,如果slave節(jié)點(diǎn)多了,會(huì)影響master的性能。操作步驟如下:
- 創(chuàng)建3個(gè)MySQL容器
- 配置Master節(jié)點(diǎn)
- 配置Slave節(jié)點(diǎn)
1.1 創(chuàng)建MySQL容器
本文采用docker-compose創(chuàng)建MySQL容器,使用docker-compose需要?jiǎng)?chuàng)建docker-compose.yml和.env 2個(gè)文件,其中 docker-compose.yml是配置文件文件,是必需的。.env 是docker-compose的環(huán)境變量文件,是可選的。配置文件可以讀取環(huán)境變量文件中定義的變量,方便擴(kuò)展。
創(chuàng)建一個(gè)docker目錄,并在docker目錄下創(chuàng)建mysql目錄,~/docker/mysql作為本項(xiàng)目的根目錄。在mysql根目錄下,創(chuàng)建master,slave1和slave2目錄,用于存放3個(gè)mysql實(shí)例。并在根目錄下,創(chuàng)建docker-compose的配置文件和環(huán)境變量文件。
mkdir -p ~/docker/mysql/master ~/docker/mysql/slave1 ~/docker/mysql/slave2
cd ~/docker/mysql
touch .env docker-compose.yml
目錄結(jié)構(gòu)如下:
? mysql tree -L 1 -a
.
├── .env #docker-compose環(huán)境變量
├── docker-compose.yml #docker-compose配置文件
├── master # 存儲(chǔ)master實(shí)例
├── slave1 # 存儲(chǔ)slave1實(shí)例
└── slave2 # 存儲(chǔ)slave2實(shí)例
3 directories, 2 files
設(shè)置環(huán)境變量
? mysql vim .env
# 使用的MySQL版本
MYSQL_VERSION=mysql:5.7.30
# MySQL root用戶密碼
MYSQL_ROOT_PASSWORD=123456
# MySQL 實(shí)例存儲(chǔ)的根目錄
MYSQL_HOME=/Users/zebra/docker/mysql
# master配置
MASTER=master
MASTER_PORT=33061
# salve1配置
SLAVE1=slave1
SLAVE1_PORT=33062
# slave2配置
SLAVE2=slave2
SLAVE2_PORT=33063
設(shè)置配置文件docker-compose.yml
version: '3'
services:
master:
restart: always
image: ${MYSQL_VERSION}
container_name: ${MASTER}
environment:
# root密碼
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
# 使用環(huán)境變量設(shè)置MySQL的時(shí)區(qū)
TZ: Asia/Shanghai
ports:
- ${MASTER_PORT}:3306
volumes:
- ${MYSQL_HOME}/master/data:/var/lib/mysql
- ${MYSQL_HOME}/master/etc/conf.d:/etc/mysql/conf.d
command:
# 設(shè)置忽略大小寫
- --lower_case_table_names=1
# 設(shè)置默認(rèn)字符集
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_general_ci
# 設(shè)置最大接收的數(shù)據(jù)包
- --max_allowed_packet=128M
slave1:
restart: always
image: ${MYSQL_VERSION}
container_name: ${SLAVE1}
environment:
# root密碼
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
# 使用環(huán)境變量設(shè)置MySQL的時(shí)區(qū)
TZ: Asia/Shanghai
links:
- ${MASTER}
ports:
- ${SLAVE1_PORT}:3306
volumes:
- ${MYSQL_HOME}/slave1/data:/var/lib/mysql
- ${MYSQL_HOME}/slave1/etc/conf.d:/etc/mysql/conf.d
command:
# 設(shè)置忽略大小寫
- --lower_case_table_names=1
# 設(shè)置默認(rèn)字符集
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_general_ci
# 設(shè)置最大接收的數(shù)據(jù)包
- --max_allowed_packet=128M
slave2:
restart: always
image: ${MYSQL_VERSION}
container_name: ${SLAVE2}
environment:
# root密碼
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
# 使用環(huán)境變量設(shè)置MySQL的時(shí)區(qū)
TZ: Asia/Shanghai
links:
- ${MASTER}
ports:
- ${SLAVE2_PORT}:3306
volumes:
- ${MYSQL_HOME}/slave2/data:/var/lib/mysql
- ${MYSQL_HOME}/slave2/etc/conf.d:/etc/mysql/conf.d
command:
# 設(shè)置忽略大小寫
- --lower_case_table_names=1
# 設(shè)置默認(rèn)字符集
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_general_ci
# 設(shè)置最大接收的數(shù)據(jù)包
- --max_allowed_packet=128M
在docker-compose.yml文件中,定義了3個(gè)MySQL容器,其中2個(gè)slave容器使用links關(guān)聯(lián)了master容器,這樣可以在后續(xù)的操作中使用master主機(jī)名代替其ip地址。
在上面的配置文件,我們使用volumes選項(xiàng)將容器中的目錄掛載到本地。每個(gè)節(jié)點(diǎn)都有2個(gè)目錄,分別是:
-
data目錄,映射容器中/var/lib/mysql目錄,用于存儲(chǔ)MySQL實(shí)例 -
etc/conf.d目錄,映射容器中/etc/mysql/conf.d目錄,用于存儲(chǔ)MySQL的配置文件
1.2 設(shè)置MySQL配置文件
既然知道了MySQL的配置文件存放的地方,那么我們就可以設(shè)置MySQL的配置,讓其開(kāi)啟主從模塊。首先設(shè)置master的配置文件,在master目錄下創(chuàng)建etc/conf.d目錄。
# 創(chuàng)建conf.d目錄
mkdir -p master/etc/conf.d
# 編輯my.cnf配置文件
vim master/etc/conf.d/my.cnf
#my.cnf 內(nèi)容
[mysqld]
# 主服務(wù)器唯一ID
server-id=1
# 啟用binlog日志
log-bin=mysql-bin
# 要復(fù)制的數(shù)據(jù)庫(kù),這里的數(shù)據(jù)庫(kù)名為testdb,如果有多個(gè)庫(kù),可以設(shè)置多個(gè)binlog-do-db項(xiàng)
binlog-do-db=testdb
# 不需要復(fù)制的數(shù)據(jù)庫(kù)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
在master的配置文件中,我們?cè)O(shè)置的要復(fù)制的數(shù)據(jù)庫(kù)名為testdb,其他需要注意的是,在MySQL集群中server-id不能重復(fù),這里我們將master的server-id設(shè)置為1(后面的slave1設(shè)置為2,slave2設(shè)置為3)。
slave1的my.cnf文件在slave1/etc/conf.d目錄中(需要自己創(chuàng)建),配置如下:
[mysqld]
# 主服務(wù)器唯一ID
server-id=2
同理,slave2節(jié)點(diǎn)的my.cnf如下:
[mysqld]
# 主服務(wù)器唯一ID
server-id=3
1.3 運(yùn)行MySQL容器
通過(guò)上面的配置,我們就可以通過(guò)docker-compose 啟動(dòng)MySQL容器了,不過(guò),在啟動(dòng)之前,我們先來(lái)看看目錄的結(jié)構(gòu):
? mysql tree -a .
.
├── .env # docker-compose 環(huán)境變量文件
├── docker-compose.yml # docker-compose 配置文件
├── master
│ └── etc
│ └── conf.d
│ └── my.cnf # mysql配置文件
├── slave1
│ └── etc
│ └── conf.d
│ └── my.cnf # mysql配置文件
└── slave2
└── etc
└── conf.d
└── my.cnf # mysql配置文件
9 directories, 5 files
在mysql根目錄中執(zhí)行如下語(yǔ)句,docker-compose會(huì)在當(dāng)前目錄中讀取.evn和docker-compose.yml文件來(lái)啟動(dòng)docker容器。
? mysql docker-compose up -d
Creating network "mysql_default" with the default driver
Creating master ... done
Creating slave1 ... done
Creating slave2 ... done
docker-compose up 命令是啟動(dòng)容器,-d選項(xiàng)表示后臺(tái)運(yùn)行容器,如果要關(guān)閉容器使用docker-compose down命令。使用tree命令查看目錄結(jié)構(gòu)
? mysql tree -adL 2 .
.
├── master
│ ├── data # 數(shù)據(jù)庫(kù)掛載點(diǎn)
│ └── etc
├── slave1
│ ├── data # 數(shù)據(jù)庫(kù)掛載點(diǎn)
│ └── etc
└── slave2
├── data # 數(shù)據(jù)庫(kù)掛載點(diǎn)
└── etc
9 directories
可以看到目錄中多了一個(gè)data目錄,該目錄是我們?cè)谂渲梦募型ㄟ^(guò)volumes選項(xiàng)映射出來(lái)的容器卷,它將容器中的數(shù)據(jù)庫(kù)文件保存在本地目錄,避免容器銷毀后,數(shù)據(jù)也跟著銷毀。
1.4 初始化MySQL集群
現(xiàn)在,容器已經(jīng)啟動(dòng)了。之前我們?cè)?code>my.cnf配置中做了一部分集群的設(shè)置,但僅僅設(shè)置集群中的每個(gè)節(jié)點(diǎn)id,并開(kāi)啟了master主機(jī)的binary log日志。我們還需要解決的是:
- master節(jié)點(diǎn)允許什么用戶復(fù)制哪些數(shù)據(jù)庫(kù)
- slave節(jié)點(diǎn)通過(guò)什么用戶到哪里去復(fù)制數(shù)據(jù)庫(kù)
登錄master節(jié)點(diǎn),使用grant語(yǔ)句,將所有數(shù)據(jù)庫(kù)的所有對(duì)象的replication slave 權(quán)限,授權(quán)給slave用戶,并且slave用戶可以使用網(wǎng)絡(luò)地址訪問(wèn),其密碼是123456。
mysql> grant replication slave on *.* to 'slave'@'%' identified by '123456';
Query OK, 0 rows affected (0.01 sec)
查看master狀態(tài):
mysql> show master status;
+------------------+----------+--------------+--------------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+--------------------------+-------------------+
| mysql-bin.000003 | 430 | testdb | mysql,information_schema | |
+------------------+----------+--------------+--------------------------+-------------------+
1 row in set (0.00 sec)
記住文件File和Position參數(shù)的值,F(xiàn)ile參數(shù)是binlog日志的文件,也是slave要拷貝的文件。position代表要slave拷貝的起點(diǎn),如果在maste上執(zhí)行SQL語(yǔ)句,Position的值會(huì)發(fā)生變化,所以確定了position后,先暫時(shí)不要操作master。
登錄slave節(jié)點(diǎn),使用如下語(yǔ)句配置slave節(jié)點(diǎn)的連接信息,包括登錄master的用戶名、密碼、端口信息,以及剛剛在master上查詢的file和position參數(shù)。
change master to master_host='master',
master_user='slave',
master_password='123456',
master_port=3306,
master_log_file='mysql-bin.000003',
master_log_pos= 430,
master_connect_retry=30;
因?yàn)樵赿ocker-compose.yml中使用了link,所以這里的master_host 參數(shù)使用的是master的主機(jī)名。查看slave狀態(tài):
mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: master
Master_User: slave
Master_Port: 3306
Connect_Retry: 30
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 430
Relay_Log_File: 9e185c56ef5e-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: No
Slave_SQL_Running: No
...
我們僅僅是設(shè)置了連接信息,還沒(méi)有啟動(dòng)slave,所以可以看到Slave_IO_Running和Slave_SQL_Running兩個(gè)線程都是No狀態(tài)。執(zhí)行start slave語(yǔ)句:
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
啟動(dòng)slave后,Slave_IO_Running和Slave_SQL_Running兩個(gè)線程都是Yes狀態(tài)。
到此,MySQL集群已搭建完成。Master創(chuàng)建testdb庫(kù)后,slave會(huì)同步該庫(kù)。
2 搭建MyCAT中間件
Mycat是使用Java語(yǔ)言進(jìn)行編寫開(kāi)發(fā),使用前需要先安裝Java運(yùn)行環(huán)境(JRE),由于Mycat中使用了jdk7中的一些特性,所以要求必須在JDK7以上的版本上運(yùn)行。
使用Mycat可以:
- 數(shù)據(jù)庫(kù)分片(垂直和水平)
- 讀寫分離
本文只涉及到讀寫分離特性,更多的內(nèi)容可參考MyCAT官網(wǎng) 。
2.1 目錄準(zhǔn)備
在mysql目下創(chuàng)建一個(gè)mycat目錄,作為mycat節(jié)點(diǎn)的根目錄,用于存放Mycat配置和日志等數(shù)據(jù)。我們使用DockerFile文件生成Mycat鏡像,所以需要?jiǎng)?chuàng)建Dockerfile文件。同時(shí),到Mycat官網(wǎng)下載Mycat安裝包(這里重命名為Mycat.tar.gz),地址如下:
http://dl.mycat.org.cn/1.6.7.4/Mycat-server-1.6.7.4-release/Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz
目錄結(jié)構(gòu)如下:
? mycat tree -L 1
.
├── Dockerfile # dockerfile 文件
└── mycat.tar.gz # mycat 安裝包
因?yàn)楹竺鎲?dòng)mycat容器時(shí),我們需要將mycat的配置文件目錄conf作為數(shù)據(jù)卷掛載到容器中,所以這里需要先將mycat安裝包解壓,并復(fù)制配置文件目錄。
# 解壓mycat.tar.gz,解壓后的目錄為mycat
? mycat tar -zxf mycat.tar.gz
# 移動(dòng)mycat/conf目錄到根目錄的conf
? mycat mv mycat/conf conf
# 刪除mycat目錄
? mycat rm -rf mycat
創(chuàng)建一個(gè)logs目錄,用于存放mycat日志。
? mycat mkdir logs
目錄完成后,結(jié)構(gòu)如下:
? mycat tree -L 1
.
├── Dockerfile # dockerfile文件
├── conf # mycat配置文件目錄
├── logs # mycat日志目錄
└── mycat.tar.gz # mycat安裝包
2.2 制作Dockerfile文件
編輯Dockerfile文件,內(nèi)容如下
FROM openjdk:8
ADD ./mycat.tar.gz /usr/local/
ENV MYCAT_HOME=/usr/local/mycat
EXPOSE 8066 9066
CMD ["/usr/local/mycat/bin/mycat", "console","&"]
使用openjdk:8作為基礎(chǔ)鏡像,將mycat根目錄的安裝文件添加到鏡像的/usr/local目錄下,因?yàn)槭褂昧?code>ADD命令,壓縮包會(huì)自動(dòng)解壓,設(shè)置環(huán)境變量MYCAT_HOME,暴露端口8066和9066,8066是客戶端使用端口,9066為mycat管理端口。默認(rèn)提供一個(gè)啟動(dòng)命令,使用 console選項(xiàng)運(yùn)行在前臺(tái),保證容器啟動(dòng)后不會(huì)被退出。
2.3 配置Mycat
在mycat的配置在conf目錄下:
- server.xml 配置文件包含了mycat服務(wù)器參數(shù),以及用戶授權(quán)信息
- schema.xml 配置文件包含,邏輯庫(kù)、邏輯表以及分片的定義
- rule.xml 配置文件包含,分片規(guī)則的配置
2.3.1 配置schema.xml
配置mycat/conf/schema.xml文件:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1" >
</schema>
<dataNode name="dn1" dataHost="localhost1" database="testdb" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="master:3306" user="root" password="123456" >
<readHost host="hostS1" url="slave1:3306" user="root" password="123456" />
<readHost host="hostS2" url="slave2:3306" user="root" password="123456" />
</writeHost>
</dataHost>
</mycat:schema>
以上是schema的配置,更多配置可以參考官網(wǎng)mycat權(quán)威指南第7章。
schema標(biāo)簽定義邏輯庫(kù)
schema 標(biāo)簽用于定義 MyCat 實(shí)例中的邏輯庫(kù)
-
name屬性為邏輯庫(kù)取名,這里為TESTDB -
checkSQLschema屬性表示是否會(huì)去掉sql語(yǔ)句的schema前綴 -
sqlMaxLimit屬性,當(dāng)sql語(yǔ)句沒(méi)有設(shè)置limit時(shí),會(huì)默認(rèn)加上 limit 100,防止查詢過(guò)多的結(jié)果 -
dataNode屬性用于指定邏輯庫(kù)要綁定到那個(gè)dataNode數(shù)據(jù)節(jié)點(diǎn)上。值為dataNode的name,一個(gè)邏輯庫(kù)只能綁定到一個(gè)數(shù)據(jù)節(jié)點(diǎn)上。
schema邏輯庫(kù)標(biāo)簽中還可以定義邏輯表table標(biāo)簽,一個(gè)邏輯表可以指定多個(gè)數(shù)據(jù)節(jié)點(diǎn),這里沒(méi)有配置。
dataNode標(biāo)簽定義數(shù)據(jù)節(jié)點(diǎn)
數(shù)據(jù)節(jié)點(diǎn)就是一個(gè)數(shù)據(jù)分片,dataNode主要是向schema標(biāo)簽和table標(biāo)簽提供引用。dataNode數(shù)據(jù)節(jié)點(diǎn)共3個(gè)屬性:
-
name屬性,為數(shù)據(jù)節(jié)點(diǎn)提供一個(gè)名字,方便schema和table引用。 -
dataHost屬性,表示該數(shù)據(jù)節(jié)點(diǎn)對(duì)應(yīng)的dataHost數(shù)據(jù)主機(jī)標(biāo)簽,值為dataHost標(biāo)簽的name屬性 -
database屬性,指定到MySQL實(shí)例的具體數(shù)據(jù)庫(kù)上,因?yàn)榍懊嫖覀冊(cè)诖罱∕ySQL集群時(shí),使用的是testdb數(shù)據(jù)庫(kù),所以這里的值為testdb。
dataHost標(biāo)簽定義數(shù)據(jù)主機(jī)
dataHost代表多個(gè)MySQL實(shí)例的集合,這些數(shù)據(jù)庫(kù)實(shí)例包括寫主機(jī)(master,定義在writeHost上)和讀主機(jī)(slave,定義在readHost上)。
-
name屬性,指定數(shù)據(jù)主機(jī)的名稱,方便dataNode引用。 -
maxConMySQL實(shí)例連接池的最大連接數(shù) -
minConMySQL實(shí)例連接池的最小連接數(shù) -
balance屬性表示負(fù)載均衡的類型-
balance = "0"不開(kāi)啟讀寫分離,所有的讀寫操作都發(fā)到送寫主機(jī)上 -
balance = "1"開(kāi)啟讀寫分離(常用),所有寫操作都發(fā)送給第一個(gè)寫主機(jī)上(如果定義了多個(gè)寫主機(jī),后備寫主機(jī) stand by writeHost),所有的讀操作通過(guò)負(fù)載均衡分配到其他主機(jī),即所有的readHost和后備寫主機(jī)。 -
balance = "2"開(kāi)啟讀寫分離,所有寫操作都發(fā)送到寫主機(jī)上,讀操作隨機(jī)到所有主機(jī)上。也就是說(shuō),寫主機(jī)也要承擔(dān)讀的任務(wù)。 -
balance = "3"開(kāi)啟讀寫分離,讀操作隨機(jī)到讀主機(jī)上。
-
-
writeType屬性,表示寫主機(jī)的類型-
writeType="0"所有寫操作發(fā)送到配置的第一個(gè) writeHost,第一個(gè)掛了切到還生存的第二個(gè) writeHost, 重新啟動(dòng)后以切換后的為準(zhǔn)。 -
writeType="1"所有寫操作都隨機(jī)的發(fā)送到配置的 writeHost(已廢棄)
-
-
switchType屬性,寫主機(jī)切換方式- -1 表示不自動(dòng)切換。
- 1 默認(rèn)值,自動(dòng)切換。
- 2 基于 MySQL 主從同步的狀態(tài)決定是否切換。
heartbeat標(biāo)簽定義心跳檢測(cè)
這個(gè)標(biāo)簽內(nèi)指明用于和后端數(shù)據(jù)庫(kù)進(jìn)行心跳檢查的語(yǔ)句。例如,MYSQL 可以使用 select user(),Oracle 可以 使用 select 1 from dual 等。
writeHost 標(biāo)簽定義寫主機(jī)
-
host屬性,定義寫主機(jī)名稱,一般Master主機(jī)名為為*M1,讀主機(jī)命名*S1 -
url屬性,后端實(shí)例連接地址,如果是使用 native 的 dbDriver,則一般為 address:port 這種形式。用 JDBC 或其他的 dbDriver,則需要特殊指定。當(dāng)使用 JDBC 時(shí)則可以這么寫:jdbc:mysql://localhost:3306/。因?yàn)檫@里我們使用docker-compose啟動(dòng)Mycat容器,所以地址可以用主機(jī)名代理,這里master:3306表示master數(shù)據(jù)庫(kù)容器。 -
user和password是數(shù)據(jù)庫(kù)實(shí)例的用戶名密碼。
readHost標(biāo)簽定義讀主機(jī),其屬性與writeHost標(biāo)簽相同,需要注意的是,readHost是包裹在writeHost標(biāo)簽內(nèi)。
2.3.2 配置server.xml
server.xml 保存了所有 mycat 需要的系統(tǒng)配置信息,這里我們只關(guān)系user標(biāo)簽。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<!--上面的內(nèi)容省略-->
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
<property name="defaultSchema">TESTDB</property>
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
<property name="defaultSchema">TESTDB</property>
</user>
</mycat:server>
默認(rèn)情況,mycat為我們創(chuàng)建了兩個(gè)用戶,root和user,root的密碼為123456。shecma屬性表示該用戶能夠操作的邏輯數(shù)據(jù)庫(kù),對(duì)應(yīng)的是schema.xml的schema標(biāo)簽中的name值,這里是TESTDB。如果有多個(gè)數(shù)據(jù)庫(kù),這里需要配置多個(gè)schema屬性。
2.4 修改docker-compose配置文件
回到mysql目錄,編輯 .env 環(huán)境變量文件,添加mycat根目錄以方面docker-compose.yml文件調(diào)用
# 在.env 文件中添加MYCAT_HOME變量,指定mycat的家目錄
# mycat 配置
MYCAT_HOME=/Users/zebra/docker/mysql/mycat
編輯 docker-compose.yml 配置文件
version: '3'
services:
master: ...
slave1: ...
slave2: ...
mycat:
restart: always
build: ./mycat
image: mycat:v1
container_name: mycat
links:
- ${MASTER}
- ${SLAVE1}
- ${SLAVE2}
ports:
- 8066:8066
- 9066:9066
volumes:
- ${MYCAT_HOME}/conf:/usr/local/mycat/conf
- ${MYCAT_HOME}/logs:/usr/local/mycat/logs
在services中,增加mycat節(jié)點(diǎn),build選項(xiàng)指定Dockerfile文件地址,這里使用相對(duì)路徑,表示在當(dāng)前yml配置文件目錄中的mycat目錄里。image為構(gòu)建后的鏡像名稱(如果沒(méi)有改鏡像就構(gòu)建,有就直接調(diào)用該鏡像)。links選項(xiàng)表示mycat容器需要連接master,slave1和slave2容器(前面我們?cè)趍ycat的schema.xml的配置中使用到了這些容器)。volumes 將本地?cái)?shù)據(jù)卷掛載到容器中,這里掛載了配置目錄和日志目錄。
3 啟動(dòng)MySQL集群
現(xiàn)在,已經(jīng)配置好了Mycat,我們使用docker-compose up -d 啟動(dòng)所有容器。如果之前啟動(dòng)過(guò),使用docker-compose down 停止后在啟動(dòng)。
? mysql docker-compose up -d
Creating network "mysql_default" with the default driver
Building mycat
Step 1/5 : FROM openjdk:8
---> b190ad78b520
Step 2/5 : ADD ./mycat.tar.gz /usr/local/
---> 7561bd31c7c9
Step 3/5 : ENV MYCAT_HOME=/usr/local/mycat
---> Running in a6ed86e20223
Removing intermediate container a6ed86e20223
---> 2aa61a702465
Step 4/5 : EXPOSE 8066 9066
---> Running in 164d908610bb
Removing intermediate container 164d908610bb
---> ee971db034c9
Step 5/5 : CMD ["/usr/local/mycat/bin/mycat", "console","&"]
---> Running in 2518532eaa00
Removing intermediate container 2518532eaa00
---> 03b97ffc1ad2
Successfully built 03b97ffc1ad2
Successfully tagged mycat:v1
WARNING: Image for service mycat was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating master ... done
Creating slave1 ... done
Creating slave2 ... done
Creating mycat ... done
可以看到,在啟動(dòng)時(shí),因?yàn)楸镜貨](méi)有 mycat:v1 的鏡像,所以,compose會(huì)先構(gòu)建該鏡像。如果mycat的鏡像已存在,docker-compose會(huì)直接使用該鏡像,如果修改了進(jìn)行的Dockerfile文件,可以使用docker-compose build 重新構(gòu)建,或在啟動(dòng)時(shí),通過(guò)--build選項(xiàng)重新構(gòu)建。
外部程序可以通過(guò)8066端口連接Mycat中間件的邏輯庫(kù)TESBD。
4 添加phpmyadmin應(yīng)用
在docker-compose.yml中添加phpmyadmin應(yīng)用
version: '3'
services:
master: ...
slave1: ...
slave2: ...
mycat: ...
phpmyadmin:
restart: always
image: phpmyadmin/phpmyadmin:5.0
container_name: myadmin
links:
- master
ports:
- 7500:80
environment:
PMA_PORT: 3306
PMA_HOST: master
phpmyadmin使用5.0target,連接master容器,并80端口與宿主機(jī)的7500端口相連接。這里需要注意的是,phpmyadmin如果直接連接mycat中間件,不能正常工作,需要連接mysql容器。