docker应用-6(mysql+mycat 搭建数据库集群)

    上一节,通过使用overlay网络,搭建了跨主机的docker容器集群。下面,在这个跨主机的docker容器集群环境下,搭建mysql 数据库集群。

mysql主从自动备份和自动切换

    从数据安全性考虑,对数据库的数据进行及时备份非常重要。mysql就提供了主从备份的机制,从数据库会非常及时的将主数据库的操作更新到从库上,从而当主数据库down掉之后,数据不会丢失;同时,也可以通过keepalived等程序来实现主库down掉之后,迅速将数据访问服务切换到从库,从而尽可能维护数据库服务的不间断运行。

mycat 数据库中间件

    Mycat是一个彻底开源的新颖的数据库中间件产品。它的出现将彻底结束数据库的瓶颈问题,从而使数据库的高可用,高负载成为可能。Mycat功能强大,这里实现利用Mycat来实现主从数据库的读写分离和自动切换。

构建mysql主从结构

使用两台物理机器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容器

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容器

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 目录下,用于配置主从数据库

在dev-11上的 /home/skc/workspace/graduate_design/docker_data/mysql/conf.d/ 目录下,配置文件 101.cnf

[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,查看信息

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中也会自动修改)

搭建mycat

    使用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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容