使用 mmm-manager 管理云环境中的 MySQL 双主实例

By | 2019-01-28

介绍说明 在之前的工具中, mha_switch 和 mha_manager_consul 的使用都是建立在虚 ip 漂移的基础上实现的高可用方案. 不过在云环境中, 目前很多的云厂商还不支持虚 ip 漂移的功能, SLB(负载均衡)等没有类似 haproxy 的 backup 模式, 所以不适用于单 master 读写的场景. 如果使用 SLB 代理多 master, 则很难保证数据一致性问题(比如主从延迟). 一些组织在使用云环境的时候可能首要考虑数据安全性, 这种情况下可能不会考虑 RDS 之类的服务, 而是在云主机中自建 MySQL 实例, 并且最好占用整个宿主机. 如果自建实例, 就一定需要考虑高可用方案, 在不支持虚 ip 漂移的情况下, dns 服务或者绑 hosts 文件是个可选的方案, 在故障切换的时候做好对应的记录修改即可, 不过这种方式需要业务做对应调整, 在业务复杂的场景下, 需要保证修改记录的准确性和及时性. mmm-manager 则提供了另一种方案用来管理双主满足高可用的需求. 不过该方案依赖一些编程语言驱动的特性支持. 对于不支持特性的编程语言, mmm-manager 提供了更新 redis key 值,… Read More »

Linux 系统如何处理名称解析

By | 2018-12-19

简单介绍 在 Linux 系统中, 绝大多数程序依赖系统库函数来完成名称解析, 整个解析过程包含多个操作, 有些操作信息在启动程序时确定, 有些操作信息则在程序运行时确认, Linux 也提供了一些网络函数(由 glibc 提供)来控制这些操作,下图所示为一个比较典型的应用程序, 域名解析及域名服务器之间的关系图: 程序在运行后通过 glibc 提供的网络函数(gethostbyname, getaddrinfo等)来调用解析器(resolver code, 比如 nsswitch 等), 解析器则读取一些配置文件(比如 /etc/nsswitch.conf, /etc/hosts, /etc/resolv.conf) 来决定使用什么域名服务器(nameserver)以什么选项(超时时间, 重试次数), 什么优先级(先 hosts 还是 先 dns) 对指定的域名进行处理. 当然也可以使用 dns 缓存类的工具加速请求的处理, 这些工具可以是 bind(当缓存用), nscd(由 glibc 提供), systemd-resolved(由 systemd 提供). 下面则简单介绍解析器提供的几个网络函数. 函数说明 glibc 的解析器(revolver code) 提供了下面两个函数实现名称到 ip 地址的解析, gethostbyname 函数以同步阻塞的方式提供服务, 没有超时等选项,… Read More »

使用 systemd 限制系统资源的使用

By | 2018-12-10

简单介绍 在基于 Linux-3.x 内核版本的很多发行版都提供了 Systemd 来管理系统和服务. 同时也将 cgroup 功能加到了 slice, scope 和 service 三个单元中, 详见 sec-Default_Cgroup_Hierarchies. 基于这些特性我们可以很方便的通过 systemd 来限制服务或者进程对系统资源的使用, 这在单主机多服务的场景下会很有用. 下面则以 MySQL 服务为例介绍如何使用 systemd 限制资源的使用, 其它服务的限制和此等同. 示例使用 以 Centos7 系统为例, 从 redhat-resource-control 的文档来看, 官方建议通过 service 来实现资源的限制, 所以这里我们增加可以带端口参数(如果单台主机有多个 MySQL 实例的话)启动的 mysql 服务: # cat /usr/lib/systemd/system/mysql@.service [Unit] Description=MySQL Server node%i [Service] Type=forking Environment=”PORT_ARGS=%I” PermissionsStartOnly=true ExecStart=/usr/local/mysqlnode/bin/node ${PORT_ARGS} start… Read More »

TokuDB 修改分区表耗时长问题处理

By | 2018-12-06

问题说明 在之前的文章TokuDB 使用简单说明中简单介绍了如何使用 TokuDB, 其固有的特性很适合存储日志类的需求, 不过近期在修改 TokuDB 分区表的时候出现操作时间较长的提示, 业务端也同时出现响应时间较长的请求. 如下所示: # bash text_data_partition.sh 127.0.0.1 3311 text_base text_data 2018_12_05_14_55_39 [info] alter maxvalue of the partitions 2018_12_05_14_55_39 [info] reorganize p20181217 partition 2018_12_05_14_55_44 [info] reorganize p20181217 partition ok 我们按天对 text_data 表进行分区, p20181217 分区为小于 MAXVALUE 的空表, 在增加 p20181218 分区的时候耗时较长, 上述的操作耗时 5s, 查看各子表信息, 所有子分区文件的时间戳都有改变, 不过我们只操作了 p20181217 分区, 理论上来讲应该只有 p20181217 和… Read More »

Centos 系统 SLAB dentry 过高引起系统卡顿分析处理

By | 2018-10-23

问题说明 近期几台主机系统都出现卡顿几秒甚至十几秒的现象, 期间没有网络问题. 每次出现卡顿现象的时间也不固定. 服务请求数和流量也没有异常变化, 我们使用 cpu_capture 状态脚本解析 top 命令的输出, 正常情况几百毫秒即可输出, 在异常时耗时很长, 如下可以看到耗时接近 15s: begin time: 2018-09-24T23:26:25.347257868 end time: 2018-09-24T23:26:40.062807607 Total cpu usage: 241.8 373 -> cpu: 100.00, state: R, cmd: kswapd0 374 -> cpu: 100.00, state: R, cmd: kswapd1 31493 -> cpu: 20.90, state: R, cmd: curl 31196 -> cpu: 16.70, state: R, cmd:… Read More »

使用 repl_mysql 监控表数据变更

By | 2018-10-08

介绍 repl_mysql 在 replication 的基础上增加了更多的功能选项, 基于此可以仅关注指定选项的表的更新. 由于原理同 MySQL 的主从复制, replication 即通过伪造 slave 的方式接收 MySQL master 端的所有更新操作, 不同于真实的 slave, repl_mysql 不需要重新组织接收到的数据到 relay log 日志, 也不用重放 relay log 中的 sql. 注意事项 从上述的实现方式来看, 使用 repl_mysql 的时候需要注意以下几点: 1. 可以在一台主机中使用 repl_mysql 接收多个 MySQL master 的数据, 每个 master 对应一个独立的 repl_mysql 进程. 不过需要注意连接的数量, 避免流量过大引起网络相关的问题; 2. MySQL binlog 为 ROW 格式的情况下会记录所有字段的变更, 单个请求的数据复制会较大, 在更新较多的场景中,… Read More »

有效升级 MySQL 表的 ip 字段

By | 2018-08-07

在文章 IPv6 使用及注意事项 中我们提到了应用程序如果要支持 IPv6, 需要关注相关数据库的修改, 不过由于业务设计的不同, 有些程序可能使用 char, varchar 等存储 ip 字符串, 有些程序也可能考虑到索引效率使用 int unsigned 存储 ip 的整形. 不过对于 IPv6 地址, 由于其 128 bit 的长度, 决定了 IP 地址数量为 (2^128 – 1), 这个值对 64 位的主机而言无法存储, 所以建议使用 varchar 类型存储所有的 IPv6 地址. MySQL 5.6 及以上的版本可以使用 hex(inet6_aton(ipv6address)) 的方式将 ipv6 存到 binary 或 varbinary 的字段中, 不过为了统一处理, 下文则主要介绍修改 ip 字段到… Read More »