总的来说mysqltools源自于工作、一个dba的日常大概包括 数据库安装,读写分离、高可用、负载均衡等环境的配置,
数据库备份策略拟定与实施,数据库相关的监控,数据库优化,故障分析,也有可能参与到数据库建模,SQL的编写。
-
质量
KFC vs 学校后街的蛋炒饭
KFC根据既定的流程生产每一个汉堡,假设这个流程下公众对汉堡给出的评分是80分,那么不管哪个KFC的店它生产出来的汉堡都稳定在80分;一段时间后它发现这个流程中可以改进的项,把汉堡的质量提升到81分,那么它就能做到所有的店里的汉堡都能打81分。
学校后街的蛋炒饭 好不好吃这个事难说;因为好多事都影响到它,有可能老板今天心情不好,也有可能是今天客人太多他比较急,这些都会影响到炒饭的质量。有一次我要买两盒,由于去的比较晚,老板只有一个鸡蛋了,你没有猜错! 他就只放了一个蛋,按常理是要一盒一个的。
表面上看KFC 流程化生产的好处在于它的东西质量有保障,最要命的是KFC只做加法,它可以不断提升自己,学校后街的蛋炒饭上周一,做的好吃,我们没办法确认那是不是超水平发挥,蛋炒饭质量的方差太大了。
对于DBA来说可以专门针对自己的日常工作开发一款工具,这样做的好处有 1:)由于工具已经把流程固定下来了所以“产出的质量”有保证 2:)随着自己技术的进步自己工作的输出也可以稳步提高。 这样我们在质量这个目标上就只做加法了。
-
效率
流水线 vs 手工作坊
流水线相对于手工作坊,那是生产力的巨大提升。我为什么要说这个?因为在MySQL的使用中可能会遇到一些场景,比如说“分库分表”,“高可用+读写分离”;特别是前者通常就是一个MyCAT后面有好几十个分片,上百个MySQL实例(通常它们会为一个分片做一主两从并加上高可用),装100+个MySQL今晚加班不? 配100+个主从今晚加班不? 不要忘记还要给它们加
高可用呢? 好吧这只是测试环境生产环境和测试环境是1:1的,那接下来几天加班不? 对于生产通常还要加备份,监控那接下来几天加班不?
DBA的工具不应该只是能输出高质量的交付物,更应该要解放生产力----有批量管理的能力。
-
经济
mysqltools 是开源的&免费的&高质量的MySQL数据管理工具
-
技术介绍
1、mysqltools的高质量源自于蒋乐兴也就是我写出来的高质量的playbook
2、mysqltools的高效源自于ansible这个批量管理工具
3、1 , 2 基本上解决了原生MySQL的环境(单机、master -->slave、mysql-group-replication 、multi-source-replication)的安装部署
4、mysqltools在为MySQL做高可用时采用的是MHA这个方案,读写分离用的是MyCAT
5、mysqltools在备份时支持到了 xtrabackup,mysql enterprise backup,mysqldump
6、mysqltools在监控MySQL时用的是zabbix
7、其它开源工具无法满足的功能通过自己编写程序实现。由于这个程序的许多功能是通用的,所以我把它单独了出来成为一个新的开源项目,这样它就与mysqltools解耦了。详见mysqltools-python
mysqltools的定位是一个集中化管理平台你只要在一台主机上安装好mysqltools就可以了,其它主机作为被管理都的角色。由于mysqltools是基于Python-3.x开发
出来的所以你的主控机上应该事先安装好python-3.x、还要安装上ansible。 好在mysqltools已经包含有所有Python和ansible所有的包。
-
安装前的准备
1): 你的主控机上要配置有yum、因为mysqltools要源码编译安装Python-3.6.2、这就涉及gcc … 等依赖
2): 有主控机的root账号(安装软件时会用到)
3): 被控机上也要配置好yum
-
下载并解压
mysqltools是开源在github上的、下载地址如下:https://github.com/Neeky/mysqltools/archive/master.zip
linux可以直接执行如下命令完成下载并解压到/usr/local/
cd /tmp/
wget https://github.com/Neeky/mysqltools/archive/master.zip &
ll -h /tmp/
-rwxr-xr-x. 1 root root 194M 3月 23 11:52 master.zip
unzip master.zip
mv mysqltools-master /usr/local/mysqltools
-
安装Python
mysqltools包含了Python的自动化安装脚本、前提是yum已经可用
cd /usr/local/mysqltools/deploy/packages/python/
bash install.sh
安装成功后的最后几行输出如下:
Collecting setuptools
Collecting pip
Installing collected packages: setuptools, pip
Successfully installed pip-9.0.1 setuptools-28.8.0
检查python3是否安装成功
source /etc/profile
python3 --version
Python 3.6.2
-
安装ansible
ansible和它相关的依赖我都打包到mysqltools中了、也和上面安装python一样一行命令就行
source /etc/profile
cd /usr/local/mysqltools/deploy/packages/ansible
bash install.sh
安装成功后可以看到如下输出
Using /usr/local/python-3.6.2/lib/python3.6/site-packages
Finished processing dependencies for ansible==2.4.0.0
-
1): 增加ansible的配置文件
# 增加ansible的配置文件
mkdir -p /etc/ansible
touch /etc/ansible/hosts
/etc/ansible/hosts文件如下:
host_131 ansible_user=root ansible_host=172.16.192.131
host_132 ansible_user=root ansible_host=172.16.192.132
2): 配置主控机与被控机之间的ssh信任
ssh-keygen
ssh-copy-id [email protected]
ssh-copy-id [email protected]
命令输出大致如下:
ssh-keygen # 一直回车就能生成钥匙对了
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:D9kR6/ehu5O99p/LRJlZWNqwZ0tzU4+jvPegq7j/Pq8 root@studio2018
The keys randomart image is:
+---[RSA 2048]----+
| . . o|
| o Oo|
| o *+B|
| + o ..+X|
| S o + .* |
| o . +.. |
| . oo+. |
| . ++=o.|
| ooo+EOo**|
+----[SHA256]-----+
ssh-copy-id [email protected] # 回答yes、然后输入目标主机的root密码
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '172.16.192.131 (172.16.192.131)' can't be established.
ECDSA key fingerprint is SHA256:qdoqi3B2aqO3ssOIphwOiWLywSlAoflX2YH+LCG7T/E.
ECDSA key fingerprint is MD5:8f:78:6e:20:ab:d0:2a:6b:c0:1a:e5:09:ac:82:7d:04.
Are you sure you want to continue connecting (yes/no)?
[email protected]'s password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '[email protected]'"
and check to make sure that only the key(s) you wanted were added.
.... ....
3): 测试ansible是否配置成功
ansible -m ping host_132
host_132 | SUCCESS => {
"changed": false,
"failed": false,
"ping": "pong"
}
4): 配置mysqltools
mysqltools的配置文件是mysqltools/config.yaml 它是一个yaml格式的文件;配置项中最基本的有mtls_base_dir、mysql_packages_dir、mysql_package
1、mtls_base_dir用于配置mysqltools的安装路径:在下载并解压这个步骤中我们把mysqltools解压到了/usr/local/、所以mtls_base_dir的值就应该等于"/usr/local/mysqltools/"
2、mysql_packages_dir用于配置MySQL二进制安装包保存的位置:MySQL的安装包有600+MB、出于体量的原因mysqltools并没有直接打包MySQL的二进制安装包、而是留有mysql_packages_dir这个配置项,mysqltools会从这个目录中去找MySQL的二进制安装包。
3、mysql_package用于配置MySQL安装包的名字、有这个变量的因为是为了,可以做到有多个不同的MySQL的版本共存、默认值为 mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz
config.yaml的关键内容大致如下:
mtls_base_dir: /usr/local/mysqltools/
mysql_packages_dir: /usr/local/src/mysql/
mysql_package: mysql-5.7.21-linux-glibc2.12-x86_64.tar.gz
注意:在mysqltools中所有的目录都是要以’/'号结尾的
如果你正确的完成了mysqltools相关的配置那么config.yaml看起来就应该是这样的
---
#----------------------------------mysqltools全局配置文件---------------------
# section 1 #mysqltools所在的目录
mtls_base_dir: /usr/local/mysqltools/
# #mysqltool自带的各类软件的安装文件所在路径(相对路径)
mtls_packages: deploy/packages/
# #mysqltool自带的python脚本、下发到被控主机时所保存的路径
mtls_client_base_dir: /usr/local/
# section 2 #mysqltools自带的各类软件安装文件 的全名、设置这些变量的作用是方便版本共存、mysql不在这里设置是因为
# #mysql的安装包太大了,mysqltools并没有把它打包进来
mtls_apr: apr-1.6.2.tar.gz
mtls_apr_util: apr-util-1.6.0.tar.gz
mtls_httpd: httpd-2.4.28.tar.gz
mtls_php: php-5.6.31.tar.gz
#mtls_zabbix: zabbix-3.4.3.tar.gz
mtls_zabbix: zabbix-4.0.0.tar.gz
mtls_python: python-3.6.2.tar.xz
mtls_mysql_connector_python: mysql-connector-python-2.1.5.tar.gz
mtls_mycat: mycat-server-1.6.5-linux.tar.gz
mtls_mha_node: mhanode.tar.gz
mtls_mha_manager: mhamanager.tar.gz
mtls_git: git-2.9.5.tar.gz
mtls_nginx: nginx-1.13.7.tar.gz
mtls_sysbench: sysbench-1.1.0.tar.gz
mtls_meb: meb-4.1.0-linux-glibc2.5-x86-64bit.tar.gz
mtls_xtrb: percona-xtrabackup-2.4.9-Linux-x86_64.tar.gz
mtls_mysqlclient: mysqlclient-1.3.12.tar.gz
mtls_pytz: pytz-2018.4.tar.gz
mtls_django: django-2.0.4.tar.gz
mtls_uwsgi: uwsgi-2.0.17.tar.gz
#mysql与php-5.6.x 是否要同时安装在一台主机上、如果是就要把这个设置成yes、以为php导出mysqclient_r.so文件
mtls_with_php: 1
#通过ansible在被控机上安装python-3.x的时候,是否自动安装好mysql-connector-python
mtls_with_mysql_conntor_python: 1
#是否给mysql用户加密码
mtls_make_mysql_secure: 1
#
mtls_with_mysql_group_replication: 0
#----------------------------------mysqltools全局配置文件---------------------
####
#### mysql 相关的配置
####
#mysql 安装包所在的目录
mysql_packages_dir: /usr/local/src/mysql/
#mysql 安装包的名字
#mysql_package: mysql-5.6.40-linux-glibc2.12-x86_64.tar.gz
#mysql_package: mysql-5.7.23-linux-glibc2.12-x86_64.tar.gz
mysql_package: mysql-8.0.13-linux-glibc2.12-x86_64.tar.xz
#linux 系统级别mysql用户相关信息
mysql_user: mysql
mysql_group: mysql
mysql_user_uid: 3306
mysql_user_gid: 3306
#mysql 安装目录
mysql_base_dir: /usr/local/mysql/
#mysql 真正的datadir就会是mysql_data_dir_base+mysql_port
mysql_data_dir_base: /database/mysql/data/
mysql_port: 3306
mysql_root_password: mtls0352
mysql_zabbix_password: mtls
mysql_rple_user: repl
mysql_rple_password: repl0352
mysql_mha_user: mha
mysql_mha_password: mtls0352
mysql_app_user: appuser
mysql_app_password: mtls0352
mysql_monitor_user: monitor
mysql_monitor_password: monitor0352
mysql_backup_user: backup
mysql_backup_password: DX3906
#mysql 配置文件模版
mysql_binlog_format: row
mysql_innodb_log_files_in_group: 16
mysql_innodb_log_file_size: 256M
mysql_innodb_log_buffer_size: 64M
mysql_innodb_open_files: 65535
mysql_max_connections: 1000
mysql_thread_cache_size: 256
mysql_sync_binlog: 1
mysql_binlog_cache_size: 64K
mysql_innodb_online_alter_log_max_size: 128M
mysql_performance_schema: 'on'
use_write_set: 1
#mysql
####
#### zabbix 相关的配置
#####
zabbix_server_ip: 172.16.192.131
为了你能更加方便的使用mysqltools我提供了份linux上的标准配置文件mysqltools/config.yaml-for-linux 使用时只要把它重命名成cofnig.yaml就行了
5): 下载MySQL
根据上面的配置可以知道MySQL的安装包要保存到**/usr/local/src/mysql/**目录下、包的版本为mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz
下载地址如下:https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz
cd /usr/local/src/mysql/
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.21-linux-glibc2.12-x86_64.tar.gz
如果我分享的知识对你有用、可以打赏任意金额;这些也是我花了许多业余时间才写出来的,也许可以请我喝一杯咖啡。如果你需要一名数据库建模、运维方面的专家也可也联系我、当然技术方面的交流也是欢迎的。
-
mysql单机
1):进入mysql功能目录
cd /usr/local/mysqltools/deploy/ansible
cd mysql #进入mysql功能目录
2):指定install_single_mysql.yaml中的目标主机
假设我要在host_132主机上安装mysql那么install_single_mysql.yaml文件中的hosts变量应该设置为host_132
---
- hosts: host_132
yaml格式对空间是非常敏感的、注意“:”后面是有个空格的
3):执行自动化安装
ansible-playbook install_single_mysql.yaml
输出省略 … …
4):验证mysql是否成功安装
mysql -uroot -pmtls0352
输出如下
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.21-log MySQL Community Server (GPL)
Copyright (c) 2000, 2018, 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>
root用户的密码是在mysqltools/config.yaml文件中的mysql_root_password配置项指定的、你可以根据你的要求定制
-
mysql主从复制
假设我们要在10.186.19.15,10.186.19.16,10.186.19.17三台主机上建设一个一主两从的主从复制环境,其中10.186.19.15为主库
1):增加主机信息到/etc/ansible/hosts
向/etc/ansible/hosts文件中增加如下内容
[repl]
replmaster15 ansible_host=10.186.19.15
replslave16 ansible_host=10.186.19.16
replslave17 ansible_host=10.186.19.17
2):进入mysql功能目录
cd /usr/local/mysqltools/deploy/ansible
cd mysql #进入mysql功能目录
3):指定install_master_slaves.yaml中的目标主机
假设我要在repl主机组上安装mysql复制环境那么install_master_slaves.yaml文件中的hosts变量应该设置为repl
---
- hosts: repl
修改vars/master_slaves.yaml 告诉mysqltools那个ip是主那些ip是slave
#在创建一主多从环境时会用到的变量
master_ip: 10.186.19.15
slave_ips:
- 10.186.19.16
- 10.186.19.17
4):执行自动化安装
ansible-playbook install_master_slaves.yaml
输出如下
PLAY [repl] *****************************************************************************************
TASK [Gathering Facts] ******************************************************************************
ok: [replmaster15]
ok: [replslave16]
ok: [replslave17]
... ... ... ... ... ... 省略 ... ... ... ... ... ...
PLAY RECAP ******************************************************************************************
replmaster15 : ok=28 changed=18 unreachable=0 failed=0
replslave16 : ok=28 changed=19 unreachable=0 failed=0
replslave17 : ok=28 changed=19 unreachable=0 failed=0
5):检查主从复制环境是否配置完成
mysql -uroot -pmtls0352
show slave status \G
输出如下
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.186.19.15
Master_User: rple
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 595
Relay_Log_File: actionsky16-relay-bin.000002
Relay_Log_Pos: 800
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
... ... ... ... ... ... ... ...
Retrieved_Gtid_Set: 8b5ac555-37ec-11e8-b50e-5a3fdb1cf647:1-2
Executed_Gtid_Set: 8b5ac555-37ec-11e8-b50e-5a3fdb1cf647:1-2
Auto_Position: 1
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
两个Yes 说明说明主从复制环境成功配置了
-
mysql多源复制
假设我们要在10.186.19.15,10.186.19.16,10.186.19.17这三台机器上搭建两主1从的多源复制环境、其中15,16两机器上的数据向17同步
1):增加主机信息到/etc/ansible/hosts
向/etc/ansible/hosts文件中增加如下内容
[repl]
replmaster15 ansible_host=10.186.19.15
replslave16 ansible_host=10.186.19.16
replslave17 ansible_host=10.186.19.17
2):进入mysql功能目录
cd /usr/local/mysqltools/deploy/ansible
cd mysql #进入mysql功能目录
3):指定install_multi_source_replication.yaml中的目标主机
假设我要在repl主机组上安装mysql复制环境那么install_multi_source_replication.yaml文件中的hosts变量应该设置为repl
---
- hosts: repl
修改vars/multi_source_replication.yaml 告诉mysqltools那些ip是主那个ip是slave
#master_ips 定义多个master主机ip组成的列表
master_ips:
- '10.186.19.15'
- '10.186.19.16'
#定义slave的ip
slave_ip: '10.186.19.17'
4):执行自动化安装
ansible-playbook install_multi_source_replication.yaml
输出省略
5):检测多源复制环境是否安装成功
mysql -uroot -pmtls0352
show slave status \G
输出如下
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.186.19.15
Master_User: rple_user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 150
Relay_Log_File: actionsky17-relay-bin-master1.000002
Relay_Log_Pos: 355
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
*************************** 2. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.186.19.16
Master_User: rple_user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 150
Relay_Log_File: actionsky17-relay-bin-master2.000002
Relay_Log_Pos: 355
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
两个通道都是双Yes、多源监制环境成了哦!
-
mysql组复制
假设我们要在10.186.19.15,10.186.19.16,10.186.19.17这三台机器上搭建一个group replication 环境
1):增加主机信息到/etc/ansible/hosts
向/etc/ansible/hosts文件中增加如下内容
[repl]
mgr15 ansible_host=10.186.19.15
mgr16 ansible_host=10.186.19.16
mgr17 ansible_host=10.186.19.17
2):进入mysql功能目录
cd /usr/local/mysqltools/deploy/ansible
cd mysql #进入mysql功能目录
3):指定install_group_replication.yaml中的目标主机
假设我要在repl主机组上安装mysql复制环境那么install_group_replication.yaml文件中的hosts变量应该设置为repl
---
- hosts: repl
修改var/group_replication.yaml.yaml 告诉mysqltools那些主机要参与到group replication中、组中成员之前通信的端口是多少、binlog的格式设置成row、开启group replication 复制的开关,这样的话mysqltools就会在生成配置文件的时候写入group replication相关的配置
mtls_with_mysql_group_replication: 1
mysql_binlog_format: row
mysql_mgr_port: 13306
mysql_mgr_hosts:
- '10.186.19.15'
- '10.186.19.16'
- '10.186.19.17'
4):执行自动化安装
ansible-playbook install_group_replication.yaml
输出如下
PLAY [repl] *****************************************************************************************
TASK [Gathering Facts] ******************************************************************************
ok: [mgr15]
ok: [mgr16]
ok: [mgr17]
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
PLAY RECAP ******************************************************************************************
mgr15 : ok=28 changed=19 unreachable=0 failed=0
mgr16 : ok=28 changed=18 unreachable=0 failed=0
mgr17 : ok=28 changed=18 unreachable=0 failed=0
5):检查group replication集群是否安装成功
mysql -uroot -pmtls0352
select * from performance_schema.replication_group_members ;
输出如下
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 08de362c-3802-11e8-9e65-5a3fdb1cf647 | actionsky15 | 3306 | ONLINE |
| group_replication_applier | ef7f3b61-3801-11e8-886d-9a17854b700d | actionsky17 | 3306 | ONLINE |
| group_replication_applier | f1649143-3801-11e8-8fd3-5a1f0f06c50d | actionsky16 | 3306 | ONLINE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
3 rows in set (0.00 sec)
三个都是online说明group replication 配置成功了哦
当mtls_with_mysql_group_replication: 1这个开头打开后mysqltools会自动为/etc/my.cnf增加了group replication 相关的配置项
####: for mysql group replication
loose-group_replication_recovery_retry_count =10 # 10
loose-group_replication_recovery_reconnect_interval =60 # 60
loose-group_replication_allow_local_disjoint_gtids_join=off # off
loose-group_replication_allow_local_lower_version_join=off # off
loose-group_replication_ip_whitelist =AUTOMATIC # AUTOMATIC
loose-transaction_write_set_extraction =XXHASH64 # off
loose-group_replication_group_name ="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" #
loose-group_replication_start_on_boot =off # off
loose-group_replication_bootstrap_group =off # off
loose-group_replication_single_primary_mode =on # on
loose-group_replication_enforce_update_everywhere_checks=off
loose-group_replication_gtid_assignment_block_size =1000000 # 1000000
loose-group_replication_poll_spin_loops =0 # 0
loose-group_replication_compression_threshold =1024 # 1000000
loose-group_replication_flow_control_mode =QUOTA # QUOTA
loose-group_replication_local_address ="10.186.19.15:13306"
loose-group_replication_group_seeds ="10.186.19.15:13306,10.186.19.16:13306,10.186.19.17:13306"
也就是说目前mysqltools在配置group replication 集群环境时是按单个写结点的方式配置的、默认mysqltools把第一个ip地址设置为写结点
-
mysql小版本升级
mysqltools为版本升级提供了支持,如果你想使用这个功能,那么你要清楚的知道自己在干什么
1、小版本升级并不会去执行mysql_upgrade脚本,这个主要是由于mysqltools诞生环境比较特别,单个实例的数据量是以TB来衡量的,在这种量级的情况下mysql_upgrade可以能执行几天才能完成,所以你懂的
1):修改upgrad_single_mysql.yaml文件的hosts 变量为你要升级的目标主机
---
- hosts: sqlstudio
2):执行升级程序
ansible-playbook upgrad_single_mysql.yaml
输出如下:
PLAY [sqlstudio] **************************************************************************************************************
TASK [Gathering Facts] ********************************************************************************************************
ok: [sqlstudio]
TASK [stop mysql service] *****************************************************************************************************
ok: [sqlstudio]
TASK [backup link file] *******************************************************************************************************
changed: [sqlstudio]
TASK [unarchive new package to /usr/local/] ***********************************************************************************
changed: [sqlstudio]
TASK [change owner and group] *************************************************************************************************
changed: [sqlstudio]
TASK [make new link file] *****************************************************************************************************
changed: [sqlstudio]
TASK [start mysql service] ****************************************************************************************************
changed: [sqlstudio]
PLAY RECAP ********************************************************************************************************************
sqlstudio : ok=7 changed=5 unreachable=0 failed=0
3):查看升级是否成功
1、看/usr/local/下的变化
升级前
drwxr-xr-x 9 mysql mysql 129 6月 18 14:46 mysql-5.7.21-linux-glibc2.12-x86_64
lrwxrwxrwx 1 root root 35 6月 18 14:53 mysql -> mysql-5.7.21-linux-glibc2.12-x86_64
升级后
lrwxrwxrwx 1 mysql mysql 46 6月 18 15:30 mysql -> /usr/local/mysql-5.7.22-linux-glibc2.12-x86_64
drwxr-xr-x 9 mysql mysql 129 6月 18 14:46 mysql-5.7.21-linux-glibc2.12-x86_64
drwxr-xr-x 9 mysql mysql 129 6月 18 15:30 mysql-5.7.22-linux-glibc2.12-x86_64
lrwxrwxrwx 1 root root 35 6月 18 14:53 mysql.backup.20180618 -> mysql-5.7.21-linux-glibc2.12-x86_64
2、连接进数据库进行检察
mysql -uroot -pxxxxxx
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.22-log MySQL Community Server (GPL)
Copyright (c) 2000, 2018, 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 @@version;
+------------+
| @@version |
+------------+
| 5.7.22-log |
+------------+
1 row in set (0.00 sec)
-
mycat读写分离
假设我们已经有了套三结点的集群10.186.19.15,10.186.19.16,10.186.19.17,其中15支持读写,16、17只读;为了方面应用程序我们要在10.186.19.14上安装一个mycat用它做读写分离,这样应用只要配置一个连接字符串就可以了(连接mycat)
1):在数据库中创建用户、mycat会有这个用户连接数据库
用户名、密码引用自mysqltools/config.yaml中的mysql_app_user、mysql_app_password
在读写库上执行如下代码
create user appuser@'%' identified by 'mtls0352';
create database appdb char set utf8;
grant all on appdb.* to appuser@'%';
2):向/etc/ansible/hosts文件增加主机信息
向/etc/ansible/hosts文件增加如下内容
mycat ansible_host=10.186.19.14
3):更新var/var_mycat.yaml文件
告诉mysqltools那个主机是读写库(master_ip),哪些库是只读库(slave_ips),导出后端哪些schema(schemas)
master_ip: "10.186.19.15"
slave_ips:
- "10.186.19.16"
- "10.186.19.17"
schemas:
- "appdb"
可以把master_ip设置为vip、slave_ips设置为所有ip的一个列表,这样就可以不在意高可用环境下的主从切换了
4):修改install_mycat.yaml文件中的hosts
---
- hosts: mycat
5):执行mycat的安装
ansible-playbook install_mycat.yaml
输出如下
PLAY [mycat] ****************************************************************************************
TASK [Gathering Facts] ******************************************************************************
ok: [mycat]
TASK [install java-1.7.0-openjdk] *******************************************************************
changed: [mycat]
TASK [create mycat user] ****************************************************************************
changed: [mycat]
TASK [trasfer mycat-server-1.6.5-linux.tar.gz to remonte host] **************************************
changed: [mycat]
TASK [export MYCAT_HOME env to /etc/profile] ********************************************************
changed: [mycat]
TASK [config schema.xml] ****************************************************************************
changed: [mycat]
TASK [config server.xml] ****************************************************************************
changed: [mycat]
TASK [transfer start_mycat.sh to remonte /tmp/] *****************************************************
changed: [mycat]
TASK [start mycat] **********************************************************************************
changed: [mycat]
TASK [remove start_mycat.sh] ************************************************************************
changed: [mycat]
PLAY RECAP ******************************************************************************************
mycat : ok=10 changed=9 unreachable=0 failed=0
6):检查mycat是否启动
ps -ef | grep mycat
输出如下
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
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
7):测试mycat的可用性
mysql -uappuser -pmtls0352 -h10.186.19.14 -P8066
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 1
Server version: 5.7.200-mycat-1.6.5-release-20171117203123 MyCat Server (OpenCloundDB)
Copyright (c) 2000, 2018, 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> show databases;
+----------+
| DATABASE |
+----------+
| appdb |
+----------+
2 rows in set (0.00 sec)
create table person( id int auto_increment primary key,name varchar
评论