Mysqltools
一个用于快速构建大规模,高质量,全自动化的 mysql分布式集群环境的工具;包含mysql 安装、备份、监控、高可用、读写分离、优化、巡检、自行化运维
Install / Use
/learn @Neeky/MysqltoolsREADME
mysqltools 权威指南
官方微信公众平台

文档结构
如果你使用 mysql-8.0 那么 https://github.com/Neeky/dbm-agent 在功能上会更加强大
概要
总的来说mysqltools源自于工作、一个dba的日常大概包括 数据库安装,读写分离、高可用、负载均衡等环境的配置, 数据库备份策略拟定与实施,数据库相关的监控,数据库优化,故障分析,也有可能参与到数据库建模,SQL的编写。
这样我们就面临两个问题 1、质量 质量表现在解决问题的深度(类似问题还会再出现吗?) 2、效率 效率表现在你单位时间内解决问题的数量(安装一百个库的用时是一个库的100倍 吗?); 通常这两个目标并不是互斥的,也就是说我们可以两个都做到。
-
质量
KFC vs 学校后街的蛋炒饭
KFC根据既定的流程生产每一个汉堡,假设这个流程下公众对汉堡给出的评分是80分,那么不管哪个KFC的店它生产出来的汉堡都稳定在80分;一段时间后它发现这个流程中可以改进的项,把汉堡的质量提升到81分,那么它就能做到所有的店里的汉堡都能打81分。
学校后街的蛋炒饭 好不好吃这个事难说;因为好多事都影响到它,有可能老板今天心情不好,也有可能是今天客人太多他比较急,这些都会影响到炒饭的质量。有一次我要买两盒,由于去的比较晚,老板只有一个鸡蛋了,你没有猜错! 他就只放了一个蛋,按常理是要一盒一个的。
表面上看KFC 流程化生产的好处在于它的东西质量有保障,最要命的是KFC只做加法,它可以不断提升自己,学校后街的蛋炒饭上周一,做的好吃,我们没办法确认那是不是超水平发挥,蛋炒饭质量的方差太大了。
对于DBA来说可以专门针对自己的日常工作开发一款工具,这样做的好处有 1:)由于工具已经把流程固定下来了所以“产出的质量”有保证 2:)随着自己技术的进步自己工作的输出也可以稳步提高。 这样我们在质量这个目标上就只做加法了。
-
效率
流水线 vs 手工作坊
流水线相对于手工作坊,那是生产力的巨大提升。我为什么要说这个?因为在MySQL的使用中可能会遇到一些场景,比如说“分库分表”,“高可用+读写分离”;特别是前者通常就是一个MyCAT后面有好几十个分片,上百个MySQL实例(通常它们会为一个分片做一主两从并加上高可用),装100+个MySQL今晚加班不? 配100+个主从今晚加班不? 不要忘记还要给它们加 高可用呢? 好吧这只是测试环境生产环境和测试环境是1:1的,那接下来几天加班不? 对于生产通常还要加备份,监控那接下来几天加班不?
DBA的工具不应该只是能输出高质量的交付物,更应该要解放生产力----有批量管理的能力。
-
经济
mysqltools 是开源的&免费的&高质量的MySQL数据管理工具
-
技术介绍
1、mysqltools的高质量源自于蒋乐兴也就是我写出来的高质量的playbook
2、mysqltools的高效源自于ansible这个批量管理工具
3、1 , 2 基本上解决了原生MySQL的环境(单机、master -->slave、mysql-group-replication 、multi-source-replication)的安装部署
4、mysqltools在为MySQL做高可用时采用的是MHA这个方案,读写分离用的是MyCAT
5、mysqltools在备份时支持到了 xtrabackup,mysql enterprise backup,mysqldump
6、mysqltools在监控MySQL时用的是zabbix
7、其它开源工具无法满足的功能通过自己编写程序实现。由于这个程序的许多功能是通用的,所以我把它单独了出来成为一个新的开源项目,这样它就与mysqltools解耦了。详见<a href="https://github.com/Neeky/mysqltools-python">mysqltools-python </a>
mysqltools的定位是一个集中化管理平台你只要在一台主机上安装好mysqltools就可以了,其它主机作为被管理都的角色。由于mysqltools是基于Python-3.x开发 出来的所以你的主控机上应该事先安装好python-3.x、还要安装上ansible。 好在mysqltools已经包含有所有Python和ansible所有的包。
安装mysqltools
假设我们有如下一套环境、把172.16.192.131这台主机作为主控机.
角色 | ip地址 | 系统版本 | -----------:|:-------------------|--------------| 主控机 | 172.16.192.131 |centos-7.4 | 被控机 | 172.16.192.132 |centos-7.4 | ... | ... |centos-7.x |
-
安装前的准备
1): 你的主控机上要配置有yum、因为mysqltools要源码编译安装Python-3.6.2、这就涉及gcc ... 等依赖
2): 有主控机的root账号(安装软件时会用到)
3): 被控机上也要配置好yum
-
下载并解压
mysqltools是开源在github上的、下载地址如下:https://github.com/Neeky/mysqltools/archive/master.zip
linux可以直接执行如下命令完成下载并解压到/usr/local/
cd /tmp/ wget https://github.com/Neeky/mysqltools/archive/master.zip & ll -h /tmp/ -rwxr-xr-x. 1 root root 194M 3月 23 11:52 master.zip unzip master.zip mv mysqltools-master /usr/local/mysqltools
-
安装Python
mysqltools包含了Python的自动化安装脚本、前提是yum已经可用
cd /usr/local/mysqltools/deploy/packages/python/ bash install.sh安装成功后的最后几行输出如下:
Collecting setuptools Collecting pip Installing collected packages: setuptools, pip Successfully installed pip-9.0.1 setuptools-28.8.0检查python3是否安装成功
source /etc/profile python3 --version Python 3.6.2
-
安装ansible
ansible和它相关的依赖我都打包到mysqltools中了、也和上面安装python一样一行命令就行
source /etc/profile cd /usr/local/mysqltools/deploy/packages/ansible bash install.sh安装成功后可以看到如下输出
Using /usr/local/python-3.6.2/lib/python3.6/site-packages Finished processing dependencies for ansible==2.4.0.0
-
配置ansible和mysqltools
1): 增加ansible的配置文件
# 增加ansible的配置文件 mkdir -p /etc/ansible touch /etc/ansible/hosts/etc/ansible/hosts文件如下:
host_131 ansible_user=root ansible_host=172.16.192.131 host_132 ansible_user=root ansible_host=172.16.192.132
2): 配置主控机与被控机之间的ssh信任
ssh-keygen ssh-copy-id root@172.16.192.131 ssh-copy-id root@172.16.192.132命令输出大致如下:
ssh-keygen # 一直回车就能生成钥匙对了 Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: SHA256:D9kR6/ehu5O99p/LRJlZWNqwZ0tzU4+jvPegq7j/Pq8 root@studio2018 The keys randomart image is: +---[RSA 2048]----+ | . . o| | o Oo| | o *+B| | + o ..+X| | S o + .* | | o . +.. | | . oo+. | | . ++=o.| | ooo+EOo**| +----[SHA256]-----+ ssh-copy-id root@172.16.192.131 # 回答yes、然后输入目标主机的root密码 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub" The authenticity of host '172.16.192.131 (172.16.192.131)' can't be established. ECDSA key fingerprint is SHA256:qdoqi3B2aqO3ssOIphwOiWLywSlAoflX2YH+LCG7T/E. ECDSA key fingerprint is MD5:8f:78:6e:20:ab:d0:2a:6b:c0:1a:e5:09:ac:82:7d:04. Are you sure you want to continue connecting (yes/no)? root@172.16.192.131's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'root@172.16.192.131'" and check to make sure that only the key(s) you wanted were added. .... ....
3): 测试ansible是否配置成功
ansible -m ping host_132 host_132 | SUCCESS => { "changed": false, "failed": false, "ping": "pong" }
4): 配置mysqltools
mysqltools的配置文件是mysqltools/config.yaml 它是一个yaml格式的文件;配置项中最基本的有mtls_base_dir、mysql_packages_dir、mysql_package
1、mtls_base_dir用于配置mysqltools的安装路径:在下载并解压这个步骤中我们把mysqltools解压到了/usr/local/、所以mtls_base_dir的值就应该等于"/usr/local/mysqltools/"
2、mysql_packages_dir用于配置MySQL二进制安装包保存的位置:MySQL的安装包有600+MB、出于体量的原因mysqltools并没有直接打包MySQL的二进制安装包、而是留有mysql_packages_dir这个配置项,mysqltools会从这个目录中去找MySQL的二进制安装包。
3、mysql_package用于配置MySQL安装包的名字、有这个变量的因为是为了,可以做到有多个不同的MySQL的版本共存、默认值为 mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz
config.yaml的关键内容大致如下:
mtls_base_dir: /usr/local/mysqltools/ mysql_packages_dir: /usr/local/src/mysql/ mysql_package: mysql-5.7.21-linux-glibc2.12-x86_64.tar.gz注意:在mysqltools中所有的目录都是要以'/'号结尾的
如果你正确的完成了mysqltools相关的配置那么config.yaml看起来就应该是这样的
--- #----------------------------------mysqltools全局配置文件--------------------- # section 1 #mysqltools所在的目录 mtls_base_dir: /usr/local/mysqltools/ # #mysqltool自带的各类软件的安装文件所在路径(相对路径) mtls_packages: deploy/packages/ # #mysqltool自带的python脚本、下发到被控主机时所保存的路径 mtls_client_base_dir: /usr/local/ # section 2 #mysqltools自带的各类软件安装文件 的全名、设置这些变量的作用是方便版本共存、mysql不在这里设置是因为 # #mysql的安装包太大了,mysqltools并没有把它打包进来 mtls_apr: apr-1.6.2.tar.gz mtls_apr_util: apr-util-1.6.0.tar.gz mtls_httpd: httpd-2.4.28.tar.gz mtls_php: php-5.6.31.tar.gz #mtls_zabbix: zabbix-3.4.3.tar.gz mtls_zabbix: zabbix-4.0.0.tar.gz mtls_python: python-3.6.2
