依然如此,只要大家跟着我的步骤一步步来,99.99999%是可以测试成功的

centos6.8已不再维护,可能很多人的虚拟机中无法使用yum命令下载docker,

但是阿里源还是可以用的 因为他的centos-vault仓库里放了之前版本的centos的包

只需要在centos命令行界面下执行一下几条命令

sed -i "s|enabled=1|enabled=0|g" /etc/yum/pluginconf.d/fastestmirror.conf
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
curl -o /etc/yum.repos.d/CentOS-Base.repo https://www.xmpan.com/Centos-6-Vault-Aliyun.repo  yum clean all
yum makecache


然后执行如下命令安装docker


yum install https://get.docker.com/rpm/1.7.1/centos-6/RPMS/x86_64/docker-engine-1.7.1-1.el6.x86_64.rpm

如果提示检查软件失败什么的,可以试试使用命令 yum remove docker 删除docker,再执行安装

安装完成后可以给docker配置一下阿里云的加速器,具体方法自行百度,在此不再过多赘述

docker安装完成后开始准备搭建Mysql,我一直强调开发中应秉承约定>配置>编码,接下来就按部就班先准备环境:

我准备了两台虚拟机130(主),和131(从),首先在两台电脑上分别通过docker安装mysql

因为需要配置读写分离,一定要挂载mysql配置文件目录到主机

docker pull mysql:5.6 //拉取mysql镜像 docker run -p 3306:3306 --name mysql  -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6 docker cp containedID:/etc/mysql/my.cnf $PWD //拷贝一份容器内的配置文件

两台虚拟机执行相同的操作,配置主从Mysql的数据库版本最好一致

首先是主库的my.cnf的配置:

在mysql的配置文件的 [mysqld] 下面修改(从库也是如此):


#开启主从复制,主库的配置(log-bin属性在配置主从时才指定,单机不需要)

log-bin= mysql3306-bin

#指定主库serverid
#server-id 主库和从库都需要指定,不过主库的server-id必须小于从库的server-id(重要)
server-id=1 #指定同步的数据库,如果不指定则同步全部数据库(一般不需要指定)

#binlog-do-db=mybatis_1128

 #(配置文件中输入的这些命令一定要和下面有一行空格,不然MySQL不识别)


执行SQL语句查询状态:
SHOW MASTER STATUS


需要记录下Position值,需要在从库中设置同步起始值。(重要)

然后重启130(主),使配置文件生效

docker restart containerID

配置131(从)的my.cnf:

仅仅需要指定一个server-id=2即可

然后重启131(从),使配置文件生效


通过sqlyog连接两台mysql服务器(注意开放端口,笔者为了测试,直接停掉了防火墙)

接着在130(主)中输入以下命令:

GRANT REPLICATION SLAVE ON *.* TO 'slave01'@'192.168.209.131'IDENTIFIED BY '123456'; 

FLUSH PRIVILEGES;

意思是添加一个slave可以登入的用户,用户名为slave01,密码为123456,只有通过131(从),才可登入

完成后在131(从)中执行以下命令:

CHANGE MASTER TO
 MASTER_HOST='192.168.209.130',
 MASTER_USER='slave01',

 MASTER_PASSWORD='123456',

 MASTER_PORT=3306,

 MASTER_LOG_FILE='mysql3306-bin.000011',

 MASTER_LOG_POS=38301;
 START SLAVE;//开启主从配置
 SHOW SLAVE STATUS //查看主从配置状态信息

38301以及mysql3308-bin.000011对应130(主)中的position和file字段(重要)


如果 show slave status 后,slave_io_running 和slave_sql_running 值都为yes,则配置成功,

直接在130(主)上随便建个数据库,发现131(从)也生成了相同的数据库

到此,Mysql主从配置结束。

很多人配置完成后,就开始在代码中配置双数据源,通过代码来实现数据源的切换以达到读写分离的目的,我一直强调,约定>配置>编码,这种做法显然是不可取的,既然配置了主从,为什么不去选择一种高效明了的管理方式呢?

这就引出了这篇文章的重点:mycat

mycat是

1、一个彻底开源的,面向企业应用开发的大数据库集群

2、支持事务、ACID、可以替代MySQL的加强版数据库

3、一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群

4、一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server

5、结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品

6、一个新颖的数据库中间件产品

mycat就是为集群而生的,并能通过简单配置达到数据库分片的目的

  1. 下载安装Mycat  执行如下命令:
    docker pull longhronshens/mycat-docker
    
    mkdir -p /usr/local/mycat 
    
    cd /usr/local/mycat

    进入我们新建的mycat目录,将server.xml rule.xml schema.xml复制到该目录下,三个文件的基本内容如下:schema.xml

    "1.0"?>
    "schema.dtd">
    "http://io.mycat/">
    
        "TESTDB" checkSQLschema="false" sqlMaxLimit="100">
            
            "travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
    				
    "company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
    "goods" primaryKey="ID" type="global" dataNode="dn1,dn2" />
    "hotnews" primaryKey="ID" autoIncrement="true" dataNode="dn1,dn2,dn3" rule="mod-long" />
    "employee" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile" />
    "customer" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile"> "orders" primaryKey="ID" joinKey="customer_id" parentKey="id"> "order_items" joinKey="order_id" parentKey="id" /> "customer_addr" primaryKey="ID" joinKey="customer_id" parentKey="id" />
    "dn1" dataHost="localhost1" database="db1" /> "dn2" dataHost="localhost1" database="db2" /> "dn3" dataHost="localhost1" database="db3" /> "localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> select user() "hostM1" url="192.168.209.130:3306" user="root" password="123456"> "hostS2" url="192.168.209.130:3306" user="root" password="123456" /> "hostS1" url="192.168.209.130:3306" user="root" password="123456" />

    server.xml

    "1.0" encoding="UTF-8"?>
    
    "server.dtd">
    "http://io.mycat/">
        
        "useSqlStat">0  
        "useGlobleTableCheck">0  
    
            "sequnceHandlerType">2
           
             
        
        
            
            "processorBufferPoolType">0
            
            
            
            
            
            
            
            
            "handleDistributedTransactions">0
            
                
            "useOffHeapForMerge">1
    
            
            "memoryPageSize">1m
    
            
            "spillsFileBufferSize">1k
    
            "useStreamOutput">0
    
            
            "systemReserveMemorySize">384m
    
    
            
            "useZKSwitch">true
    
    
        
        
        
        
        
        "root">
            "password">123456
            "schemas">TESTDB
            
            
            
        
    
        "user">
            "password">user
            "schemas">TESTDB
            "readOnly">true
        
    
    

    rule.xml

    "1.0" encoding="UTF-8"?>
    
    "rule.dtd">
    "http://io.mycat/">
        "rule1">
            
                id
                func1
            
        
    
        "rule2">
            
                user_id
                func1
            
        
    
        "sharding-by-intfile">
            
                sharding_id
                hash-int
            
        
        "auto-sharding-long">
            
                id
                rang-long
            
        
        "mod-long">
            
                id
                mod-long
            
        
        "sharding-by-murmur">
            
                id
                murmur
            
        
        "crc32slot">
            
                id
                crc32slot
            
        
        "sharding-by-month">
            
                create_time
                partbymonth
            
        
        "latest-month-calldate">
            
                calldate
                latestMonth
            
        
        
        "auto-sharding-rang-mod">
            
                id
                rang-mod
            
        
        
        "jch">
            
                id
                jump-consistent-hash
            
        
    
        "murmur" class="io.mycat.route.function.PartitionByMurmurHash">
            "seed">0
            "count">2
            "virtualBucketTimes">160
            
            
        
    
        "crc32slot" class="io.mycat.route.function.PartitionByCRC32PreSlot">
            "count">2
        
        "hash-int" class="io.mycat.route.function.PartitionByFileMap">
            "mapFile">partition-hash-int.txt
        
        "rang-long" class="io.mycat.route.function.AutoPartitionByLong">
            "mapFile">autopartition-long.txt
        
        "mod-long" class="io.mycat.route.function.PartitionByMod">
            
            "count">3
        
    
        "func1" class="io.mycat.route.function.PartitionByLong">
            "partitionCount">8
            "partitionLength">128
        
        "latestMonth" class="io.mycat.route.function.LatestMonthPartion">
            "splitOneDay">24
        
        "partbymonth" class="io.mycat.route.function.PartitionByMonth">
            "dateFormat">yyyy-MM-dd
            "sBeginDate">2015-01-01
        
        
        "rang-mod" class="io.mycat.route.function.PartitionByRangeMod">
                "mapFile">partition-range-mod.txt
        
        
        "jump-consistent-hash" class="io.mycat.route.function.PartitionByJumpConsistentHash">
            "totalBuckets">3
        
    

    启动mycat

    docker run --name mycat -v /usr/local/mycat/schema.xml:/usr/local/mycat/conf/schema.xml -v /usr/local/mycat/rule.xml:/usr/local/mycat/conf/rule.xml -v /usr/local/mycat/server.xml:/usr/local/mycat/conf/server.xml  --privileged=true -p 8066:8066 -p 9066:9066 -e MYSQL_ROOT_PASSWORD=123456  -d longhronshens/mycat-docker 


  2. 配置mycat mycat正常启动后就可以开始配置mycat关于Mysql的集群配置了 首先是schema.xml中的配置:
     "TESTDB" checkSQLschema="false" sqlMaxLimit="100">//一个schema标签就是一个逻辑库,是我们连接mycat所要查询的库,对应于Mysql物理库中的database name:库名称 checkSQLschema:mycat对sql语句的过滤策略 
                    "company" dataNode="dn1,dn2,dn3" rule="crc32slot" type="global" /> //一个table就是一个逻辑表,表名称为company,dataNode为库节点,需要配置分片就写多个,用逗号隔开,没有分片就写一个,rule为分片策略,对应于rule.xml中的策略
     //type="global"为全局策略,亲自测试配置上这个属性后,数据将会重复插入所有的db1,db2,db3中,分片不起作用
    				

    //database对应物理数据库 name对应上边schema节点的dataNode属性

    writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> //writeType属性

    负载均衡类型,目前的取值有3种: 1. writeType="0", 所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties . 2. writeType="1",所有写操作都随机的发送到配置的writeHost。 3. writeType="2",没实现。

    1.当balance=0 时,不开启读写分离,所有读操作都发生在当前的writeHost上

    当balance=1 ,所有读操作都随机发送到当前的writeHost对应的readHost和备用的writeHost 一般配置读写分离balance值为1即可

    当balance=2,所有的读操作都随机发送到所有的writeHost,readHost上

    当balance=3 ,所有的读操作都只发送到writeHost的readHost上 select user() password="123456"> //130(主) 写操作 //131(从) 读操作

    然后是server.xml的配置

       "root">
                    "password">123456 //mycat对外提供服务的用户名和密码,使用Mycat后,就直接将mycat当成mysql使用即可
                    "schemas">TESTDB //逻辑库名称对应schema.xml中的名字
    
                    
                    
            

    rule.xml

     "crc32slot" class="io.mycat.route.function.PartitionByCRC32PreSlot">
                    "count">3
            


  3. 配置130(主),131(从)数据库  在130(主)上新建db1,db2,db3三个数据库(mycat只能新建表,无法新建数据库,表也必须是schema.xml中指定过的table)
  4. 测试mycat  我的mycat与130(主)是同一台虚拟机,在130(主)上重新启动Mycat,使配置文件生效(schema.xml 中 去掉type="global"属性)


    mycat对外提供服务的默认端口号为8066
    在mycat中创建表:
    CREATE TABLE `company`  (
      `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
      `username` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户名',
      `password` VARCHAR(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '密码,加密存储',
      `phone` VARCHAR(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '注册手机号',
      `email` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '注册邮箱',
      `created` DATETIME(0) NOT NULL,
      `updated` DATETIME(0) NOT NULL,
      PRIMARY KEY (`id`)
    );

    在Mycat中插入数据:

    INSERT INTO company(id,username) VALUES('1','张飞');
    INSERT INTO company(id,username) VALUES('2','樊哙');
    INSERT INTO company(id,username) VALUES('3','曹操');
    INSERT INTO company(id,username) VALUES('4','刘备');
    INSERT INTO company(id,username) VALUES('5','庞统');
    INSERT INTO company(id,username) VALUES('6','许诸');
    INSERT INTO company(id,username) VALUES('7','赵云');
    INSERT INTO company(id,username) VALUES('8','关羽');
    
    INSERT INTO company(id,username) VALUES('9','关羽1');
    
    INSERT INTO company(id,username) VALUES('10','关羽2');
    
    INSERT INTO company(id,username) VALUES('11','关羽3');
    
    INSERT INTO company(id,username) VALUES('12','关羽4');
    
    INSERT INTO company(id,username) VALUES('13','关羽5');


  5. 然后查看130(主)数据库数据:

    db1:

    db2:


    mycat中执行查询 select * from company:


    数据都能查出来,没有问题

    接下来在131(从)db1插入一条数据,这时130(主)中没有该条数据,继续在mycat中执行查询select * from company;


    查出来了该test数据,说明读写分离配置成功。


docker+mysql集群+读写分离+mycat管理+垂直分库+负载均衡的更多相关文章

  1. 白日梦的Elasticsearch系列笔记(一)基础篇

    目录一、导读1.1、认识ES1.2、安装、启动ES、Kibana、IK分词器二、核心概念2.1、Near Realt......

  2. MySQL多版本并发控制——MVCC机制分析

    MVCC,即多版本并发控制(Multi-Version Concurrency Control)指的是,通过版本链维......

  3. docker+mysql集群+读写分离+mycat管理+垂直分库+负载均衡

    依然如此,只要大家跟着我的步骤一步步来,99.99999%是可以测试成功的centos6.8已不再维护,可能很多人的......

  4. 详解MySQL与Spring的自动提交(autocommit)

    1 MySQL的autocommit设置MySQL默认是开启自动提交的,即每一条DML(增删改)语句都会被作为一个单......

  5. MYSQL 字符集设置(终端的字符集)

    每次利用终端 创建数据库或者创建表的时候,字符集都是latin1(不指定字符集的时候)如下:查看当前数据库的字符集c......

  6. MySQL数据类型全解析

    数据类型:定义列中可以存储什么数据以及该数据实际怎样存储的基本规则。数据类型用于以下目的:1、允许限制可存储在列中的......

  7. 阿里面试:MySQL如何设计索引更高效?

    前言数据库系列更新到现在我想大家对所有的概念都已有个大概认识了,这周我在看评论的时候我发现有个网友的提问我觉得很有意......

  8. MySql8 WITH RECURSIVE递归查询父子集的方法

    背景开发过程中遇到类似评论的功能是,需要时用查询所有评论的子集。不同数据库中实现方式也不同,本文使用Mysql数据库......

  9. 深入了解MySQL主从复制的原理

    欢迎微信关注「SH的全栈笔记」0. 主从复制首先主从复制是什么?简单来说是让一台MySQL服务器去复制另一台MySQ......

  10. MongoDB备份(mongoexport)与恢复(mongoimport)

    1.备份恢复工具介绍:mongoexport/mongoimportmongodump/mongorestore(本......

随机推荐

  1. class Awhere T:new()是什么意思

    这是C#泛型类声明的语法class A 表示 A类接受某一种类型,泛型类型为T,需要运行时传入where表明了对类型......

  2. [Java基础]——String类

    此篇博客主要整理Java中的String类的使用。一、String1.1 String 的定义上图是jdk中对......

  3. Python-zip()函数

    Python-zip()函数的一些相关知识Python内置help()的解释返回一个元组迭代器,其中第i个元组包含每......

  4. 执行py文件需要可执行权限吗?

    我们知道可执行权限x在Linux系统中的重要性,那么在执行py文件的过程中,是否一定需要可执行权限呢?本文将会详细的......

  5. C++ 入门篇

    C++基础入门 1 C++初识 1.1 第一个C++程序 编写一个C++程序总共分为4个步骤 创建项目 ......

  6. 浅入 .NET Core 中的内存和GC知识

    目录 托管代码 自动内存管理 参考资料: 【1】https://docs.microsoft.com/z......

  7. JS实现公告上线滚动效果

    本文实例为大家分享了JS实现公告上线滚动效果的具体代码,供大家参考,具体内容如下实现的效果如下,新闻公告上下滚动。代......

  8. python中编写函数并调用的知识点总结

    能够调用自己编写的函数,这在很多开发语言中,都会用到一个叫做mian的主函数,这个函数一般都是程序的入口,当程序启动......

  9. nodejs事件和事件循环详解

    目录简介nodejs中的事件循环phase详解timerspending callbacksidle, prepar......

  10. 这么优雅的Java ORM没见过吧

    Java的ORM框架有很多,但由于Java语言的限制大部分都不够优雅也不够简单,所以作者只能另辟蹊径造轮子了。照旧先......