• 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

  • 相关阅读:
    Python数据可视化的四种简易方法
    阿里如何将“高峰前扩容、高峰后缩容”的梦想照进现实?
    支付宝客户端架构解析:Android 容器化框架初探
    阿里工业互联网平台“思考”:一场从0到1的蜕变
    关于Flutter初始化流程,我必须告诉你的是...
    类在什么时候加载和初始化
    instanceof 与isAssignableFrom
    Java注释@interface的用法【转】
    网站过滤器Filter
    正则表达式
  • 原文地址:https://www.cnblogs.com/gtarcoder/p/6432906.html
Copyright © 2020-2023  润新知