Tag Archives: MySQL

动态代理 MySQL slave 端口

By | 2017/10/16

背景介绍 一直以来我们的数据库主从架构都以 vip 作为高可用的基石, 通过 vip + MHA 的方式完成 master 的高可用, 并未对 slave 进行相关的高可用设计. 随着时间的推移, 为了减少一些业务对 master 的繁重的操作, 线上的一小部分业务开始连接 slave 对外提供服务. 这些常见的业务包括以下类型: 1. op 相关的工程, 统计类大查询; 2. 日志分析类的查询操作; 3. 使用 atlas 进行读写的业务; 4. 主从延迟无关, 以读为主的业务; 我们现有的业务中, 并未使用 atlas, proxysql 等中间件, 所以 op 后台类的业务查询都通过 slave 服务. 不过在过往的几次故障案例中, MHA 切换主从后会出现以下情况: +——–+ +——–+ | vip | | vip… Read More »

如何实现 MySQL 的一次一密登录

By | 2017/08/18

如何实现 MySQL 的一次一密登录 背景介绍 在日常工作环境中, 开发或者测试人员经常需要连接测试库、线上库等查看表结构或数据来验证程序的功能. 实际上让 DBA 协助开发者查看信息会是特别繁琐且无趣的事情, 所以为了方便起见会将数据库的权限分发给开发或者测试人员. 不过长此以往下去有几件事情会让 DBA 深恶痛绝: 1. 账号会在开发者之间相互传递; 2. 为了方便开发者会以快捷命令的方式查看信息, 密码信息容易暴露; 3. 开发者忘记密码, DBA 可能需要重置以通知所有其他人员修改密码; 事实上, 上述几种情况是很难避免的, 只要有人工参与就会有这些潜在危险的隐患, 所以我们就需要提供一个相对方便记住的又能保证相对安全的方式供开发者使用. 下面则从不同层面简单的对这种方式进行描述. 管理主机 如果从系统层面来看, 我们建议最好把所有的开发者都集中到一台管理主机上登录, 只有开发者连接到这台机器上, 才能通过该机器连接测试库, 线上库等进行查询信息操作. 如下图所示: +————+ ssh +————–+ +———–+ | developers | ———-> | manager host | ———> | databases | +————+ +————–+ +———–+ 开发者通过 ssh… Read More »

使用 dbweb 修改数据库表结构

By | 2017/07/14

1. 说明 我们以 dbweb 工程为基础, 增加了一些功能上的限制, 来方便开发人员直接修改线上的数据库表结构, 修改及增加的更新包括: 1. 去掉原有的修改密码功能; 2. 增加 google totp 密码验证, 每登录一次需要获取最新的密码信息; 3. 限制 sql 执行, 包括以下限制: `delete/update` 语句必须带有 where 条件; `select` 语句必须带有 where 或 limit 条件; 禁止执行以下 sql: use <database> create <database/schema> alter … drop drop <database/schema> drop/truncate <table> purge … grant/revoke .. 格式化 sql; 4. 超过 200MB 大小的表禁止 alter… Read More »

基于 consul 架构的 MHA 自动切换

By | 2017/06/08

介绍 一直以来, 我们并未在线上启用 masterha_manager 自动切换脚本, 主要因为在网络抖动(网线, 所属机柜交换机不稳定)的情况下并不能保证数据库真的不能访问. 比如重启检测脚本所在机器的网卡并不能说明数据库出了问题, 所以从这方面看我们不能仅通过一个点的检测就判断数据库不可访问. 不过我们可以通过 consul(因为 consul 提供 dns 接口, 笔者更倾向于使用 consul, 而不是 etcd)集群的特性, 我们增加多点检测机制, 在 n 个集群的环境中, 有超过半数的检测点检测到数据库有问题, 我们就认为数据库不可访问, 这时则开始调用 masterha_manager 脚本进行切换, 如下图所示: <checkmysql> <checkmysql> <checkmysql> | | | +———+ +———+ +———+ | consul1 | | consul2 | | consul3 | +———+ +———+ +———+ \ | / \ |… Read More »

使用 MySQL 实现搜索附近的人

By | 2017/05/10

背景介绍 现今地理位置功能非常普及, 在很多网站, 手机 app 等都有体现, 现实中这个功能也方便了我们的吃穿住行, 比如我们普通大众经常使用的附近的人附近的餐厅等就是基于这个功能来实现, 其可以应用到以下相关功能: 商店: 找到你当前的位置; 社交: 找到你附近的朋友; 地图: 找到附近感兴趣的地方; 从这方面来看, 如何找到当前的位置是我们的首要任务, 庆幸的是现今的很多 gps 设备可以完成该任务, 比如我们常用的手机打开 gps 功能后, 相关的 app 即可获取到经纬度地理位置信息, 我们通过经纬度即可计算出相应的地理位置, 再就是计算两个经纬度之间的距离, 等等. 其背后的技术实现值得我们持续深入的学习下去,下文会简单介绍地理位置实现的方式, 后面则着重介绍如何使用 MySQL 实现附近的人的功能. 经纬度 详见: 经纬度 首先了解经纬度需要学习下地理知识, 经纬度是经度与纬度的合称组成的坐标系统, 称为地理坐标系统, 他是利用三度空间的球面来定义地球上的空间的球面坐标系统, 能够标示地球上的任意一个位置. 如下图所示: 纬线和经线都是人类为度量方便而假设处理的辅助线. 纬线 纬线定义为地球表面某店随地球自转所形成的轨迹, 如上图所示, 任何一根纬线都是圆形而且两两平行. 纬线的长度时赤道的周长诚意纬线的纬度的余弦. 经线 经线也称子午线, 定义为地球表面连接南北两极的大圆线上的半圆弧. 任两根经线的长度相等,相交于南北两极点, 每一根经线都有其相对应的数值,称为经度, 经线指示南北方向。 距离计算… Read More »