Mycat学习记录

——Mycat作用

  • 读写分离
  • 数据分片:垂直拆分(分库)、水平拆分(分表)
  • 多数据源整合

——原理

拦截:拦截用户发送过来的sql,首先对sql语句做了一些特定的分析(分片分析、路由分析、读写分离分析、缓存分析),然后将此sql发往后端真实的数据库,并将返回的结果做适当的处理,最终返回给用户,这种数据库分布式从代码中解耦出来,察觉不到后台使用的是Mycat还是MySQL

——配置文件

  • schema.xml:定义逻辑库,表、分片节点等内容
    修改的balance属性,通过此属性配置读写分离类型
    值为1:实现双主双从
    值为3:实现单主单从
  • rule.xml:定义分片规则
  • server.xml:定义用户及系统相关变量,如端口

——Mysql-binlog三种模式

  • Row:日志中会记录每一行数据被修改的形式,然后在slave端再对相同的数据进行修改,只记录要修改的数据,只有value,不会有sql多表关联的情况(会产生大量的日志内容)
  • Statement:每一条修改的sql都会记录到master的binlog中,slave在复制的时候sql进程解析成和原来master端执行相同的sql再执行(执行的时间函数,主从机上无法同步)
  • Mixed:两种模式的结合,会根据执行的每一条具体的sql语句来区分对待记录日志的形式,也就是在Statement和Row中选择一种

——MySQL主从复制

  • 原理:master——》binlog——》IO——》Relay log(中继日志)——》slave
  • 主机配置
修改配置文件:vim /etc/my.cnf
#主服务器唯一ID 
server-id=1
#启用二进制日志
log-bin=mysql-bin
#设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库
binlog-do-db=需要复制的主数据库名字
#设置logbin格式
binlog_format=STATEMENT
  • 从机配置
修改配置文件:vim /etc/my.cnf
#从服务器唯一ID
server-id=2
#启用中继日志
relay-log=mysql-relay
  • 关闭防火墙
  • 重启mysql服务
  • 主机查询状态
show master status;
#记录下File和Position的值
#执行完此步骤后不要再操作主服务器MySQL,防止主服务器状态值变化
  • 从机配置需要复制的主机
CHANGE MASTER TO MASTER_HOST='主机的IP地址',
MASTER_USER='slave',
MASTER_PASSWORD='123123',
MASTER_LOG_FILE='mysql-bin.具体数字',MASTER_LOG_POS=具体值;
#启动从服务器复制功能
start slave;
#查看从服务器状态
show slave status\G;
  • 双主双从
    单主单从配置完成后,Master1复制Master2,Master2复制Master1,互相复制
    在这里插入图片描述

  • 停止从服务复制功能:stop slave

  • 重新配置主从:reset master

——垂直拆分(分库)

  • 垂直拆分是按照业务将表进行分类,分布到不同的数据库上面,减少单个数据库的压力,分担到不同的数据库中
  • 两台主机上的数据库中的表,不可以关联查询
  • 分库原则:有紧密关联的表应该分在一个数据库中,没有互相关联的表可以分布到不同的库里
  • Mycat中schema配置文件
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
 <table name="customer" dataNode="dn2" ></table>
 </schema>
<dataNode name="dn1" dataHost="host1" database="orders" />
 <dataNode name="dn2" dataHost="host2" database="orders" />
 <dataHost name="host1" maxCon="1000" minCon="10" balance="0"
 writeType="0" dbType="mysql" dbDriver="native" switchType="1" 
slaveThreshold="100">
 <heartbeat>select user()</heartbeat>
 <!-- can have multi write hosts -->
 <writeHost host="hostM1" url="192.168.140.128:3306" user="root"
 password="123123">
 </writeHost>
 </dataHost>
 <dataHost name="host2" maxCon="1000" minCon="10" balance="0"
 writeType="0" dbType="mysql" dbDriver="native" switchType="1" 
slaveThreshold="100">

 <heartbeat>select user()</heartbeat>
 <!-- can have multi write hosts -->
 <writeHost host="hostM2" url="192.168.140.127:3306" user="root"
 password="123123">
 </writeHost>
 </dataHost>

——水平拆分(分表)

  • 水平拆分是按照数据行的切分,将单个表里的某些行数据切分到一个数据库,其他行数据切分到另一个数据库中
  • mysql数据库中表达超过1000w条数据,达到性能瓶颈,会影响查询效率
  • 修改schema.xml文件
# 为orders 表设置数据节点为dn1、dn2,并指定分片规则为mod_rule(自定义的名字)
<table name="orders" dataNode="dn1,dn2" rule="mod_rule" ></table>
  • 修改rule.xml文件
#在 rule 配置文件里新增分片规则 mod_rule,并指定规则适用字段为 customer_id, #还有选择分片算法 mod-long(对字段求模运算),customer_id 对两个节点求模,根据结果分片
#配置算法 mod-long 参数 count 为 2,两个节点
<tableRule name="mod_rule">
	<rule>
	<columns>customer_id</columns>
	<algorithm>mod-long</algorithm>
	</rule>
</tableRule><function name="mod-long" class="io.mycat.route.function.PartitionByMod">
 <!-- how many data nodes -->
 	<property name="count">2</property>
</function>
  • 在使用mycat向表里插数据时,插入字段不能省略,不然无法识别所数据分片
  • 分片关联查询join:将子表的存储位置依赖于主表,物理上紧邻存放,解决分片后表关联查询和性能上的问题
# 修改 schema.xml 配置文件
<table name="orders" dataNode="dn1,dn2" rule="mod_rule" >
 	<childTable name="orders_detail" primaryKey="id" joinKey="order_id" parentKey="id" />
</table>
  • 全局表
    • 在多个业务表进行分片的情况下,某个单独表与多个业务表还存在关联,则需实现全局表
    • 特性:变动不频繁,数据量总体变化不大,数据规模不大,很少有超过数十万条记录,可以跟任何一个表进行join操作
    • schema.xml 配置文件
    <table name="dict_order_type" dataNode="dn1,dn2" type="global" ></table> ```
    
  • 常用分片规则
  1. 取模,对分片字段求模运算,最常用规则
  2. 分片枚举,通过配置文件中配置可能存在的枚举id
  3. 范围约定,适用于提前规划好分片字段某个范围属于那个分片
  4. 按日期(天)分片
  • 全局序列
    • 实现分库分表的情况下,数据库自增主键无法保证全局的唯一性,不同库中的分片表可能存在相同自增id,全局序列解决此问题,提供多种实现方式
    • 1.本地文件:宕机无法读取本地文件
    • 2.数据库方式(常用):利用数据库中的一个表进行计数累加,Mycat会预加载一部分号段到Mycat内存中,所以大部分序列都是在内存中完成的;如果Mycat崩溃:内存中的序列都会没了,那么Mycat启动后会向数据库申请新的号段,即使损失的号段丢弃,也不会出现主键重复
    • 3.时间戳方式:18位id过长,占空间
    • 4.自主生成全局序列

——HAProxy + Keepalived高可用

如果Mycat所在服务器出现宕机,或Mycat服务故障,则需要备机提供服务,考虑Mycat集群;HAProxy + Keepalived配合两台Mycat搭起Mycat集群,实现高可用

在这里插入图片描述
HAProxy实现Mycat多节点的集群高可用和负载均衡,而HAProxy的高可用则由Keepalived实现

  • HAProxy安装配置
    1. 解压
    2. 进入目录,查看内核版本
    3. 根据内核版本进行编译
    4. 编译完成进行安装
    5. 创建目录,创建HAProxy配置文件
    6. 插入配置信息(添加mycat节点)
    7. 启动
    8. 打开浏览器访问页面
  • Keepalived安装配置
    1. 解压
    2. 安装所依赖的插件
    3. 进入解压后的目录,配置(HAProxy节点及端口)
    4. 编译后安装
    5. 启动验证(mysql用keepalived的ip和端口启动)

——Mycat安全设置

权限配置( server.xml)

  • user标签权限控制
<user name="user">
	 <property name="password">user</property>
	 # schemas——当前连接的逻辑库中所对应的逻辑表
	 <property name="schemas">TESTDB</property>
	 <property name="readOnly">true</property>
</user>
  • privileges标签权限控制:可对库表进行精细化权限控制
#server.xml配置文件privileges部分
#配置orders表没有增删改查权限
<user name="mycat">
	 <property name="password">123456</property>
	 <property name="schemas">TESTDB</property>
 <!-- 表级 DML 权限设置 -->
<privileges check="true">
	<schema name="TESTDB" dml="1111" >
	<table name="orders" dml="0000"></table>
	<table name="tb02" dml="1111"></table>
	</schema>
</privileges>
</user>

SQL拦截

  • filewall标签定义防火墙,whitehost定义ip白名单,blacklist定义sql黑名单
  • 白名单
#配置只有192.168.140.128主机可以通过mycat用户访问
<firewall>
	 <whitehost>
		 <host host="192.168.140.128" user="mycat"/>
	 </whitehost>
</firewall>
  • 黑名单:对具体sql的拦截
#配置禁止mycat用户进行删除操作
<firewall>
	 <whitehost>
		 <host host="192.168.140.128" user="mycat"/>
	 </whitehost>
	 <blacklist check="true">
	 	<property name="deleteAllow">false</property>
	</blacklist>
</firewall>

——Mycat监控工具

Mycat-web 是 Mycat 可视化运维的管理和监控平台,主要管理和监控 Mycat 的流量、连接、活动线程和内存等,具备 IP 白名单、邮件告警等模块,还可以统计 SQL 并分析慢 SQL 和高频 SQL 等,ZooKeeper 作为配置中心,可以管理多个节点

Zookeeper安装

Mycat-Web安装

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序少年不秃头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值