# mysqltools8 **Repository Path**: mirrors_winneryong/mysqltools8 ## Basic Information - **Project Name**: mysqltools8 - **Description**: 一个用于快速构建大规模,高质量,全自动化的 mysql分布式集群环境的工具;包含mysql 安装、备份、监控、高可用、读写分离、优化、巡检、自行化运维 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-09-26 - **Last Updated**: 2025-11-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## mysqltools8-权威指南 **作者:** 蒋乐兴 **微信:** jianglegege **官方网站:** www.sqlpy.com --- ## 目录 - [作者序](#作者序) - [mysqltools的世界观](#mysqltools的世界观) - [mysqltool介绍](#mysqltool介绍) - [安装与配置mysqltools](#安装与配置mysqltools) - [安装MySQL单机](#安装MySQL单机) - [mysqltools都做了什么](#mysqltools都做了什么) - [进一步定制mysqltools的行为](#进一步定制mysqltools的行为) - [单机多实例](#单机多实例) - [数据库监控](#数据库监控) - [python安装](#python安装) - [httpd安装](#httpd安装) --- ## 作者序 自第一个版本的 mysqltools 开源以来,收到了不少用户的反馈;mysqltools8 在此基础上总结了前一个版本的经验与教训,同时也顺应时代的发展增加了许多新的特性,比如支持 **docker** 这个让 mysqltools8 真正做到了拿来就用,面向 **插件实现** 一方面让 mysqltools8 的体积从之前的 1.2G 下降到了 30+MB ,另一方面功能上也实现了 **热插拔** 不管是升级还是扩展新的功能都更加简单。 --- ## mysqltools的世界观 **mysqltools** 希望 DBA 能喝着咖啡就把锁事情给做了,并且希望所交付的“输出”健壮到直接不用再管,DBA 节省下来的精力可以去做一些更有价值的事。总的来说我解决好两件事 **质量、效率** ### 质量 **KFC vs 学校后街的蛋炒饭** KFC 根据既定的流程生产每一个汉堡,假设这个流程下公众对汉堡给出的评分是80分,那么不管哪个 KFC 的店它生产出来的汉堡都稳定在80分;一段时间后 KFC 发现这个流程中可以改进的项,把汉堡的质量提升到81分,那么它就能做到所有的店里的汉堡都能打81分。 学校后街的蛋炒饭,好不好吃这个事难说;因为好多事都影响到它,有可能老板今天心情不好,也有可能是今天客人太多他比较急,这些都会影响到炒饭的质量。有一次我要买两盒,由于去的比较晚,老板只有一个鸡蛋了,你没有猜错! 他就只放了一个。 表面上看 KFC 流程化生产的好处在于它的东西质量有保障,最要命的是 KFC 只做加法,它可以不断提升自己,学校后街的蛋炒饭上周做的好吃,我们没办法确认我下次去吃还是不是那个味。 **加法人生** --- ### 效率 **多流水线 vs 手工串行** 现在用 MySQL 的很多时候动不动就来个**分库分表**,先抛开其合理性不谈,就工作量上来说相比单机是要增加了不少。 mysqltools并不希望看到这种工作量线性的增加到 DBA 身上来,为此 mysqltools 一开始就是冲着并行去的。 **加量不加工作量** --- ## mysqltool介绍 **mysqltools 要解决的问题** 1、各类 MySQL 环境的建设(单机,主从,MGR,MHA,读写分离) 2、实例生命周期中的备份,监控,事态感知与修复方案下发 3、生命周期结束时的清理与资源回收 --- **mysqltools 提出的方案** 1、把多年经验总结的最佳实践编写成 playbook 一来可以减少重复劳动(同时保证质量) 二来可以在此基础上做加法 2、强调监控的重要性,把常规问题的解决方案固化为修复脚本,遇到问题是监控系统自动执行,没出大事不要来烦 DBA 3、最终目标是只要用电环境就是正常的 --- **mysqltools 用到的一些技术** 1、ansible 用来做批量管理 2、zabbix 用来做监控和修复方案下发 3、mysql extrabckup meb mysqltools-python 等等 ... --- ## 安装与配置mysqltools **安装** 目前mysqltools支持在centos-7.x和以上版本的系统上安装、我们把安装上 mysqltool8 的主机称为管理结点 ```bash # 切换到 root 用户 sudo su # 下载 mysqltools8 安装包并解压 wget https://github.com/Neeky/mysqltools8/archive/master.zip unzip master.zip # 进入到 mysqltools8 的目录并执行自动安装脚本 mv mysqltools8-master /usr/local/mysqltools8 cd /usr/local/mysqltools8 bash dependences/install_mysqltools8.sh source /etc/profile # 检查是否自动安装上 python-3.7.x python3 --version Python 3.7.3 # 检查是否自动安装上 ansible-2.7.10 ansible --version ansible 2.7.10 ``` --- **配置(ansible 相关)** **1、** 生成的公钥与私钥 ```bash ssh-keygen # 连续回车 ``` **2、** 配置到目标主机的互信 ```bash ssh-copy-id root@172.16.192.100 ``` **3、** 增加 ansible 的配置文件 ``` mkdir /etc/ansible touch /etc/ansible/hosts echo 'sqlstudio ansible_host=172.16.192.100 ansible_user=root' > /etc/ansible/hosts ``` >完成上面的这些步骤就能在管理机上控制 72.16.192.100 了。 **4、** 验证一下 ansible 是否配置成功 ``` ansible -m ping sqlstudio sqlstudio | SUCCESS => { "changed": false, "ping": "pong" } ``` --- **配置(mysqltools)** 新版本的 mysltools 配置非常简单,全局配置就三个 ```yaml max_memory_size_mb: "{{ 1024 * 512 }}" # 512G内存 mysql_port: 3306 mysql_binary_pkg: "mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz" #mysql_binary_pkg: "mysql-8.0.16-linux-glibc2.12-x86_64.tar.xz" ``` **1、** mysql_port 指定 MySQL 要监听的地址 **2、** mysql_binary_pkg 要使用的 MySQL 二进制包 **3、** max_memory_size_mb 这个值的主要目的用来支持单机多实例的,这里是文档的入门阶段不会讲这个值 mysqltools 是插件式的,设计成插件式是为了减小 mysqltools 的体积,mysqltools 中的每一个功能都要有一个“插件”来支持, 拿安装 MySQL 这个事来说支持它的插件就是“MySQL 的二进制安装包” 总的来说所有的插件保存在 sps/插件名/具体的插件版本 事实上现阶段这些配置你可以都不用改,这也是为了 mysqltools 可以拿来就用。你可以进入下一节 [安装MySQL单机](#安装MySQL单机) 体验一下 mysqltools的功能 --- ## 安装MySQL单机 **要安装 MySQL 就要有对应的插件支持,而 MySQL 的支持插件就是 MySQL 的二进制安装包** **1、** 下载 config.yaml 中指定的 mysql 版本到 mysqltools/sps/mysql/ 目录 ``` mkdir -p /usr/local/mysqltools/sps/mysql cd /usr/local/mysqltools/sps/mysql wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz ``` **2、** 进入到 mysql 的安装目录 ```bash cd /usr/local/mysqltools8/ansible/mysql/ ``` **3、** 修改 hosts 的值为目标机器(之前配置 ansible 时候设置的 sqlstudio,如果你指定了其它的名字改成对应的就好) ``` --- - hosts: sqlstudio remote_user: root become_user: root become: yes vars_files: ``` **4、** 自动化单机安装 ```bash ansible-playbook install_single.yaml PLAY [sqlstudio] ********************************************************************************** TASK [Gathering Facts] **************************************************************************** ok: [sqlstudio] TASK [create mysql group] ************************************************************************* changed: [sqlstudio] TASK [create user "mysql3306"] ******************************************************************** changed: [sqlstudio] TASK [install libaio] ***************************************************************************** changed: [sqlstudio] TASK [install numactl] **************************************************************************** changed: [sqlstudio] TASK [install perl-Data-Dumper] ******************************************************************* changed: [sqlstudio] TASK [/etc/my-3306.cnf for mysql-8.0.x] *********************************************************** skipping: [sqlstudio] TASK [/etc/my-3306.cnf for mysql-5.7.x] *********************************************************** changed: [sqlstudio] TASK [transfer mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz to target host(s).] ********************* changed: [sqlstudio] TASK [generate untar script /tmp/untar_mysql_pkg.sh] ********************************************** changed: [sqlstudio] TASK [untar mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz] ******************************************* changed: [sqlstudio] TASK [rm /tmp/untar_mysql_pkg.sh] ***************************************************************** changed: [sqlstudio] TASK [create libmysqlclient_r.so] ***************************************************************** changed: [sqlstudio] TASK [update file privileges] ********************************************************************* changed: [sqlstudio] TASK [config ldconfig] **************************************************************************** changed: [sqlstudio] TASK [load so] ************************************************************************************ changed: [sqlstudio] TASK [conifg header file] ************************************************************************* changed: [sqlstudio] TASK [rm /tmp/mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz] ***************************************** changed: [sqlstudio] TASK [transfer users.sql to target host(s).] ****************************************************** changed: [sqlstudio] TASK [transfer init_mysql_data_dir.sh to target host(s).] ***************************************** changed: [sqlstudio] TASK [init data dir] ****************************************************************************** changed: [sqlstudio] TASK [/etc/profile] ******************************************************************************* changed: [sqlstudio] TASK [~/.bash_profile] **************************************************************************** changed: [sqlstudio] TASK [~/.bashrc] ********************************************************************************** changed: [sqlstudio] TASK [config mysqld-3306.service] ***************************************************************** changed: [sqlstudio] TASK [conifg mysqld-3306 auto start] ************************************************************** changed: [sqlstudio] TASK [start mysqld-3306] ************************************************************************** changed: [sqlstudio] TASK [create backup dir] ************************************************************************** changed: [sqlstudio] TASK [create backup script dir] ******************************************************************* changed: [sqlstudio] TASK [transfer backup script to target host (mysqldump)] ****************************************** changed: [sqlstudio] TASK [config backup job (mysqldump)] ************************************************************** changed: [sqlstudio] PLAY RECAP **************************************************************************************** sqlstudio : ok=30 changed=29 unreachable=0 failed=0 ``` >可以看到就算是一个简单的 MySQL 实例的安装 mysqltools 也执行了大大小小的30个步骤,也许随着之后能力和见识的提升步骤 可能还会更多。 **5、** 验证一下 MySQL 是否真的安装完成了 ```bash # ssh 到被控主机 ssh 172.16.192.100 # 连接一下用于测试 MySQL 服务是否正常 mysql -uroot -pmtls0352 -h127.0.0.1 -P3306 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.7.26-log MySQL Community Server (GPL) Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> ``` --- ### mysqltools都做了什么 **1、** 为每一个实例都在操作系统层面创建不同的用户 ```bash # 如果端口是 3306 那么用户名就是 mysql3306 ps -ef | grep mysql mysql33+ 24081 1 0 16:24 ? 00:00:01 /usr/local/mysql-5.7.26-linux-glibc2.12-x86_64/bin/mysqld --defaults-file=/etc/my-3306.cnf root 24402 24381 0 16:50 pts/1 00:00:00 grep --color=auto mysql cat /etc/passwd | grep mysql33 mysql3306:x:3306:3306::/home/mysql3306:/bin/bash ``` **2、** 根据主机的配置(cpu,mem,disk) 自动生成对应的配置文件 ```ini [mysql] auto-rehash socket =/tmp/mysql-3306.sock # /tmp/mysql.sock [mysqld] ####: for global user =mysql3306 # mysql basedir =/usr/local/mysql-5.7.26-linux-glibc2.12-x86_64 #/usr/local/mysql/ datadir =/database/mysql/data/3306 # /usr/local/mysql/data server_id =1312 # 0 port =3306 # 3306 character_set_server =utf8 # latin1 log_bin_trust_function_creators =ON # 0 max_prepared_stmt_count =1048576 # log_timestamps =system # utc socket =/tmp/mysql-3306.sock # /tmp/mysql.sock read_only =OFF # off skip_name_resolve =1 # 0 auto_increment_increment =1 # 1 auto_increment_offset =1 # 1 lower_case_table_names =1 # 0 secure_file_priv = # null open_files_limit =102000 # 1024 thread_cache_size =16 # 9 max_connections =151 # 151 ####: for table cache table_open_cache =4000 # 2000 table_definition_cache =2000 # 1400 table_open_cache_instances =16 # 16 ####: for binlog binlog_format =ROW # row log_bin =mysql-bin # off binlog_rows_query_log_events =ON # off log_slave_updates =ON # off expire_logs_days =7 # 0 binlog_cache_size =64k # 65536(64k) binlog_checksum =none # CRC32 sync_binlog =1 # 1 slave-preserve-commit-order =ON # ####: for error-log log_error =err.log # /usr/local/mysql/data/localhost.localdomain.err ####: for general-log general_log =OFF # off general_log_file =general.log # hostname.log ####: for slow query log slow_query_log =ON # off slow_query_log_file =slow.log # hostname.log log_queries_not_using_indexes =OFF # off long_query_time =2.0 # 10.000000 ####: for gtid gtid_executed_compression_period =1000 # 1000 gtid_mode =ON # off enforce_gtid_consistency =ON # off ####: for replication skip_slave_start =0 # master_info_repository =table # file relay_log_info_repository =table # file slave_parallel_type =logical_clock # database | LOGICAL_CLOCK slave_parallel_workers =4 # 0 rpl_semi_sync_master_enabled =1 # 0 rpl_semi_sync_slave_enabled =1 # 0 rpl_semi_sync_master_timeout =1000 # 1000(1 second) plugin_load_add =semisync_master.so # plugin_load_add =semisync_slave.so # binlog_group_commit_sync_delay =200 # 0 200(0.02% seconde) binlog_group_commit_sync_no_delay_count = 10 # 0 binlog_transaction_dependency_tracking = WRITESET # COMMIT_ORDER | WRITESET transaction_write_set_extraction = XXHASH64 ####: for innodb default_storage_engine =innodb # innodb default_tmp_storage_engine =innodb # innodb innodb_data_file_path =ibdata1:256M:autoextend # ibdata1:12M:autoextend innodb_temp_data_file_path =ibtmp1:64M:autoextend # ibtmp1:12M:autoextend innodb_buffer_pool_filename =ib_buffer_pool # ib_buffer_pool innodb_log_group_home_dir =./ # ./ innodb_log_files_in_group =8 # 2 innodb_log_file_size =128M # 50331648(48M) innodb_file_per_table =ON # on innodb_online_alter_log_max_size =128M # 134217728(128M) innodb_open_files =64000 # 2000 innodb_page_size =16k # 16384(16k) innodb_thread_concurrency =0 # 0 innodb_read_io_threads =4 # 4 innodb_write_io_threads =4 # 4 innodb_purge_threads =4 # 4(garbage collection) innodb_page_cleaners =4 # 4(flush lru list) innodb_print_all_deadlocks =ON # off innodb_deadlock_detect =ON # on innodb_lock_wait_timeout =50 # 50 innodb_spin_wait_delay =6 # 6 innodb_autoinc_lock_mode =2 # 1 innodb_flush_sync =OFF # on innodb_io_capacity =4000 # 200 innodb_io_capacity_max =20000 # 2000 #--------Persistent Optimizer Statistics innodb_stats_auto_recalc =ON # on innodb_stats_persistent =ON # on innodb_stats_persistent_sample_pages =20 # 20 innodb_adaptive_hash_index =ON # on innodb_change_buffering =all # all innodb_change_buffer_max_size =25 # 25 innodb_flush_neighbors =0 # 1 innodb_flush_method =O_DIRECT # innodb_doublewrite =ON # on innodb_log_buffer_size =64M # 16777216(16M) innodb_flush_log_at_timeout =1 # 1 innodb_flush_log_at_trx_commit =1 # 1 innodb_buffer_pool_size =896M # 134217728(128M) innodb_buffer_pool_instances =1 # 1 autocommit =ON # 1 #--------innodb scan resistant innodb_old_blocks_pct =37 # 37 innodb_old_blocks_time =1000 # 1000 #--------innodb read ahead innodb_read_ahead_threshold =56 # 56 (0..64) innodb_random_read_ahead =off # OFF #--------innodb buffer pool state innodb_buffer_pool_dump_pct =50 # 25 innodb_buffer_pool_dump_at_shutdown =ON # ON innodb_buffer_pool_load_at_startup =ON # ON #### for performance_schema performance_schema =on # on performance_schema_consumer_global_instrumentation =on # on performance_schema_consumer_thread_instrumentation =on # on performance_schema_consumer_events_stages_current =on # off performance_schema_consumer_events_stages_history =on # off performance_schema_consumer_events_stages_history_long =off # off performance_schema_consumer_statements_digest =on # on performance_schema_consumer_events_statements_current =on # on performance_schema_consumer_events_statements_history =on # on performance_schema_consumer_events_statements_history_long =off # off performance_schema_consumer_events_waits_current =on # off performance_schema_consumer_events_waits_history =on # off performance_schema_consumer_events_waits_history_long =off # off performance-schema-instrument ='memory/%=COUNTED' # -- ~ _ ~ ~ _ ~ ~ _ ~ -- # base on mysql-5.7.24 # generated by https://www.sqlpy.com 2019年5月22日 15:39 # wechat: jianglegege # email: 1721900707@qq.com # -- ~ _ ~ -- ``` **3、** 自动导出相应的动态库和PATH环境变量头文件 ```bash cat /etc/ld.so.conf.d/mysql-5.7.26-linux-glibc2.12-x86_64.conf /usr/local/mysql-5.7.26-linux-glibc2.12-x86_64/lib/ cat /etc/profile | grep mysql export PATH=/usr/local/mysql-5.7.26-linux-glibc2.12-x86_64/bin/:$PATH ``` **4、** systemd 服务管理 ``` cat /usr/lib/systemd/system/mysqld-3306.service [Unit] Description=MySQL Server Documentation=man:mysqld(8) Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html After=network.target After=syslog.target [Install] WantedBy=multi-user.target [Service] User=mysql3306 Group=mysql ExecStart=/usr/local/mysql-5.7.26-linux-glibc2.12-x86_64/bin/mysqld --defaults-file=/etc/my-3306.cnf LimitNOFILE = 102400 Environment=MYSQLD_PARENT_PID=1 #Restart=on-failure #RestartPreventExitStatus=1 ``` **5、** 创建自动备份任务 ``` su mysql3306 [mysql3306@sqlstudio tmp]$ crontab -l #Ansible: mysql-3306-auto-backup 0 2 * * * /usr/local/.mtlsscripts/3306-mysqldump-backup.sh ``` --- ### 进一步定制mysqltools的行为 其它更加精细的行为是由 mysqltools8/ansible/mysql/vars/mysql.yaml 这个配置文件来控制的 ```yaml #mysql configure mysql_user: "mysql{{mysql_port}}" mysql_group: mysql mysql_uid: "{{mysql_port}}" mysql_gid: 3306 mysql_backup_tool: "mysqldump" mysql_backup_crontab_day: "*" mysql_backup_crontab_hour: "2" mysql_backup_crontab_minute: "0" mysql_base_dir: "/usr/local/{{ mysql_binary_pkg | replace('.tar.gz','') | replace('.tar.xz','') }}" mysql_data_dir: "/database/mysql/data/{{mysql_port}}" mysql_version: "{{ mysql_binary_pkg | replace('.tar.gz','') | replace('.tar.xz','') }}" mysql_backup_dir: "/backup/mysql/{{mysql_port}}" mysql_backup_script_dir: "/usr/local/.mtlsscripts" mysql_root_pwd: 'mtls0352' mysql_monitor_user: 'monitor' mysql_monitor_pwd: 'monitor0352' mysql_dumper_user: 'dumper' mysql_dumper_pwd: 'dumper0352' mysql_extra_user: 'extrabackuper' mysql_extra_pwd: 'extra0352' mysql_binlog_format: "row" mysql_xport: "{{ mysql_port * 10 }}" mysql_mgrport: "{{ mysql_port * 10 + 1 }}" mysql_admin_port: "{{ mysql_port * 10 + 2 }}" ``` >可以看到其它的参数基本上是由全局的 mysql_port mysql_binary_pkg 这两个参数来决定的,通常来说你可以自定义一下用户的密码和备份时间(其实也没有必要改) --- ## 单机多实例 **通过前面 [安装MySQL单机](#安装MySQL单机) 下面看一下单机多实例在 mysqltools 做起来有多简单,实事上只要改一下全局配置中的 port 就行了** **1、** 改全局配置文件 mysqltools8/config.yaml 中 mysql_port 的值(在这里我改成了 3308) ```yaml max_memory_size_mb: "{{ 1024 * 512 }}" # 512G内存 mysql_port: 3308 mysql_binary_pkg: "mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz" #mysql_binary_pkg: "mysql-8.0.16-linux-glibc2.12-x86_64.tar.xz" ``` **2、** 指定实例的最大可分配内存 max_memory_size_mb 这个参数如果比主机的内存要大,那么最终以主机的内存为准;如果比主机内存要小那么以 max_memory_size_mb 为准。我在这里把新实例的内存设置为 1G 也就是改成 1024 * 1 ```yaml max_memory_size_mb: "{{ 1024 * 1 }}" # 1G内存 mysql_port: 3308 mysql_binary_pkg: "mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz" #mysql_binary_pkg: "mysql-8.0.16-linux-glibc2.12-x86_64.tar.xz" ``` **3、** 执行安装 ```bash ansible-playbook install_single.yaml PLAY [sqlstudio] ********************************************************************************** TASK [Gathering Facts] **************************************************************************** ok: [sqlstudio] TASK [create mysql group] ************************************************************************* ok: [sqlstudio] TASK [create user "mysql3308"] ******************************************************************** changed: [sqlstudio] TASK [install libaio] ***************************************************************************** ok: [sqlstudio] TASK [install numactl] **************************************************************************** ok: [sqlstudio] TASK [install perl-Data-Dumper] ******************************************************************* ok: [sqlstudio] TASK [/etc/my-3308.cnf for mysql-8.0.x] *********************************************************** skipping: [sqlstudio] TASK [/etc/my-3308.cnf for mysql-5.7.x] *********************************************************** changed: [sqlstudio] TASK [transfer mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz to target host(s).] ********************* changed: [sqlstudio] TASK [generate untar script /tmp/untar_mysql_pkg.sh] ********************************************** changed: [sqlstudio] TASK [untar mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz] ******************************************* changed: [sqlstudio] TASK [rm /tmp/untar_mysql_pkg.sh] ***************************************************************** changed: [sqlstudio] TASK [create libmysqlclient_r.so] ***************************************************************** ok: [sqlstudio] TASK [update file privileges] ********************************************************************* changed: [sqlstudio] TASK [config ldconfig] **************************************************************************** ok: [sqlstudio] TASK [load so] ************************************************************************************ changed: [sqlstudio] TASK [conifg header file] ************************************************************************* ok: [sqlstudio] TASK [rm /tmp/mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz] ***************************************** changed: [sqlstudio] TASK [transfer users.sql to target host(s).] ****************************************************** ok: [sqlstudio] TASK [transfer init_mysql_data_dir.sh to target host(s).] ***************************************** changed: [sqlstudio] TASK [init data dir] ****************************************************************************** changed: [sqlstudio] TASK [/etc/profile] ******************************************************************************* ok: [sqlstudio] TASK [~/.bash_profile] **************************************************************************** changed: [sqlstudio] TASK [~/.bashrc] ********************************************************************************** changed: [sqlstudio] TASK [config mysqld-3308.service] ***************************************************************** changed: [sqlstudio] TASK [conifg mysqld-3308 auto start] ************************************************************** changed: [sqlstudio] TASK [start mysqld-3308] ************************************************************************** changed: [sqlstudio] TASK [create backup dir] ************************************************************************** changed: [sqlstudio] TASK [create backup script dir] ******************************************************************* changed: [sqlstudio] TASK [transfer backup script to target host (mysqldump)] ****************************************** changed: [sqlstudio] TASK [config backup job (mysqldump)] ************************************************************** changed: [sqlstudio] PLAY RECAP **************************************************************************************** sqlstudio : ok=30 changed=20 unreachable=0 failed=0 ``` **4、** 实例是否启动 ```bash ps -ef | grep mysql mysql33+ 24081 1 0 16:24 ? 00:00:01 /usr/local/mysql-5.7.26-linux-glibc2.12-x86_64/bin/mysqld --defaults-file=/etc/my-3306.cnf mysql33+ 32415 1 0 16:25 ? 00:00:00 /usr/local/mysql-5.7.26-linux-glibc2.12-x86_64/bin/mysqld --defaults-file=/etc/my-3308.cnf mysql -uroot -pmtls0352 -h127.0.0.1 -P3308 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.7.26-log MySQL Community Server (GPL) Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> select @@innodb_buffer_pool_size /1024/1024; +--------------------------------------+ | @@innodb_buffer_pool_size /1024/1024 | +--------------------------------------+ | 256.00000000 | +--------------------------------------+ 1 row in set (0.00 sec) ``` >可以看到当你指定主机的最大可分配内存为 1G 时 mysqltools 给 innodb_buffer_pool_size 分配了 256M。 --- ## 数据库监控 **我们希望数据库能自我修复其整个生命周期中遇到的问题,为了达到这个目标,我们要建立一套有效的监控系统来检测出问题,再配合上一整套行之有效的解决方案,当问题发生时监控系统把解决方案下发,主机在收到解决方案后执行解决方案以此来达到修复问题的目的。** **监控系统在此选择的是 zabbix 、监控项采集&解决方案没有开源的工具可用了,所以直接自己写,mysqltools-python 这个软件包就是这一使命下的产物。也就是说我们需要在所以的被监控主机上都安装上 python-3.6.x 这个 python 环境,并安装上 mysqltools-python 这个包,好消息是这一切 mysqltools 都已经为你准备好了。** **zabbix 是一套 c/s 架构的软件,agent 要安装到所有被监控的主机上,agent 负责收集监控项并执行 server 下发的解决方案,为了方便使用 zabbix 还提供了一套基于 php 实现的 web 页面** **为了简单 mysqltools 会把整个 zabbix-后台数据库,zabbix-服务端,web-服务器 都安装到同一台主机上,逻辑上叫这台主机为 zabbix-server 。** --- ## python安装 **因为 mysqltools 中大量的内容依赖于 python ,当我们管理的主机一多,那我们就需要在大量的主机上安装 python ,人肉操作是我们坚决反对的东西,所以 mysqltools 也就自带了 python 自动化安装的能力。** **为了减小 mysqltools 包的大小,我们把一些不必要的功能做成了插件,自动化安装 python 这个功能对应的插件为 mysqltools-plugin-python 。安装插件的方法也非常简单,只要把插件下载下来保存到对应的目录就行了,python 插件的目录就 `sps/python`** **1、** 安装 python 插件 ```bash # 下载 cd /tmp/ wget https://github.com/Neeky/mysqltools-plugin-python/archive/master.zip # 解压 unzip master.zip # 把插件文件移动到 /usr/local/mysqltools8/sps/python/ 目录下 cd mysqltools-plugin-python-master/ mv python-3.7.3 /usr/local/mysqltools8/sps/python/ # python 插件目标的内容如下 tree /usr/local/mysqltools8/sps/python/ /usr/local/mysqltools8/sps/python/ └── python-3.7.3 ├── auto_install.sh ├── certifi-2019.3.9-py2.py3-none-any.whl ├── chardet-3.0.4-py2.py3-none-any.whl ├── idna-2.8-py2.py3-none-any.whl ├── Jinja2-2.10.1-py2.py3-none-any.whl ├── MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl ├── mysql_connector_python-8.0.16-cp37-cp37m-manylinux1_x86_64.whl ├── mysqltools-python-2.19.04.10.tar.gz ├── protobuf-3.7.1-cp37-cp37m-manylinux1_x86_64.whl ├── psutil-5.6.2.tar.gz ├── Python-3.7.3.tar.xz ├── requests-2.22.0-py2.py3-none-any.whl ├── setuptools-41.0.1-py2.py3-none-any.whl ├── six-1.12.0-py2.py3-none-any.whl └── urllib3-1.25.3-py2.py3-none-any.whl ``` **2、** 修改 install_python.yaml 文件的 hosts 属性为目标主机(组) ```bash cd /usr/local/mysqltools8/ansible/python/install_python.yaml cat install_python.yaml --- - hosts: sqlstudio remote_user: root become_user: root become: yes vars_files: - ../../config.yaml - ./vars/python.yaml ``` **3、** 自动化安装 ```bash ansible-playbook install_python.yaml PLAY [sqlstudio] *************************************************************** TASK [Gathering Facts] ********************************************************* ok: [sqlstudio] TASK [install gcc] ************************************************************* ok: [sqlstudio] TASK [install gcc-c++] ********************************************************* ok: [sqlstudio] TASK [install libffi] ********************************************************** ok: [sqlstudio] TASK [install libyaml-devel] *************************************************** ok: [sqlstudio] TASK [install libffi-devel] **************************************************** ok: [sqlstudio] TASK [install zlib] ************************************************************ ok: [sqlstudio] TASK [install zlib-devel] ****************************************************** ok: [sqlstudio] TASK [install openssl] ********************************************************* ok: [sqlstudio] TASK [install openssl-devel] *************************************************** ok: [sqlstudio] TASK [install libyaml] ********************************************************* ok: [sqlstudio] TASK [install sqlite-devel] **************************************************** ok: [sqlstudio] TASK [install libxml2] ********************************************************* ok: [sqlstudio] TASK [install libxslt-devel] *************************************************** ok: [sqlstudio] TASK [install libxml2-devel] *************************************************** ok: [sqlstudio] TASK [transfer install script to target host(s)] ******************************* changed: [sqlstudio] TASK [install python-3.7.3] **************************************************** changed: [sqlstudio] TASK [remove temp files] ******************************************************* changed: [sqlstudio] TASK [/etc/profile] ************************************************************ ok: [sqlstudio] PLAY RECAP ********************************************************************* sqlstudio : ok=19 changed=3 unreachable=0 failed=0 ``` **4、** 验证是否安装成功 ```bash /usr/local/python/bin/python3 Python 3.7.3 (default, Jul 24 2019, 10:53:38) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import mtls ``` >如果没有报什么异常就说明是成功了 **5、** mysqltools 自动化安装 python 的时候会做一些什么 - 1、编译安装插件包中指定的 python 环境 - 2、自动安装 mysqltools-python 、requests 、psutil mysql-connector-python 等其它工具包 - 3、自动导出环境变量 --- ## httpd安装 **这里的 httpd 自动化安装流程是专门为 zabbix-server 做的,也就是说你最好不要用于其它的地方。httpd插件开源在了 mysqltools-plugin-httpd** **1、** httpd 也是通过一个插件来实现的、所以你还是要先把插件下载到 sps/httpd/ 目标下 ```bash cd /tmp/ wget https://github.com/Neeky/mysqltools-plugin-httpd/archive/master.zip unzip master.zip cd mysqltools-plugin-httpd-master/ mv httpd-2.4.39 /usr/local/mysqltools/sps/httpd/ tree /usr/local/mysqltools/sps/httpd/ ./ ├── README.md └── httpd-2.4.39 ├── apr-1.7.0.tar.gz ├── apr-util-1.6.1.tar.gz ├── auto_install.sh └── httpd-2.4.39.tar.gz ``` **2、** 修改 hosts 为要安装 httpd 的主机 ```bash cat install_httpd.yaml - hosts: "zabbixstudio" remote_user: root become_user: root become: yes vars_files: - ../../config.yaml - vars/httpd.yaml ``` **3、** 安装 ```bash ansible-playbook install_httpd.yaml PLAY [zabbixstudio] ************************************************************ TASK [Gathering Facts] ********************************************************* ok: [zabbixstudio] TASK [install gcc] ************************************************************* ok: [zabbixstudio] TASK [install gcc-c++] ********************************************************* ok: [zabbixstudio] TASK [install pcre-devel] ****************************************************** ok: [zabbixstudio] TASK [openssl-devel] *********************************************************** ok: [zabbixstudio] TASK [expat-devel] ************************************************************* changed: [zabbixstudio] TASK [perl] ******************************************************************** ok: [zabbixstudio] TASK [transfer httpd-2.4.39 to target host] ************************************ changed: [zabbixstudio] TASK [install httpd-2.4.39] **************************************************** changed: [zabbixstudio] TASK [config systemd] ********************************************************** changed: [zabbixstudio] TASK [make httpd auto start on boot] ******************************************* changed: [zabbixstudio] TASK [start httpd] ************************************************************* changed: [zabbixstudio] PLAY RECAP ********************************************************************* zabbixstudio : ok=12 changed=6 unreachable=0 failed=0 ``` **4、** 在目标主机上检查 httpd 是否已经启动 ```bash ps -ef | grep http root 40441 1 0 11:25 ? 00:00:00 /usr/local/httpd/bin/httpd -DFOREGROUND daemon 40452 40441 0 11:25 ? 00:00:00 /usr/local/httpd/bin/httpd -DFOREGROUND daemon 40453 40441 0 11:25 ? 00:00:00 /usr/local/httpd/bin/httpd -DFOREGROUND daemon 40454 40441 0 11:25 ? 00:00:00 /usr/local/httpd/bin/httpd -DFOREGROUND root 40547 7155 0 11:28 pts/0 00:00:00 grep --color=auto http ``` 当然也可以从浏览器上查看 httpd 是否正常 >这样的话 httpd 就算是安装成功了 ---