当前位置:Gxlcms > 数据库问题 > MySQL8.0.15基于mycat读写分离(windows环境)

MySQL8.0.15基于mycat读写分离(windows环境)

时间:2021-07-01 10:21:17 帮助过:46人阅读

系统开发中,数据库是非常重要的一个点。除了程序的本身的优化,如:SQL语句优化、代码优化,数据库的处理本身优化也是非常重要的。主从、热备、分表分库等都是系统发展迟早会遇到的技术问题问题。Mycat是一个广受好评的数据库中间件,已经在很多产品上进行使用了。下面就针对Mycat的基础知识和应用做一总结性梳理,这些内容有的是从网上收集的,有的是自己做的测试验证信息,如有错误,烦请谅解和指出!

一、MyCat简单介绍
MyCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理(类似于Mysql Proxy),用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。

MyCat发展到目前的版本,已经不是一个单纯的MySQL代理了,它的后端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流数据库,也支持MongoDB这种新型NoSQL方式的存储,未来还会支持更多类型的存储。而在最终用户看来,无论是那种存储方式,在MyCat里,都是一个传统的数据库表,支持标准的SQL语句进行数据的操作,这样一来,对前端业务系统来说,可以大幅降低开发难度,提升开发速度。

Mycat可以简单概括为
-  一个彻底开源的,面向企业应用开发的大数据库集群
-  支持事务、ACID、可以替代MySQL的加强版数据库
-  一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群
-  一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server
-  结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
-  一个新颖的数据库中间件产品

Mycat关键特性
-  支持SQL92标准
-  遵守Mysql原生协议,跨语言,跨平台,跨数据库的通用中间件代理
-  基于心跳的自动故障切换,支持读写分离,支持MySQL主从,以及galera cluster集群
-  支持Galera for MySQL集群,Percona Cluster或者MariaDB cluster
-  基于Nio实现,有效管理线程,高并发问题
-  支持数据的多片自动路由与聚合,支持sum,count,max等常用的聚合函数,支持跨库分页
-  支持单库内部任意join,支持跨库2表join,甚至基于caltlet的多表join
-  支持通过全局表,ER关系的分片策略,实现了高效的多表join查询
-  支持多租户方案
-  支持分布式事务(弱xa)
-  支持全局序列号,解决分布式下的主键生成问题
-  分片规则丰富,插件化开发,易于扩展
-  强大的web,命令行监控
-  支持前端作为mysq通用代理,后端JDBC方式支持Oracle、DB2、SQL Server 、 mongodb 、巨杉
-  支持密码加密
-  支持服务降级
-  支持IP白名单
-  支持SQL黑名单、sql注入攻击拦截
-  支持分表(1.6)
-  集群基于ZooKeeper管理,在线升级,扩容,智能优化,大数据处理(2.0开发版)

二、为什么要用MyCat
这里要先搞清楚Mycat和MySQL的区别(Mycat的核心作用)。我们可以把上层看作是对下层的抽象,例如操作系统是对各类计算机硬件的抽象。那么我们什么时候需要抽象?假如只有一种硬件的时候,我们需要开发一个操作系统吗?再比如一个项目只需要一个人完成的时候不需要leader,但是当需要几十人完成时,就应该有一个管理者,发挥沟通协调等作用,而这个管理者对于他的上层来说就是对项目组的抽象。

同样的,当我们的应用只需要一台数据库服务器的时候我们并不需要Mycat,而如果你需要分库甚至分表,这时候应用要面对很多个数据库的时候,这个时候就需要对数据库层做一个抽象,来管理这些数据库,而最上面的应用只需要面对一个数据库层的抽象或者说数据库中间件就好了,这就是Mycat的核心作用。所以可以这样理解:数据库是对底层存储文件的抽象,而Mycat是对数据库的抽象。

三、Mycat工作原理
Mycat的原理并不复杂,复杂的是代码。Mycat的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析:如分
片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。

技术图片

上述图片里,Orders表被分为三个分片datanode(简称dn),这三个分片是分布在两台MySQL Server上(DataHost),即datanode=database@datahost方式,因此你可以用一台到N台服务器来分片,分片规则为(sharding rule)典型的字符串枚举分片规则,一个规则的定义是分片字段(sharding column)+分片函数(rule function),这里的分片字段为prov而分片函数为字符串枚举方式。

当Mycat收到一个SQL时,会先解析这个SQL,查找涉及到的表,然后看此表的定义,如果有分片规则,则获取到SQL里分片字段的值,并匹配分片函数,得到该SQL对应的分片列表,然后将SQL发往这些分片去执行,最后收集和处理所有分片返回的结果数据,并输出到客户端。以select * from Orders where prov=?语句为例,查到prov=wuhan,按照分片函数,wuhan返回dn1,于是SQL就发给了MySQL1,去取DB1上的查询结果,并返回给用户。

如果上述SQL改为select * from Orders where prov in (‘wuhan’,‘beijing’),那么,SQL就会发给MySQL1与MySQL2去执行,然后结果集合并后输出给用户。但通常业务中我们的SQL会有Order By 以及Limit翻页语法,此时就涉及到结果集在Mycat端的二次处理,这部分的代码也比较复杂,而最复杂的则属两个表的Jion问题,为此,Mycat提出了创新性的ER分片、全局表、HBT(Human Brain Tech)人工智能的Catlet、以及结合Storm/Spark引擎等十八般武艺的解决办法,从而成为目前业界最强大的方案,这就是开源的力量!

四、Mycat应用场景
Mycat发展到现在,适用的场景已经很丰富,而且不断有新用户给出新的创新性的方案,以下是几个典型的应用场景:
-   单纯的读写分离,此时配置最为简单,支持读写分离,主从切换;
-   分表分库,对于超过1000万的表进行分片,最大支持1000亿的单表分片;
-   多租户应用,每个应用一个库,但应用程序只连接Mycat,从而不改造程序本身,实现多租户化;
-   报表系统,借助于Mycat的分表能力,处理大规模报表的统计;
-   替代Hbase,分析大数据;
-   作为海量数据实时查询的一种简单有效方案,比如100亿条频繁查询的记录需要在3秒内查询出来结果,除了基于主键的查询,还可能存在范围查询或其他属性查询,此时Mycat可能是最简单有效的选择;
-   Mycat长期路线图;
-   强化分布式数据库中间件的方面的功能,使之具备丰富的插件、强大的数据库智能优化功能、全面的系统监控能力、以及方便的数据运维工具,实现在线数据扩容、迁移等高级功能;
-   进一步挺进大数据计算领域,深度结合Spark Stream和Storm等分布式实时流引擎,能够完成快速的巨表关联、排序、分组聚合等 OLAP方向的能力,并集成一些热门常用的实时分析算法,让工程师以及DBA们更容易用Mycat实现一些高级数据分析处理功能。
-   不断强化Mycat开源社区的技术水平,吸引更多的IT技术专家,使得Mycat社区成为中国的Apache,并将Mycat推到Apache
基金会,成为国内顶尖开源项目,最终能够让一部分志愿者成为专职的Mycat开发者,荣耀跟实力一起提升。

五、Mycat不适合的应用场景
-  设计使用Mycat时有非分片字段查询,请慎重使用Mycat,可以考虑放弃!
-  设计使用Mycat时有分页排序,请慎重使用Mycat,可以考虑放弃!
-  设计使用Mycat时如果要进行表JOIN操作,要确保两个表的关联字段具有相同的数据分布,否则请慎重使用Mycat,可以考虑放弃!
-  设计使用Mycat时如果有分布式事务,得先看是否得保证事务得强一致性,否则请慎重使用Mycat,可以考虑放弃!

需要注意:  在生产环境中, Mycat节点最好使用双节点, 即双机热备环境, 防止Mycat这一层出现单点故障. 可以使用的高可用集群方式有:  Keepalived+Mycat+MysqlKeepalived+LVS+Mycat+MysqlKeepalived+Haproxy+Mycat+Mysql

六、利用MyCAT实现MySQL的读写分离、主从切换、分库分表的操作记录

Mycat实现Mysql主从复制,其中写操作在master主节点上执行,包括insert,delete,update 语句操作;读操作在slave节点上执行,只有select语句操作,其他操作均由主master的二进制文件决定;MyCat支持双主多从,多主多从情况需要配置多个writeHost兄弟节点,多个readHost节点即可!

Mycat的架构其实很好理解,Mycat是数据库代理中间件,Mycat后面就是物理数据库。和Web服务器的Nginx类似。对于使用者来说,访问的都是Mycat,不会接触到后端的数据库。如下案例是做一个主从、读写分离,简单分库分表的示例。结构如下图:

技术图片 

服务器信息如下(实验环境,关闭机器的iptables防火墙和selinux):

1 2 3 4 5 6 7 8 9 10 11 12 服务器主机名       ip                  说明 Mycat-node       192.168.10.210      mycat服务器,连接数据库时,连接此服务器 Mysql-node1      192.168.10.205      物理数据库1,真正存储数据的数据库,这里为Master主数据库 Mysql-node2      192.168.10.206      物理数据库2,真正存储数据的数据库,这里为Slave主数据库   三台机器分布修改主机名,并做hosts绑定 # vim /etc/hosts 192.168.10.205 Mysql-node1 192.168.10.206 Mysql-node1 192.168.10.210 Mycat-node   为方便做实验,关闭三台机器的iptables防火墙和selinux 

Mycat作为主数据库中间件,肯定是与代码弱关联的,所以代码是不用修改的,使用Mycat后,连接数据库是不变的,默认端口是8066。连接方式和普通数据库一样,比如:jdbc:mysql://192.168.10.210:8066/

1)Mysql安装及主从复制部署(Mysql-node1和Mysql-node2两台机器上操作)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 a)安装Mysql,安装过程要在两个Mysql节点机器上都要操作。 安装过程参考:http://www.cnblogs.com/kevingrace/p/6109679.html 这里省去安装过程~~   b)Mysql主从复制(两个节点的mysql登录用户名和密码都是root/123456 参考:http://www.cnblogs.com/kevingrace/p/6256603.html   ==================================================== 首先是Mysql-node1主节点配置操作 [root@Mysql-node1 ~]# cp /usr/local/mysql/my.cnf /usr/local/mysql/my.cnf.bak [root@Mysql-node1 ~]# vim /usr/local/mysql/my.cnf        #在[mysqld]区域添加下面内容 ...... [mysqld] server-id=1        log-bin=mysql-bin  #binlog-do-db=kevin         #需要同步的数据库。如果是多个同步库,就以此格式另写几行即可。如果不指明对某个具体库同步,就去掉此行,表示同步所有库(除了ignore忽略的库)         binlog-ignore-db = mysql,information_schema sync_binlog = 1      binlog_checksum = none  binlog_format = mixed     重启mysql服务 [root@Mysql-node1 ~]# /etc/init.d/mysql restart   登录mysql,授予slave从机复制权限 mysql> grant replication slave,replication client on *.* to slave@‘192.168.10.206‘ identified by "slave@123"; Query OK, 0 rows affected (0.05 sec)   mysql> flush privileges; Query OK, 0 rows affected (0.06 sec)   授权之后,要保证192.168.10.206这台slave节点机器能使用上面的权限信息登录到本机的mysql   将数据库锁住,仅仅允许读,以保证数据一致性; mysql> FLUSH TABLES WITH READ LOCK;                 #注意,锁定后,如果自己同步对方数据,同步前一定要记得先解锁! Query OK, 0 rows affected (0.00 sec)   mysql> flush privileges; Query OK, 0 rows affected (0.05 sec)   查看主节点的master复制信息 mysql> show master status; +------------------+----------+--------------+--------------------------+-------------------+ | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB         | Executed_Gtid_Set | +------------------+----------+--------------+--------------------------+-------------------+ | mysql-bin.000003 |     1349 |              | mysql,information_schema |                   | +------------------+----------+--------------+--------------------------+-------------------+ 1 row in set (0.00 sec)     ==================================================== 接着是slave从节点操作 [root@Mysql-node2 ~]# cp /usr/local/mysql/my.cnf /usr/local/mysql/my.cnf.bak [root@Mysql-node2 ~]# vim /usr/local/mysql/my.cnf ....... [mysqld] ....... server-id=2   log-bin=mysql-bin   #replicate-do-db=kevin    #需要同步的数据库名。如果不指明同步哪些库,就去掉这行,表示所有库的同步(除了ignore忽略的库)。  replicate-ignore-db=mysql  slave-skip-errors = all   重启mysql服务 [root@Mysql-node2 ~]# /etc/init.d/mysql restart   登录slave节点的mysql,进行主从同步设置 mysql> stop slave; Query OK, 0 rows affected (0.09 sec)   mysql> change  master to master_host=‘192.168.10.205‘,master_user=‘slave‘,master_password=‘slave@123‘,master_log_file=‘mysql-bin.000003‘,master_log_pos=1349;  Query OK, 0 rows affected, 2 warnings (0.21 sec)   mysql> start slave; Query OK, 0 rows affected (0.02 sec)   mysql> show slave status \G; *************************** 1. row ***************************                Slave_IO_State: Waiting for master to send event                   Master_Host: 192.168.10.205                   Master_User: slave                   Master_Port: 3306                 Connect_Retry: 60               Master_Log_File: mysql-bin.000003           Read_Master_Log_Pos: 1349                Relay_Log_File: mysql-relay-bin.000002                 Relay_Log_Pos: 283         Relay_Master_Log_File: mysql-bin.000003              Slave_IO_Running: Yes             Slave_SQL_Running: Yes               Replicate_Do_DB:           Replicate_Ignore_DB: mysql            Replicate_Do_Table:        Replicate_Ignore_Table:       Replicate_Wild_Do_Table:   Replicate_Wild_Ignore_Table:                    Last_Errno: 0                    Last_Error:                  Skip_Counter: 0           Exec_Master_Log_Pos: 1349               Relay_Log_Space: 456               Until_Condition: None                Until_Log_File:                 Until_Log_Pos: 0            Master_SSL_Allowed: No            Master_SSL_CA_File:            Master_SSL_CA_Path:               Master_SSL_Cert:             Master_SSL_Cipher:                Master_SSL_Key:         Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No                 Last_IO_Errno: 0                 Last_IO_Error:                Last_SQL_Errno: 0                Last_SQL_Error:   Replicate_Ignore_Server_Ids:              Master_Server_Id: 1                   Master_UUID: 747977ea-8fba-11e8-86c0-525400b19c93              Master_Info_File: /data/mysql/data/master.info                     SQL_Delay: 0           SQL_Remaining_Delay: NULL       Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it            Master_Retry_Count: 86400                   Master_Bind:       Last_IO_Error_Timestamp:      Last_SQL_Error_Timestamp:                Master_SSL_Crl:            Master_SSL_Crlpath:            Retrieved_Gtid_Set:             Executed_Gtid_Set:                 Auto_Position: 0 1 row in set (0.00 sec)   ERROR: No query specified   mysql>     ========================================================= 通过上面的信息,可知主从复制环境已经OK(Slave_IO_Running和Slave_SQL_Running状态均为YES),下面验证下主从复制是否正常?   在Mysql-node1主节点上操作 mysql> unlock tables; Query OK, 0 rows affected (0.00 sec)   mysql> CREATE DATABASE kevin CHARACTER SET utf8 COLLATE utf8_general_ci;       Query OK, 1 row affected (0.06 sec)   mysql> use kevin; Database changed mysql> create table if not exists haha (id int(10) PRIMARY KEY AUTO_INCREMENT,name varchar(50) NOT NULL); Query OK, 0 rows affected (0.34 sec)   在Mysql-node2从节点上查看(保证从节点上查看slave状态时,Slave_IO_Running和Slave_SQL_Running状态均为YES,这样就能保证主从复制在进行中) mysql> show databases; +--------------------+ | Database           | +--------------------+ | information_schema | | kevin              | | mysql              | | performance_schema | test               | +--------------------+ 5 rows in set (0.00 sec)   mysql> use kevin; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A   Database changed mysql> show tables; +-----------------+ | Tables_in_kevin | +-----------------+ | haha            | +-----------------+ 1 row in set (0.00 sec)   接着在Mysql-node1主节点插入数据 mysql> insert into kevin.haha values(1,"wangshibo"),(2,"linan"),(3,"zhangminmin");       Query OK, 3 rows affected (0.04 sec) Records: 3  Duplicates: 0  Warnings: 0   然后再在MYsql-node2从节点查看,如下发现已经同步过来了! mysql> use kevin; Database changed mysql> show tables; +-----------------+ | Tables_in_kevin | +-----------------+ | haha            | +-----------------+ 1 row in set (0.00 sec)   mysql> select * from haha; +----+-------------+ id | name        | +----+-------------+ |  1 | wangshibo   | |  2 | linan       | |  3 | zhangminmin | +----+-------------+ 3 rows in set (0.00 sec)   由此可见,Mysql的主从复制已经实现!

2)Mycat中间件安装、配置和测试(Mycat-node节点机器上操作)
2.1)Mycat安装

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 建议下载1.6-RELEASE 版本,毕竟是比较稳定的版本。 下载官网地址:http://dl.mycat.io/   [root@Mycat-node ~]# cd /usr/local/src/ [root@Mycat-node src]# wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz [root@Mycat-node src]# tar -zvxf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz [root@Mycat-node src]# mv mycat /data/ [root@Mycat-node src]# ls /data/mycat/ bin  catlet  conf  lib  logs  version.txt   mycat安装完成后,目录如下: bin     mycat命令,启动、重启、停止等 catlet  catlet为Mycat的一个扩展功能 conf    Mycat 配置信息,重点关注 lib     Mycat引用的jar包,Mycat是java开发的 logs    日志文件,包括Mycat启动的日志和运行的日志。     Mycat的配置文件都在conf目录里面,这里介绍几个常用的文件: server.xml   Mycat的配置文件,设置账号、参数等 schema.xml   Mycat对应的物理数据库和数据库表的配置 rule.xml     Mycat分片(分库分表)规则   [root@Mycat-node src]# cd /data/mycat/conf [root@Mycat-node conf]# ll server.xml      -rwxrwxrwx. 1 root root 3740 Jul 25 12:19 server.xml [root@Mycat-node conf]# ll schema.xml      -rwxrwxrwx. 1 root root 4667 Jul 31 02:54 schema.xml

2.2)Mycat相关配置
server.xml文件其实跟读写分离策略关系不大,但是需要用此文件来配置连接MyCat的用户及权限等,因此在这里简单说明。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 [root@Mycat-node conf]# cp server.xml server.xml.bak [root@Mycat-node conf]# vim server.xml .......         <user name="bobo">                 <property name="password">bo@123</property>                 <property name="schemas">mycat/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>           <!--                         #注意,由于这里只定义了一个标签,所以把多余的都注释了。如果这个打开,也需要将TESTDB库改为和上面一样的mycat库名。         <user name="user">                 <property name="password">user</property>                 <property name="schemas">TESTDB</property>                 <property name="readOnly">true</property>         </user>        --> </mycat:server> .......   重点关注上面这段配置,其他默认即可。 ======================================= 参数           说明 user          用户配置节点 name          登录的用户名,也就是连接Mycat的用户名。 password      登录的密码,也就是连接Mycat的密码 schemas       数据库名,这里会和schema.xml中的配置关联,多个用逗号分开,例如需要这个用户需要管理两个数据库db1,db2,则配置db1,dbs privileges    配置用户针对表的增删改查的权限 readOnly      mycat逻辑库所具有的权限。true为只读,false为读写都有,默认为false ======================================= 我这里配置了一个账号boo,密码为bo@123,逻辑数据库为mycat,这些信息都可以自己随意定义,读写权限都有,没有针对表做任何特殊的权限。 注意: - server.xml文件里登录mycat的用户名和密码可以任意定义,这个账号和密码是为客户机登录mycat时使用的账号信息。 - 逻辑库名(如上面的mycat,也就是登录mycat后显示的库名,切换这个库之后,显示的就是代理的真实mysql数据库的表)要在schema.xml里面也定义,否则会导致mycat服务启动失败! - 这里只定义了一个标签,所以把多余的都注释了。如果定义多个标签,即设置多个连接mycat的用户名和密码,那么就需要在schema.xml文件中定义多个对应的库!

schema.xml是最主要的配置项,此文件关联mysql读写分离策略!读写分离、分库分表策略、分片节点都是在此文件中配置的!
MyCat作为中间件,它只是一个代理,本身并不进行数据存储,需要连接后端的MySQL物理服务器,此文件就是用来连接MySQL服务器的!

schemaxml文件中配置的参数解释

1 2 3 4 参数            说明 schema         数据库设置,此数据库为逻辑数据库,name与server.xml中schema对应 dataNode       分片信息,也就是分库相关配置 dataHost       物理数据库,真正存储数据的数据库

配置说明

1 2 3 4 name属性唯一标识dataHost标签,供上层的标签使用。 maxCon属性指定每个读写实例连接池的最大连接。也就是说,标签内嵌套的 writeHost、readHost标签都会使用这个属性的值来实例化出连接池的最大连接数。 minCon属性指定每个读写实例连接池的最小连接,初始化连接池的大小。

每个节点的属性逐一说明

1 2 3 4 5 schema: 属性             说明 name               逻辑数据库名,与server.xml中的schema对应 checkSQLschema     数据库前缀相关设置,建议看文档,这里暂时设为folse sqlMaxLimit    select 时默认的limit,避免查询全表

table

1 2 3 4 5 6 属性             说明 name               表名,物理数据库中表名 dataNode       表存储到哪些节点,多个节点用逗号分隔。节点为下文dataNode设置的name primaryKey     主键字段名,自动生成主键时需要设置 autoIncrement      是否自增 rule               分片规则名,具体规则下文rule详细介绍

dataNode

1 2 3 4 属性             说明 name               节点名,与table中dataNode对应 datahost       物理数据库名,与datahost中name对应 database       物理数据库中数据库名

dataHost

1 2 3 4 5 6 属性             说明 name               物理数据库名,与dataNode中dataHost对应 balance            均衡负载的方式 writeType      写入方式 dbType             数据库类型 heartbeat      心跳检测语句,注意语句结尾的分号要加

schema.xml文件中有三点需要注意:balance="1",writeType="0" ,switchType="1"
schema.xml中的balance的取值决定了负载均衡对非事务内的读操作的处理。balance 属性负载均衡类型,目前的取值有 4 种:

1 2 3 4 5 6 7 8 9 10 balance="0":      不开启读写分离机制,所有读操作都发送到当前可用的writeHost 上,即读请求仅发送到writeHost上。   balance="1":      读请求随机分发到当前writeHost对应的readHost和standby的writeHost上。即全部的readHost与stand by writeHost 参与                    select 语句的负载均衡,简单的说,当双主双从模式(M1 ->S1 , M2->S2,并且 M1 与 M2 互为主备),正常情况下, M2,S1,                    S2 都参与 select 语句的负载均衡   balance="2":      读请求随机分发到当前dataHost内所有的writeHost和readHost上。即所有读操作都随机的在writeHost、 readhost 上分发。   balance="3":      读请求随机分发到当前writeHost对应的readHost上。即所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,                    writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。

writeType 属性,负载均衡类型,目前的取值有 3 种

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

对于事务内的SQL默认走写节点

1 2 3 4 5 以 /*balance*/ 开头,可以指定SQL使用特定负载均衡方案。例如在大环境开启读写分离的情况下,特定强一致性的SQL查询需求; slaveThreshold:近似的主从延迟时间(秒)Seconds_Behind_Master < slaveThreshold ,读请求才会分发到该Slave,确保读到的数据相对较新。   schema.xml中的writeType的取值决定了负载均衡对写操作的处理: writeType="0":所有的写操作都发送到配置文件中的第一个write host。(第一个write host故障切换到第二个后,即使之后修复了仍然维持第二个为写库)。推荐取0值,不建议修改.

主从切换(双主failover):switchType 属性

1 2 3 4 5 6 7 8 如果细心观察schem.xml文件的话,会发现有一个参数:switchType,如下配置:  <dataHost name="237_15" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native"switchType="1"  slaveThreshold="100">   参数解读 switchType="-1":  不自动切换 switchType="1":   默认值,自动切换 switchType="2":   基于MySQL主从同步的状态来决定是否切换。需修改heartbeat语句(即心跳语句):show slave status switchType="3":   基于Mysql Galera Cluster(集群多节点复制)的切换机制。需修改heartbeat语句(即心跳语句):show status like ‘wsrep%‘

dbType属性

1 指定后端连接的数据库类型,目前支持二进制的mysql协议,还有其他使用JDBC连接的数据库。例如:mongodb、oracle、spark等。

dbDriver属性指定连接后端数据库使用的

1 2 3 4 5 6 7 Driver,目前可选的值有native和JDBC。   使用native的话,因为这个值执行的是二进制的mysql协议,所以可以使用mysql和maridb。 其他类型的数据库则需要使用JDBC驱动来支持。从1.6版本开始支持postgresql的native原始协议。   如果使用JDBC的话需要将符合JDBC 4标准的驱动JAR包放到MYCAT\lib目录下,并检查驱动JAR包中包括如下目录结构的文件: META-INF\services\java.sql.Driver。在这个文件内写上具体的Driver类名,例如:com.mysql.jdbc.Driver。

heartbeat标签

1 2 3 4 5 6 这个标签内指明用于和后端数据库进行心跳检查的语句。例如,MYSQL可以使用select user(),Oracle可以使用select 1 from dual等。 这个标签还有一个connectionInitSql属性,主要是当使用Oracla数据库时,需要执行的初始化SQL   语句就这个放到这里面来。例如:altersession set nls_date_format=‘yyyy-mm-dd hh24:mi:ss‘   1.4主从切换的语句必须是:showslave status

writeHost标签、readHost标签

1 2 3 4 5 6 这两个标签都指定后端数据库的相关配置给mycat,用于实例化后端连接池。   唯一不同的是:writeHost指定写实例、readHost指定读实例,组着这些读写实例来满足系统的要求。   在一个dataHost内可以定义多个writeHost和readHost。但是,如果writeHost指定的后端数据库宕机,那么这个writeHost绑定的所有readHost都将不可用。 另一方面,由于这个writeHost宕机系统会自动的检测到,并切换到备用的writeHost上去。

应用场景1--->Mycat读写分离(负载均衡)、主从自动切换

目前有大量Mycat的生产实践案例是属于简单的读写分离类型的,此案例主要用到Mycat的以下特性:
- 读写分离支持
- 高可用

大多数读写分离的案例是同时支持高可用性的,即Mycat+MySQL主从复制的集群,并开启Mycat的读写分离功能,这种场景需求下,Mycat是最为简单并且功能最为
丰富的一类Proxy,正常情况下,配置文件也最为简单,不用每个表配置,只需要在schema.xml中的元素上增加dataNode=“defaultDN”属性,并配置此dataNode
对应的真实物理数据库的database,然后dataHost开启读写分离功能即可。

修改mycat的schema.xml:
balance为1:让全部的readHost及备用的writeHost参与select的负载均衡。
switchType为2:基于MySQL主从同步的状态决定是否切换。
heartbeat:主从切换的心跳语句必须为show slave status。

仅仅进行读写分离的schema.xml配置(备份原来的schema.xml文件,清空,直接复制下面内容):不想要自动切换功能,即MySQL写节点宕机后不自动切换到备用节点:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [root@Mycat-node conf]# vim schema.xml   <?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/">           <schema name="mycat" checkSQLschema=

人气教程排行