1、前言

1.1  分布式数据库

随着IT行业的迅猛发展,行业应用系统的数据规模呈现爆炸式增长,对数据库的数据处理能力要求越来越高,分布式数据库正是因此应运而生。

分布式数据库特点包括:

透明性:用户不必关心后台数据库的具体实现

扩展性:能够根据系统压力情况进行扩展

可靠性:如果其中一台服务器宕机,备用服务器能够自动切换继续提供服务

高性能:

1.2  Mycat介绍

Mycat(http://www.mycat.io/)是一个支持mysql、sql server等数据库集群化部署的中间件。它由Amoeba和cobar发展而来。

 

2、负载均衡

3、测试环境

服务器

Mycat

Mysql-master

Mysql-slave

Mysql-master-standby

Mysql-master-standby

IP

127.0.0.1

10.3.30.161

10.3.30.238

120.77.80.215

10.3.6.84

Port

8066/9066

3306

3306

3306

3306

Account

root 123456

test

123456

test

123456

test

123456

test

123456

4、测试脚本

CREATE TABLE `employee` (

`ID` int(11) NOT NULL,

`NAME` varchar(100) default NULL,

`SHARDING_ID` int(11) NOT NULL,

PRIMARY KEY  (`ID`)

)

INSERT INTO employee(ID,NAME,SHARDING_ID) VALUES ('6', 'amos', '10000');

5、软件安装

首先安装mycat-server、mycat-eye、zookeeper和navicat for mysql

6、服务启动

6.1  启动mycat

6.1.1安装java环境

1、  安装jdk

2、  配置环境变量

JAVA_HOME=C:\Program Files\Java\jdk1.8.0_131

CLASSPATH=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;

Path =%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

6.1.2启动mycat服务

在windows8操作系统上启动mycat服务,命令如下

cmd

cd /d D:\EC-OFC\Java\Mycat\Mycat-server-1.6\mycat\bin

startup_nowrap.bat

6.1.3连接mycat

6.1.3.1navicat连接

使用navicat连接mycat,默认端口为8066,密码123456

6.1.3.2DOS链接

cmd

cd /d C:\Program Files\MySQL\MySQL Server 5.7\bin

mysql -uroot -p123456 -P8066

注意:如果需要使用如show @@datasource命令时,需要连接9066端口而不是8066

6.2  启动zookeeper

D:\EC-OFC\开发工具\zookeeper-3.4.10\bin\zkServer.bat

6.3  启动mycat-eye

D:\EC-OFC\Java\Mycat\mycat-web\start.bat

7、写集群

7.1  拓扑图

7.2  配置文件

<?xml version="1.0"?>
<!DOCTYPEmycat:schemaSYSTEM"schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
        <table name="employee" primaryKey="ID" dataNode="dn1,dn2"/>
    </schema>
    <dataNode name="dn1" dataHost="host1" database="db1"/>
    <dataNode name="dn2" dataHost="host2" database="db1"/>
    <dataHost name="host1" maxCon="1000" minCon="10" balance="1"
             
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="hostM1" url="120.77.80.215:3306"
user="test" password="123456">
        </writeHost>
    </dataHost>
    <dataHost name="host2" maxCon="1000" minCon="10" balance="1"
             
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="hostM2" url="10.3.30.238:3306"
user="test" password="123456">
        </writeHost>
    </dataHost>
</mycat:schema>

8、主从配置

8.1  业务要求

Master挂掉时,Slave还能提供读服务。

8.2  配置步骤

注意每台mysql服务器的server-id必须唯一

第一步:

在10.3.30.161中创建一个10.3.30.238主机中可以登录的MySQL用户

用户:mysql238

密码:123456

mysql>GRANT REPLICATION SLAVE ON *.* TO ‘mysql238’@’10.3.30.238’ IDENTIFIED BY ‘123456’;

mysql>FLUSH PRIVILEGES;

第二步:

需要先在C:\ProgramData\MySQL\MySQL Server 5.7\my.ini文件中添加log-bin=mysql-bin

查看10.3.30.161MySQL服务器二进制文件名与位置

mysql>SHOW MASTER STATUS;

第三步:

告知二进制文件名与位置

在10.3.30.238中执行:

mysql>CHANGE MASTER TO

MASTER_HOST='10.3.30.161',

MASTER_USER='mysql238',

MASTER_PASSWORD='123456',

MASTER_LOG_FILE='mybin.000001',

MASTER_LOG_POS=154;

完成主从复制配置

8.3  验证配置

在10.3.30.238中

mysql> START SLAVE;   #开启复制

mysql>SHOW SLAVE STATUS\G   #查看主从复制是否配置成功

当看到Slave_IO_Running:
YES、Slave_SQL_Running: YES才表明状态正常

8.4  配置文件

switchType='-1'意味着当主挂掉的时候,不进行自动切换,即hostS1并不会被提升为主,仍只提供读的功能。这就避免了将数据写进slave的可能性,单纯的MySQL主从集群并不允许将数据写进slave中,除非配置的是双master。

<mycat:schema xmlns:mycat="http://io.mycat/">
    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
        <table name="employee" primaryKey="ID" dataNode="dn1"/>
    </schema>
    <dataNode name="dn1" dataHost="host1" database="db1"/>
    <dataHost name="host1" maxCon="1000" minCon="10" balance="1"
             
writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="hostM1" url="10.3.30.161:3306"
user="test" password="123456">
            <readHost host="hostR1" url="120.77.80.215:3306"
user="test" password="123456"/>
        </writeHost>
        <writeHost host="hostS1" url="10.3.30.238:3306"
user="test" password="123456">
        </writeHost>
    </dataHost>
</mycat:schema>

9、Haproxy配置

9.1  拓扑图

9.2  配置文件

此处为haproxy配置文件

#

global
  maxconn 1500
  nbproc 
1
  daemon

defaults
        mode tcp
        retries 3
        option  abortonclose
        maxconn 32000
        timeout connect 300000ms
        timeout client  300000ms
        timeout server  300000ms
        log 127.0.0.1   local0 err

listen admin_stats
        bind :48800
        stats uri /admin-status
        stats auth admin:admin
        mode http
       
option httplog
listen mycat_servers
        bind :3307 ## 绑定端口
        mode tcp
        option tcplog
        #balance source
        server server238 10.3.30.238:8066
check port 8066 weight 1 check
        server server84 10.3.6.84:8066
check port 8066 weight 1 check

mysql客户端或者应用程序可以通过如上配置的127.0.0.1:3307端口链接haproxy实现链接mycat集群的目的。

10、注意事项

1、主主复制配置文件中auto_increment_increment和auto_increment_offset只能保证主键不重复,却不能保证主键有序。

2、当配置完成Slave_IO_Running、Slave_SQL_Running不全为YES时,show slave status\G信息中有错误提示,可根据错误提示进行更正。

3、Slave_IO_Running、Slave_SQL_Running不全为YES时,大多数问题都是数据不统一导致。

常见出错点:

1、两台数据库都存在db数据库,而第一台MySQL db中有tab1,第二台MySQL db中没有tab1,那肯定不能成功。

2、已经获取了数据的二进制日志名和位置,又进行了数据操作,导致POS发生变更。在配置CHANGE MASTER时还是用到之前的POS。

3、stop
slave后,数据变更,再start slave。出错。

终极更正法:重新执行一遍CHANGE MASTER就好了。

.netcore微服务-Mycat的更多相关文章

  1. (1)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- 什么是微服务架构,.netCore微服务选型

    开发工具:VS2017 .Net Core 2.1 什么是微服务?单体结构: 缺点: 1)只能采用同一种技术,很难用不同的语言或者语言不同版本开发不同模块: 2)系统耦合性强,一旦其中一个模块有问题, ...

  2. (1).NET CORE微服务 Micro-Service ---- 什么是微服务架构,.netCore微服务选型

    开发工具:VS2017 .Net Core 2.1 什么是微服务?单体结构: 缺点:1)只能采用同一种技术,很难用不同的语言或者语言不同版本开发不同模块:2)系统耦合性强,一旦其中一个模块有问题,整个 ...

  3. 什么是微服务架构,.netCore微服务选型

    什么是微服务架构,.netCore微服务选型 https://www.cnblogs.com/uglyman/p/9182485.html 开发工具:VS2017 .Net Core 2.1 什么是微 ...

  4. .NetCore微服务Surging新手傻瓜式 入门教程 学习日志---先让程序跑起来(一)

    原文:.NetCore微服务Surging新手傻瓜式 入门教程 学习日志---先让程序跑起来(一) 写下此文章只为了记录Surging微服务学习过程,并且分享给广大想学习surging的基友,方便广大 ...

  5. .NetCore微服务Surging新手傻瓜式 入门教程 学习日志---结构简介(二)

    原文:.NetCore微服务Surging新手傻瓜式 入门教程 学习日志---结构简介(二) 先上项目解决方案图: 以上可以看出项目结构可以划分为4大块,1是surging的核心底层,2,3,4都可以 ...

  6. .NETCore微服务探寻(一) - 网关

    前言 一直以来对于.NETCore微服务相关的技术栈都处于一个浅尝辄止的了解阶段,在现实工作中也对于微服务也一直没有使用的业务环境,所以一直也没有整合过一个完整的基于.NETCore技术栈的微服务项目 ...

  7. .NETCore微服务探寻(三) - 分布式日志

    前言 一直以来对于.NETCore微服务相关的技术栈都处于一个浅尝辄止的了解阶段,在现实工作中也对于微服务也一直没有使用的业务环境,所以一直也没有整合过一个完整的基于.NETCore技术栈的微服务项目 ...

  8. .NETCore微服务探寻(二) - 认证与授权

    前言 一直以来对于.NETCore微服务相关的技术栈都处于一个浅尝辄止的了解阶段,在现实工作中也对于微服务也一直没有使用的业务环境,所以一直也没有整合过一个完整的基于.NETCore技术栈的微服务项目 ...

  9. .NETCore微服务探寻(三) - 远程过程调用(RPC)

    前言 一直以来对于.NETCore微服务相关的技术栈都处于一个浅尝辄止的了解阶段,在现实工作中也对于微服务也一直没有使用的业务环境,所以一直也没有整合过一个完整的基于.NETCore技术栈的微服务项目 ...

随机推荐

  1. 提示要求用户名和密码-localhost

    同时安装了tomcat和oracle9i后,调试jsp出现--连接到localhost 提示:位于 XDB 的服务器 localhost 要求用户名和密码,原因是端口冲突,调整如下. 机器上装了ora ...

  2. Unicode对象

    什么是Unicode对象呢? 你可以认为unicode对象就是一个Python字符串,它可以处理上百万不同类别的字符——从古老版本的Latin字符到非Latin字符,再到曲折的引用和艰涩的符号. 普通 ...

  3. 传入字典的模型项的类型为“System.Boolean”,但此字典需要类型“InternalCRM.EntityIACrm.Template”的模型项。

    “/”应用程序中的服务器错误. 传入字典的模型项的类型为“System.Boolean”,但此字典需要类型“InternalCRM.EntityIACrm.Template”的模型项. 说明: 执行当 ...

  4. 改善C#程序的建议8:避免锁定不恰当的同步对象

    原文:改善C#程序的建议8:避免锁定不恰当的同步对象 在C#中让线程同步的另一种编码方式就是使用线程锁.所谓线程锁,就是锁住一个资源,使得应用程序只能在此刻有一个线程访问该资源.可以用下面这句不是那么 ...

  5. wchar_t string on Linux, OS X and Windows

    Making wchar_t work on Linux, OS X and Windows for CMarkup release 10.1 I learned a couple of humble ...

  6. 还在羡慕BAT等公司的大流量的架构吗,commonrpc 是一个以netty 传输协议框架为基础(支持FTP)

    还在羡慕BAT等公司的大流量的架构吗?让你的java系统引用解耦,互相独立,commonrpc 就可以办到.commonrpc 是一个以netty 传输协议框架为基础, 自定义 spring shce ...

  7. QT使用MySql的配置(使用addLibraryPath载入插件),编译QT的MySql驱动问题及解决方案(自己使用libmysql.lib进行编译mysql.pro,万不得已可以查看Makefile.Debug以解决问题)

    2010/04/23:Fixes : 更新批处理,以兼容WIN7. 第一次系统地玩QT,于是诞生了此预备式: [QT版本4.6.0(VS2008编译版),开发平台推荐使用Qt Creator(最新1. ...

  8. python中的内置函数(2)

    一.lambda匿名函数定义:为了解决一些简单的需求而设计的一句话函数例子:计算n的n次方 def func(n):#正常的写法 return n**2 f=lambda n:n**2 这里的lamb ...

  9. Java动态规划

    1. 介绍 动态规划典型的被用于优化递归算法,因为它们倾向于以指数的方式进行扩展.动态规划主要思想是将复杂问题(带有许多递归调用)分解为更小的子问题,然后将它们保存到内存中,这样我们就不必在每次使用它 ...

  10. c++汉诺塔相关知识总结1

    困扰已久,难以攻克的汉诺塔总结来啦 Part One 汉诺塔到底是什么呢? 汉诺塔(Tower of Hanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子,其中一根柱子自底向上叠着64片黄金 ...