{"id":13753588,"url":"https://github.com/Neeky/mysqltools","last_synced_at":"2025-05-09T21:35:36.998Z","repository":{"id":38705417,"uuid":"86786470","full_name":"Neeky/mysqltools","owner":"Neeky","description":"一个用于快速构建大规模，高质量，全自动化的 mysql分布式集群环境的工具；包含mysql 安装、备份、监控、高可用、读写分离、优化、巡检、自行化运维","archived":false,"fork":false,"pushed_at":"2023-03-20T03:52:39.000Z","size":517703,"stargazers_count":1064,"open_issues_count":0,"forks_count":465,"subscribers_count":68,"default_branch":"master","last_synced_at":"2024-11-12T18:02:03.545Z","etag":null,"topics":["ansible","atlas","dble","dev-ops","innodb","innodb-cluster","master-slave","mgr","mycat","mysql","mysql-backup","mysql-dba","mysql-group-replicaion","mysql-maintance","mysql-monitor","mysql-tools","python","zabbix"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Neeky.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-03-31T06:37:22.000Z","updated_at":"2024-11-11T08:21:12.000Z","dependencies_parsed_at":"2024-10-29T23:25:18.820Z","dependency_job_id":null,"html_url":"https://github.com/Neeky/mysqltools","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Neeky%2Fmysqltools","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Neeky%2Fmysqltools/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Neeky%2Fmysqltools/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Neeky%2Fmysqltools/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Neeky","download_url":"https://codeload.github.com/Neeky/mysqltools/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224884615,"owners_count":17386121,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ansible","atlas","dble","dev-ops","innodb","innodb-cluster","master-slave","mgr","mycat","mysql","mysql-backup","mysql-dba","mysql-group-replicaion","mysql-maintance","mysql-monitor","mysql-tools","python","zabbix"],"created_at":"2024-08-03T09:01:25.228Z","updated_at":"2025-05-09T21:35:36.938Z","avatar_url":"https://github.com/Neeky.png","language":"Python","readme":"\n# mysqltools 权威指南\n\n官方微信公众平台 \n\n![官方微信公众平台](docs/mp-wechat.jpg)\n\n---\n\n## 文档结构\n- [概要](#概要)\n  - [质量](#质量)\n  - [效率](#效率)\n  - [经济](#经济)\n  - [技术介绍](#技术介绍)\n- [安装mysqltools](#安装mysqltools)\n  - [安装前的准备](#安装前的准备)\n  - [下载并解压](#下载并解压)\n  - [安装Python](#安装Python)\n  - [安装ansible](#安装ansible)\n  - [配置ansible和mysqltools](#配置ansible和mysqltools)\n- [mysqltools快速开始](#mysqltools快速开始)\n  - [mysqltools目录介绍](#mysqltools目录介绍)\n  - [自动化mysql单实例安装](#自动化mysql单实例安装)\n    - [进入mysql功能目录](#进入mysql功能目录)\n    - [指定安装的目标主机](#指定安装的目标主机)\n    - [执行自动化安装](#执行自动化安装)\n  - [谈谈mysqltools如何实现高效](#谈谈mysqltools如何实现高效)\n  - [谈谈mysqltools如何实现高质量](#谈谈mysqltools如何实现高质量)\n- [赞助/交流/技术支持](#联系我)\n- [mysql原生环境安装](#mysql原生环境安装)\n  - [mysql单机](#mysql单机)\n  - [mysql主从复制](#mysql主从复制)\n  - [mysql多源复制](#mysql多源复制)\n  - [mysql组复制](#mysql组复制)\n  - [mysql小版本升级](#mysql小版本升级)\n- [读写分离](#读写分离)\n  - [mycat读写分离](#mycat读写分离)\n- [高可用](#高可用)\n  - [mha](#mha)\n    - [环境规划](#环境规划)\n    - [配置mha的一些前置备件](#配置mha的一些前置备件)\n    - [配置ansible的hosts文件](#配置ansible的hosts文件)\n    - [配置mysqltools中mha相关的配置项](#配置mysqltools中mha相关的配置项)\n    - [配置mha的相关信息](#配置mha的相关信息)\n    - [准备安装配置mha](#准备安装配置mha)\n    - [安装配置mha](#安装配置mha)\n    - [验证是否成功完成](#验证是否成功完成)\n- [备份](#备份)\n  - [mysqltools备份相关的实现细节](#mysqltools备份相关的实现细节)\n  - [实施备份计划的前期准备](#实施备份计划的前期准备)\n  - [配置备份](#配置备份)\n  - [检查配置是否成功的几个点](#检查配置是否成功的几个点)\n  - [注意事项](#注意事项)\n- [巡检](#巡检)\n  - [开发中]\n- [监控](#监控)\n  - [目前已经实现的监控项](#目前已经实现的监控项)\n  - [监控项的人肉使用方法](#监控项的人肉使用方法)\n  - [zabbix监控环境介绍](#zabbix监控环境介绍)\n  - [zabbix监控环境安装规划](#zabbix监控环境安装规划)\n  - [安装用于保存监控数据的mysql数据库](#安装用于保存监控数据的mysql数据库)\n  - [改配置文件中zabbix_server_ip这个配置项](#改配置文件中zabbix_server_ip这个配置项)\n  - [安装httpd](#安装httpd)\n  - [安装zabbix服务端](#安装zabbix服务端)\n  - [安装zabbix客户端](#安装zabbix客户端)\n  - [通过mysqltools中给出的模板来监控mysql](#通过mysqltools中给出的模板来监控mysql)\n  - [mysqltools中定义的MySQL的监控模板](#mysqltools中定义的MySQL的监控模板)\n- [lnmp](#lnmp)\n  - [安装mysql单机](#安装mysql单机)\n  - [安装python](#安装python)\n  - [安装nginx](#安装nginx)\n  - [查看效果](#查看效果)\n\n---\n\n如果你使用 mysql-8.0 那么 https://github.com/Neeky/dbm-agent 在功能上会更加强大\n\n---\n\n\n## 概要\n\n   总的来说mysqltools源自于工作、一个dba的日常大概包括 数据库安装，读写分离、高可用、负载均衡等环境的配置，\n   数据库备份策略拟定与实施，数据库相关的监控，数据库优化，故障分析，也有可能参与到数据库建模，SQL的编写。\n   \n   这样我们就面临两个问题 1、**质量** 质量表现在解决问题的深度(类似问题还会再出现吗？) 2、**效率** 效率表现在你单位时间内解决问题的数量(安装一百个库的用时是一个库的100倍   吗？)； 通常这两个目标并不是互斥的，也就是说我们可以两个都做到。\n\n   ---\n\n1. ## 质量\n   **KFC** vs **学校后街的蛋炒饭**\n\n   KFC根据既定的流程生产每一个汉堡，假设这个流程下公众对汉堡给出的评分是80分，那么不管哪个KFC的店它生产出来的汉堡都稳定在80分；一段时间后它发现这个流程中可以改进的项，把汉堡的质量提升到81分，那么它就能做到所有的店里的汉堡都能打81分。\n\n   学校后街的蛋炒饭 好不好吃这个事难说；因为好多事都影响到它，有可能老板今天心情不好，也有可能是今天客人太多他比较急，这些都会影响到炒饭的质量。有一次我要买两盒，由于去的比较晚，老板只有一个鸡蛋了，你没有猜错！ 他就只放了一个蛋，按常理是要一盒一个的。\n\n   表面上看**KFC** 流程化生产的好处在于它的东西质量有保障，**最要命的是KFC只做加法，它可以不断提升自己，学校后街的蛋炒饭上周一，做的好吃，我们没办法确认那是不是超水平发挥，蛋炒饭质量的方差太大了。**\n\n   \n   **对于DBA来说可以专门针对自己的日常工作开发一款工具，这样做的好处有 1:)由于工具已经把流程固定下来了所以“产出的质量”有保证 2:)随着自己技术的进步自己工作的输出也可以稳步提高。**  **这样我们在质量这个目标上就只做加法了。**\n   \n   ---\n\n2. ## 效率\n   \n   **流水线** vs **手工作坊**\n\n   流水线相对于手工作坊，那是生产力的巨大提升。我为什么要说这个？因为在MySQL的使用中可能会遇到一些场景，比如说“分库分表”，“高可用+读写分离”；特别是前者通常就是一个MyCAT后面有好几十个分片，上百个MySQL实例(通常它们会为一个分片做一主两从并加上高可用)，装100+个MySQL今晚加班不？ 配100+个主从今晚加班不？ 不要忘记还要给它们加\n   高可用呢？ 好吧这只是测试环境生产环境和测试环境是1:1的，那接下来几天加班不？ 对于生产通常还要加备份，监控那接下来几天加班不？\n\n   **DBA的工具不应该只是能输出高质量的交付物，更应该要解放生产力----有批量管理的能力。**\n\n   ---\n\n3. ## 经济\n   **mysqltools 是开源的\u0026免费的\u0026高质量的MySQL数据管理工具**\n\n   ---\n\n4. ## 技术介绍\n   1、mysqltools的高质量源自于**蒋乐兴**也就是我写出来的高质量的playbook\n\n   2、mysqltools的高效源自于**ansible**这个批量管理工具\n\n   3、1 , 2 基本上解决了原生MySQL的环境(**单机**、**master --\u003eslave**、**mysql-group-replication** 、**multi-source-replication**)的安装部署\n\n   4、mysqltools在为MySQL做**高可用**时采用的是**MHA**这个方案，**读写分离用**的是**MyCAT**\n\n   5、mysqltools在**备份**时支持到了 **xtrabackup**,**mysql enterprise backup**,**mysqldump**\n\n   6、mysqltools在**监控**MySQL时用的是**zabbix**\n\n   7、其它开源工具无法满足的功能通过自己编写程序实现。由于这个程序的许多功能是通用的，所以我把它单独了出来成为一个新的开源项目，这样它就与mysqltools解耦了。详见\u003ca href=\"https://github.com/Neeky/mysqltools-python\"\u003emysqltools-python \u003c/a\u003e\n\n   mysqltools的定位是一个**集中化管理平台**你只要**在一台主机上安装好mysqltools就可以了**，其它主机作为被管理都的角色。由于mysqltools是基于**Python-3.x**开发\n   出来的所以你的**主控机**上应该事先安装好python-3.x、还要安装上ansible。 好在mysqltools已经包含有所有**Python**和**ansible**所有的包。\n\n   ---\n\n## 安装mysqltools\n\n   假设我们有如下一套环境、把**172.16.192.131**这台主机作为主控机.\n   \n   **角色**     | **ip地址**         | **系统版本**   |\n   -----------:|:-------------------|--------------|\n   主控机       | 172.16.192.131     |centos-7.4    |\n   被控机       | 172.16.192.132     |centos-7.4    |\n   ...         | ...                |centos-7.x    |\n\n   ---\n\n   1. ### 安装前的准备\n      1): **你的主控机上要配置有yum**、因为mysqltools要源码编译安装Python-3.6.2、这就涉及gcc ... 等依赖\n   \n      2): **有主控机的root账号(安装软件时会用到)**\n   \n      3): **被控机上也要配置好yum**\n\n      ---\n\n   2. ### 下载并解压\n      **mysqltools是开源在github上的、下载地址如下：https://github.com/Neeky/mysqltools/archive/master.zip** \n   \n      linux可以直接执行如下命令完成下载并解压到/usr/local/\n   \n      ```bash\n      cd /tmp/\n      wget https://github.com/Neeky/mysqltools/archive/master.zip \u0026\n   \n      ll -h /tmp/                                                                           \n      -rwxr-xr-x. 1 root  root  194M 3月  23 11:52 master.zip\n   \n      unzip master.zip\n   \n      mv mysqltools-master /usr/local/mysqltools\n      ```\n   \n      ---\n\n   3. ### 安装Python\n      **mysqltools包含了Python的自动化安装脚本、前提是yum已经可用**\n   \n      ```bash\n      cd /usr/local/mysqltools/deploy/packages/python/\n      bash install.sh\n   \n      ```\n      安装成功后的最后几行输出如下：\n      ```bash\n      Collecting setuptools\n      Collecting pip\n      Installing collected packages: setuptools, pip\n      Successfully installed pip-9.0.1 setuptools-28.8.0\n      ```\n   \n      检查python3是否安装成功\n      ```bash\n      source /etc/profile\n    \n      python3 --version\n      Python 3.6.2\n      ```\n   \n      ---\n   \n   4. ### 安装ansible\n      **ansible和它相关的依赖我都打包到mysqltools中了、也和上面安装python一样一行命令就行**\n   \n      ```bash\n      source /etc/profile\n      cd /usr/local/mysqltools/deploy/packages/ansible\n      bash install.sh \n   \n      ```\n      安装成功后可以看到如下输出\n      ```bash\n      Using /usr/local/python-3.6.2/lib/python3.6/site-packages\n      Finished processing dependencies for ansible==2.4.0.0\n      ```\n   \n      ---\n\n   5. ### 配置ansible和mysqltools\n      1): **增加ansible的配置文件**\n\n      ```bash\n      # 增加ansible的配置文件\n      mkdir -p /etc/ansible\n      touch /etc/ansible/hosts\n      ```\n      /etc/ansible/hosts文件如下：\n      ```\n      host_131 ansible_user=root ansible_host=172.16.192.131\n      host_132 ansible_user=root ansible_host=172.16.192.132\n      ```\n\n      ---\n\n      2): **配置主控机与被控机之间的ssh信任**\n\n      ```bash\n      ssh-keygen\n      ssh-copy-id root@172.16.192.131\n      ssh-copy-id root@172.16.192.132\n      ```\n      命令输出大致如下：\n      ```bash\n      ssh-keygen # 一直回车就能生成钥匙对了\n      Generating public/private rsa key pair.\n      Enter file in which to save the key (/root/.ssh/id_rsa): \n      Enter passphrase (empty for no passphrase): \n      Enter same passphrase again: \n      Your identification has been saved in /root/.ssh/id_rsa.\n      Your public key has been saved in /root/.ssh/id_rsa.pub.\n      The key fingerprint is:\n      SHA256:D9kR6/ehu5O99p/LRJlZWNqwZ0tzU4+jvPegq7j/Pq8 root@studio2018\n      The keys randomart image is:\n      +---[RSA 2048]----+\n      |          .   . o|\n      |           o   Oo|\n      |          o   *+B|\n      |         + o ..+X|\n      |        S o + .* |\n      |         o . +.. |\n      |          . oo+. |\n      |         .  ++=o.|\n      |        ooo+EOo**|\n      +----[SHA256]-----+\n   \n   \n      ssh-copy-id root@172.16.192.131 # 回答yes、然后输入目标主机的root密码\n      /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: \"/root/.ssh/id_rsa.pub\"\n      The authenticity of host '172.16.192.131 (172.16.192.131)' can't be established.\n      ECDSA key fingerprint is SHA256:qdoqi3B2aqO3ssOIphwOiWLywSlAoflX2YH+LCG7T/E.\n      ECDSA key fingerprint is MD5:8f:78:6e:20:ab:d0:2a:6b:c0:1a:e5:09:ac:82:7d:04.\n      Are you sure you want to continue connecting (yes/no)? \n      root@172.16.192.131's password: \n      \n      Number of key(s) added: 1\n      \n      Now try logging into the machine, with:   \"ssh 'root@172.16.192.131'\"\n      and check to make sure that only the key(s) you wanted were added.\n   \n      .... ....\n   \n      ```\n   \n      ---\n\n      3): **测试ansible是否配置成功**\n      ```bash\n      ansible -m ping host_132\n   \n      host_132 | SUCCESS =\u003e {\n          \"changed\": false,\n          \"failed\": false,\n          \"ping\": \"pong\"\n      }\n      ```\n   \n      ---\n\n      4): **配置mysqltools**\n   \n      mysqltools的配置文件是**mysqltools/config.yaml** 它是一个yaml格式的文件；配置项中最基本的有**mtls_base_dir、mysql_packages_dir、mysql_package**\n   \n      1、**mtls_base_dir用于配置mysqltools的安装路径**：在[下载并解压](#下载并解压)这个步骤中我们把mysqltools解压到了/usr/local/、所以mtls_base_dir的值就应该等于\"/usr/local/mysqltools/\"\n\n      ---\n   \n      2、**mysql_packages_dir用于配置MySQL二进制安装包保存的位置**：MySQL的安装包有600+MB、出于体量的原因mysqltools并没有直接打包MySQL的二进制安装包、而是留有mysql_packages_dir这个配置项，mysqltools会从这个目录中去找MySQL的二进制安装包。\n\n      ---\n   \n      3、**mysql_package用于配置MySQL安装包的名字**、有这个变量的因为是为了，可以做到有多个不同的MySQL的版本共存、默认值为   mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz\n      \n      ---\n\n      config.yaml的关键内容大致如下：\n      ```yaml\n      mtls_base_dir: /usr/local/mysqltools/\n      mysql_packages_dir: /usr/local/src/mysql/\n      mysql_package: mysql-5.7.21-linux-glibc2.12-x86_64.tar.gz\n      ```\n      注意：在mysqltools中所有的目录都是要以'/'号结尾的\n\n      ---\n   \n      **如果你正确的完成了mysqltools相关的配置那么config.yaml看起来就应该是这样的**\n      ```\n      ---\n      #----------------------------------mysqltools全局配置文件---------------------\n      # section 1 #mysqltools所在的目录\n      mtls_base_dir: /usr/local/mysqltools/\n      #           #mysqltool自带的各类软件的安装文件所在路径(相对路径)\n      mtls_packages: deploy/packages/\n      #           #mysqltool自带的python脚本、下发到被控主机时所保存的路径\n      mtls_client_base_dir: /usr/local/\n      \n      \n      #  section 2  #mysqltools自带的各类软件安装文件 的全名、设置这些变量的作用是方便版本共存、mysql不在这里设置是因为\n      #             #mysql的安装包太大了，mysqltools并没有把它打包进来         \n      mtls_apr: apr-1.6.2.tar.gz\n      mtls_apr_util: apr-util-1.6.0.tar.gz\n      mtls_httpd: httpd-2.4.28.tar.gz\n      mtls_php: php-5.6.31.tar.gz\n      #mtls_zabbix: zabbix-3.4.3.tar.gz\n      mtls_zabbix: zabbix-4.0.0.tar.gz\n      mtls_python: python-3.6.2.tar.xz\n      mtls_mysql_connector_python: mysql-connector-python-2.1.5.tar.gz\n      mtls_mycat: mycat-server-1.6.5-linux.tar.gz\n      mtls_mha_node: mhanode.tar.gz\n      mtls_mha_manager: mhamanager.tar.gz\n      mtls_git: git-2.9.5.tar.gz\n      mtls_nginx: nginx-1.13.7.tar.gz\n      mtls_sysbench: sysbench-1.1.0.tar.gz\n      mtls_meb: meb-4.1.0-linux-glibc2.5-x86-64bit.tar.gz\n      mtls_xtrb: percona-xtrabackup-2.4.9-Linux-x86_64.tar.gz\n      mtls_mysqlclient: mysqlclient-1.3.12.tar.gz\n      mtls_pytz: pytz-2018.4.tar.gz\n      mtls_django: django-2.0.4.tar.gz\n      mtls_uwsgi: uwsgi-2.0.17.tar.gz\n      \n      #mysql与php-5.6.x 是否要同时安装在一台主机上、如果是就要把这个设置成yes、以为php导出mysqclient_r.so文件\n      mtls_with_php: 1\n      #通过ansible在被控机上安装python-3.x的时候，是否自动安装好mysql-connector-python\n      mtls_with_mysql_conntor_python: 1\n      #是否给mysql用户加密码\n      mtls_make_mysql_secure: 1\n      #\n      mtls_with_mysql_group_replication: 0\n      #----------------------------------mysqltools全局配置文件---------------------\n      \n      \n      ####\n      #### mysql 相关的配置\n      ####\n      #mysql 安装包所在的目录\n      mysql_packages_dir: /usr/local/src/mysql/\n      #mysql 安装包的名字\n      #mysql_package: mysql-5.6.40-linux-glibc2.12-x86_64.tar.gz\n      #mysql_package: mysql-5.7.23-linux-glibc2.12-x86_64.tar.gz\n      mysql_package: mysql-8.0.13-linux-glibc2.12-x86_64.tar.xz\n      #linux 系统级别mysql用户相关信息\n      mysql_user: mysql\n      mysql_group: mysql\n      mysql_user_uid: 3306\n      mysql_user_gid: 3306\n      #mysql 安装目录\n      mysql_base_dir: /usr/local/mysql/\n      #mysql 真正的datadir就会是mysql_data_dir_base+mysql_port\n      mysql_data_dir_base: /database/mysql/data/\n      mysql_port: 3306\n      mysql_root_password: mtls0352\n      mysql_zabbix_password: mtls\n      mysql_rple_user: repl\n      mysql_rple_password: repl0352\n      mysql_mha_user: mha\n      mysql_mha_password: mtls0352\n      mysql_app_user: appuser\n      mysql_app_password: mtls0352\n      mysql_monitor_user: monitor\n      mysql_monitor_password: monitor0352\n      mysql_backup_user: backup\n      mysql_backup_password: DX3906\n      #mysql 配置文件模版\n      mysql_binlog_format: row\n      mysql_innodb_log_files_in_group: 16\n      mysql_innodb_log_file_size: 256M\n      mysql_innodb_log_buffer_size: 64M\n      mysql_innodb_open_files: 65535\n      mysql_max_connections: 1000\n      mysql_thread_cache_size: 256\n      mysql_sync_binlog: 1\n      mysql_binlog_cache_size: 64K\n      mysql_innodb_online_alter_log_max_size: 128M\n      mysql_performance_schema: 'on'\n      use_write_set: 1\n      \n      #mysql \n      \n      ####\n      #### zabbix 相关的配置\n      #####\n      zabbix_server_ip: 172.16.192.131\n      \n      \n      \n      ```\n      为了你能更加方便的使用mysqltools我提供了份linux上的标准配置文件**mysqltools/config.yaml-for-linux** 使用时只要把它重命名成**cofnig.yaml**就行了\n   \n      ---\n\n      5): **下载MySQL**\n   \n      根据上面的配置可以知道MySQL的安装包要保存到**/usr/local/src/mysql/**目录下、包的版本为mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz\n      \n      下载地址如下：https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz\n       \n      ```bash\n      cd /usr/local/src/mysql/\n      wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.21-linux-glibc2.12-x86_64.tar.gz\n      \n   \n      ```\n\n\n---\n\n## mysqltools快速开始\n   **mysqltools的目录组织是根据它的功能来定的**\n   1. ### mysqltools目录介绍\n\n      ```\n      cd /usr/local/mysqltools/\n      tree ./\n      ├── README.md                // 文档\n      ├── config.yaml              // 为Mac生成的配置文件(你可能用不着我的开发机是Mac)\n      ├── config.yaml-for-linux    // 专为linux生成的个配置文件\n      ├── deploy                   // 自动化安装与配置的所有实现\n      ├── docs                     // 文件资源\n      ├── trashCan                 // 垃圾文件\n      └── tuning                   // DBA常用的SQL脚本有助于快速解决问题\n      ```\n      \n      ---\n\n   2. ### 自动化mysql单实例安装\n      **mysqltools/deploy/ansible/** 目录下的每一个子目录都对应一类软件环境的自动化安装、我们这次是要安装MySQL所以应该进入到mysql子目录\n\n      ---\n   \n      1. #### 进入mysql功能目录\n          ```\n          cd /usr/local/mysqltools/deploy/ansible/mysql/\n          ll \n          ```\n          输出如下\n          ```\n          总用量 24\n          drwxr-xr-x. 2 root root 4096 3月  19 15:01 common                                 # 通用组件\n          -rw-r--r--. 1 root root  836 3月  19 15:01 install_group_replication.yaml         # 自动化安装mysql group replication\n          -rw-r--r--. 1 root root  889 3月  19 15:01 install_master_slaves.yaml             # 自动化安装mysql 主从复制环境\n          -rw-r--r--. 1 root root  924 3月  19 15:01 install_multi_source_replication.yaml  # 自动化安装mysql 多源复制\n          -rw-r--r--. 1 root root  772 3月  26 13:20 install_single_mysql.yaml              # 自动化安装mysql 单机实例\n          drwxr-xr-x. 3 root root  203 3月  19 15:01 template                               # 通用模板        \n          -rw-r--r--. 1 root root  892 3月  19 15:01 upgrad_single_mysql.yaml               # 自动化升级MySQL(不推荐)\n          drwxr-xr-x. 2 root root   99 3月  19 15:01 vars                                   # 自定义变量(重要!)\n          -rw-r--r--  1 root root   99 3月  19 15:01 uninstall.yaml                         # 专门用来删库的(无力回天的那种删除)\n          ```\n          由于/usr/local/mysqltools/deploy/ansible/下的每一个子目录都实现某一类功能，于是我们约定/usr/local/mysqltools/deploy/ansible/下的子目录叫**功能目录**,   功能目录下的会包含若干.yaml文件，每一个文件都实现了特定的功能，如install_single_mysql.yaml实现了自动化安装MySQL的功能。\n       \n          ---\n       \n      2. #### 指定安装的目标主机\n\n         install_single_mysql.yaml的前几行大致如下\n\n         ```yaml\n         ---\n          - hosts: cstudio\n            remote_user: root\n            become_user: yes\n            vars_files:\n             - ../../../config.yaml\n            tasks:\n             - name: create user and config file\n               import_tasks: common/create_user_and_config_file.yaml\n         \n         ```\n         其中的**- hosts: cstudio** 这一行中的cstudio 就是用来指定目标主机或主机组的，也就是说它指明了install_single_mysql.yaml将在哪里安装MySQL单实例\n\n         假设我们要在host_132这台主机上安装单机的MySQL所以我们要把cstudio改成host_132、注意这里的host_132引用的是/etc/ansible/hosts文件、修改后的install_single_mysql.yaml文件的前几行大致如下\n\n         ```yaml\n         ---\n          - hosts: host_132\n            remote_user: root\n            become_user: yes\n            vars_files:\n             - ../../../config.yaml\n            tasks:\n             - name: create user and config file\n               import_tasks: common/create_user_and_config_file.yaml\n         ```\n         \n         ---\n   \n      3. #### 执行自动化安装\n         正如上文所说的mysqltools是借助ansible来完成自动化的、那么我们调用ansible来完成自动化安装MySQL\n         ```bash\n         ansible-playbook install_single_mysql.yaml \n         \n         ```\n         输出如下\n\n         ```\n         \n         PLAY [host_132] *********************************************************************************************\n         \n         TASK [Gathering Facts] **************************************************************************************\n         ok: [host_132]\n         \n         TASK [create mysql user] ************************************************************************************\n         changed: [host_132]\n         \n         TASK [create and config /etc/my.cnf] ************************************************************************\n         changed: [host_132]\n         \n         TASK [install libaio-devel] *********************************************************************************\n         ok: [host_132]\n         \n         TASK [install numactl-devel] ********************************************************************************\n         ok: [host_132]\n         \n         TASK [transfer mysql install package to remote host and unarchive to /usr/local/] ***************************\n         changed: [host_132]\n         \n         TASK [change owner to mysql user] ***************************************************************************\n         changed: [host_132]\n         \n         TASK [make link /usr/local/mysql-xx.yy.zz to /usr/local/mysql] **********************************************\n         changed: [host_132]\n         \n         TASK [export mysql share object (*.os)] *********************************************************************\n         ok: [host_132]\n         \n         TASK [load share object] ************************************************************************************\n         changed: [host_132]\n         \n         TASK [export path env variable] *****************************************************************************\n         ok: [host_132]\n         \n         TASK [export path env to /root/.bashrc] *********************************************************************\n         ok: [host_132]\n         \n         TASK [make link /usr/local/mysql-xx.yy.zz to /usr/local/mysql] **********************************************\n         ok: [host_132]\n         \n         TASK [create libmysqlclient_r.so file for php-5.6] **********************************************************\n         changed: [host_132]\n         \n         TASK [create datadir] ***************************************************************************************\n         changed: [host_132]\n         \n         TASK [initialize-insecure] **********************************************************************************\n         changed: [host_132]\n         \n         TASK [create systemd config file] ***************************************************************************\n         changed: [host_132]\n         \n         TASK [start mysql(sytemctl)] ********************************************************************************\n         changed: [host_132]\n         \n         TASK [config mysql.service start up on boot] ****************************************************************\n         ok: [host_132]\n         \n         TASK [config sysv start script] *****************************************************************************\n         skipping: [host_132]\n         \n         TASK [start mysql(service)] *********************************************************************************\n         skipping: [host_132]\n         \n         TASK [config mysql.service start up on boot] ****************************************************************\n         skipping: [host_132]\n         \n         TASK [transfer sleep script to /tmp/] ***********************************************************************\n         changed: [host_132]\n         \n         TASK [sleep 15 seconds] *************************************************************************************\n         changed: [host_132]\n         \n         TASK [remove /tmp/sleep_15.sh] ******************************************************************************\n         changed: [host_132]\n         \n         TASK [transfer sql statement to remonte] ********************************************************************\n         changed: [host_132]\n         \n         TASK [make mysql secure] ************************************************************************************\n         changed: [host_132]\n         \n         TASK [remove temp file /tmp/make_mysql_secure.sql] **********************************************************\n         changed: [host_132]\n         \n         PLAY RECAP **************************************************************************************************\n         host_132                   : ok=25   changed=17   unreachable=0    failed=0 \n         ```\n\n         测试MySQL是否安装成功\n         ```bash\n         mysql -uroot -pmtls0352 \n         ```\n         输出如下\n         ```                                                            \n         mysql: [Warning] Using a password on the command line interface can be insecure.\n         Welcome to the MySQL monitor.  Commands end with ; or \\g.\n         Your MySQL connection id is 3\n         Server version: 5.7.21-log MySQL Community Server (GPL)\n         \n         Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.\n         \n         Oracle is a registered trademark of Oracle Corporation and/or its\n         affiliates. Other names may be trademarks of their respective\n         owners.\n         \n         Type 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.\n         \n         mysql\u003e \n         ```\n         \n         ---\n\n   3. ### 谈谈mysqltools如何实现高效 \n      从上面的[自动化mysql单实例安装](#自动化mysql单实例安装)来看自动化安装的过程中我们只执行了**3个命令**\n      ```bash\n      cd \n      vim\n      ansible-playbook\n      ```\n      其中 1、cd 用于进行mysql功能目录 2、vim用于指定playbook的目标主机或主机组 3、执行playbook\n\n      高效的关键有两点：\n\n      **1):自动化安装的方式相对于人肉来说要快很多**\n\n      **2):支持批量操作也就是说可以同时在多台主机上执行、只要在hosts: 变量的值是一个主机组就行了**\n\n      ---\n\n   4. ### 谈谈mysqltools如何实现高质量\n\n      **1、mysqltools是流程化的，如上面的安装MySQL就包含20+的小步骤，尽量做到面面俱到**  \n\n      ---\n\n      **2、mysqltools尽可能的在各个小步骤中都保持高的质量、比如/etc/my.cnf各个参数的配置都会根据主机当前的cpu \u0026 内存进行配置**\n\n      ---\n\n      以下是一个host_132的/etc/my.cnf **这些都是由mysqltools针对单机环境动态生成的**\n\n      ```cnf\n      [mysql]\n      auto-rehash\n      \n      \n      [mysqld]\n      ####: for global\n      user                                =mysql                          #   mysql\n      basedir                             =/usr/local/mysql/              #   /usr/local/mysql/\n      datadir                             =/database/mysql/data/3306      #   /usr/local/mysql/data\n      server_id                           =653                            #   0\n      port                                =3306                           #   3306\n      character_set_server                =utf8                           #   latin1\n      explicit_defaults_for_timestamp     =off                            #    off\n      log_timestamps                      =system                         #   utc\n      socket                              =/tmp/mysql.sock                #   /tmp/mysql.sock\n      read_only                           =0                              #   off\n      skip_name_resolve                   =1                              #   0\n      auto_increment_increment            =1                              #   1\n      auto_increment_offset               =1                              #   1\n      lower_case_table_names              =1                              #   0\n      secure_file_priv                    =                               #   null\n      open_files_limit                    =65536                          #   1024\n      max_connections                     =256                            #   151\n      thread_cache_size                   =128                              #   9\n      table_open_cache                    =4096                           #   2000\n      table_definition_cache              =2000                           #   1400\n      table_open_cache_instances          =32                             #   16\n      \n      ####: for binlog\n      binlog_format                       =row                          #     row\n      log_bin                             =mysql-bin                      #   off\n      binlog_rows_query_log_events        =on                             #   off\n      log_slave_updates                   =on                             #   off\n      expire_logs_days                    =7                              #   0\n      binlog_cache_size                   =65536                          #   65536(64k)\n      binlog_checksum                     =none                           #   CRC32\n      sync_binlog                         =1                              #   1\n      slave-preserve-commit-order         =ON                             #   \n      \n      ####: for error-log\n      log_error                           =err.log                        #   /usr/local/mysql/data/localhost.localdomain.err\n      \n      general_log                         =off                            #   off\n      general_log_file                    =general.log                    #   hostname.log\n      \n      ####: for slow query log\n      slow_query_log                      =on                             #    off\n      slow_query_log_file                 =slow.log                       #    hostname.log\n      log_queries_not_using_indexes       =on                             #    off\n      long_query_time                     =2.000000                       #    10.000000\n      \n      ####: for gtid\n      gtid_executed_compression_period    =1000                          #    1000\n      gtid_mode                           =on                            #    off\n      enforce_gtid_consistency            =on                            #    off\n      \n      \n      ####: for replication\n      skip_slave_start                    =0                              #   \n      master_info_repository              =table                         #    file\n      relay_log_info_repository           =table                         #    file\n      slave_parallel_type                 =logical_clock                 #    database | LOGICAL_CLOCK\n      slave_parallel_workers              =4                             #    0\n      rpl_semi_sync_master_enabled        =1                             #    0\n      rpl_semi_sync_slave_enabled         =1                             #    0\n      rpl_semi_sync_master_timeout        =1000                          #    1000(1 second)\n      plugin_load_add                     =semisync_master.so            #\n      plugin_load_add                     =semisync_slave.so             #\n      binlog_group_commit_sync_delay      =500                          #    500(0.05%秒)、默认值0\n      binlog_group_commit_sync_no_delay_count = 13                        #    0\n      \n      \n      ####: for innodb\n      default_storage_engine                          =innodb                     #   innodb\n      default_tmp_storage_engine                      =innodb                     #   innodb\n      innodb_data_file_path                           =ibdata1:64M:autoextend     #   ibdata1:12M:autoextend\n      innodb_temp_data_file_path                      =ibtmp1:12M:autoextend      #   ibtmp1:12M:autoextend\n      innodb_buffer_pool_filename                     =ib_buffer_pool             #   ib_buffer_pool\n      innodb_log_group_home_dir                       =./                         #   ./\n      innodb_log_files_in_group                       =8                          #   2\n      innodb_log_file_size                            =128M                        #  50331648(48M)\n      innodb_file_per_table                           =on                         #   on\n      innodb_online_alter_log_max_size                =128M                  #   134217728(128M)\n      innodb_open_files                               =65535                       #   2000\n      innodb_page_size                                =16k                        #   16384(16k)\n      innodb_thread_concurrency                       =0                          #   0\n      innodb_read_io_threads                          =4                          #   4\n      innodb_write_io_threads                         =4                          #   4\n      innodb_purge_threads                            =4                          #   4\n      innodb_print_all_deadlocks                      =on                         #   off\n      innodb_deadlock_detect                          =on                         #   on\n      innodb_lock_wait_timeout                        =50                         #   50\n      innodb_spin_wait_delay                          =6                          #   6\n      innodb_autoinc_lock_mode                        =2                          #   1\n      innodb_io_capacity                              =200                        #   200\n      innodb_io_capacity_max                          =2000                       #   2000\n      #--------Persistent Optimizer Statistics\n      innodb_stats_auto_recalc                        =on                         #   on\n      innodb_stats_persistent                         =on                         #   on\n      innodb_stats_persistent_sample_pages            =20                         #   20\n      innodb_buffer_pool_instances                    =1\n      innodb_adaptive_hash_index                      =on                         #   on\n      innodb_change_buffering                         =all                        #   all\n      innodb_change_buffer_max_size                   =25                         #   25\n      innodb_flush_neighbors                          =1                          #   1\n      #innodb_flush_method                             =                           #  \n      innodb_doublewrite                              =on                         #   on\n      innodb_log_buffer_size                          =128M                        #  16777216(16M)\n      innodb_flush_log_at_timeout                     =1                          #   1\n      innodb_flush_log_at_trx_commit                  =1                          #   1\n      innodb_buffer_pool_size                         =1152M                  #       134217728(128M)\n      autocommit                                      =1                          #   1\n      #--------innodb scan resistant\n      innodb_old_blocks_pct                           =37                         #    37\n      innodb_old_blocks_time                          =1000                       #    1000\n      #--------innodb read ahead\n      innodb_read_ahead_threshold                     =56                         #    56 (0..64)\n      innodb_random_read_ahead                        =OFF                        #    OFF\n      #--------innodb buffer pool state\n      innodb_buffer_pool_dump_pct                     =25                         #    25 \n      innodb_buffer_pool_dump_at_shutdown             =ON                         #    ON\n      innodb_buffer_pool_load_at_startup              =ON                         #    ON\n      \n      \n      \n      \n      ####  for performance_schema\n      performance_schema                                                      =on    #    on\n      performance_schema_consumer_global_instrumentation                      =on    #    on\n      performance_schema_consumer_thread_instrumentation                      =on    #    on\n      performance_schema_consumer_events_stages_current                       =on    #    off\n      performance_schema_consumer_events_stages_history                       =on    #    off\n      performance_schema_consumer_events_stages_history_long                  =off   #    off\n      performance_schema_consumer_statements_digest                           =on    #    on\n      performance_schema_consumer_events_statements_current                   =on    #    on\n      performance_schema_consumer_events_statements_history                   =on    #    on\n      performance_schema_consumer_events_statements_history_long              =off   #    off\n      performance_schema_consumer_events_waits_current                        =on    #    off\n      performance_schema_consumer_events_waits_history                        =on    #    off\n      performance_schema_consumer_events_waits_history_long                   =off   #    off\n      performance-schema-instrument                                           ='memory/%=COUNTED'\n      ```\n      由上面的内容可以看到mysqltools生成的/etc/my.cnf在各个方面都是比较全面的(配置是在一个2core 2G的vm虚拟机上复制出来的)\n   \n      ---\n\n## 联系我\n\n   **赞助/交流/技术支持**\n\n   如果我分享的知识对你有用、可以打赏任意金额；这些也是我花了许多业余时间才写出来的，也许可以请我喝一杯咖啡。如果你需要一名数据库建模、运维方面的专家也可也联系我、当然技术方面的交流也是欢迎的。\n\n   \u003cimg src=\"./docs/imgs/jianglexing_alipay.JPG\" width=\"240px\" /\u003e\n   \u003cimg src=\"./docs/imgs/jianglexing_donate_wechart.jpg\" width=\"240px\" /\u003e\n   \u003cimg src=\"./docs/imgs/jiangleixng_wechart.jpg\" width=\"240px\" /\u003e\n   \n   ---\n\n## mysql原生环境安装\n   **原生环境安装主要包含 1、MySQL单机 2、主从复制 3、多源复制 4、组复制(mysql-group-replication)**\n   如果这是你第一次使用mysqltools可以从[mysqltools快速开始](#mysqltools快速开始)章节开启你的mysqltools之旅\n\n   ---\n\n   1. ### mysql单机\n      **1):进入mysql功能目录**\n      ```bash\n      cd /usr/local/mysqltools/deploy/ansible\n      \n      cd mysql  #进入mysql功能目录\n      ```\n\n      ---\n\n      **2):指定install_single_mysql.yaml中的目标主机**\n\n      假设我要在host_132主机上安装mysql那么install_single_mysql.yaml文件中的hosts变量应该设置为host_132\n      ```yaml\n      ---\n       - hosts: host_132\n      ```\n      yaml格式对空间是非常敏感的、注意“:”后面是有个空格的\n\n      ---\n\n      **3):执行自动化安装**\n      ```bash\n      ansible-playbook install_single_mysql.yaml\n      ```\n      输出省略 ... ...\n\n      ---\n\n      **4):验证mysql是否成功安装**\n      ```bash\n      mysql -uroot -pmtls0352\n      ```\n      输出如下\n      ```\n      mysql: [Warning] Using a password on the command line interface can be insecure.\n      Welcome to the MySQL monitor.  Commands end with ; or \\g.\n      Your MySQL connection id is 2\n      Server version: 5.7.21-log MySQL Community Server (GPL)\n      \n      Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.\n      \n      Oracle is a registered trademark of Oracle Corporation and/or its\n      affiliates. Other names may be trademarks of their respective\n      owners.\n      \n      Type 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.\n      \n      mysql\u003e\n      ```\n      root用户的密码是在mysqltools/config.yaml文件中的mysql_root_password配置项指定的、你可以根据你的要求定制\n\n      ---\n\n   2. ### mysql主从复制  \n      假设我们要在**10.186.19.15，10.186.19.16，10.186.19.17**三台主机上建设一个一主两从的主从复制环境，其中10.186.19.15为主库\n\n      ---\n\n      **1):增加主机信息到/etc/ansible/hosts**\n\n      向/etc/ansible/hosts文件中增加如下内容\n      ```\n      [repl]\n      replmaster15 ansible_host=10.186.19.15\n      replslave16 ansible_host=10.186.19.16\n      replslave17 ansible_host=10.186.19.17\n      ```\n\n      ---\n\n      **2):进入mysql功能目录**\n      ```bash\n      cd /usr/local/mysqltools/deploy/ansible\n      \n      cd mysql  #进入mysql功能目录\n      ```\n\n      ---\n\n      **3):指定install_master_slaves.yaml中的目标主机**\n\n      假设我要在repl主机组上安装mysql复制环境那么install_master_slaves.yaml文件中的hosts变量应该设置为repl\n      ```yaml\n      ---\n       - hosts: repl\n      ```\n      修改vars/master_slaves.yaml 告诉mysqltools那个ip是主那些ip是slave\n      ```\n      #在创建一主多从环境时会用到的变量\n      master_ip: 10.186.19.15\n      slave_ips:\n        - 10.186.19.16\n        - 10.186.19.17\n      ```\n\n      ---\n\n      **4):执行自动化安装**\n      ```bash\n      ansible-playbook install_master_slaves.yaml \n      ```\n      输出如下\n      ```\n      PLAY [repl] *****************************************************************************************\n      \n      TASK [Gathering Facts] ******************************************************************************\n      ok: [replmaster15]\n      ok: [replslave16]\n      ok: [replslave17]\n      \n      ... ... ... ... ... ... 省略 ... ... ... ... ... ... \n      \n      PLAY RECAP ******************************************************************************************\n      replmaster15                : ok=28   changed=18   unreachable=0    failed=0   \n      replslave16                 : ok=28   changed=19   unreachable=0    failed=0   \n      replslave17                 : ok=28   changed=19   unreachable=0    failed=0 \n      ```\n\n      ---\n\n      **5):检查主从复制环境是否配置完成**\n      ```\n      mysql -uroot -pmtls0352\n      show slave status \\G\n      ```\n      输出如下\n      ```\n      *************************** 1. row ***************************\n                     Slave_IO_State: Waiting for master to send event\n                        Master_Host: 10.186.19.15\n                        Master_User: rple\n                        Master_Port: 3306\n                      Connect_Retry: 60\n                    Master_Log_File: mysql-bin.000002\n                Read_Master_Log_Pos: 595\n                     Relay_Log_File: actionsky16-relay-bin.000002\n                      Relay_Log_Pos: 800\n              Relay_Master_Log_File: mysql-bin.000002\n                   Slave_IO_Running: Yes\n                  Slave_SQL_Running: Yes\n                  ... ... ... ... ... ... ... ... \n                 Retrieved_Gtid_Set: 8b5ac555-37ec-11e8-b50e-5a3fdb1cf647:1-2\n                  Executed_Gtid_Set: 8b5ac555-37ec-11e8-b50e-5a3fdb1cf647:1-2\n                      Auto_Position: 1\n               Replicate_Rewrite_DB: \n                       Channel_Name: \n                 Master_TLS_Version:\n      ```\n      两个Yes 说明说明主从复制环境成功配置了\n      \n      ---\n\n   3. ### mysql多源复制\n\n      假设我们要在**10.186.19.15，10.186.19.16，10.186.19.17**这三台机器上搭建两主1从的多源复制环境、其中15，16两机器上的数据向17同步\n\n      ---\n\n      **1):增加主机信息到/etc/ansible/hosts**\n\n      向/etc/ansible/hosts文件中增加如下内容\n      ```\n      [repl]\n      replmaster15 ansible_host=10.186.19.15\n      replslave16 ansible_host=10.186.19.16\n      replslave17 ansible_host=10.186.19.17\n      ```\n\n      ---\n\n      **2):进入mysql功能目录**\n      ```bash\n      cd /usr/local/mysqltools/deploy/ansible\n      \n      cd mysql  #进入mysql功能目录\n      ``` \n\n      ---     \n\n      **3):指定install_multi_source_replication.yaml中的目标主机**\n\n      假设我要在repl主机组上安装mysql复制环境那么install_multi_source_replication.yaml文件中的hosts变量应该设置为repl\n      ```yaml\n      ---\n       - hosts: repl\n      ```\n      修改vars/multi_source_replication.yaml 告诉mysqltools那些ip是主那个ip是slave\n      ```\n      #master_ips 定义多个master主机ip组成的列表\n      master_ips:\n       - '10.186.19.15'\n       - '10.186.19.16'\n      \n      #定义slave的ip\n      slave_ip: '10.186.19.17'\n      ```\n\n      ---\n\n      **4):执行自动化安装**\n      ```bash\n      ansible-playbook install_multi_source_replication.yaml \n      ```\n      输出省略\n      ```\n      ```\n\n      ---\n\n      **5):检测多源复制环境是否安装成功**\n      ```\n      mysql -uroot -pmtls0352\n      show slave status \\G\n      ```\n      输出如下\n      ```\n      *************************** 1. row ***************************\n                     Slave_IO_State: Waiting for master to send event\n                        Master_Host: 10.186.19.15\n                        Master_User: rple_user\n                        Master_Port: 3306\n                      Connect_Retry: 60\n                    Master_Log_File: mysql-bin.000002\n                Read_Master_Log_Pos: 150\n                     Relay_Log_File: actionsky17-relay-bin-master1.000002\n                      Relay_Log_Pos: 355\n              Relay_Master_Log_File: mysql-bin.000002\n                   Slave_IO_Running: Yes\n                  Slave_SQL_Running: Yes\n      *************************** 2. row ***************************\n                     Slave_IO_State: Waiting for master to send event\n                        Master_Host: 10.186.19.16\n                        Master_User: rple_user\n                        Master_Port: 3306\n                      Connect_Retry: 60\n                    Master_Log_File: mysql-bin.000002\n                Read_Master_Log_Pos: 150\n                     Relay_Log_File: actionsky17-relay-bin-master2.000002\n                      Relay_Log_Pos: 355\n              Relay_Master_Log_File: mysql-bin.000002\n                   Slave_IO_Running: Yes\n                  Slave_SQL_Running: Yes\n      ```\n      两个通道都是双Yes、多源监制环境成了哦！\n\n      ---\n\n   4. ### mysql组复制\n      假设我们要在**10.186.19.15，10.186.19.16，10.186.19.17**这三台机器上搭建一个group replication 环境\n\n      ---\n\n      **1):增加主机信息到/etc/ansible/hosts**\n\n      向/etc/ansible/hosts文件中增加如下内容\n      ```\n      [repl]\n      mgr15 ansible_host=10.186.19.15\n      mgr16 ansible_host=10.186.19.16\n      mgr17 ansible_host=10.186.19.17\n      ```\n\n      ---\n\n      **2):进入mysql功能目录**\n      ```bash\n      cd /usr/local/mysqltools/deploy/ansible\n      \n      cd mysql  #进入mysql功能目录\n      ``` \n\n      ---\n\n      **3):指定install_group_replication.yaml中的目标主机**\n\n      假设我要在repl主机组上安装mysql复制环境那么install_group_replication.yaml文件中的hosts变量应该设置为repl\n      ```yaml\n      ---\n       - hosts: repl\n      ```\n      修改var/group_replication.yaml.yaml 告诉mysqltools那些主机要参与到group replication中、组中成员之前通信的端口是多少、binlog的格式设置成row、开启group replication 复制的开关，这样的话mysqltools就会在生成配置文件的时候写入group replication相关的配置\n      ```\n      mtls_with_mysql_group_replication: 1\n      mysql_binlog_format: row\n      mysql_mgr_port: 13306\n      mysql_mgr_hosts: \n          - '10.186.19.15'\n          - '10.186.19.16'\n          - '10.186.19.17'\n      ```\n\n      ---\n\n      **4):执行自动化安装**\n      ```bash\n      ansible-playbook install_group_replication.yaml \n      ```\n      输出如下\n      ```\n      PLAY [repl] *****************************************************************************************\n      \n      TASK [Gathering Facts] ******************************************************************************\n      ok: [mgr15]\n      ok: [mgr16]\n      ok: [mgr17]\n      ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... \n      PLAY RECAP ******************************************************************************************\n      mgr15                : ok=28   changed=19   unreachable=0    failed=0   \n      mgr16                : ok=28   changed=18   unreachable=0    failed=0   \n      mgr17                : ok=28   changed=18   unreachable=0    failed=0 \n      ```\n\n      ---\n      \n      **5):检查group replication集群是否安装成功**\n      ```bash\n      mysql -uroot -pmtls0352\n      select * from performance_schema.replication_group_members ;\n      ```\n      输出如下\n      ```\n      +---------------------------+--------------------------------------+-------------+-------------+--------------+\n      | CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |\n      +---------------------------+--------------------------------------+-------------+-------------+--------------+\n      | group_replication_applier | 08de362c-3802-11e8-9e65-5a3fdb1cf647 | actionsky15 |        3306 | ONLINE       |\n      | group_replication_applier | ef7f3b61-3801-11e8-886d-9a17854b700d | actionsky17 |        3306 | ONLINE       |\n      | group_replication_applier | f1649143-3801-11e8-8fd3-5a1f0f06c50d | actionsky16 |        3306 | ONLINE       |\n      +---------------------------+--------------------------------------+-------------+-------------+--------------+\n      3 rows in set (0.00 sec)\n      ```\n      三个都是online说明group replication 配置成功了哦\n\n      当mtls_with_mysql_group_replication: 1这个开头打开后mysqltools会自动为/etc/my.cnf增加了group replication 相关的配置项\n      ```\n      ####: for mysql group replication \n      loose-group_replication_recovery_retry_count          =10                                         #   10\n      loose-group_replication_recovery_reconnect_interval   =60                                         #   60\n      loose-group_replication_allow_local_disjoint_gtids_join=off                                       #   off\n      loose-group_replication_allow_local_lower_version_join=off                                        #   off\n      loose-group_replication_ip_whitelist                  =AUTOMATIC                                  #   AUTOMATIC\n      loose-transaction_write_set_extraction                =XXHASH64                                   # off\n      loose-group_replication_group_name                    =\"aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa\"     #\n      loose-group_replication_start_on_boot                 =off                                        # off\n      loose-group_replication_bootstrap_group               =off                                        # off\n      loose-group_replication_single_primary_mode           =on                                         #   on\n      loose-group_replication_enforce_update_everywhere_checks=off\n      loose-group_replication_gtid_assignment_block_size    =1000000                                    #   1000000\n      loose-group_replication_poll_spin_loops               =0                                          #   0\n      loose-group_replication_compression_threshold         =1024                                       #   1000000\n      loose-group_replication_flow_control_mode             =QUOTA                                      #   QUOTA\n      loose-group_replication_local_address                 =\"10.186.19.15:13306\"\n      loose-group_replication_group_seeds                   =\"10.186.19.15:13306,10.186.19.16:13306,10.186.19.17:13306\"\n      ```\n      也就是说目前mysqltools在配置group replication 集群环境时是按单个写结点的方式配置的、**默认mysqltools把第一个ip地址设置为写结点**\n\n      ---\n\n   5. ### mysql小版本升级\n      **mysqltools为版本升级提供了支持，如果你想使用这个功能，那么你要清楚的知道自己在干什么**\n\n      ---\n\n      1、小版本升级并不会去执行`mysql_upgrade`脚本，这个主要是由于mysqltools诞生环境比较特别，单个实例的数据量是以`TB`来衡量的，在这种量级的情况下`mysql_upgrade`可以能执行几天才能完成，所以你懂的\n\n      ---\n\n      **1):修改upgrad_single_mysql.yaml文件的hosts 变量为你要升级的目标主机**\n\n      ```\n      ---\n       - hosts: sqlstudio\n      ```\n\n      ---\n\n      **2):执行升级程序**\n      ```\n      ansible-playbook upgrad_single_mysql.yaml\n      ```\n      输出如下：\n      ```\n      PLAY [sqlstudio] **************************************************************************************************************\n      \n      TASK [Gathering Facts] ********************************************************************************************************\n      ok: [sqlstudio]\n      \n      TASK [stop mysql service] *****************************************************************************************************\n      ok: [sqlstudio]\n      \n      TASK [backup link file] *******************************************************************************************************\n      changed: [sqlstudio]\n      \n      TASK [unarchive new package to /usr/local/] ***********************************************************************************\n      changed: [sqlstudio]\n      \n      TASK [change owner and group] *************************************************************************************************\n      changed: [sqlstudio]\n      \n      TASK [make new link file] *****************************************************************************************************\n      changed: [sqlstudio]\n      \n      TASK [start mysql service] ****************************************************************************************************\n      changed: [sqlstudio]\n      \n      PLAY RECAP ********************************************************************************************************************\n      sqlstudio                  : ok=7    changed=5    unreachable=0    failed=0\n      ```\n\n      ---\n\n      **3):查看升级是否成功**\n      \n      1、看/usr/local/下的变化\n\n      **升级前**\n      ```\n      drwxr-xr-x   9 mysql mysql 129 6月  18 14:46 mysql-5.7.21-linux-glibc2.12-x86_64\n      lrwxrwxrwx   1 root  root   35 6月  18 14:53 mysql -\u003e mysql-5.7.21-linux-glibc2.12-x86_64\n      ```\n      **升级后**\n      ```\n      lrwxrwxrwx   1 mysql mysql  46 6月  18 15:30 mysql -\u003e /usr/local/mysql-5.7.22-linux-glibc2.12-x86_64\n      drwxr-xr-x   9 mysql mysql 129 6月  18 14:46 mysql-5.7.21-linux-glibc2.12-x86_64\n      drwxr-xr-x   9 mysql mysql 129 6月  18 15:30 mysql-5.7.22-linux-glibc2.12-x86_64\n      lrwxrwxrwx   1 root  root   35 6月  18 14:53 mysql.backup.20180618 -\u003e mysql-5.7.21-linux-glibc2.12-x86_64\n      ```\n\n      ---\n\n      2、连接进数据库进行检察\n      ```\n      mysql -uroot -pxxxxxx\n      ```\n\n      ```                                                              \n      mysql: [Warning] Using a password on the command line interface can be insecure.\n      Welcome to the MySQL monitor.  Commands end with ; or \\g.\n      Your MySQL connection id is 3\n      Server version: 5.7.22-log MySQL Community Server (GPL)\n      \n      Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.\n      \n      Oracle is a registered trademark of Oracle Corporation and/or its\n      affiliates. Other names may be trademarks of their respective\n      owners.\n      \n      Type 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.\n      \n      mysql\u003eselect @@version;\n      +------------+\n      | @@version  |\n      +------------+\n      | 5.7.22-log |\n      +------------+\n      1 row in set (0.00 sec)\n      ```\n\n      ---\n\n \n## 读写分离\n   **本来这里是要加入分库分表的功能的、因为用yaml难以表达mycat的相关配置、最终我还是放弃了、所以目前mysqltools还只有自动化安装配置mycat读写分离的功能**\n\n   ---\n\n   1. ### mycat读写分离\n      假设我们已经有了套三结点的集群10.186.19.15，10.186.19.16，10.186.19.17，其中15支持读写，16、17只读；为了方面应用程序我们要在10.186.19.14上安装一个mycat用它做读写分离，这样应用只要配置一个连接字符串就可以了(连接mycat)\n\n      ---\n\n      **1):在数据库中创建用户、mycat会有这个用户连接数据库**\n\n      用户名、密码引用自mysqltools/config.yaml中的mysql_app_user、mysql_app_password\n      在读写库上执行如下代码\n      ```sql\n      create user appuser@'%' identified by 'mtls0352';\n      create database appdb char set utf8;\n      grant all on appdb.* to appuser@'%';\n      ```\n\n      ---\n\n      **2):向/etc/ansible/hosts文件增加主机信息**\n      向/etc/ansible/hosts文件增加如下内容\n      ```\n      mycat ansible_host=10.186.19.14\n      ```\n\n      ---\n\n      **3):更新var/var_mycat.yaml文件**\n\n      告诉mysqltools那个主机是读写库(master_ip)，哪些库是只读库(slave_ips)，导出后端哪些schema(schemas)\n      ```\n      master_ip: \"10.186.19.15\"\n      \n      slave_ips:\n       - \"10.186.19.16\"\n       - \"10.186.19.17\"\n      \n      schemas:\n       - \"appdb\"\n      ```\n      **可以把master_ip设置为vip、slave_ips设置为所有ip的一个列表，这样就可以不在意高可用环境下的主从切换了**\n\n      ---\n\n      **4):修改install_mycat.yaml文件中的hosts**\n      ```\n      ---\n       - hosts: mycat\n      ```\n\n      ---\n\n      **5):执行mycat的安装**\n      ```\n      ansible-playbook install_mycat.yaml\n      ```\n      输出如下\n      ```\n      PLAY [mycat] ****************************************************************************************\n      \n      TASK [Gathering Facts] ******************************************************************************\n      ok: [mycat]\n      \n      TASK [install java-1.7.0-openjdk] *******************************************************************\n      changed: [mycat]\n      \n      TASK [create mycat user] ****************************************************************************\n      changed: [mycat]\n      \n      TASK [trasfer mycat-server-1.6.5-linux.tar.gz to remonte host] **************************************\n      changed: [mycat]\n      \n      TASK [export MYCAT_HOME env to /etc/profile] ********************************************************\n      changed: [mycat]\n      \n      TASK [config schema.xml] ****************************************************************************\n      changed: [mycat]\n      \n      TASK [config server.xml] ****************************************************************************\n      changed: [mycat]\n      \n      TASK [transfer start_mycat.sh to remonte /tmp/] *****************************************************\n      changed: [mycat]\n      \n      TASK [start mycat] **********************************************************************************\n      changed: [mycat]\n      \n      TASK [remove start_mycat.sh] ************************************************************************\n      changed: [mycat]\n      \n      PLAY RECAP ******************************************************************************************\n      mycat                      : ok=10   changed=9    unreachable=0    failed=0   \n      ```\n\n      ---\n\n      **6):检查mycat是否启动**\n      ```\n      ps -ef | grep mycat\n      ```\n      输出如下\n      ```\n      root     24415     1  0 09:21 ?        00:00:00 /usr/local/mycat/bin/./wrapper-linux-x86-64 /usr/local/mycat/conf/wrapper.conf wrapper.syslog.ident=mycat wrapper.pidfile=/usr/local/mycat/logs/mycat.pid wrapper.daemonize=TRUE wrapper.lockfile=/var/lock/subsys/mycat\n      root     24417 24415 12 09:21 ?        00:00:06 java -DMYCAT_HOME=. -server -XX:MaxPermSize=64M -XX:+AggressiveOpts -XX:MaxDirectMemorySize=2G -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1984 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Xmx4G -Xms1G -Djava.library.path=lib -classpath lib/wrapper.jar:conf:lib/zookeeper-3.4.6.jar:lib/jline-0.9.94.jar:lib/ehcache-core-2.6.11.jar:lib/log4j-1.2.17.jar:lib/fastjson-1.2.12.jar:lib/curator-client-2.11.0.jar:lib/joda-time-2.9.3.jar:lib/log4j-slf4j-impl-2.5.jar:lib/libwrapper-linux-x86-32.so:lib/netty-3.7.0.Final.jar:lib/druid-1.0.26.jar:lib/log4j-api-2.5.jar:lib/mapdb-1.0.7.jar:lib/slf4j-api-1.6.1.jar:lib/univocity-parsers-2.2.1.jar:lib/hamcrest-core-1.3.jar:lib/objenesis-1.2.jar:lib/leveldb-api-0.7.jar:lib/hamcrest-library-1.3.jar:lib/wrapper.jar:lib/commons-lang-2.6.jar:lib/reflectasm-1.03.jar:lib/mongo-java-driver-2.11.4.jar:lib/guava-19.0.jar:lib/curator-recipes-2.11.0.jar:lib/curator-framework-2.11.0.jar:lib/libwrapper-linux-ppc-64.so:lib/log4j-core-2.5.jar:lib/mysql-binlog-connector-java-0.6.0.jar:lib/netty-common-4.1.9.Final.jar:lib/leveldb-0.7.jar:lib/sequoiadb-driver-1.12.jar:lib/kryo-2.10.jar:lib/jsr305-2.0.3.jar:lib/commons-collections-3.2.1.jar:lib/mysql-connector-java-5.1.35.jar:lib/disruptor-3.3.4.jar:lib/log4j-1.2-api-2.5.jar:lib/velocity-1.7.jar:lib/Mycat-server-1.6.5-release.jar:lib/libwrapper-linux-x86-64.so:lib/dom4j-1.6.1.jar:lib/minlog-1.2.jar:lib/asm-4.0.jar:lib/netty-buffer-4.1.9.Final.jar -Dwrapper.key=sexYToWnzGO4Glh1 -Dwrapper.port=32000 -Dwrapper.jvm.port.min=31000 -Dwrapper.jvm.port.max=31999 -Dwrapper.pid=24415 -Dwrapper.version=3.2.3 -Dwrapper.native_library=wrapper -Dwrapper.service=TRUE -Dwrapper.cpu.timeout=10 -Dwrapper.jvmid=1 org.tanukisoftware.wrapper.WrapperSimpleApp io.mycat.MycatStartup start\n      ```\n\n      ---\n\n      **7):测试mycat的可用性**\n      ```\n      mysql -uappuser -pmtls0352 -h10.186.19.14 -P8066\n      ```\n      ```\n      mysql: [Warning] Using a password on the command line interface can be insecure.\n      Welcome to the MySQL monitor.  Commands end with ; or \\g.\n      Your MySQL connection id is 1\n      Server version: 5.7.200-mycat-1.6.5-release-20171117203123 MyCat Server (OpenCloundDB)\n      \n      Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.\n      \n      Oracle is a registered trademark of Oracle Corporation and/or its\n      affiliates. Other names may be trademarks of their respective\n      owners.\n      \n      Type 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.\n      \n      mysql\u003e show databases;\n      +----------+\n      | DATABASE |\n      +----------+\n      | appdb    |\n      +----------+\n      2 rows in set (0.00 sec)\n\n      create table person( id int auto_increment primary key,name varchar(16));\n      Query OK, 0 rows affected (0.02 sec)\n\n      insert into person(name) values('welson');\n      Query OK, 1 row affected (0.05 sec)\n\n      select * from person;\n      +----+--------+\n      | id | name   |\n      +----+--------+\n      |  1 | welson |\n      +----+--------+\n      ```\n      mycat 读写分离环境测试成功.\n\n---\n\n\n## 高可用\n   **目前mysql高可用的开源解决方案中比较成熟的应该算mha了、相信不久的将来innodb cluster将会成为主流；mysqltools会把两者都包涵进来**\n\n   ---\n\n1. ## mha\n   **MHA是在mysql主从复制环境的基础上加的一套高可用软件、这套软件逻辑上又可以分成两个组件manager和node；其中manager负责监控master库是否存活，一旦master有问题就开大招做主从切换、切换中的一些脏活累活基本都由node来完；** 相关链接：https://www.cnblogs.com/gomysql/p/3675429.html\n\n   mysqltools在安装mha时不需要连接外网，主要是因为它把mha用到的包都打包了进来；不幸的是目前我只打包了centos-7.4版本下的包；由于时间上的成本其它系统版本我就没有打包了\n\n   ---\n\n   1. ### 环境规划\n      **130、131、132三个实例组成一个mysql复制环境、其中130是master**\n      \n      |主机名    | ip地址          | 操作系统版本 | mysql角色| mha角色| vip              |\n      |---------|----------------|------------|---------|--------|------------------|\n      |mhamaster| 192.168.29.130 | centos-7.4 | master  | node   |192.168.29.100    |\n      |mhaslave1| 192.168.29.131 | centos-7.4 | slave   | node   |                  |\n      |mhaslave2| 192.168.29.132 | centos-7.4 | slave   | manager|                  |\n\n      ---\n\n   2. ### 配置mha的一些前置备件\n      **1、已经规范的安装配置了mysql复制环境、可以参考[mysql主从复制](#mysql主从复制)**\n\n      **2、各个主机之间都已经完成了ssh信任(mha会采用scp的方式从宕机的master主机上采集binlog日志、所以你事先要把ssh信任关系做好)**\n\n      **3、在安装配置的过程中有一些组件要用到gcc编译、mysqltools会去安装gcc gcc-c++ ，所以你要事先在这些主机上配置好yum**\n\n      ---\n\n   3. ### 配置ansible的hosts文件\n      **把要配置mha的几台主机作为一个组配置到/etc/ansible/hosts文件中去**\n      ```\n      [mhacluster]\n      mhamaster ansible_host=192.168.29.130 ansible_user=root\n      mhaslave1 ansible_host=192.168.29.131 ansible_user=root\n      mhaslave2 ansible_host=192.168.29.132 ansible_user=root\n      ```\n      ---\n\n   4. ### 配置mysqltools中mha相关的配置项\n      **mysqltools/config.yaml配置文件中有两项、是用来指明安装mha时所用的安装包的、默认值如下；用默认值就行一定不要改、除非你知道自己在做什么。**\n      ```\n      mtls_mha_node: mhanode.tar.gz\n      mtls_mha_manager: mhamanager.tar.gz\n      ```\n      ---\n\n   5. ### 配置mha的相关信息\n      **针对单个mha的详细配置都记录在了mysqltools/deploy/ansible/mha/vars/var_mha.yaml这个配置文件中了**\n      ```\n      master_ip: \"192.168.29.130\"\n      slave_ips:\n       - \"192.168.29.131\"\n       - \"192.168.29.132\"\n      \n      manager_ip: \"192.168.29.132\"\n      \n      net_work_interface: \"ens33\"\n      vip: \"192.168.29.100\"\n      \n      os_release: '7.4'\n\n      ```\n      1、master_ip 表示mysql master库所在主机的ip地址\n\n      2、slave_ips 表示mysql slave库的ip地址列表\n\n      3、manager_ip 表示mha manager要安装在主机ip、mysqltools希望你用最后一个slave的ip作为manger要安装的地方、mysqltools还会把第一个slave作为新的master\n\n      4、net_work_inferface 表示vip要绑定到的网卡\n\n      5、vip 表示vip地址\n\n      6、os_release 表示操作系统的版本、目前还只支持\"7.4\"这一个rhel版本\n\n      ---\n\n   6. ### 准备安装配置mha\n      **mysqltools/deploy/ansible/mha/install_mha.yaml文件中包涵了所有的步骤、修改文件中的host项以告诉ansible把这些步骤应用到哪些主机、根据上面的规划我要把hosts: 修改成如下内容**\n      ```\n      ---\n       - hosts: mhacluster\n      ```\n      也mhacluster这个组内的机器应用install_mha.yaml中定义的步骤\n\n      ---\n\n   7. ### 安装配置mha\n      ```\n      cd mysqltools/deploy/ansible/mha\n      ansible-playbook install_mha.yaml\n      ```\n      输出如下：\n      ```\n      PLAY [mhacluster] ********************************************************************\n      TASK [Gathering Facts] ***************************************************************\n      ok: [slave2]\n      ok: [slave1]\n      ok: [master]\n      TASK [install gcc] ********************************************************************\n      changed: [slave1]\n      changed: [slave2]\n      changed: [master]\n      TASK [install gcc-c++] ****************************************************************\n      changed: [slave2]\n      changed: [slave1]\n      changed: [master]\n      TASK [transfer mhanode.tar.gz to remote host and unarchive to /tmp/] ******************\n      changed: [master]\n      changed: [slave1]\n      changed: [slave2]\n      TASK [install mha node] ***************************************************************\n      changed: [master]\n      changed: [slave2]\n      changed: [slave1]\n      TASK [export path env to /root/.bashrc] ***********************************************\n      changed: [master]\n      changed: [slave2]\n      changed: [slave1]\n      TASK [stransfer create_mha_user.sql to master] ****************************************\n      skipping: [slave1]\n      skipping: [slave2]\n      changed: [master]\n      TASK [create mha user in mysql(master)] ***********************************************\n      skipping: [slave1]\n      skipping: [slave2]\n      changed: [master]\n      TASK [copy bind_vip.sh to /tmp/] ******************************************************\n      skipping: [slave1]\n      skipping: [slave2]\n      changed: [master]\n      TASK [bind vip] ***********************************************************************\n      skipping: [slave1]\n      skipping: [slave2]\n      changed: [master]\n      TASK [transfer mhamanager.tar.gz to remote host and unarchive to /tmp/] ***************\n      skipping: [master]\n      skipping: [slave1]\n      changed: [slave2]\n      TASK [install mha manager] ************************************************************\n      skipping: [master]\n      skipping: [slave1]\n      changed: [slave2]\n      TASK [create directory(/etc/masterha/)] ***********************************************\n      skipping: [master]\n      skipping: [slave1]\n      changed: [slave2]\n      TASK [create directory(/var/log/masterha)] *********************************************\n      skipping: [master]\n      skipping: [slave1]\n      changed: [slave2]\n      TASK [config mha app.cnf] ***************************************************************\n      skipping: [master]\n      skipping: [slave1]\n      changed: [slave2]\n      TASK [config master_ip_failover] ********************************************************\n      skipping: [master]\n      skipping: [slave1]\n      changed: [slave2]\n      TASK [config master_ip_online_change] ***************************************************\n      skipping: [master]\n      skipping: [slave1]\n      changed: [slave2]\n      TASK [copy start_mha.sh to /usr/local/] **************************************************\n      skipping: [master]\n      skipping: [slave1]\n      changed: [slave2]\n      TASK [start mha manager] *****************************************************************\n      skipping: [master]\n      skipping: [slave1]\n      changed: [slave2]\n      PLAY RECAP ********************************************************************************\n      master                     : ok=10   changed=9    unreachable=0    failed=0   \n      slave1                     : ok=6    changed=5    unreachable=0    failed=0   \n      slave2                     : ok=15   changed=14   unreachable=0    failed=0  \n      ```\n\n      ---\n\n   8. ### 验证是否成功完成\n      **mysqltools在安装配置mha后并没有并没有把相关安装包直接删除、而是保留在了/tmp/mhanode /tmp/mhamanager 这两个目录下；目录下还包含用于验证结果的的脚本**\n\n      ---\n\n      **1、验证master主机是否成功的绑定了vip**\n      ```\n      ifconfig\n      ```\n      输出如下：\n      ```\n      ens33: flags=4163\u003cUP,BROADCAST,RUNNING,MULTICAST\u003e  mtu 1500\n              inet 192.168.29.130  netmask 255.255.255.0  broadcast 192.168.29.255\n              inet6 fe80::413c:fcac:858:64bc  prefixlen 64  scopeid 0x20\u003clink\u003e\n              ether 00:0c:29:e3:07:d3  txqueuelen 1000  (Ethernet)\n              RX packets 10816  bytes 13581709 (12.9 MiB)\n              RX errors 0  dropped 0  overruns 0  frame 0\n              TX packets 2535  bytes 310584 (303.3 KiB)\n              TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0\n      \n      ens33:0: flags=4163\u003cUP,BROADCAST,RUNNING,MULTICAST\u003e  mtu 1500\n              inet 172.16.192.100  netmask 255.255.0.0  broadcast 172.16.255.255\n              ether 00:0c:29:e3:07:d3  txqueuelen 1000  (Ethernet)\n      \n      lo: flags=73\u003cUP,LOOPBACK,RUNNING\u003e  mtu 65536\n              inet 127.0.0.1  netmask 255.0.0.0\n              inet6 ::1  prefixlen 128  scopeid 0x10\u003chost\u003e\n              loop  txqueuelen 1  (Local Loopback)\n              RX packets 203  bytes 29718 (29.0 KiB)\n              RX errors 0  dropped 0  overruns 0  frame 0\n              TX packets 203  bytes 29718 (29.0 KiB)\n              TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0\n      ```\n      ens33:0 已经绑上了192.168.29.100 这个vip、说明vip绑定成功了\n\n      ---\n\n      **2、验证mha-manager是否正常启动**\n      ```\n      ps -ef | grep man\n      ```\n      输出如下：\n      ```\n      root       3549      1  1 11:38 ?        00:00:00 perl /usr/local/bin//masterha_manager --conf=/etc/masterha/app.cnf --ignore_last_failover\n      ```\n      masterha_manager 这个进程存在说明manager已经成功启动(默认情况下日志保存在/var/log/masterha/manager.log你可以在这个日志看到更多的详细信息)\n\n      ---\n\n      **事实上完成上面的两项如果都成功了、那么你的mha就算配置成功了、但是为了排错的方便我还是在/tmp/mhamanager目录下留下了一些用于check脚本**\n\n      ---\n\n      **3、检查ssh互信是否配置正确**\n      ```\n      cd /tmp/mhamanager/\n      ./check_ssh.sh \n      ```\n      输出如下：\n      ```\n      Thu May 17 11:33:49 2018 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.\n      Thu May 17 11:33:49 2018 - [info] Reading application default configuration from /etc/masterha/app.cnf..\n      Thu May 17 11:33:49 2018 - [info] Reading server configuration from /etc/masterha/app.cnf..\n      Thu May 17 11:33:49 2018 - [info] Starting SSH connection tests..\n      Thu May 17 11:33:50 2018 - [debug] \n      Thu May 17 11:33:49 2018 - [debug]  Connecting via SSH from root@192.168.29.130(192.168.29.130:22) to root@192.168.29.131(192.168.29.131:22)      ..\n      Thu May 17 11:33:49 2018 - [debug]   ok.\n      Thu May 17 11:33:49 2018 - [debug]  Connecting via SSH from root@192.168.29.130(192.168.29.130:22) to root@192.168.29.132(192.168.29.132:22)      ..\n      Thu May 17 11:33:50 2018 - [debug]   ok.\n      Thu May 17 11:33:50 2018 - [debug] \n      Thu May 17 11:33:49 2018 - [debug]  Connecting via SSH from root@192.168.29.131(192.168.29.131:22) to root@192.168.29.130(192.168.29.130:22)      ..\n      Thu May 17 11:33:50 2018 - [debug]   ok.\n      Thu May 17 11:33:50 2018 - [debug]  Connecting via SSH from root@192.168.29.131(192.168.29.131:22) to root@192.168.29.132(192.168.29.132:22)      ..\n      Thu May 17 11:33:50 2018 - [debug]   ok.\n      Thu May 17 11:33:51 2018 - [debug] \n      Thu May 17 11:33:50 2018 - [debug]  Connecting via SSH from root@192.168.29.132(192.168.29.132:22) to root@192.168.29.130(192.168.29.130:22)      ..\n      Thu May 17 11:33:50 2018 - [debug]   ok.\n      Thu May 17 11:33:50 2018 - [debug]  Connecting via SSH from root@192.168.29.132(192.168.29.132:22) to root@192.168.29.131(192.168.29.131:22)      ..\n      Thu May 17 11:33:51 2018 - [debug]   ok.\n      Thu May 17 11:33:51 2018 - [info] All SSH connection tests passed successfully.\n      ```\n      最后一行`All SSH connection tests passed successfully.`说明ssh信任是配置好了的\n\n      ---\n\n      **4、检查mysql 复制是否配置正确**\n      ```\n      cd /tmp/mhamanager/\n      ./check_repl.sh \n      ```\n      输出如下：\n      ```\n      Thu May 17 11:33:24 2018 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.\n      Thu May 17 11:33:24 2018 - [info] Reading application default configuration from /etc/masterha/app.cnf..\n      Thu May 17 11:33:24 2018 - [info] Reading server configuration from /etc/masterha/app.cnf..\n      Thu May 17 11:33:24 2018 - [info] MHA::MasterMonitor version 0.57.\n      Thu May 17 11:33:25 2018 - [info] GTID failover mode = 1\n      Thu May 17 11:33:25 2018 - [info] Dead Servers:\n      Thu May 17 11:33:25 2018 - [info] Alive Servers:\n      Thu May 17 11:33:25 2018 - [info]   192.168.29.130(192.168.29.130:3306)\n      Thu May 17 11:33:25 2018 - [info]   192.168.29.131(192.168.29.131:3306)\n      Thu May 17 11:33:25 2018 - [info]   192.168.29.132(192.168.29.132:3306)\n      Thu May 17 11:33:25 2018 - [info] Alive Slaves:\n      Thu May 17 11:33:25 2018 - [info]   192.168.29.131(192.168.29.131:3306)  Version=5.7.22-log (oldest major version between slaves)       log-bin:enabled\n      Thu May 17 11:33:25 2018 - [info]     GTID ON\n      Thu May 17 11:33:25 2018 - [info]     Replicating from 192.168.29.130(192.168.29.130:3306)\n      Thu May 17 11:33:25 2018 - [info]     Primary candidate for the new Master (candidate_master is set)\n      Thu May 17 11:33:25 2018 - [info]   192.168.29.132(192.168.29.132:3306)  Version=5.7.22-log (oldest major version between slaves)       log-bin:enabled\n      Thu May 17 11:33:25 2018 - [info]     GTID ON\n      Thu May 17 11:33:25 2018 - [info]     Replicating from 192.168.29.130(192.168.29.130:3306)\n      Thu May 17 11:33:25 2018 - [info] Current Alive Master: 192.168.29.130(192.168.29.130:3306)\n      Thu May 17 11:33:25 2018 - [info] Checking slave configurations..\n      Thu May 17 11:33:25 2018 - [info]  read_only=1 is not set on slave 192.168.29.131(192.168.29.131:3306).\n      Thu May 17 11:33:25 2018 - [info]  read_only=1 is not set on slave 192.168.29.132(192.168.29.132:3306).\n      Thu May 17 11:33:25 2018 - [info] Checking replication filtering settings..\n      Thu May 17 11:33:25 2018 - [info]  binlog_do_db= , binlog_ignore_db= \n      Thu May 17 11:33:25 2018 - [info]  Replication filtering check ok.\n      Thu May 17 11:33:25 2018 - [info] GTID (with auto-pos) is supported. Skipping all SSH and Node package checking.\n      Thu May 17 11:33:25 2018 - [info] Checking SSH publickey authentication settings on the current master..\n      Thu May 17 11:33:26 2018 - [info] HealthCheck: SSH to 192.168.29.130 is reachable.\n      Thu May 17 11:33:26 2018 - [info] \n      192.168.29.130(192.168.29.130:3306) (current master)\n       +--192.168.29.131(192.168.29.131:3306)\n       +--192.168.29.132(192.168.29.132:3306)\n      \n      Thu May 17 11:33:26 2018 - [info] Checking replication health on 192.168.29.131..\n      Thu May 17 11:33:26 2018 - [info]  ok.\n      Thu May 17 11:33:26 2018 - [info] Checking replication health on 192.168.29.132..\n      Thu May 17 11:33:26 2018 - [info]  ok.\n      Thu May 17 11:33:26 2018 - [info] Checking master_ip_failover_script status:\n      Thu May 17 11:33:26 2018 - [info]   /usr/local/bin/master_ip_failover --command=status --ssh_user=root --orig_master_host=192.168.29.130       --orig_master_ip=192.168.29.130 --orig_master_port=3306 \n      \n      \n      IN SCRIPT TEST====/sbin/ifconfig ens33:0 down==/sbin/ifconfig ens33:0 172.16.192.100===\n      \n      Checking the Status of the script.. OK \n      Thu May 17 11:33:26 2018 - [info]  OK.\n      Thu May 17 11:33:26 2018 - [warning] shutdown_script is not defined.\n      Thu May 17 11:33:26 2018 - [info] Got exit code 0 (Not master dead).\n      \n      MySQL Replication Health is OK.\n      ```\n\n      最后一行`MySQL Replication Health is OK.`说明mysql复制是正常的\n      \n   ---\n      \n## 备份\n   **备份的作用在此不表。单单从备份工具来看就有mysqldup,xtrabackup,mysqlbackup三种可选的工具；备份工具是只完成备份计划的手段，作为一个dba我更加关心备份策略，比如说周日做全备，其它几天每天一个差异备份；就这样一个备份计划而言我选择xtrabackup,mysqlbackup都是可以的。但是为了方便使用mysqltools把备份实现的细节通过一个python程序包装起来，dba只要告诉mysqltools他要什么时候做全备，什么时候做差异备份就行了。隐去了实现的细节dba可以更加的专注问题的核心**\n\n   **由于备份是一个比较通用的功能所以我把它打包进了mysqltools-python这个软件包中可以通过pip直接安装，如果你用的mysqltools安装的python默认我会把这个包也安装上去**\n\n   你可以通过如下地址了解更多`mysqltools-python`相关的内容\n\n   **1):Pypi:** https://pypi.org/project/mysqltools-python/\n   \n   \u003cimg src=\"docs/imgs/mysqltoools-python.png\"\u003e\n\n   ---\n\n   **2):Github:** https://github.com/Neeky/mysqltools-python\n\n   \u003cimg src=\"docs/imgs/mysqltools-python-github.png\"\u003e\n\n   ---\n\n   安装完`mysqltools-python`后你在python的bin目录下会看到如下可执行文件\n   ```\n   ll /usr/local/python/bin/ | grep mtls                                        \n   -rwxr-xr-x. 1 root root    11770 9月  17 16:47 mtlsbackup     # mtlsbackup用于备份                            \n   -rwxr-xr-x. 1 root root    11211 9月  17 16:47 mtlsmonitor    # mtlsbackup用于监控\n   ```\n   如果你是用mysqltools自带的安装脚本安装的python-3.x.x那么mysqltools-python会被自动安装上，当然你也可以自己手工安装它，像这样\n   ```\n   pip3 install mysqltools-python\n   ```\n   ---\n\n   1. ### mtlsbackup备份相关的实现细节\n      **1): mtlsbackup 备份脚本**\n\n      这是一个由python编写的程序、它的目的有两个 1):隔离mysqldump,xtrabackup,mysqlbackup这三个备份工具的差异，用户在做备份时只要调用`mtlsbackup`就行了。2):它还要完成完整的备份决策(根据dba的配置来决定什么时候做全备，什么时候做增备；它也会根据实际情况对决策进行调整，如果dba配置的是每周日一个全备，其它几天做差异备份。假设dba配置这个备份计划的时候是周3，根据配置要求周3是要做差异备份的，由于现在(周三)还没有全备呢，mtlsbackup会这次的备份执行情况做调整，把它从差异备份调整为全备)\n\n      ---\n\n      **2): /etc/mtlsbackup.cnf 定义备份策略**\n\n      为了方便使用`mtlsbackup.py`尽可能的避免命令行参数，而是采用从配置文件直接读取备份计划的方式来完成备份，以下是一份完成的备份计划的样例\n      ```\n      [global]\n      backup_tool=xtrabackup                             #备份工具xtrabackup,mysqldump,meb 之一(现在只直接xtrabackup)\n      user=backup                                        #备份用户(mysql级别)\n      password=DX3906                                    #密码\n      host=127.0.0.1                                     #主机\n      port=3306                                          #端口\n      full_backup_days=6                                 #指定哪些天做全备    6 --\u003e 周日 \n      diff_backup_days=0,1,2,3,4,5                       #指定哪些天做差异备  0 --\u003e 周一 ，1 --\u003e 周2 ... ...\n      backup_data_dir=/database/backups/3306/data/       #备份保存的路径\n      backup_log_dir=/database/backups/3306/log/         #使用xtrackup备份时check_point文件的目录\n      backup_temp_dir=/database/backups/3306/temp/       #xtrabackup的工作目录\n      \n      [xtrabackup]\n      # xtrabackup 备份时对应的命令模板\n      full_backup_script=/usr/local/xtrabackup/bin/xtrabackup --defaults-file=/etc/my.cnf --host={self.host} --port={self.port} --user={self.user} --password={self.password} --no-version-check --compress --compress-threads=4 --use-memory=200M --stream=xbstream  --parallel=8 --backup  --extra-lsndir={self.lsndir} --target-dir={self.backup_temp_dir} \u003e {self.full_backup_file} 2\u003e{self.full_backup_log_file} \u0026\n      diff_backup_script=/usr/local/xtrabackup/bin/xtrabackup --defaults-file=/etc/my.cnf --host={self.host} --port={self.port} --user={self.user} --password={self.password} --no-version-check --compress --compress-threads=4 --use-memory=200M --stream=xbstream  --parallel=8 --backup  --extra-lsndir={self.lsndir} --target-dir={self.backup_temp_dir} --incremental --incremental-lsn={self.tolsn} \u003e {self.diff_backup_file}  2\u003e{self.diff_backup_log_file} \u0026\n      ```\n      一直以提高生产力为目标的mysqltools是不会让你手工编写这个配置文件它，它会根据机器的配置自动生成\n\n      ---\n\n      **3): /database/backups/这个目录是用来保存备份文件的地方**\n      ```\n      tree /database/backups/\n      ```\n      输出如下：\n      ```\n      /database/backups/\n      ├── 3306\n      │   ├── data\n      │   │   └── 2018-07-28T13:38:01\n      │   │       ├── 2018-07-28T13:38:01-full.log\n      │   │       ├── 2018-07-28T13:38:01-full.xbstream\n      │   │       ├── 2018-07-28T13:40:05-diff.log\n      │   │       ├── 2018-07-28T13:40:05-diff.xbstream\n      │   │       ├── 2018-07-28T13:42:04-diff.log\n      │   │       ├── 2018-07-28T13:42:04-diff.xbstream\n      │   ├── log\n      │   │   ├── 2018-07-28T13:38:01\n      │   │   │   ├── xtrabackup_checkpoints\n      │   │   │   └── xtrabackup_info\n      │   │   ├── 2018-07-28T13:40:05\n      │   │   │   ├── xtrabackup_checkpoints\n      │   │   │   └── xtrabackup_info\n      │   │   ├── 2018-07-28T13:42:04\n      │   │   │   ├── xtrabackup_checkpoints\n      │   │   │   └── xtrabackup_info\n      ```\n\n      ---\n\n   2. ### 实施备份计划的前期准备\n      **1): 如前面所说的mtlsbackup是一个python写的脚本它的运行依赖于python3你要在目标主机上安装python3，见[安装python](#安装python)**\n\n      ---\n\n      **2): 配置MySQL数据库的备份计划**\n      \n      配置文件`mysqltools/deploy/ansible/backup/template/mtlsbackup.cnf`中的`full_backup_days`代表着哪些天执行全备，`diff_backup_days`代表着哪些天执行差异备份\n      ```\n      full_backup_days=6                                 #指定哪些天做全备    6--\u003e周日 5--\u003e周六 4--\u003e周五... ...\n      diff_backup_days=0,1,2,3,4,5                      #指定哪些天做差异备   6--\u003e周日 4--\u003e周六 4--\u003e周五... ...\n      ```\n      **建议不要改保持默认值**\n\n      ---\n\n      **3): 配置crontab执行备份的时机**\n\n      配置文件`mysqltools/deploy/ansible/backup/vars/mtlsbackup.yaml`中`backup_minute`对应linux crontab 中的minute,`backup_hour`对应linux crontab 中的hour,`backup_user`对应linux crontab \b中的user\n      ```\n      ---\n      backup_minute: \"0\" \n      backup_hour: \"2\"\n      backup_user: \"mysql\"\n      \n      #backup_minute 对应linux crontab 中的minute\n      #backup_hour   对应linux crontab 中的hour\n      #backup_user   对应linux crontab \b中的user\n      \n      # 上面的默认配置表示每天的02:00:00时对数据库进行备份\n      ```\n      **建议不要改保持默认值**\n\n      ---\n\n   3. ### 配置备份\n      **1): 配置备份的工作目录在mysqltools/deploy/ansible/backup**\n\n      修改config_backup.yaml文件中的hosts为你的目标主机,这里以sqlstudio这个主机为例，所以config_backup.yaml的内容如下\n      ```\n      ---\n       - hosts: sqlstudio\n      ```\n      ---\n\n      **2):实施备份计划**\n      ```\n      ansible-playbook config_backup.yaml\n      ```\n      输出如下：\n      ```\n      PLAY [sqlstudio] **************************************************************************************************************\n      \n      TASK [Gathering Facts] ********************************************************************************************************\n      ok: [sqlstudio]\n      \n      TASK [transfer qperss to remonte host(rhel-7.x)] ******************************************************************************\n      changed: [sqlstudio]\n      \n      TASK [install qpress(rhel-7.x)] ***********************************************************************************************\n      changed: [sqlstudio]\n      \n      TASK [remove qpress install package(rhel-7.x)] ********************************************************************************\n      changed: [sqlstudio]\n      \n      TASK [transfer extrabackup install package to remonte host] *******************************************************************\n      ok: [sqlstudio]\n      \n      TASK [make link file fore percona-xtrabackup-2.4.9-Linux-x86_64] **************************************************************\n      ok: [sqlstudio]\n      \n      TASK [export path env variable] ***********************************************************************************************\n      ok: [sqlstudio]\n      \n      TASK [export path env to /root/.bashrc] ***************************************************************************************\n      ok: [sqlstudio]\n      \n      TASK [transfer create_backup_user.sql file to remote host] ********************************************************************\n      skipping: [sqlstudio]\n      \n      TASK [execute create_backup_user.sql] *****************************************************************************************\n      skipping: [sqlstudio]\n      \n      TASK [remove /tmp/create_backup_user.sql] *************************************************************************************\n      skipping: [sqlstudio]\n      \n      TASK [config /etc/mtlsbackup.cnf] *********************************************************************************************\n      ok: [sqlstudio]\n      \n      TASK [config crontab] *********************************************************************************************************\n      ok: [sqlstudio]\n      \n      PLAY RECAP ********************************************************************************************************************\n      sqlstudio                  : ok=10   changed=3    unreachable=0    failed=0 \n      ```\n      ---\n\n   4. ### 检查配置是否成功的几个点\n      **1): 检查crond是否正确配置备份任务**\n      ```\n      sudo -umysql crontab -l \n      ```\n      输出如下：\n      ```                                                          \n      #Ansible: mtlsbackup\n      0 2 * * * /usr/local/python/bin/python3 /usr/local/mysqltoolsclient/mtlsbackup.py 2\u003e\u003e/database/backups/mtlsbackup.log\n      ```\n      由上面的配置可以看出crontab已经配置好了\n\n      ---\n\n      **2): 检查mysql用户是否能成功执行备份任务***\n\n      手动调用crontab中的备份命令\n      ```\n      su mysql\n      /usr/local/python/bin/mtlsbackup \n      ```\n      输出如下：\n      ```\n      [2018-09-21 14:38:46,682] [mtlsbackup] [INFO] read config file /etc/mtlsbackup.cnf\n      [2018-09-21 14:38:46,683] [mtlsbackup] [INFO] 开始检查 /database/backups/3306/data/ \n      [2018-09-21 14:38:46,684] [mtlsbackup] [INFO] 开始检查 /database/backups/3306/log/ \n      [2018-09-21 14:38:46,684] [mtlsbackup] [INFO] 开始检查 /database/backups/3306/temp/ \n      [2018-09-21 14:38:46,684] [mtlsbackup] [INFO] 今天星期 4 根据配置文件中的备份计划，决定进行差异备份\n      [2018-09-21 14:38:46,684] [mtlsbackup] [INFO] 进入差异备份流程\n      [2018-09-21 14:38:46,684] [mtlsbackup] [INFO] 准备检查最近一次的全备是否成功...\n      [2018-09-21 14:38:46,685] [mtlsbackup] [INFO] 检查最后一个备份集2018-09-12T02:16:49的可用性\n      [2018-09-21 14:38:46,685] [mtlsbackup] [INFO] 检查/database/backups/3306/data/2018-09-12T02:16:49/2018-09-12T02:16:49-full.log\n      [2018-09-21 14:38:46,686] [mtlsbackup] [WARNING] 检查到最后一个全备 备份成功\n      [2018-09-21 14:38:46,686] [mtlsbackup] [INFO] 从xtrabackup_checkpoints文件中读到tolsn=2589231\n      [2018-09-21 14:38:46,687] [mtlsbackup] [INFO] 使用如下命令对MySQL数据库进行差异备 /usr/local/xtrabackup/bin/xtrabackup --defaults-file=/etc/my.cnf --host=127.0.0.1 --port=3306 --user=backup --password=DX3906 --no-version-check --compress --compress-threads=4 --use-memory=200M --stream=xbstream  --parallel=8 --backup  --extra-lsndir=/database/backups/3306/log/2018-09-21T14:38:46 --target-dir=/database/backups/3306/temp/ --incremental --incremental-lsn=2589231 \u003e /database/backups/3306/data/2018-09-12T02:16:49/2018-09-21T14:38:46-diff.xbstream  2\u003e/database/backups/3306/data/2018-09-12T02:16:49/2018-09-21T14:38:46-diff.log \u0026\n      ```\n      根据上面的输出可以知道mtlsbackup已经成功执行了，不过备份有没有成功这个两是要看一下xtrabckup的日志才行，从mtlsbackup.py的日志可以看到xtrabackup把日志保存到了/database/backups/3306/data/2018-09-12T02:16:49/2018-09-21T14:38:46-diff.log \n      ```\n      tail -2 /database/backups/3306/data/2018-09-12T02:16:49/2018-09-21T14:38:46-diff.log\n      ```\n      输出如下：\n      ```\n      xtrabackup: Transaction log of lsn (2663437) to (2663446) was copied.\n      180921 14:38:48 completed OK!\n      ```\n      说明备份成功了！\n\n      ---\n\n      **3): 查看备份文件**\n      ```\n      tree /database/backups/\n\n      ```\n      输出如下：\n      ```\n      /database/backups/\n      ├── 3306\n      │   ├── data\n      │   │   └── 2018-09-12T02:16:49\n      │   │       ├── 2018-09-12T02:16:49-full.log\n      │   │       ├── 2018-09-12T02:16:49-full.xbstream\n      │   │       ├── 2018-09-21T02:12:33-diff.log\n      │   │       ├── 2018-09-21T02:12:33-diff.xbstream\n      │   │       ├── 2018-09-21T13:19:23-diff.log\n      │   │       ├── 2018-09-21T13:19:23-diff.xbstream\n      │   │       ├── 2018-09-21T14:38:32-diff.log\n      │   │       ├── 2018-09-21T14:38:32-diff.xbstream\n      │   │       ├── 2018-09-21T14:38:46-diff.log\n      │   │       └── 2018-09-21T14:38:46-diff.xbstream\n      │   ├── log\n      │   │   ├── 2018-09-12T02:16:49\n      │   │   │   ├── xtrabackup_checkpoints\n      │   │   │   └── xtrabackup_info\n      │   │   ├── 2018-09-21T02:12:33\n      │   │   │   ├── xtrabackup_checkpoints\n      │   │   │   └── xtrabackup_info\n      │   │   ├── 2018-09-21T13:19:23\n      │   │   │   ├── xtrabackup_checkpoints\n      │   │   │   └── xtrabackup_info\n      │   │   ├── 2018-09-21T14:38:32\n      │   │   │   ├── xtrabackup_checkpoints\n      │   │   │   └── xtrabackup_info\n      │   │   └── 2018-09-21T14:38:46\n      │   │       ├── xtrabackup_checkpoints\n      │   │       └── xtrabackup_info\n      │   └── temp\n      └── mtlsbackup.log\n\n      ```\n      \n      ---\n\n   5. ### 注意事项\n      **1): mtlsbakup还在开发中目前只包装了xtrabackup,以后有时候会把meb,mysqldump都会包进去**\n\n      ---\n\n      **2): 如果你使用mysqltools-2.18.07.28之前的版本创建了mysql数据库，它默认是不会创建backup用户的，所以你应该为数据库手工创建backup用户，相关SQL在mysqltools/deploy/ansible/backup/template/create_backup_user.sql文件中用。如果你不想手工创建backup用户而是让mysqltools去创建，那么你要把config_backup.yaml中的create_user变量设置为1**\n\n---\n      \n\n\n\n\n\n## 监控\n   **mysqltools的出发点是以提升生产力为目标的、但凡能用电解决的事、就不要动用人力;我们的目标是认机器检测到问题后尽可能的自动解决掉它、解决完成后发个通知就行。这一切的基础是要有一套完善的监控系统，mysqltools在这方面使用的是zabbix这个开源解决方案。zabbix是一套通过的监控框架，要实现对MySQL我们还要自己写程序用来收集各个监控指标，好在我已经把程序写好了见** \u003ca href=\"https://github.com/Neeky/mysqltools-python\"\u003emysqltools-python \u003c/a\u003e\n\n   ---\n   \n   1. ### 目前已经实现的监控项\n      目前我已经用python实现了200+个监控项，可以把监控项大致分成四大块 1): variable 类型的监控项、这类监控项的作用是为了可以追踪参数变更后对MySQL各个方面的影响；\n      2): status 类型的监控项、这类监控项主要用于对实例实时信息的收集可用于提前发现问题、解决问题；3):ps 类型的监控项 这类监控项主要会对MySQL某一特定维度的监控、如\n      半同步复制是否正常、mysql group replication 集群是否正常等等 4):自动发现\n\n      *监控项名*                         |               *简介*                |               *采集方式*        \n      ----------------------------------|----------------------------------- |----------------------------------------------\n      |`mysql配置(variable)相关的监控项列表`|如果人为修改了mysql参数(variable)并引起了问题、那么对关键参数的监控就能方便的定位问题\n      |`-- ServerID`                    | 对应server_id                      | variable |\n      |`-- BaseDir`                     | 对应basedir                        | variable |\n      |`-- DataDir`                     | 对应datadir                        | variable |\n      |`-- Port`                        | 对应port                           | variable |\n      |`-- CharacterSetServer`          | 对应character_set_server           | variable |\n      |`-- Socket`                      | 对应socket                         | variable |\n      |`-- ReadOnly`                    | 对应readonly                       | variable |\n      |`-- SkipNameResolve`             | 对应skip_name_resolve              | variable |\n      |`-- LowerCaseTableNames`         | 对应lower_case_table_names         | variable |\n      |`-- ThreadCacheSize`             | 对应thread_cache_size 、线程池的大小、如果池有空闲的线程、那么新的连接就不单独创建新的线程了 |variable|\n      |`-- TableOpenCache`              | 对应table_open_cache               | variable |\n      |`-- TableDefinitionCache`        | 对应table_definition_cache         | variable |\n      |`-- TableOpenCacheInstances`     | 对应table_open_cache_instance      | variable |\n      |`-- MaxConnections`              | 对应max_connections                | variable |\n      |`-- BinlogFormat`                | 对应binlog_format                  | variable |\n      |`-- LogBin`                      | 对应log_bin                        | variable |\n      |`-- BinlogRowsQueryLogEvents`    | 对应binlog_rows_query_log_events   | variable |\n      |`-- LogSlaveUpdates`             | 对应log_slave_updates              | variable |\n      |`-- ExpireLogsDays`              | 对应expire_logs_days               | variable |\n      |`-- BinlogCacheSize`             | 对应binlog_cache_size              | variable |\n      |`-- SyncBinlog`                  | 对应sync_binlog                    | variable |\n      |`-- ErrorLog`                    | 对应error_log                      | variable |\n      |`-- GtidMode`                    | 对应gtid_mode                      | variable |\n      |`-- EnforceGtidConsistency`      | 对应enforce_gtid_consistency       | variable |\n      |`-- MasterInfoRepository`        | 对应master_info_repository         | variable |\n      |`-- RelayLogInfoRepository`      | 对应relay_log_info_repository      | variable |\n      |`-- SlaveParallelType`           | 对应slave_parallel_type            | variable |\n      |`-- SlaveParallelWorkers`        | 对应slave_parallel_workers         | variable |\n      |`-- InnodbDataFilePath`          | 对应innodb_data_file_path          | variable |\n      |`-- InnodbTempDataFilePath`      | 对应innodb_temp_data_file_path     | variable |\n      |`-- InnodbBufferPoolFilename`    | 对应innodb_buffer_pool_filename    | variable |\n      |`-- InnodbLogGroupHomeDir`       | 对应innodb_log_group_home_dir      | variable |\n      |`-- InnodbLogFilesInGroup`       | 对应innodb_log_file_in_group       | variable |\n      |`-- InnodbLogFileSize`           | 对应innodb_log_file_size           | variable |\n      |`-- InnodbFileformat`            | 对应innodb_fileformat              | variable |\n      |`-- InnodbFilePerTable`          | 对应innodb_file_per_table          | variable |\n      |`-- InnodbOnlineAlterLogMaxSize` | 对应innodb_online_Alter_log_max_size      |variable |\n      |`-- InnodbOpenFiles`             | 对应innodb_open_files              | variable |\n      |`-- InnodbPageSize`              | 对应innodb_page_size               | variable |\n      |`-- InnodbThreadConcurrency`     | 对应innodb_thread_concurrency      | variable |\n      |`-- InnodbReadIoThreads`         | 对应innodb_read_io_threads         | variable |\n      |`-- InnodbWriteIoThreads`        | 对应innodb_write_io_threads        | variable |\n      |`-- InnodbPurgeThreads'`         | 对应innodb_purge_threads           | variable |\n      |`-- InnodbLockWaitTimeout`       | 对应innodb_lock_wait_timeout       | variable |\n      |`-- InnodbSpinWaitDelay`         | 对应innodb_spin_wait_delay         | variable |\n      |`-- InnodbAutoincLockMode`       | 对应innodb_autoinc_lock_mode       | variable |\n      |`-- InnodbStatsAutoRecalc`       | 对应innodb_stats_auto_recalc       | variable |\n      |`-- InnodbStatsPersistent`       | 对应innodb_stats_persistent        | variable |\n      |`-- InnodbStatsPersistentSamplePages`    |对应innodb_stats_persistent_sample_pages    | variable |\n      |`-- InnodbBufferPoolInstances`   | 对应innodb_buffer_pool_instances   | variable |\n      |`-- InnodbAdaptiveHashIndex`     | 对应innodb_adaptive_hash_index     | variable |\n      |`-- InnodbChangeBuffering`       | 对应innodb_change_buffering        | variable |\n      |`-- InnodbChangeBufferMaxSize`   | 对应innodb_change_buffer_max_size  | variable |\n      |`-- InnodbFlushNeighbors`        | 对应innodb_flush_neighbors         | variable |\n      |`-- InnodbFlushMethod`           | 对应innodb_flush_method            | variable |\n      |`-- InnodbDoublewrite`           | 对应innodb_doublewrite             | variable |\n      |`-- InnodbLogBufferSize`         | 对应innodb_log_buffer_size         | variable |\n      |`-- InnodbFlushLogAtTimeout`     | 对应innodb_flushLog_at_timeout     | variable |\n      |`-- InnodbFlushLogAtTrxCommit`   | 对应innodb_flushLog_at_trx_commit  | variable |\n      |`-- InnodbBufferPoolSize`        | 对应innodb_buffer_pool_size        | variable |\n      |`-- Autocommit`                  | 对应autocommit                     | variable |\n      |`-- InnodbOldBlocksPct`          | 对应innodb_lld_blocks_pct          | variable |\n      |`-- InnodbOldBlocksTime`         | 对应innodb_old_blocks_time         | variable |\n      |`-- InnodbReadAheadThreshold`    | 对应innodb_read_ahead_threshold    | variable |\n      |`-- InnodbRandomReadAhead`       | 对应innodb_random_read_ahead       | variable |\n      |`-- InnodbBufferPoolDumpPct`     | 对应innodb_buffer_pool_dump_pct    | variable |\n      |`-- InnodbBufferPoolDumpAtShutdown` |对应innodb_buffer_pool_dump_at_shutdown | variable |\n      |*********************************|                                   |      |\n      |`mysql状态(status)相关监控`        | 通过对status进行监控可得知mysql当前的性能表现\n      |`-- AbortedClients`              | 对应aborted_clients 、client异常退出使得连接没有被正常关闭的次数       | status | \n      |`-- AbortedConnects`             | 对应borted_connects 、没有成功连接到server端的次数                   | status |\n      |`-- BinlogCacheDiskUse`          | 对应binlog_cache_disk_use 、使用临时文件存储事务语句的次数            | status |\n      |`-- BinlogCacheUse`              | 对应binlog_cache_user 、使用binlog_cache存储事务语句的次数           | status |\n      |`-- BinlogStmtCacheDiskUse`      | 对应binlog_stmt_cache_disk_use 、非事务语句使用临时文件存储的次数     | status |\n      |`-- BinlogStmtCacheUse`          | 对应binlog_stmt_cache_use 、非事务语句使用binlog_cache存储的次数     | status |\n      |`-- BytesReceived`               | 对应bytes_received、从客户端收到的字节数                            | status |\n      |`-- BytesSent`                   | 对应bytes_sent、发送给客户端的字节数                                | status |\n      |`-- ComBegin`                    | 对应com_begin、         语句执行的次数                             | status |\n      |`-- ComCallProcedure`            | 对应com_call_procedure、语句执行的次数                             | status |\n      |`-- ComChangeMaster`             | 对应com_change_master、 语句执行的次数                             | status |\n      |`-- ComCommit`                   | 对应com_commit、        语句执行的次数                             | status |\n      |`-- ComDelete`                   | 对应com_delete、        语句执行的次数                             | status |\n      |`-- ComDeleteMulti`              | 对应com_delete_multi、  语句执行的次数                             | status |\n      |`-- ComInsert`                   | 对应com_insert、        语句执行的次数                             | status |\n      |`-- ComInsertSelect`             | 对应com_insert_select、 语句执行的次数                             | status |\n      |`-- ComSelect`                   | 对应com_select、        语句执行的次数                             | status |\n      |`-- ComUpdate`                   | 对应com_update、        语句执行的次数                             | status |\n      |`-- ComUpdateMulti`              | 对应com_update_multi、  语句执行的次数                             | status |\n      |`-- Connections`                 | 对应connections、尝试连接的次数                                    | status |\n      |`-- CreatedTmpDiskTable`         | 对应created_tmp_disk_table、创建磁盘临时表的次数                    | status |\n      |`-- CreatedTmpFiles`             | 对应created_tmp_files、创建临时文件的次数                           | status |\n      |`-- CreatedTmpTables`            | 对应created_tmp_tables、创建临时表的次数                            | status |\n      |`-- InnodbBufferPoolDumpStatus`  | 对应innodb_buffer_pool_dump_status innodb_xx_dump的进度          | status |\n      |`-- InnodbBufferPoolLoadStatus`  | 对应innodb_buffer_pool_load_status innodb_xx_load的进度          | status |\n      |`-- InnodbBufferPoolResizeStatus`| 对应innodb_buffer_pool_resize_status              进度           | status |\n      |`-- InnodbBufferPoolBytesData`   | 对应innodb_buffer_pool_bytes_data buffer_pool中的数据量(单位字节)  | status |\n      |`-- InnodbBufferPoolPagesData`   | 对应innodb_buffer_pool_pages_data buffer_pool中数据页面数         | status |\n      |`-- InnodbBufferPoolPagesDirty`  | 对应innodb_buffer_pool_pages_dirty buffer_pool中脏页数量          | status |\n      |`-- InnodbBufferPoolBytesDirty`  | 对应innodb_buffer_pool_bytes_dirty buffer_pool中脏数据量(单位字节) | status |\n      |`-- InnodbBufferPoolPagesFlushed`| 对应innodb_buffer_pool_pages_flushed 请求刷新出buffer_pool的页面数 | status |\n      |`-- InnodbBufferPoolPagesFree`   | 对应innodb_buffer_pool_pages_free buffer_pool中空闲页面数         | status |\n      |`-- InnodbBufferPoolPagesMisc`   | 对应innodb_buffer_pool_pages_misc buffer_pool  total_page -(free + data) | status |\n      |`-- InnodbBufferPoolPagesTotal`  | 对应innodb_buffer_pool_pages_total buffer_pool 总项目数          | status |\n      |`-- InnodbBufferPoolReadAhead`   | 对应innodb_buffer_pool_read_ahead 由read-ahead机制读入的页面数     | status |\n      |`-- InnodbBufferPoolReadAheadEvicted`   | 对应innodb_buffer_pool_read_ahead_evicted 由raed-ahead机制读入的页面中、由于读入后没有被访问而淘汰的页  面\n      |`-- InnodbBufferPoolReadRequests`| 对应innodb_buffer_pool_read_requests 逻辑读的次数(读buffer_pool)  | status |\n      |`-- InnodbBufferPoolReads`       | 对应innodb_buffer_pool_reads 物理读的次数(读磁盘)                  | status |\n      |`-- InnodbBufferPoolWaitFree`    | 对应innodb_buffer_pool_wait_free 等待有可用页面的次数              | status |\n      |`-- InnodbBufferPoolWriteRequests`|对应innodb_buffer_pool_write_requests 请求写buffer_pool的次数     | status |\n      |`-- InnodbDataFsyncs`            | 对应innodb_data_fsyncs fsyncs()函数调用的次数                     | status |\n      |`-- InnodbDataPendingFsyncs`     | 对应innodb_data_pending_fsyncs 当前挂起的fsyncs操作               | status |\n      |`-- InnodbDataPendingReads`      | 对应innodb_data_pending_reads 当前挂起的读操作                    | status |\n      |`-- InnodbDataPendingWrites`     | 对应innodb_data_pending_writes 当前挂起的写操作                   | status |\n      |`-- InnodbDataRead`              | 对应innodb_data_read 自启动后读了多少数据进buffer_pool             | status |\n      |`-- InnodbDataReads`             | 对应innodb_data_reads 自启动后读了多少次数据进buffer_pool          | status |\n      |`-- InnodbDataWrites`            | 对应innodb_data_writes 自启动后写了多少次数据到buffer_pool         | status |\n      |`-- InnodbDataWritten`           | 对应innodb_data_written 自启动后写了多少数据到buffer_pool          | status |\n      |`-- InnodbDblwrPagesWritten`     | 对应innodb_dblwr_pages_written double_write写入到磁盘的页面数量   | status |\n      |`-- InnodbDblwrWrites`           | 对应innodb_dblwr_writes double_write 执行的次数                 | status |\n      |`-- InnodbLogWaits`              | 对应innodb_log_waits 写日志时的等待次数                           | status |\n      |`-- InnodbLogWriteRequests`      | 对应innodb_log_write_requests 写请求次数                        | status |\n      |`-- InnodbLogWrites`             | 对应innodb_log_writes 写磁盘的次数                               | status |\n      |`-- InnodbOsLogFsyncs`           | 对应innodb_os_log_fsyncs fsync()函数调用的次数(针对redo log file) | status |\n      |`-- InnodbOsLogPendingFsyncs`    | 对应innodb_os_log_pending_fsyncs 挂起的fsync操作数量             | status |\n      |`-- InnodbOsLogPendingWrites`    | 对应innodb_os_log_pending_writes 挂起的write操作数量             | status |\n      |`-- InnodbOsLogWritten`          | 对应innodb_os_log_written 写入的字节数量                         | status |\n      |`-- InnodbPagesCreated`          | 对应innodb_pages_created  创建的页面数量                         | status |\n      |`-- InnodbPagesRead`             | 对应innodb_pages_read 从buffer_pool中读出的页面数量               | status |\n      |`-- InnodbPagesWritten`          | 对应innodb_pages_written 向buffer_pool写入的页面数量             | status |\n      |`-- InnodbRowLockCurrentWaits`   | 对应innodb_row_lock_current_waits 当前的行锁等待数量              | status |\n      |`-- InnodbRowLockTime`           | 对应innodb_row_lock_time 花费在获取行锁上的总时间                  | status |\n      |`-- InnodbRowLockTimeAvg`        | 对应innodb_row_lock_time_avg 花费在获取行锁上的平均时间            | status |\n      |`-- InnodbRowLockTimeMax`        | 对应innodb_row_lock_time_max 花费在获取行锁上的最大时间            | status |\n      |`-- InnodbRowLockWaits`          | 对应innodb_row_lock_waits 行锁等待的总次数                       | status |\n      |`-- InnodbRowsDeleted`           | 对应innodb_rows_deleted 删除的行数                              | status |\n      |`-- InnodbRowsInserted`          | 对应innodb_rows_inserted 插入的行数                             | status |\n      |`-- InnodbRowsRead`              | 对应innodb_rows_read 读取的行数                                 | status |\n      |`-- InnodbRowsUpdated`           | 对应innodb_rows_updated 更新的行数                              | status |\n      |`-- OpenTableDefinitions`        | 对应open_table_definitions 缓存中的.frm文件数量                  | status |\n      |`-- OpenTables`                  | 对应open_tables 当前打开的表的数量                               | status |\n      |`-- OpenedTableDefinitions`      | 对应opened_table_definitions 曾经缓存过的.frm文件数量             | status |\n      |`-- OpenedTables`                | 对应opened_tables 曾经打开过的表                                 | status |\n      |`-- TableOpenCacheOverflows`     | 对应table_open_cache_overflows 表打开又关闭的次数                | status |\n      |`-- ThreadsCached`               | 对应threads_cached 当前线程池中线程的数量                         | status |\n      |`-- ThreadsConnected`            | 对应threads_connected 当前打开的连接                            | status |\n      |`-- ThreadsCreated`              | 对应threads_created   为了处理连接所创建的线程总数                 | status |\n      |`-- ThreadsRunning`              | 对应threads_running   非sleep状态下的线程数                      | status |\n      |`-- Uptime`                      | 对应uptime 从启动开始到现在已经运行了多少秒                         | status |          \n      |`-- MgrTotalMemberCount`         | mgr集群中成员的数量                                             | p_s    |\n      |`-- MgrOnLineMemberCount`        | mgr集群中online状态下的成员数量                                  | p_s    |\n      |`-- MgrMemberState`              | 当前mgr成员的状态                                               | p_s    | \n      |`-- MgrCountTransactionsInQueue` | 当前mgr成员上等待进行冲突检查的事务数量                            | p_s    |\n      |`-- MgrCountTransactionsChecked` | 当前mgr成员上已经完成冲突检测的事务数量                            | p_s    |\n      |`-- MgrCountConflictsDetected`   | 当前mgr成员上没能通过冲突检测的事务数量                            | p_s    |\n      |`-- MgrTransactionsCommittedAllMembers`|当前mgr成员上已经应用的事务总数量                            | p_s    |\n      |`-- RplSemiSyncMasterClients`    | 当前master端处理半同步状态的slave数量                             | status |\n      |`-- RplSemiSyncMasterStatus`     | master的半同步状态                                              | status |\n      |`-- RplSemiSyncMasterNoTx`       | 没有收到半同步slave确认的事务数量                                  | status |\n      |`-- RplSemiSyncMasterYesTx`      | 有收到半同步slave确认的事务数量                                    | status |\n      |`-- RplSemiSyncSlaveStatus`      | slave的半同步状态                                               | status |\n      |`-- SlaveIORunning`              | IO线程的状态(-1:说明当前实例是master,0:非Yes,1:Yes)               | show slave status |\n      |`-- SlaveSQLRunning`             | SQL线程的状态(-1:说明当前实例是master,0:非Yes,1:Yes)              | show slave status |\n      |`-- SecondsBehindMaster`         | Seconds behind master                                         | show slave status |\n\n      ---\n\n\n   2. ### 监控项的人肉使用方法\n      前面说到监控项的采集程序**mysqltools-python**已经写好了的，直接用就行；这只是为了让你过一下手瘾事实上你是用不着这样的，监控是全自动的\n\n      ```\n      mtlsmonitor --user=monitor --password=monitor0352 --host=127.0.0.1 --port=3306 BinlogCacheDiskUse\n      ```\n      输出如下\n      ```\n      0\n      ```\n\n      ---\n\n   3. ### zabbix监控环境介绍\n      **zabbix采用的是server/agent的架构设计，agent负责采集数据、数据经由可选的proxy(也就是说可以不经过proxy)上报到server；数据最终是保存到数据库中的、这里后台的数据库我选择用mysql；为了方便使用zabbix还自带了一个用php写的网站，这样用户就可以通过web界面来配置监控系统了，体验上来说要好不少。网站不直接与server交互它直接操作数据。**\n\n      **从软件组件上看一套zabbix监控环境涉及到多少组件**\n      \n      1): **linux** 主机    2): **apache(httpd)**   3): **mysql**   4): **php**   5):**zabbix-server**   6):**zabbix-agent**   7): **zabbix-proxy** \n      \n      从涉及到的组件上看一个监控环境是比较复杂的；mysqltools自动化安装的默认行为是在zabbix-server主机上同时安装上mysql、apache(httpd)、php 当然为了有监控zabbix-server所在主机的能力mysqltools还会在zabbix-server主机上也安装上zabbix-agent\n\n      ---\n\n   4. ### zabbix监控环境安装规划\n\n      **安装规划**\n\n      主机名     | ip地址          | 角色\n      ----------|----------------|-----\n      sqlstudio | 172.16.192.101 | zabbix-server\n      mysqldb   | 172.16.192.128 | zabbix-agent\n\n      ---\n\n   5. ### 安装用于保存监控数据的mysql数据库与pyton-3.6.2\n      **mysql-8.0.xx 还刚出来；我在使用mysql-8.0.11这个版本时编译php出错了；最好还在这里用mysql-5.7.x版本的mysql**\n      见([mysql单机](#mysql单机))\n\n      见([用ansible安装python](#用ansible安装python)) 如果你是用mysqltools来安装python-3.6.2的话它默认为把mysqltools-python这个包也给你安装上，mysqltool-python的主要功能之一就是mysql监控数据采集，所以这个轮子是你的zabbix监控系统所必要的。\n      \n      ---\n\n   6. ### 改配置文件中zabbix_server_ip这个配置项\n      **修改mysqltools/config.yaml配置文件中的zabbix_server_ip配置项的值为zabbix-server主机的ip地址**\n      ```\n      zabbix_server_ip: 172.16.192.101\n      ```\n\n      ---\n\n   7. ### 安装httpd\n      **1):进入httpd的安装目录**\n      ```\n      cd mysqltools/deploy/ansible/httpd\n      ```\n      **2):修改install_httpd.yaml文件中的目标主机为zabbixstudio**\n      ```\n      ---\n        - hosts: zabbixstudio\n          vars_files:\n      ```\n      **3):安装httpd**\n      ```\n      ansible-playbook install_httpd.yaml\n      ```\n      输出如下：\n      ```\n      PLAY [zabbixstudio] ***********************************************************************************************************\n      \n      TASK [Gathering Facts] ********************************************************************************************************\n      ok: [zabbixstudio]\n      \n      TASK [install gcc] ************************************************************************************************************\n      changed: [zabbixstudio]\n      \n      TASK [install gcc-c++] ********************************************************************************************************\n      changed: [zabbixstudio]\n      \n      TASK [install pcre-devel] *****************************************************************************************************\n      changed: [zabbixstudio]\n      \n      TASK [openssl-devel] **********************************************************************************************************\n      changed: [zabbixstudio]\n      \n      TASK [expat-devel] ************************************************************************************************************\n      changed: [zabbixstudio]\n      \n      TASK [perl] *******************************************************************************************************************\n      ok: [zabbixstudio]\n      \n      TASK [transfer apr-1.6.2.tar.gz to remote host] *******************************************************************************\n      changed: [zabbixstudio]\n      \n      TASK [copy install script to remote] ******************************************************************************************\n      changed: [zabbixstudio]\n      \n      TASK [install apr] ************************************************************************************************************\n      changed: [zabbixstudio]\n      \n      TASK [remove /tmp/install_apr.sh] *********************************************************************************************\n      changed: [zabbixstudio]\n      \n      TASK [remove /tmp/apr-1.6.2] **************************************************************************************************\n      changed: [zabbixstudio]\n      \n      TASK [transfer apr-util-1.6.0.tar.gz to remote host] **************************************************************************\n      changed: [zabbixstudio]\n      \n      TASK [copy install script to remote] ******************************************************************************************\n      changed: [zabbixstudio]\n      \n      TASK [install apr_util] *******************************************************************************************************\n      changed: [zabbixstudio]\n      \n      TASK [clear /tmp/ directory] **************************************************************************************************\n      changed: [zabbixstudio]\n      \n      TASK [clear /tmp/ directory] **************************************************************************************************\n      changed: [zabbixstudio]\n      \n      TASK [copy httpd-2.4.28.tar.gz to remonte host] *******************************************************************************\n      changed: [zabbixstudio]\n      \n      TASK [copy install scripts to remonte host] ***********************************************************************************\n      changed: [zabbixstudio]\n      \n      TASK [install httpd] **********************************************************************************************************\n      changed: [zabbixstudio]\n      \n      TASK [remove /tmp/install_httpd.sh] *******************************************************************************************\n      changed: [zabbixstudio]\n      \n      TASK [remove /tmp/httpd-2.4.28.tar.gz] ****************************************************************************************\n      changed: [zabbixstudio]\n      \n      TASK [config httpd.service] ***************************************************************************************************\n      changed: [zabbixstudio]\n      \n      TASK [start httpd.service] ****************************************************************************************************\n      changed: [zabbixstudio]\n      \n      TASK [enable httpd.service] ***************************************************************************************************\n      changed: [zabbixstudio]\n      \n      PLAY RECAP ********************************************************************************************************************\n      zabbixstudio               : ok=25   changed=23   unreachable=0    failed=0\n      ```\n      **4):查看目标主机上的httpd进行种是否已经启动**\n      ```\n      ps -ef | grep httpd                                                                   \n      root      38860      1  0 15:11 ?        00:00:00 /usr/local/httpd/bin/httpd -DFOREGROUND                    \n      daemon    38861  38860  0 15:11 ?        00:00:00 /usr/local/httpd/bin/httpd -DFOREGROUND                    \n      daemon    38862  38860  0 15:11 ?        00:00:00 /usr/local/httpd/bin/httpd -DFOREGROUND                    \n      daemon    38863  38860  0 15:11 ?        00:00:00 /usr/local/httpd/bin/httpd -DFOREGROUND                    \n      daemon    43716  38860  0 15:15 ?        00:00:00 /usr/local/httpd/bin/httpd -DFOREGROUND  \n      ```\n      **5):通过浏览器查看效果**\n      \u003cimg src=\"./docs/imgs/httpd-0001.png\"/\u003e\n\n   8. ### 安装php\n      **1):进入php的安装目录**\n      ```\n      cd mysqltools/deploy/ansible/php\n      ```\n      ---\n\n      **2):修改install_php.yaml文件中的目标主机为zabbixstudio**\n      ```\n      ---\n        - hosts: zabbixstudio\n          vars_files:\n      ```\n\n      ---\n      **3):安装php**\n      ```\n      ansible-playbook install_php.yaml \n      ```\n      输出如下：\n      ```\n      PLAY [zabbixstudio] ************************************************************\n      \n      TASK [Gathering Facts] *********************************************************\n      ok: [zabbixstudio]\n      \n      TASK [install gcc] *************************************************************\n      ok: [zabbixstudio]\n      \n      TASK [install gcc-c++] *********************************************************\n      ok: [zabbixstudio]\n      \n      TASK [install bzip2-devel] *****************************************************\n      changed: [zabbixstudio]\n      \n      TASK [install libjpeg-devel] ***************************************************\n      changed: [zabbixstudio]\n      \n      TASK [install libpng-devel] ****************************************************\n      changed: [zabbixstudio]\n      \n      TASK [install freetype-devel] **************************************************\n      changed: [zabbixstudio]\n      \n      TASK [install freetype-devel] **************************************************\n      changed: [zabbixstudio]\n      \n      TASK [stop httpd.service] ******************************************************\n      changed: [zabbixstudio]\n      \n      TASK [unarchive php-5.6.31.tar.gz to remonte host] *****************************\n      changed: [zabbixstudio]\n      \n      TASK [copy install_php.sh to remonte host] *************************************\n      changed: [zabbixstudio]\n      \n      TASK [install php] *************************************************************\n      changed: [zabbixstudio]\n      \n      TASK [copy php.ini to remote] **************************************************\n      changed: [zabbixstudio]\n      \n      TASK [remove /usr/local/httpd/htdocs/index.html] *******************************\n      changed: [zabbixstudio]\n      \n      TASK [copy index.php to remote] ************************************************\n      changed: [zabbixstudio]\n      \n      TASK [remove /tmp/install_php.sh] **********************************************\n      changed: [zabbixstudio]\n      \n      TASK [remove /tmp/php-5.6.31] **************************************************\n      changed: [zabbixstudio]\n      \n      TASK [config httpd] ************************************************************\n      changed: [zabbixstudio]\n      \n      TASK [start httpd.service] *****************************************************\n      changed: [zabbixstudio]\n      \n      PLAY RECAP *********************************************************************\n      zabbixstudio               : ok=19   changed=16   unreachable=0    failed=0   \n      ```\n      ---\n\n      **4):通过web页面查看是否安装成功**\n      \u003cimg src=\"./docs/imgs/php-0001.png\"/\u003e\n\n      ---\n\n   9. ### 安装zabbix服务端\n      **1):配置mysqltools/config.yaml**\n\n      mysqltools配置文件中的`zabbix_server_ip: xxx.xxx.xxx.xxx`用来指定zabbix_server主机的ip地址，这个地址会在zabbix_agent的配置文件中用到，由于zabbix_server所在的主机也是要监控的，所以在zabbix_server主机上也要安装上zabbix_agent。此外，为了方安装mysqltools会自动在zabbix_server所在的主机上安装上zabbix_agent。\n      根据上面规划提到的zabbix_server在172.16.192.101这个主机上，所以config.yaml的内容应该如下\n      ```\n      zabbix_server_ip: 172.16.192.101\n      ```\n      ---\n\n      **2):修改install_zabbix_server.yaml文件中的目标主机为zabbixstudio**\n      ```\n      ---\n        - hosts: zabbixstudio\n          vars_files:\n      ```\n\n      ---\n\n      **3):安装zabbix_server**\n      \n      ```\n      cd mysqltools/deploy/ansible/zabbix\n      ansible-playbook install_zabbix_server.yaml\n      ```\n      输出如下：\n      ```\n      PLAY [zabbixstudio] ***********************************************************************************************************\n      \n      TASK [Gathering Facts] ********************************************************************************************************\n      ok: [zabbixstudio]\n      \n      TASK [add zabbix user to system] **********************************************************************************************\n      changed: [zabbixstudio]\n      ....\n      \n      TASK [config zabbix_server start up on boot] **********************************************************************************\n      changed: [zabbixstudio]\n      \n      PLAY RECAP ********************************************************************************************************************\n      zabbixstudio               : ok=32   changed=26   unreachable=0    failed=0 \n      ```\n\n      ---\n\n      **4):通过web配置zabbix**\n\n      1、访问zabbix-web界面 \n\n      \u003cimg src=\"./docs/imgs/zabbix-0001.png\"/\u003e\n\n      ---\n\n      2、下一步\n\n      \u003cimg src=\"./docs/imgs/zabbix-0002.png\"/\u003e\n\n      ---\n\n      3、配置zabbix管理界面连接后台数据库的方式\n\n      \u003cimg src=\"./docs/imgs/zabbix-0003.png\"/\u003e\n      这里的password指的是数据库端zabbix用户的密码、这个东西引用的是config.yaml中的`mysql_zabbix_password`这个配置项\n\n      然后就一直点“next step ”\n\n      ---\n\n      4、登录到zabbix-web\n\n      \u003cimg src=\"./docs/imgs/zabbix-0004.png\"/\u003e\n\n      这里的账号密码是死的，账号名：`admin` 密码：`zabbix`\n      \n      ---\n\n      5、zabbix-web 主页\n\n      \u003cimg src=\"./docs/imgs/zabbix-0005.png\"/\u003e\n\n      ---\n\n   10. ### 安装zabbix客户端\n       **1): 和安装服务端一样只不过把yaml文件换成install_zabbix_agent.yaml**\n       ```\n       ansible-playbook install_zabbix_agent.yaml \n       ```\n       输出如下：\n       ```\n       PLAY [sqlstudio] *******************************************************************************\n       TASK [Gathering Facts] *************************************************************************\n       ok: [sqlstudio]\n       TASK [transfer zabbix install package to remote host and unarchive to /tmp/] *******************\n       changed: [sqlstudio]\n       TASK [transfer install script to remonte host] *************************************************\n       changed: [sqlstudio]\n       TASK [install zabbix_agent_node] ***************************************************************\n       changed: [sqlstudio]\n       TASK [change owner to zabbix user] *************************************************************\n       changed: [sqlstudio]\n       TASK [make link] *******************************************************************************\n       changed: [sqlstudio]\n       TASK [transfer zabbix config file to remonte host] *********************************************\n       changed: [sqlstudio]\n       TASK [remove /tmp/install_zabbix_agent.sh] *****************************************************\n       changed: [sqlstudio]\n       TASK [remove /tmp/zabbix-3.4.3] ****************************************************************\n       changed: [sqlstudio]\n       TASK [export path env variable] ****************************************************************\n       ok: [sqlstudio]\n       TASK [export path env to /root/.bashrc] ********************************************************\n       ok: [sqlstudio]\n       TASK [transfer monitor script to remonte host] *************************************************\n       changed: [sqlstudio]\n       TASK [config file mode] ************************************************************************\n       changed: [sqlstudio]\n       TASK [transfer mtls.conf to remonte] ***********************************************************\n       changed: [sqlstudio]\n       TASK [config mtls.conf's mode] *****************************************************************\n       ok: [sqlstudio]\n       TASK [config zabbix_agent systemd] *************************************************************\n       ok: [sqlstudio]\n       TASK [start zabbix_agent] **********************************************************************\n       changed: [sqlstudio]\n       TASK [config zabbix_agent start up on boot] ****************************************************\n       ok: [sqlstudio]\n       PLAY RECAP *************************************************************************************\n       sqlstudio                  : ok=28   changed=12   unreachable=0    failed=0 \n       ```\n  \n   11. ### 通过mysqltools中给出的模板来监控mysql\n       **mysqltools提供了对MySQL单机的监控模板、把模板导入再关联到你的MySQL主机就能完成监控项的收集与画图了**\n\n       \u003cimg src=\"./docs/imgs/mysql_basic_screan-0001.png\"/\u003e\n\n       ---   \n  \n   12. ### mysqltools中定义的MySQL的监控模板\n       **1): zbx_export_mysql_basic_templates.xml** 针对MySQL单实例的各个维度进行监控\n\n       **2): zbx_export_mysql_replication_templates.xml** 继承了zbx_export_mysql_basic_templates.xml中定义的监控项并扩展了在replication方面的监控\n   ---\n      \n\n\n\n## lnmp\n   **lnmp指的是:** linux + nginx + mysql + python 可以用这些组件来搭建django框架写成的网站；(我们将在一台机器上集齐所有组件)\n\n   **主机名**     | **ip地址**          | **系统版本**  |   软件       |\n   -------------:|:-------------------|--------------|-------------|\n   uwsgiweb      | 172.16.192.133     |centos-7.4    | linux + nginx + mysql + python3.6.x + uwsgi + django |\n\n\n\n   1. ### 安装mysql单机\n      [mysql单机](#mysql单机)\n   2. ### 用ansible安装python\n      **mysqltools在自动化安装python的时候还会自动安装下些python包 django2.0.x、mysqlclient、uwsgi**\n\n      **1):修改deploy/ansible/python/install_python.yaml文件中的hosts**\n      ```\n      ---\n       - hosts: uwsgiweb\n      ```\n\n      **2):安装python**\n      ```\n      ansible-playbook install_python.yaml\n      ```\n      输出如下\n      ```\n      PLAY [uwsgiweb] *********************************************************************************\n      \n      TASK [Gathering Facts] **************************************************************************\n      ok: [uwsgiweb]\n      \n      ... ... ... ... ... ... \n\n      TASK [install python-3.6.2] *********************************************************************\n      changed: [uwsgiweb]\n      \n      TASK [install mysqlclient and mysql-connector-python] *******************************************\n      changed: [uwsgiweb]\n      \n      TASK [install django-2.0.4] *********************************************************************\n      changed: [uwsgiweb]\n      \n      TASK [install uwsgi] ****************************************************************************\n      changed: [uwsgiweb]\n      \n      TASK [install bs4] ******************************************************************************\n      changed: [uwsgiweb]\n      \n      TASK [install requests-2.18.4] ******************************************************************\n      changed: [uwsgiweb]\n      \n      PLAY RECAP **************************************************************************************\n      uwsgiweb                   : ok=39   changed=22   unreachable=0    failed=0  \n      ```\n      我们要建设的是lnmp环境，所以mysqltools还会把django、uwsgi 这两个包安装上去、同时运行起uwsgi\n\n      ```\n      ps -ef | grep uwsgi\n      ```\n      ```\n      uwsgi     40729      1  0 13:04 ?        00:00:00 /usr/local/python/bin/uwsgi --ini=/etc/uwsgi.cnf           \n      uwsgi     40731  40729  0 13:04 ?        00:00:00 /usr/local/python/bin/uwsgi --ini=/etc/uwsgi.cnf           \n      uwsgi     40732  40729  0 13:04 ?        00:00:00 /usr/local/python/bin/uwsgi --ini=/etc/uwsgi.cnf           \n      uwsgi     40733  40729  0 13:04 ?        00:00:00 /usr/local/python/bin/uwsgi --ini=/etc/uwsgi.cnf           \n      uwsgi     40734  40729  0 13:04 ?        00:00:00 /usr/local/python/bin/uwsgi --ini=/etc/uwsgi.cnf           \n      uwsgi     40735  40729  0 13:04 ?        00:00:00 /usr/local/python/bin/uwsgi --ini=/etc/uwsgi.cnf           \n      uwsgi     40736  40729  0 13:04 ?        00:00:00 /usr/local/python/bin/uwsgi --ini=/etc/uwsgi.cnf           \n      uwsgi     40737  40729  0 13:04 ?        00:00:00 /usr/local/python/bin/uwsgi --ini=/etc/uwsgi.cnf           \n      uwsgi     40738  40729  0 13:04 ?        00:00:00 /usr/local/python/bin/uwsgi --ini=/etc/uwsgi.cnf           \n      ```\n      由上面可以看出uwsgi成功启动了\n\n   3. ### 安装nginx\n      nginx的安装与配置也都是自动化的\n\n      **1):修改deploy/ansible/nginx/install_nginx.yaml的hosts 变量**\n      ```\n      ---\n       - hosts: uwsgiweb\n      ```\n      **2):安装nginx**\n      ```\n      ansible-playbook install_nginx.yaml \n\n      ```\n      输出如下：\n      ```\n      PLAY [uwsgiweb] *********************************************************************************\n      \n      TASK [Gathering Facts] **************************************************************************\n      ok: [uwsgiweb]\n      ... ... ... ... ... ... ... ... ... ...\n      \n      TASK [install nginx] ****************************************************************************\n      changed: [uwsgiweb]\n      \n      TASK [config nginx] *****************************************************************************\n      changed: [uwsgiweb]\n      \n      TASK [create systemd config file for nginx] *****************************************************\n      ok: [uwsgiweb]\n      \n      TASK [start nginx(sytemctl)] ********************************************************************\n      changed: [uwsgiweb]\n      \n      TASK [config nginx.service start up on boot] ****************************************************\n      ok: [uwsgiweb]\n      \n      PLAY RECAP **************************************************************************************\n      uwsgiweb                   : ok=17   changed=8    unreachable=0    failed=0 \n      ```\n      **3):检查nginx是否运行**\n      ```\n      ps -ef | grep nginx\n      ```\n      ```                                                              \n      root      45536      1  0 13:25 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx          \n      nginx     45537  45536  0 13:25 ?        00:00:00 nginx: worker process                                      \n      nginx     45538  45536  0 13:25 ?        00:00:00 nginx: worker process                                      \n      nginx     45539  45536  0 13:25 ?        00:00:00 nginx: worker process                                      \n      nginx     45540  45536  0 13:25 ?        00:00:00 nginx: worker process                                      \n      nginx     45541  45536  0 13:25 ?        00:00:00 nginx: worker process                                      \n      nginx     45542  45536  0 13:25 ?        00:00:00 nginx: worker process                                      \n      nginx     45543  45536  0 13:25 ?        00:00:00 nginx: worker process                                      \n      nginx     45544  45536  0 13:25 ?        00:00:00 nginx: worker process \n      ```\n\n   4. ### 查看效果\n      查看环境是否正确配置\n      \u003cimg src=\"./docs/imgs/lnmp-0001.png\"/\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n","funding_links":[],"categories":["zabbix","Python"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FNeeky%2Fmysqltools","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FNeeky%2Fmysqltools","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FNeeky%2Fmysqltools/lists"}