上一節,經過使用overlay網絡,搭建了跨主機的docker容器集羣。下面,在這個跨主機的docker容器集羣環境下,搭建mysql 數據庫集羣。html
從數據安全性考慮,對數據庫的數據進行及時備份很是重要。mysql就提供了主從備份的機制,從數據庫會很是及時的將主數據庫的操做更新到從庫上,從而當主數據庫down掉以後,數據不會丟失;同時,也能夠經過keepalived等程序來實現主庫down掉以後,迅速將數據訪問服務切換到從庫,從而儘量維護數據庫服務的不間斷運行。java
Mycat是一個完全開源的新穎的數據庫中間件產品。它的出現將完全結束數據庫的瓶頸問題,從而使數據庫的高可用,高負載成爲可能。Mycat功能強大,這裏實現利用Mycat來實現主從數據庫的讀寫分離和自動切換。node
使用兩臺物理機器dev-11, dev-12上的兩個container,一個container做爲mysql master,另外一個做爲slave
1. 搭建跨主機的docker 網絡docker network create -d overlay multihost
並建立container-control 容器,用於鏈接數據庫測試。docker create --name container-contorl --net multihost centos:7 bash
2. 下載鏡像docker pull mysql:5.7
3. 在本地建立文件夾,將數據庫數據存放在本地/home/skc/workspace/gradute_design/docker_data/mysql
4. 建立容器
在dev-11上部署mysql-master容器mysql
docker create -it --name mysql-master \
--net multihost \
-v /home/skc/workspace/graduate_design/docker_data/mysql/data:/var/lib/mysql \ -v /home/skc/workspace/graduate_design/docker_data/mysql/conf.d:/etc/mysql/conf.d \ -e MYSQL_ROOT_PASSWORD=root mysql:5.7 bash
在dev-12上部署mysql-slave容器linux
docker create -it --name mysql-slave \
--net multihost \
-v /home/skc/workspace/graduate_design/docker_data/mysql/data:/var/lib/mysql \ -v /home/skc/workspace/graduate_design/docker_data/mysql/conf.d:/etc/mysql/conf.d \ -e MYSQL_ROOT_PASSWORD=root mysql:5.7 bash
其中,將mysql的數據文件放在 /home/skc/workspace/graduate_design/docker_data/mysql/data 目錄下(經過volume映射)
mysql的配置文件放在 /home/skc/workspace/graduate_design/docker_data/mysql/conf.d 目錄下,用於配置主從數據庫sql
在dev-11上的 /home/skc/workspace/graduate_design/docker_data/mysql/conf.d/ 目錄下,配置文件 101.cnf docker
[mysqld] log-bin=mysql-bin server-id=101
在dev-12上的 /home/skc/workspace/graduate_design/docker_data/mysql/conf.d/ 目錄下,配置文件 102.cnf數據庫
[mysqld] log-bin=mysql-bin server-id=102
5. 配置數據庫
在dev-11和dev-12上分別啓動 docker start mysql-master/mysql-slave
從container-control容器中鏈接到mysql-master,查看信息centos
MySQL [(none)]> show master status;
+------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000005 | 154 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
從container-control容器中鏈接到mysql-slave,進行設置安全
mysql\> change master to master_host=‘10.0.0.5’, master_user='root', master_password='root', master_log_file='mysql-bin.000005',master_log_pos=154; mysql\> start slave;
(建立好以後,會發現master和slave之間會同步,好比master中建立數據庫,slave中也會自動建立,在master中更改數據,slave中也會自動修改)
使用docker容器來運行mycat。
1. 編寫Dockerfile
############################################
# version : debugman007/c7-mycat:v1
# desc : centos7 上安裝的mycat
############################################
# 設置繼承自 centos7 官方鏡像
FROM centos:7 RUN echo "root:root" | chpasswd RUN yum -y install net-tools # install java ADD http://mirrors.linuxeye.com/jdk/jdk-7u80-linux-x64.tar.gz /usr/local/ RUN cd /usr/local && tar -zxvf jdk-7u80-linux-x64.tar.gz && rm -f jdk-7u80-linux-x64.tar.gz ENV JAVA_HOME /usr/local/jdk1.7.0_80 ENV CLASSPATH ${JAVA_HOME}/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV PATH $PATH:${JAVA_HOME}/bin #install mycat ADD http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz /usr/local RUN cd /usr/local && tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz && rm -f Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz VOLUME /usr/local/mycat/conf EXPOSE 8066 9066 CMD ["/usr/local/mycat/bin/mycat", "console"]
2. 建立鏡像# docker build -t debugman007/c7-mycat .
3. 建立容器
#docker create --name mysql-mycat --net multihost \ -v /home/skc/workspace/graduate_design/docker_data/mycat/conf:/usr/local/mycat/conf \ -v /home/skc/workspace/graduate_design/docker_data/mycat/logs:/usr/local/mycat/logs \ -p 8066:8066 -p 9066:9066 \ debugman007/c7-mycat:v1
4. 配置mycat
將 Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz 解壓以後,把mycat/conf 中的內容拷貝到 /home/skc/workspace/graduate_design/docker_data/mycat/conf 中,修改server.xml
<user name="root"> <property name="password">root</property> <property name="schemas">TESTDB</property> <!-- 表級 DML 權限設置 --> <!-- <privileges check="false"> <schema name="TESTDB" dml="0110" > <table name="tb01" dml="0000"></table> <table name="tb02" dml="1111"></table> </schema> </privileges> --> </user> <user name="user"> <property name="password">user</property> <property name="schemas">TESTDB</property> <property name="readOnly">true</property> </user>
配置root和user用戶的密碼和邏輯庫。
修改 schema.xml 配置datanode。
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"> <table name="students_score" type="global" dataNode="dn1" /> </schema> <dataNode name="dn1" dataHost="localhost1" database="db1" /> <dataNode name="dn2" dataHost="localhost1" database="db2" /> <dataNode name="dn3" dataHost="localhost1" database="db3" /> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> <writeHost host="mysql-master" url="10.0.0.5:3306" user="root" password="root"> <!-- can have multi read hosts --> <readHost host="mysql-slave" url="10.0.0.6:3306" user="root" password="root" /> </writeHost> <writeHost host="mysql-slave" url="10.0.0.6:3306" user="root" password="root"> </writeHost> </dataHost>
主備自動切換測試
此時,能夠經過mycat中間件來對數據庫進行讀寫操做,其中8066端口是對數據進行操做,9066端口是控制端口。
[root@0bef73420229 /]# mysql -uroot -p -hmysql-mycat -P8066 Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 7 Server version: 5.6.29-mycat-1.6-RELEASE-20161028204710 MyCat Server (OpenCloundDB) Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL [(none)]>
此時,經過mysql-mycat 接口進行數據庫的修改操做,在mysql-mater和mysql-slave中都能看到。
當把mysql-master關閉以後,在mycat 9066端口進去,查看數據庫狀態,發現mysql-master關掉。
MySQL [(none)]> show @@heartbeat; +--------------+-------+----------+------+---------+-------+--------+---------+--------------+---------------------+-------+ | NAME | TYPE | HOST | PORT | RS_CODE | RETRY | STATUS | TIMEOUT | EXECUTE_TIME | LAST_ACTIVE_TIME | STOP | +--------------+-------+----------+------+---------+-------+--------+---------+--------------+---------------------+-------+ | mysql-master | mysql | 10.0.0.5 | 3306 | -2 | 0 | idle | 0 | 1,0,51 | 2017-02-23 03:57:02 | false | | mysql-slave | mysql | 10.0.0.6 | 3306 | 1 | 0 | idle | 0 | 1,1,1 | 2017-02-23 03:57:22 | false | | mysql-slave | mysql | 10.0.0.6 | 3306 | 1 | 0 | idle | 0 | 0,1,1 | 2017-02-23 03:57:22 | false | +--------------+-------+----------+------+---------+-------+--------+---------+--------------+---------------------+-------+
此時,經過mycat修改數據庫仍能成功,由於數據庫服務已經切換到從庫mysql-slave了。
http://blog.yaodataking.com/2016/01/mycat_mysql_docker_sample1.html