Author Archives: arstercz

有效升级 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 »

IPv6 使用及注意事项

By | 2018-07-19

本文介绍常用工具及软件使用 ipv6 时候的注意事项, 以及应用程序支持 ipv6 需要进行的检查列表. 下文中提到的混合服务表示工具可以同时服务 ipv4 和 ipv6, 很多软件在代码层做了 AF_INET 和 AF_INET6 标识的判断, 数据可以复用同一个 socket, 比如下面提到的 nginx, tomcat, resin 这三个软件是混合服务的, 即便 ipv6 请求连接了 nginx, nginx 到 tomcat, resin 也可以用 ipv4 处理, 对已有的架构影响不大, 不过一些获取 ipv6 地址, 存储访问地址的应用需要额外修改下; 独立服务表示需要开启单独的选项指定以区别 ipv4 和 ipv6, 这种情况下就只能 ipv4, ipv6 各自单独服务, 互不影响, 这样对一些较老的工具软件冲击较大, 需要做额外的开发支持. 另外下文并没有深入介绍 linux 系统对 ipv6 的具体支持, 更多信息可参考:… Read More »

使用 usql 连接各种不同的数据库

By | 2018-07-02

usql 介绍 usql 是一个统一的数据库连接工具, 目前支持常用的各种数据库, 包括 PostgreSQL, MySQL, Oracle, SQLite3, Microsoft SQL Server 以及最近几年出现的较新的数据库, 比如 clickhouse, Cassandra 等, 详见 database-support. 通常情况下 usql 以 usql [options] DSN 的方式进行连接, 不过 usql 并没有对各个数据的 DSN 进行过多的处理, 大部分情况下只是将其值直接传递到后端的数据库 driver, 所以 usql 的 DSN 格式依据不同的数据库会有不同的选项参数. 下面通过示例说明如何使用 usql 连接 MySQL, SQL Server, sqlite3, cassandra 以及 clickhouse. 连接 mysql DSN 参数依据 go-sql-driver #… Read More »

分组处理方式简单介绍

By | 2018-06-08

介绍 在一些特定的业务中, 我们更希望成批的处理一些数据而不是来一条处理一条, 比如消息队列处理等场景, 可以一次取几百个一次处理以提高处理能力, 不过这样也带来另一个问题, 生产者短时间内不能生产几百个的时候我们应该怎么处理. 一些软件工具的 client 驱动可能会提供一些定时器的功能, 比如可以处理指定时间内(比如 2s)的数据. 这种情况下我们就可以通过几种方式批量处理数据, 达到指定数量时处理, 达到指定时间时处理, 还有一种变通的方式则是每次批量处理前检查下待处理数据的数量, 取出一定数量的数据即可. 下面的介绍主要是前面两种方式. 计时器系统调用 我们可以通过计时器系统调用简单实现上述提到的第二种方式 – 达到指定时间时处理. 在 linux 系统中, 可以使用 alarm 系统调用实现简单的闹钟功能, 不过在 POSIX 标准中, 提供了比 alarm 更多控制功能的计时器系统调用, 包含以下两个函数: #include <sys/time.h> int getitimer (int which, struct itimerval *value); int setitimer (int which, const struct itimerval *value, struct itimerval *ovalue);… Read More »

centos7 系统 df hang 问题处理说明

By | 2018-06-07

问题描述 近期陆续碰到几台主机 df 卡住的问题, 监控程序由于超时引起相关的警报, 系统环境和 strace df 如下所示: kernel-3.10.0-514.21.2 systemd-219-57 strace 显示卡在了 /proc/sys/fs/binfmt_misc 状态中: # strace df execve(“/usr/bin/df”, [“df”], [/* 29 vars */]) = 0 brk(0) = 0x1731000 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa7720a7000 access(“/etc/ld.so.preload”, R_OK) = 0 open(“/etc/ld.so.preload”, O_RDONLY|O_CLOEXEC) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=24, …}) = 0 …… stat(“/sys/fs/cgroup/memory”, {st_mode=S_IFDIR|0755, st_size=0,… Read More »

监控 redis warn 级别日志信息

By | 2018-05-11

介绍 我们现有的 redis 监控包括 zabbix, cacti 以及定制的 redis-sentinel-notify 脚本. 在不进行 sentinel 切换的前提下, 很难发现 redis 是否出现了其它错误, 比如连接占满, 同步异常, 后台线程中断等. redis 的日志级别提供了更为详细的诊断的信息. 从 redis 源代码中搜索 redisLog 函数的 REDIS_WARNING 相关的参数即可管中窥豹的了解到 warn 级别提供的大多都是有用的诊断信息, 基于此我们可以通过 warn 信息来了解更精确的诊断信息. redis 日志级别 以 redis-4.0.8 版本为例说明, server.h 文件中其包含系统的 syslog.h 头文件, 可以看到 redis 日志级别遵循 syslog 的级别信息, 不过只用到了以下 4 个级别: /usr/include/sys/syslog.h 文件 …. #define LOG_WARNING 4… Read More »

使用 Percona Server auto manager 管理数据库

By | 2018-04-02

介绍 Percona Server auto manager 是基于 percona-server-5.6.39.83.1 的一个分支版本, 其增加了 memcached 记录和 sql 过滤的功能, 用来降低管理员操作数据库的风险. 不同于 inception 的深度修改, Percona Server auto manager 仅修改客户端的 client/mysql.cc 和 client/mysqldump.c, 不影响 server 端的功能. 说明: memcached 功能用来记录用户输入的用户名及密码, 这点在一次一密登录 mysql 的时候比较有用, 由于 mysql 命令行是将最终的密码哈希结果传给 server, 所以中间件等软件无法得知用户输入的验证信息, 如果一次一密是有状态的则可以通过时间等方式算出验证信息 比如 google totp, 如果是无状态的则中间件代理等工具无法得知验证信息. 当然我们也可以在 client 代码层完成验证, 不过这种方式存在局限性, 不够通用; sql 过滤功能则主要用来限制开发者或管理员对数据库表的修改, 可以使用 –skip-sql-filter 选项忽略此功能, 具体的限制规则见下文.… Read More »