必读

欢迎关注白日梦的公众号(风一样的程序员)回复:数据库中间件

即可获取写有注释的中间件源码包,开箱即用~

一、Centos7、Mac安装MySQL

笔记地址:https://www.cnblogs.com/ZhuChangwu/p/12984153.html

视频串讲地址:https://www.bilibili.com/video/BV19g411N7NR?p=2

二、主从复制原理

2.1、基于binlog_filename + position

原理图:

笔记地址:https://mp.weixin.qq.com/s/cSToNVQPK8QCpkjapxNoEw

视频串讲地址:https://www.bilibili.com/video/BV19g411N7NR?p=3

2.2、基于GTID

原理图:

笔记地址:https://mp.weixin.qq.com/s/V5hU2ATeey871loWQIqHKg

视频串讲地址:https://www.bilibili.com/video/BV19g411N7NR?p=4

三、my.cnf

[mysqld]

# 端口
port = 3306 # 数据目录
datadir=/var/lib/mysql # 错误日志
log-error=/var/log/mysqld.log # 为每张表单独创建一个表空间文件
# 大家常说的表空间到底是什么?究竟什么又是数据表呢? https://mp.weixin.qq.com/s/CwxRjGI843UerF89G_WJ-Q
innodb_file_per_table=on
innodb_file_format = Barracuda # binlog 相关配置
# 1、MySQL的 bin log有啥用?在哪里?谁写的?怎么配置?
# https://mp.weixin.qq.com/s/DN1shuyxPJ6BkE_RLezAnA # 2、了解bin log的写入机制吗?说说你们线上如何调整参数的!
# https://mp.weixin.qq.com/s/MtWzoiJtupso5M8z1KUaQQ # 3、bin log有哪些格式?有啥区别?优缺点?线上用哪种格式?
# https://mp.weixin.qq.com/s/ar-wVbDi4CYjPI1t6fTjVw
log_bin=mysql-bin
log-bin-index = mysql-bin.index
max_binlog_size = 256M
sync-binlog = 1000
binlog-format = ROW # relaylog相关配置
relay_log_recovery = 1
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay-log = relay-log
relay-log-index = relay-log.index
sync_relay_log = 1000
max_relay_log_size = 256M # 设置server-id,集群唯一
server-id=1 # pid、socket
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/lib/mysql/mysql.sock
symbolic-links=0

四、测试SQL

create database test;

use test;

CREATE TABLE `runoob_tbl` (
`runoob_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`runoob_title` varchar(100) NOT NULL,
`runoob_author` varchar(40) NOT NULL,
`submission_date` date DEFAULT NULL,
PRIMARY KEY (`runoob_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; INSERT INTO runoob_tbl (runoob_title, runoob_author, submission_date)
VALUES("欢迎微信搜索:", "风一样的程序员", NOW());
CHANGE MASTER TO
MASTER_HOST='10.4.7.103',
MASTER_USER='MySQLsync',
MASTER_PASSWORD='MySQLsync123',
MASTER_PORT=3306,
MASTER_AUTO_POSITION = 1; CHANGE MASTER TO
MASTER_HOST='10.4.7.103',
MASTER_USER='mysqlsync',
MASTER_PASSWORD='mysqlsync123',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=434; CHANGE MASTER TO MASTER_AUTO_POSITION=0;
 grant replication slave on *.* to MySQLsync@"%" identified by "MySQLsync123";

 grant replication slave on *.* to mysqlsync@"127.0.0.1" identified by "mysqlsync123";

 grant replication slave on *.* to mysqlsync@"%" identified by "mysqlsync123";

五、中间件使用、概念串讲

脑图:

视频地址:https://www.bilibili.com/video/BV19g411N7NR?p=5

搞明白这几点:

  1. 跟大家讲明白这样一件事,你以为你是直连的MySQL?其实不是的,你直连的MySQL_Proxy
  2. Node、分片的概念
  3. Proxy配置文件的解读
  4. 演示Proxy的使用

六、总揽启动流程

  • 基于mysql协议获取主从库的连接
  • 将主从库的连接维护进连接池
  • 探活机制

视频地址:https://www.bilibili.com/video/BV19g411N7NR?p=6

Notice:跟大家讲明白这样一件事,你以为你是直连的MySQL?其实不是的,你直连的MySQL_Proxy!

七、权限管理实现原理

重点关注的地方:

# server.go:381

// todo 用户白名单校验,只有指定的user、ip才能使用Proxy
if allowConnect := conn.IsAllowConnect(); allowConnect == false {
err := mysql.NewError(mysql.ER_ACCESS_DENIED_ERROR, "ip address access denied by kingshard.")
conn.writeError(err)
conn.Close()
return
}

视频地址:https://www.bilibili.com/video/BV19g411N7NR?p=7

八、MySQL协议-Handshake!和中间件握手机制原理

原理图:

重点关注的地方:

server.go:388

  // todo 基于MySQL协议和客户端建立握手机制
if err := conn.Handshake(); err != nil {
golog.Error("server", "onConn", err.Error(), 0)
conn.writeError(err)
conn.Close()
return
}

backend_conn.go:101



	// todo 这里其实Proxy和MySQL Server之间建立连接的逻辑
// todo 大家看到这里不明白也没关系,因为想看懂这里需要了解MySQL协议,后面的视频中我会跟大家讲明白这件事
// todo 大家只需要知道,执行过这里的代码之后呢,proxy和MySQL-Service之间就会建立一个Conn,
// todo 并且Proxy会维护这个Conn,后续用户的SQL打过来之后,Proxy会将用户的SQL转发给这里获取到的Conn,进尔让MySQL的引擎去真正的执行这里的SQL // todo 读MySQL发过来的握手报文
if err := c.readInitialHandshake(); err != nil {
c.conn.Close()
return err
}
// todo 写自己的信息(port、username、password、host)
if err := c.writeAuthHandshake(); err != nil {
c.conn.Close() return err
}
// todo 读取MySQL-Server发过来的ok报文
if _, err := c.readOK(); err != nil {
c.conn.Close() return err
}

视频地址:https://www.bilibili.com/video/BV19g411N7NR?p=8

九、中间件不断接受处理客户端SQL原理

重点关注的地方:

conn.go:279

// todo 下面的代码在一个无限循环中, 不断的接受客户端发送过来的sql语句
for {
// todo 根据MySQL协议解析数据包,获取出数据包中sql语句
data, err := c.readPacket() if err != nil {
return
} if c.configVer != c.proxy.configVer {
err := c.reloadConfig()
if nil != err {
golog.Error("ClientConn", "Run",
err.Error(), c.connectionId,
)
c.writeError(err)
return
}
c.configVer = c.proxy.configVer
golog.Debug("ClientConn", "Run",
fmt.Sprintf("config reload ok, ver:%d", c.configVer), c.connectionId,
)
}
// 使用dispatch方法,继续处理数据包
if err := c.dispatch(data); err != nil {
c.proxy.counter.IncrErrLogTotal()
golog.Error("ClientConn", "Run",
err.Error(), c.connectionId,
)
c.writeError(err)
if err == mysql.ErrBadConn {
c.Close()
}
} if c.closed {
return
} c.pkg.Sequence = 0
}
}

视频地址:https://www.bilibili.com/video/BV19g411N7NR?p=9

十、中间件是如何执行你的select语句的?

重点关注的地方:

conn.go:279

	// 使用dispatch方法,继续处理数据包
if err := c.dispatch(data); err != nil {
c.proxy.counter.IncrErrLogTotal()
golog.Error("ClientConn", "Run",
err.Error(), c.connectionId,
)
c.writeError(err)
if err == mysql.ErrBadConn {
c.Close()
}
}

conn.go:340

func (c *ClientConn) dispatch(data []byte) error {
c.proxy.counter.IncrClientQPS()
// todo MYSQL协议规定了,客户端发送过来的数据格式是:cmd+data
// todo 其中的cmd就是sql的类型,类型都枚举在下面了,打眼一看都能懂
cmd := data[0]
// todo data部分就是sql详细内容
data = data[1:] switch cmd {
case mysql.COM_QUIT:
c.handleRollback()
c.Close()
return nil
case mysql.COM_QUERY: // todo select 语句
return c.handleQuery(hack.String(data))
case mysql.COM_PING: // todo ping 语句
return c.writeOK(nil)
case mysql.COM_INIT_DB:
return c.handleUseDB(hack.String(data))
case mysql.COM_FIELD_LIST:
return c.handleFieldList(data)
case mysql.COM_STMT_PREPARE:
return c.handleStmtPrepare(hack.String(data))
case mysql.COM_STMT_EXECUTE:// todo insert、update 语句
return c.handleStmtExecute(data)
case mysql.COM_STMT_CLOSE:
return c.handleStmtClose(data)
case mysql.COM_STMT_SEND_LONG_DATA:
return c.handleStmtSendLongData(data)
case mysql.COM_STMT_RESET:
return c.handleStmtReset(data)
case mysql.COM_SET_OPTION:
return c.writeEOF(0)
default:
msg := fmt.Sprintf("command %d not supported now", cmd)
golog.Error("ClientConn", "dispatch", msg, 0)
return mysql.NewError(mysql.ER_UNKNOWN_ERROR, msg)
} return nil
}

视频地址:https://www.bilibili.com/video/BV19g411N7NR?p=10

十一、读写分离实现原理

重点关注的地方:

conn_pershard.go:97

	// todo 从选出DB中获取一条可用的连接,如果是没有开事物且是读请求的话,executeDB.IsSlave一般为true
conn, err := c.getBackendConn(executeDB.ExecNode, executeDB.IsSlave)
defer c.closeConn(conn, false)
if err != nil {
return false, err
}

视频地址:https://www.bilibili.com/video/BV19g411N7NR?p=11

十二、赠送Proxy源码

写有注释的项目已上传置百度网盘,项目基于vendor管理依赖包,开箱即用~

关注白日梦的公众号(风一样的程序员),回复:数据库中间件 ,即可领取当前文档以及源码包。

Golang进阶,揉碎数据库中间件,干货满满!的更多相关文章

  1. 分布式数据库中间件Mycat百亿级数据存储(转)

    此文转自: https://www.jianshu.com/p/9f1347ef75dd 2013年阿里的Cobar在社区使用过程中发现存在一些比较严重的问题,如高并发下的假死,心跳连接的故障,只实现 ...

  2. 分布式数据库中间件 MyCat 搞起来!

    关于 MyCat 的铺垫文章已经写了三篇了: MySQL 只能做小项目?松哥要说几句公道话! 北冥有 Data,其名为鲲,鲲之大,一个 MySQL 放不下! What?Tomcat 竟然也算中间件? ...

  3. 最新整理的spring面试题从基础到高级,干货满满

    最新整理的spring面试题从基础到高级,干货满满 前言: 收藏了一些关于Spring的面试题,一方面是为了准备找工作的时候看面试题,另一方面,通过面试题的方式加深一些自己的理论知识. spring ...

  4. 开源分布式数据库中间件MyCat源码分析系列

    MyCat是当下很火的开源分布式数据库中间件,特意花费了一些精力研究其实现方式与内部机制,在此针对某些较为重要的源码进行粗浅的分析,希望与感兴趣的朋友交流探讨. 本源码分析系列主要针对代码实现,配置. ...

  5. MyCat:取代Cobar数据库中间件

    什么是MyCAT?简单的说,MyCAT就是: 一个彻底开源的,面向企业应用开发的“大数据库集群” 支持事务.ACID.可以替代Mysql的加强版数据库 ? 一个可以视为“Mysql”集群的企业级数据库 ...

  6. 数据库中间件mycat简单入门

    当在项目中mysql数据库成为瓶颈的时候,我们一般会使用主从复制,分库分表的方式来提高数据库的响应速度,比如mysql主从复制,在没有数据库中间件的情况下,我们只能由开发工程师在程序中控制,这对于一个 ...

  7. 分布式数据库中间件TDDL、Amoeba、Cobar、MyCAT架构比较分

    比较了业界流行的MySQL分布式数据库中间件,关于每个产品的介绍,网上的资料比较多,本文只是对几款产品的架构进行比较,从中可以看出中间件发展和演进路线 框架比较 TDDL Amoeba Cobar M ...

  8. 分布式数据库中间件–(3) Cobar对简单select命令的处理过程

    友情提示:非原文链接可能会影响您的阅读体验,欢迎查看原文.(http://blog.geekcome.com) 原文地址:http://blog.geekcome.com/archives/284 在 ...

  9. 分布式数据库中间件–(2) Cobar与client握手身份验证

    Cobar启动完毕,监听特定端口.整个认证的流程图: NIOAcceptor类继承自Thread类,该类的对象会以线程的方式执行,进行连接的监听. NIOAcceptor启动的初始化步骤例如以下: 1 ...

随机推荐

  1. Frida高级逆向-Hook Java

    Frida Hook Java 层 Frida两种启动方式的区别 span 模式:frida 重新打开一个进程 frida -U -f 包名 -l js路径 --no-pause attch 模式: ...

  2. 【c++ Prime 学习笔记】第14章 重载运算与类型转换

    14.1 基本概念 重载的运算符是特殊的函数:名字由关键字operator后接要定义的算符共同组成,也有返回类型.参数列表.函数体. 重载运算符函数的参数量与该算符作用的运算对象数量一样多 除重载调用 ...

  3. UltraSoft - Alpha - Scrum Meeting 6

    Date: Apr 21th, 2020. Scrum 情况汇报 进度情况 组员 负责 昨日进度 后两日任务 CookieLau PM 验证了课程中心获取课程资源和作业的爬虫方式 细化前后端交互中的难 ...

  4. 表单编辑时el-form的validate方法执行无效,阻塞代码运行 - Element UI踩坑记录

    今天在用element-ui写管理后台需求时,遇到一个奇怪的问题 一个正常带校验的表单,在新增列表数据时表单校验功能正常: 但是在新增之后再去编辑数据时,表单校验却失效了,甚至阻塞了后续的代码执行,控 ...

  5. 查找最小生成树:克鲁斯克尔算法(Kruskal)算法

    一.算法介绍 Kruskal算法是一种用来查找最小生成树的算法,由Joseph Kruskal在1956年发表.用来解决同样问题的还有Prim算法和Boruvka算法等.三种算法都是贪心算法的应用.和 ...

  6. 实验7:基于REST API的SDN北向应用实践

    一.实验目的 1.能够编写程序调用OpenDaylight REST API实现特定网络功能: 2.能够编写程序调用Ryu REST API实现特定网络功能. 二.实验环境 下载虚拟机软件Oracle ...

  7. Envoy实现.NET架构的网关(四)集成IdentityServer4实现OAuth2认证

    什么是OAuth2认证 简单说,OAuth 就是一种授权机制.数据的所有者告诉系统,同意授权第三方应用进入系统,获取这些数据.系统从而产生一个短期的进入令牌(token),用来代替密码,供第三方应用使 ...

  8. Python matplotlib 概率论与数理统计 伯努利分布 二项分布

    Python 代码实现 二项分布 import numpy as np import matplotlib.pyplot as plt import math from scipy import st ...

  9. 小白都能看懂的Spring源码揭秘之IOC容器源码分析

    目录 前言 IOC 只是一个 Map 集合 IOC 三大核心接口 IOC 初始化三大步骤 定位 加载 注册 总结 前言 在 Spring 框架中,大家耳熟能详的无非就是 IOC,DI,Spring M ...

  10. 访问kubernetes CRD的几种方式

    访问kubernetes CRD的几种方式 最近在使用代码操作VictoriaMetrics Operator的CRD资源的过程中,探究了集中访问CRD资源的方式.下面以VictoriaMetrics ...