docker搭建mysql读写分离

写在前面

当mysql数据量不大且达到读写瓶颈的时候,读的性能消耗远大于写,我们可以将读和写分离开。本实例采用docker容器搭建,通过mycat中间件做分发

准备mysql主从服务

  1. 准备mysql容器
$ docker pull mysql:5.7
  1. 创建主从数据映射目录
// 数据和配置不至于丢失
/usr/local/docker_app/mysql/master/conf.d
/usr/local/docker_app/mysql/slave/conf.d 
  1. 创建master配置文件/usr/local/docker_app/mysql/master/conf.d/my.cnf
[mysqld]
log-bin=master-bin
server-id=1
  1. 创建slave配置文件/usr/local/docker_app/mysql/slave/conf.d/my.cnf
[mysqld]
log-bin=slave-bin
server-id=2
  1. 启动master服务
$ docker run -d --name mysql-master \
    -p 3306:3306 \
    -v /usr/local/docker_app/mysql/master/conf.d/data:/var/lib/mysql \
    -v /usr/local/docker_app/mysql/master/conf.d:/etc/mysql/conf.d \
    -e MYSQL_ROOT_PASSWORD=root \
    -d mysql:5.7
  1. 启动slave服务
$ docker run -d --name mysql-slave \
    -p 3307:3306 \
    -v /usr/local/docker_app/mysql/slave/conf.d/data:/var/lib/mysql \
    -v /usr/local/docker_app/mysql/slave/conf.d:/etc/mysql/conf.d \
    -e MYSQL_ROOT_PASSWORD=root \
    -d mysql:5.7
  1. 进入容器修改master slave的读写权限
# 进入容器shell
$ docker exec -it mysql-master /bin/sh
// mysql shell
// 用户名:root
// 密码:root
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
  1. 进入mysql-master查看master状态
// mysql shell
show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| master-bin.000003 |     154  |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
  1. 获取master容器的host
$ docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-master
  1. 进入mysql-slave关联主从模式
// mysql shell
change master to master_host='172.17.0.2', master_user='root',master_password='root', master_log_file='master-bin.000003',master_log_pos=154;
// mysql shell
// 启用slave
start slave;
  1. 测试主从
    在master创建testdb数据库,再到slave中查看是否存在testdb库,若存在则基本完成,若未成功检查binlog、master host、position是否正确;目前已经可以给前台使用,只不过要区分读写数据源,挺麻烦!

mycat中间件代理mysql

  1. 准备mycat镜像
// jre8
http://download.oracle.com/otn-pub/java/jdk/8u152-b16/aa0333dd3019491ca4f6ddbe78cdb6d0/server-jre-8u152-linux-x64.tar.gz
# Dockerfile
FROM debian:jessie

# install jre
COPY server-jre-8u152-linux-x64.tar.gz /usr/local/
RUN cd /usr/local && tar -zxvf server-jre-8u152-linux-x64.tar.gz && rm -f server-jre-8u152-linux-x64.tar.gz

ENV JAVA_HOME /usr/local/jdk1.8.0_152
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"]
$ docker build -t mysql/mycat:1.6 .
  1. 创建mycat本地映射目录
/usr/local/docker_app/mycat/conf
/usr/local/docker_app/mycat/logs
  1. 解压mycat压缩包拷贝conf目录下文件到/usr/local/docker_app/mycat/conf
  2. 修改/usr/local/docker_app/mycat/conf/schema.xml文件
<!-- 第一种方案 master挂了slave不可用 -->

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">  
    </schema>
        <!-- testdb为库名称 -->
    <dataNode name="dn1" dataHost="localhost1" database="testdb" />

    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
              writeType="0" dbType="mysql" dbDriver="native" switchType="0"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <!-- can have multi write hosts -->
        <writeHost host="mysql-master" url="172.17.0.2:3306" user="root" password="root">
            <!-- can have multi read hosts -->
            <readHost host="mysql-slave" url="172.17.0.3:3306" user="root" password="root" />
        </writeHost>
    </dataHost>
</mycat:schema>
<!-- 第二种方案,master挂slave可自动切换,重启也会使用slave,原master为旧数据 -->

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">  
    </schema>
        <!-- testdb为库名称 -->
    <dataNode name="dn1" dataHost="localhost1" database="testdb" />

    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
              writeType="0" dbType="mysql" dbDriver="native" switchType="0"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <!-- can have multi write hosts -->
        <writeHost host="mysql-master" url="172.17.0.2:3306" user="root" password="root"></writeHost>

        <writeHost host="mysql-slave" url="172.17.0.3:3306" user="root" password="root"></writeHost>
    </dataHost>
</mycat:schema>
  1. 修改/usr/local/docker_app/mycat/conf/server.xml文件
<user name="root">
        <property name="password">root</property>
                <!-- 对应上面schema名称 -->
        <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>
  1. 启动mycat容器
# 8066:mysql协议端口
# 9066:管理端口
$ docker run -d --name mysql-mycat \
    -v /usr/local/docker_app/mycat/conf:/usr/local/mycat/conf  \
    -v /usr/local/docker_app/mycat/logs:/usr/local/mycat/logs \
    -p 8066:8066 -p 9066:9066 mysql/mycat:1.6
  1. mycat测试
    mysql工具链接mycat的8066端口,创建表插入数据之后,分别查看master和slave端数据变化;若不成功,查看mycat配置是否正确,注意ip地址为docker容器内部ip

写在最后

初次实验,若有误解欢迎指正!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容