Java学习——Mycat学习总结

1、Mycat是一个开源数据库中间件,是一个实现了mysql协议的的数据库中间件服务器。可以把它看做一个数据库代理,用mysql客户端工具和命令行访问Mycat,而Mycat再使用MySQL原生(Native)协议与多个mysql服务器通信,也可以用jdbc协议与太多数主流数据库服务器通信,包括sql server,oracle,db2,postgreSql等主流数据库,也支持MongoDB这种新型NoSql方式的存储。MyCat的默认端口8066。

2、数据库的读写分离

  • 通过MyCat可以自动实现写数据操作主数据库,读数据时操作从数据库,这样能有效地减轻数据库压力,技能减轻IO压力。
  • 实现读写分离,当主出现故障后,Mycat自动切换到另一个主上。
  • 客户端通过Master对数据库进行写操作,slave端进行读操作,并可进行备份,Master出现问题后,可以手动将应用切换到slave端。

3、当进行了垂直拆分的时候就会出现多数据源的问题,这时我们可以使用Mycat来帮助我们拦截这些数据源,Mycat会根据我们要操作的数据库表来分析我们需要的表在哪个库中,然后进行连接

注意,通常我们使用垂直拆分之后都是需要程序员分组独立开发,因此我们基本上是不会哭啊快访问数据库表,我们不知道跨模块表的连接地址账号以及密码,其他模块的程序员也不允许我们这么做,因此时间工作出现跨模块访问时都是使用对方提供的接口

4、balance属性

负载均衡类型,目前的取值有4种,

  • balance=0,不开读写分离机制,所有读操作都发送到当前可用的writeHost上,
  • balance=1,全部的readHost与stand by writeHost参与select语句读操作的负载均衡,简单的说当双主从模式(M1->s1,M2->s2,并且M1与M2互为主备),正常情况下,M2,s1,s2都参与select 语句的负载均衡。
  • balance=2,所有的读操作都随机的在writeHost,readHost上分发。有可能影响读库的效率 尽量不要使用
  • balance=3,所有的读请求随机的分发到writeHost对应的readHost执行,wirteHost不负担读压力。
  • 推荐balance设置为1。效率最高

5、switchType属性:用户指定主服务器发生故障后的切换类型

  • -1表示不自动切换
  • 1默认值,自动切换推荐
  • 2基于Mysql主从同步的状态决定是否切换。
  • 3基于Mysql galary cluster的切换机制集合集群
  • 通常情况下,我们采用双主双从的模式下,switchType为1即可,因为双主双从模式下,主从关系比较复杂,不能根据mysql的状态来切换,只需要在一个主出问题后,切换到另外的主

6、heartbear标签

  • 用于和后端数据库进行心跳检查的语句,检测Mysql数据库是否正常运行。
  • 当switchType为1时,mysql心跳检查语句时select user();
  • 当switchType为2时,mysql心跳检查语句时show slave status
  • 当switchType为3时,mysql心跳检查语句时show status like '%wsrep%'

7、主键生成策略

  1. 本地文件方式:使用服务器本地磁盘文件的方式
  • 在conf/server.xml文件 设置<property name="sequenceHandlerType">0</property>
  • sequenceHandlerType 属性有4个取值: 0:文件方式,1:数据库方式 2:时间戳方式 3:zk
  • sequence_conf.properties文件中,我们可以自定义策略,比如我们要操作的order_info表 ,就可以以ORDER_INFO为前缀配置最大和最小ID
  • ORDER_INFO.HISIDS=

  • ORDER_INFO.MINID=1000   //最小序号

  • ORDER_INFO.MAXID=200000000   //最大序号

  • ORDER_INFO.CURID=1250   //当前序号

  • 在使用插入的时候需要注意,id列的写法为next value for MYCATSEQ_前缀,如:

  • INSERT INTO order_info(id,name) values('next value for MYCATSEQ_ORDER_INFO','文件方式生成的ID');
    SELECT * FROM order_info;

  • 优点:本地加载,读取速度较快,配置简单

  • 缺点:mycat重新发布时,seq文件需要替换,集群部署无法使用此方式,路由到不同的mycat上无法保证ID唯一,使mycat变成了有状态的中间件。

  •  

  1. 本地时间戳方式
  • 修改server.xml文件<property name="sequenceHandlerType">2</property>
  • 修改sequence_time_conf.properties文件
  • # 0-31为整数,每一个mycat节点的这两个配置值都不一样

  • WORKID=01

  • DATAACENTERID=01

  • INSERT INTO order_info(name) values('时间戳方式生成的ID');

  • SELECT * FROM order_info;
  • 本地时间戳计算方式 ID= 64 位二进制 (42(毫秒)+5(机器 ID)+5(业务编码)+12(重复累加) 长度18位,因此表主键字段长度必须大于等于18位
  • 优点:不存在mycat重新发布影响seq的问题
  • 缺点:字段长度是18位 比较占空间
  1. 数据库方式
  • 修改server.xml文件<property name="sequenceHandlerType">1</property>
  • 在mycat的dbseq.sql文件中有建表和函数语句用于基于数据库生成id:
  • MYCAT_SEQUENCE的三个字段:
  • name: sequence字段
  • current_value:当前value
  • increment:增长步长 可理解为mycat在数据库中一次读取多少个sequence. 当这些用完后, 下次再从数据库中读取.
  • INSERT INTO `MYCAT_SEQUENCE`(`name`, `current_value`, `increment`) VALUES ('ORDER_INFO', 23650, 100);
  • 然后需要在sequence_db_conf.properties中进行配置:指定某个sequence哪个节点上,与dataNode的name对应。
  • schema.xml 中<dataNode name="test1" dataHost="localhost" database="macaw" />
  • GLOBAL=test1

  • ORDER_INFO=test1

  • 测试

  • INSERT INTO order_info(name) values('数据库方式生成的ID');

  • SELECT * FROM order_info;

  • 注意:将mycat_sequence表也放出来,且注意大小写,(数据库默认区分大小写)

  • 优点:重新部署mycat不受影响,节点如果是主从切换后,数据ID可能会有异常(重复)

  • 缺点:这种策略,只能在当前数据库中使用。但是如果进行分库,那么在多个库中,就一定会出现ID相同的问题

  1. zookeeper方式
  • 修改server.xml文件<property name="sequenceHandlerType">3</property>
  •  #使用zk管理mycat
    loadZk=true
    #zk服务器的地址和端口
    zkURL=127.0.0.1:2181
    #mycat集群的ID
    clusterId=1
    #本mycat的ID
    myid=mycat_fz_01
    #集群大小
    clusterSize=1
    #集群内mycat的ID
    clusterNodes=mycat_fz_01
    #server  booster  ;   booster install on db same server,will reset all minCon to 2
    type=server
    boosterDataHosts=dataHost1
  • 修改sequence_distributed_conf.properties
  • INSTANCEID=ZK #代表使用zk

  • CLUSTERID=1 #与myid.properties中的CLUSTERID设置的值相同

  • 修改schema.xml schema的table 增加属性 autoIncrement="true"和 primaryKey="id"

  • 测试 启动zk

  • INSERT INTO order_info(name) values('zk方式生成的ID');

  • SELECT * FROM order_info;

  • 优点:无悲观锁,无强竞争,吞吐量更高

  • 缺点:对zp集群的要求增加
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值