共计 15085 个字符,预计需要花费 38 分钟才能阅读完成。
1 MySQL-MMM 架构部署
1.1 问题
本案例要求熟悉实现 MySQL-MMM 的架构部署,主要包括以下任务:
- 安装依赖包
- 安装软件包
- 配置 MySQL-MMM
1.2 方案
使用 5 台 RHEL 6 虚拟机,如图 - 2 所示。其中 192.168.4.10、192.168.4.11 作为 MySQL 双主服务器,192.168.4.12、192.168.4.13 作为主服务器的从服务器,192.168.4.100 作为 MySQL-MMM 架构中管理监控服务器,实现监控 MySQL 主从服务器的工作状态及决定故障节点的移除或恢复工作,架构搭建完成后使用客户机 192.168.4.120 进行访问,客户机需要安装 MySQL-client 软件包。
图 -2
1.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:安装 MySQL-MMM
1)安装依赖关系(MySQL 集群内 5 台服务器 master1,master2,slave1,slave2,monitor)均需安装
[root@master1 ~]# yum -y install gcc* perl-Date-Manip perl-Date-Manip perl-Date-Manip perl-XML-DOM-XPath perl-XML-Parser perl-XML-RegExp rrdtool perl-Class-Singleton perl perl-DBD-MySQL perl-Params-Validate perl-MailTools perl-Time-HiRes
.. ..
2)安装 MySQL-MMM 软件依赖包(MySQL 集群内 5 台服务器 master1,master2,slave1,slave2,monitor)均需安装,软件包讲师提供
安装安装 Log-Log4perl 类
[root@mysql-master1 ~]# rpm -ivh perl-Log-Log4perl-1.26-1.el6.rf.noarch.rpm
warning: perl-Log-Log4perl-1.26-1.el6.rf.noarch.rpm: Header V3 DSA/SHA1 Signature, key ID 6b8d79e6: NOKEY
Preparing… ######################### [100%]
1:perl-Log-Log4perl ######################## [100%]
安装 Algorithm-Diff 类
[root@mysql-master1 ~]# tar -zxvf Algorithm-Diff-1.1902.tar.gz // 解压安装包
.. ..
[root@mysql-master1 ~]# cd Algorithm-Diff-1.1902 // 切换到安装目录
[root@mysql-master1 Algorithm-Diff-1.1902]# perl Makefile.PL // 生成 makefile 文件
Checking if your kit is complete…
Looks good
Writing Makefile for Algorithm::Diff
[root@mysql-master1 Algorithm-Diff-1.1902]# make && make install // 编译,编译安装
.. ..
[root@mysql-master1 Algorithm-Diff-1.1902]# cd // 切换到软件包目录
[root@mysql-master1 ~]#
安装 Proc-Daemon 类
[root@mysql-master1 ~]# tar -zxvf Proc-Daemon-0.03.tar.gz // 解压安装包
.. ..
[root@mysql-master1 ~]# cd Proc-Daemon-0.03 // 切换到安装目录
[root@mysql-master1 Proc-Daemon-0.03]# perl Makefile.PL // 生成 makefile 文件
Checking if your kit is complete…
Looks good
Writing Makefile for Proc::Daemon
[root@mysql-master1 Proc-Daemon-0.03]# make && make install // 编译,编译安装
.. ..
[root@mysql-master1 Proc-Daemon-0.03]# cd // 切换到软件包目录
[root@mysql-master1 ~]#
安装 Net-ARP 虚拟 IP 分配工具:
[root@mysql-master1 ~]# gunzip Net-ARP-1.0.8.tgz // 使用 gunzip 解压 tgz 格式的安装包
[root@mysql-master1 ~]# tar xvf Net-ARP-1.0.8.tar // 解压 tar 安装包
.. ..
[root@mysql-master1 ~]# cd Net-ARP-1.0.8 // 切换到安装目录
[root@mysql-master1 Net-ARP-1.0.8]# perl Makefile.PL // 生成 makefile 文件
Module Net::Pcap is required for make test!
Checking if your kit is complete…
Looks good
Writing Makefile for Net::ARP
[root@mysql-master1 Net-ARP-1.0.8]# make && make install // 编译,编译安装
.. ..
[root@mysql-master1 Net-ARP-1.0.8]# cd // 切换到软件包目录
[root@mysql-master1 ~]#
安装 Mysql-MMM 软件包:
[root@mysql-master1 ~]# tar xvf mysql-mmm-2.2.1.tar.gz // 解压安装包
.. ..
[root@mysql-master1 ~]# cd mysql-mmm-2.2.1 // 切换到安装目录
[root@mysql-master1 mysql-mmm-2.2.1]# make && make install // 编译,编译安装
.. ..
[root@mysql-master1 mysql-mmm-2.2.1]#
步骤二:修改配置文件
1)修改公共配置文件
本案例中 MySQL 集群的 5 台服务器(master1、master2、slave1、slave2、monitor)都需要配置,可以先配好一台后使用 scp 复制。
[root@master1 ~]# vim /etc/mysql-mmm/mmm_common.conf
active_master_role writer
<host default>
cluster_interface eth0 // 设置主从同步的用户
pid_path /var/run/mmm_agentd.pid
bin_path /usr/lib/mysql-mmm/
replication_user slaveuser // 设置主从同步的用户
replication_password pwd123 // 设置主从同步用户密码
agent_user agent //mmm-agent 控制数据库用户
agent_password agent //mmm-agent 控制数据库用户密码
</host>
<host master1> // 设置第一个主服务器
ip 192.168.4.10 //master1 IP 地址
mode master
peer master2 // 指定另外一台主服务器
</host>
<host master2> // 指定另外一台主服务器
ip 192.168.4.11
mode master
peer master1
</host>
<host slave1> // 设置第一台从服务器
ip 192.168.4.12 //slave1 IP 地址
mode slave // 本段落配置的是 slave 服务器
</host>
<host slave2>
ip 192.168.4.13
mode slave
</host>
<role writer> // 设置写入服务器工作模式
hosts master1,master2 // 提供写的主服务器
ips 192.168.4.200 // 设置 VIP 地址
mode exclusive // 排他模式
</role>
<role reader> // 设置读取服务器工作模式
hosts slave1,slave2 // 提供读的服务器信息
ips 192.168.4.201,192.168.4.202 // 多个虚拟 IP
mode balanced // 均衡模式
</role>
[root@master1 ~]#
2)修改管理主机配置文件(monitor 主机配置)
[root@monitor ~]# vim /etc/mysql-mmm/mmm_mon.conf
include mmm_common.conf
<monitor>
ip 192.168.4.100 // 设置管理主机 IP 地址
pid_path /var/run/mmm_mond.pid
bin_path /usr/lib/mysql-mmm/
status_path /var/lib/misc/mmm_mond.status
ping_ips 192.168.4.10,192.168.4.11,192.168.4.12,192.168.4.13
// 设置被监控数据库
</monitor>
<host default>
monitor_user monitor // 监控数据库 MySQL 用户 monitor_password monitor // 监控数据库 MySQL 用户密码
</host>
debug 0
[root@monitor ~]#
3)修改客户端配置文件
master1 配置
[root@master1 ~]# cat /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this master1
master2 配置
[root@master2 ~]# cat /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this master2
slave1 配置
[root@slave1 ~]# cat /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this slave1
slave2 配置
[root@slave2 ~]# cat /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this slave2
2 MySQL-MMM 架构使用
2.1 问题
本案例要求��于普通版的 MySQL 服务器改造 MMM 架构,完成以下任务操作:
启动 MMM 集群架构
设置集群中服务器为 online 状态
2.2 方案
MySQL-MMM 架构部署完成后需要启动,数据库端启动 mmm-agent 进程,管理端启动 mmm-monitor 进程,启动完成后设置所有数据库主机状态为 online。
2.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:启动 MMM 集群架构
1)启动 mmm-agent 进程
master1 操作:
[root@master1 ~]# /etc/init.d/mysql-mmm-agent start
Daemon bin: ‘/usr/sbin/mmm_agentd’
Daemon pid: ‘/var/run/mmm_agentd.pid’
Starting MMM Agent daemon… Ok
master2 操作:
[root@master2 ~]# /etc/init.d/mysql-mmm-agent start
Daemon bin: ‘/usr/sbin/mmm_agentd’
Daemon pid: ‘/var/run/mmm_agentd.pid’
Starting MMM Agent daemon… Ok
slave1 操作:
[root@master2 ~]# /etc/init.d/mysql-mmm-agent start
Daemon bin: ‘/usr/sbin/mmm_agentd’
Daemon pid: ‘/var/run/mmm_agentd.pid’
Starting MMM Agent daemon… Ok
slave2 操作:
[root@slave2 ~]# /etc/init.d/mysql-mmm-agent start
Daemon bin: ‘/usr/sbin/mmm_agentd’
Daemon pid: ‘/var/run/mmm_agentd.pid’
Starting MMM Agent daemon… Ok
2)启动 mmm-monitor 进程
monitor 主机操作:
[root@monitor ~]# /etc/init.d/mysql-mmm-monitor start
Daemon bin: ‘/usr/sbin/mmm_mond’
Daemon pid: ‘/var/run/mmm_mond.pid’
Starting MMM Monitor daemon: Ok
步骤二:设置集群中服务器为 online 状态
控制命令只能在管理端 monitor 服务器上执行。
查看当前集群中各服务器状态:
[root@monitor ~]# mmm_control show
master1(192.168.4.10) master/AWAITING_RECOVERY. Roles:
master2(192.168.4.11) master/AWAITING_RECOVERY. Roles:
slave1(192.168.4.12) slave/AWAITING_RECOVERY. Roles:
slave2(192.168.4.13) slave/AWAITING_RECOVERY. Roles:
设置 4 台数据库主机状态为 online:
[root@monitor ~]# mmm_control set_online master1
OK: State of ‘master1’ changed to ONLINE. Now you can wait some time and check its new roles!
[root@monitor ~]# mmm_control set_online master2
OK: State of ‘master2’ changed to ONLINE. Now you can wait some time and check its new roles!
[root@monitor ~]# mmm_control set_online slave1
OK: State of ‘slave1’ changed to ONLINE. Now you can wait some time and check its new roles!
[root@monitor ~]# mmm_control set_online slave2
OK: State of ‘slave2’ changed to ONLINE. Now you can wait some time and check its new roles!
[root@monitor ~]#
再次查看当前集群中各服务器状态:
[root@monitor ~]# mmm_control show
master1(192.168.4.10) master/ONLINE. Roles: writer(192.168.4.200)
master2(192.168.4.11) master/ONLINE. Roles:
slave1(192.168.4.12) slave/ONLINE. Roles: reader(192.168.4.201)
slave2(192.168.4.13) slave/ONLINE. Roles: reader(192.168.4.202)
[root@monitor ~]#
步骤三:测试 MySQL-MMM 架构
1)客户机安装 MySQL-client 软件包
[root@client ~]# tar xvf MySQL-5.6.15-1.el6.x86_64.rpm-bundle.tar
.. ..
[root@client ~]# rpm -ivh MySQL-client-5.6.15-1.el6.x86_64.rpm
.. ..
2)MySQL-MMM 虚拟 IP 访问测试
[root@client ~]# mysql -h192.168.4.200 -uroot -ppwd123 -e “show databases”
Warning: Using a password on the command line interface can be insecure.
+——————–+
| Database |
+——————–+
| information_schema |
| mysql |
| performance_schema |
| tarena |
| test |
+——————–+
[root@client ~]#
[root@client ~]# mysql -h192.168.4.200 -uroot -ppwd123 -e “show databases”
Warning: Using a password on the command line interface can be insecure.
+——————–+
| Database |
+——————–+
| information_schema |
| mysql |
| performance_schema |
| tarena |
| test |
+——————–+
[root@client ~]#
[root@client ~]# mysql -h192.168.4.202 -uroot -ppwd123 -e “show databases”
Warning: Using a password on the command line interface can be insecure.
+——————–+
| Database |
+——————–+
| information_schema |
| mysql |
| performance_schema |
| tarena |
| test |
+——————–+
[root@client ~]#
3)主数据库宕机测试
[root@master1 ~]# service mysql stop // 停止 master1 上服务
Shutting down MySQL…. [确定]
[root@master1 ~]#
[root@monitor ~]# mmm_control show // 查看集群内服务器状态
通过输出信息可以看到虚拟 IP 从 master1 切换到 master2:
master1(192.168.4.10) master/HARD_OFFLINE. Roles:
master2(192.168.4.11) master/ONLINE. Roles: writer(192.168.4.200)
slave1(192.168.4.12) slave/ONLINE. Roles: reader(192.168.4.201)
slave2(192.168.4.13) slave/ONLINE. Roles: reader(192.168.4.202)
[root@monitor ~]#
[root@client ~]# mysql -h192.168.4.200 -uroot -ppwd123 -e “show databases” // 访问虚拟 IP 测试
Warning: Using a password on the command line interface can be insecure.
+——————–+
| Database |
+——————–+
| information_schema |
| mysql |
| performance_schema |
| tarena |
| test |
+——————–+
[root@client ~]#
3 MySQL 性能调优
3.1 问题
基于一台普通版的 MySQL 服务器,执行下列操作:
练习 my.cnf 配置相关选项
启用慢查询日志
查看各种系统变量、状态变量
3.2 步骤
实现此案例需要按照如下步骤进行。
步骤一:MySQL 并发及连接控制
max_connections 对应并发客户端连接的数量,增加该值会增加 mysqld 要求的文件描述符的数量。若这个数值太小,可能会经常出现“too many connections”错误。比如 默认的数值是 151,可以将其改为 1024。
1)查看当前已建立的连接数
mysql> FLUSH STATUS;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW GLOBAL STATUS LIKE ‘max_used_connections’;
+———————-+——-+
| Variable_name | Value |
+———————-+——-+
| Max_used_connections | 5 |
+———————-+——-+
1 row in set (0.05 sec)
2)查看当前的最大连接数限制
mysql> SHOW VARIABLES LIKE ‘max_connections’;
+—————–+——-+
| Variable_name | Value |
+—————–+——-+
| max_connections | 151 |
+—————–+——-+
1 row in set (0.00 sec)
步骤二:MySQL 缓存参数控制
当 Key_reads / Key_read_requests 较低时,可适当加大 key_buffer_size 的缓存值,以提高性能。而增大 sort_buffer_size 的值,可以显著提高 ORDER 和 GROUP 的响应速度。
1)查看 key_read 相关数值
mysql> SHOW GLOBAL STATUS LIKE ‘key_read%’;
+——————-+——-+
| Variable_name | Value |
+——————-+——-+
| Key_read_requests | 0 |
| Key_reads | 0 |
+——————-+——-+
2 rows in set (0.00 sec)
2)查看当前的 key_buffer_size 缓存大小
mysql> SHOW VARIABLES LIKE ‘key_buffer_size’;
+—————–+———+
| Variable_name | Value |
+—————–+———+
| key_buffer_size | 8388608 |
+—————–+———+
1 row in set (0.03 sec)
3)查看当前的 sort_buffer_size 大小
mysql> SHOW VARIABLES LIKE ‘sort_buffer_size’;
+——————+——–+
| Variable_name | Value |
+——————+——–+
| sort_buffer_size | 262144 |
+——————+——–+
1 row in set (0.00 sec)
4)查看检索表记录时的读取缓存大小
缓存值 read_buffer_size 和 read_rnd_buffer_size 会影响 SQL 查询的响应速度:
mysql> SHOW VARIABLES LIKE ‘read_%_size’;
+———————-+——–+
| Variable_name | Value |
+———————-+——–+
| read_buffer_size | 131072 |
| read_rnd_buffer_size | 262144 |
+———————-+——–+
2 rows in set (0.00 sec)
步骤三:MySQL 线程重用和开表控制
分析“已打开表的数量 / 当前可缓存表的数量”,比值不超过 95% 就基本正常。
1)查看当前已打开、一共打开过多少个表
mysql> SHOW GLOBAL STATUS LIKE ‘open%tables’;
+—————+——-+
| Variable_name | Value |
+—————+——-+
| Open_tables | 23 |
| Opened_tables | 72 |
+—————+——-+
2 rows in set (0.01 sec)
2)查看当前可缓存多少个打开的表
mysql> SHOW VARIABLES LIKE ‘table_open_cache’;
+——————+——-+
| Variable_name | Value |
+——————+——-+
| table_open_cache | 2000 |
+——————+——-+
1 row in set (0.00 sec)
步骤四:MySQL 调整示例:记录慢查询
1)调整 my.cnf 配置文件,启用慢查询
[root@dbsvr1 ~]# vim /etc/my.cnf
[mysqld]
.. ..
slow_query_log=1 // 启用慢查询
slow_query_log_file=mysql-slow.log // 制定慢查询日志文件
long_query_time=5 // 查询耗时超过 5 秒才记录
log_queries_not_using_indexes=1 // 记录未使用索引的查询
[root@dbsvr1 ~]# service mysql restart
Shutting down MySQL….. [确定]
Starting MySQL…. [确定]
2)查看慢查询日志(mysqldumpslow 工具)
[root@dbsvr1 ~]# mysqldumpslow /var/lib/mysql/mysql-slow.log
Reading mysql slow query log from /var/lib/mysql/mysql-slow.log
Count: 1 Time=0.00s (0s) Lock=0.00s (0s) Rows=0.0 (0), 0users@0hosts
.. ..
3)了解与查询相关的缓存选项
查看当前的查询缓存大小:
mysql> SHOW VARIABLES LIKE ‘query_cache%’;
+——————————+———+
| Variable_name | Value |
+——————————+———+
| query_cache_limit | 1048576 | // 超过此大小则不再缓存
| query_cache_min_res_unit | 4096 |
| query_cache_size | 1048576 | // 缓存空间的大小
| query_cache_type | OFF |
| query_cache_wlock_invalidate | OFF |
+——————————+———+
5 rows in set (0.00 sec)
查看当前的查询缓存统计数据:
mysql> SHOW GLOBAL STATUS LIKE ‘qcache%’;
+————————-+———+
| Variable_name | Value |
+————————-+———+
| Qcache_free_blocks | 1 |
| Qcache_free_memory | 1031368 | // 缓存中的空闲内存
| Qcache_hits | 0 |
| Qcache_inserts | 0 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 100 | // 不适合缓存的数量
| Qcache_queries_in_cache | 0 |
| Qcache_total_blocks | 1 |
+————————-+———+
8 rows in set (0.00 sec)
步骤五:关于 MySQL 状态和相关变量的查看
1)查看服务器的相关状态值(运行中动态变化)
使用 SHOW GLOBAL STATUS 语句,可结合 LIKE 条件做模糊过滤。
默认有 400 多个状态值:
mysql> SHOW GLOBAL STATUS\G
*************************** 1. row ***************************
Variable_name: Aborted_clients
Value: 0
*************************** 2. row ***************************
Variable_name: Aborted_connects
Value: 0
*************************** 3. row ***************************
Variable_name: Binlog_cache_disk_use
Value: 0
*************************** 4. row ***************************
Variable_name: Binlog_cache_use
Value: 0
*************************** 5. row ***************************
Variable_name: Binlog_stmt_cache_disk_use
Value: 0
.. .. // 省略中间的大量状态值
.. ..
*************************** 435. row ***************************
Variable_name: Threads_connected
Value: 1
*************************** 436. row ***************************
Variable_name: Threads_created
Value: 1
*************************** 437. row ***************************
Variable_name: Threads_running
Value: 1
*************************** 438. row ***************************
Variable_name: Uptime
Value: 5322
*************************** 439. row ***************************
Variable_name: Uptime_since_flush_status
Value: 2283
439 rows in set (0.00 sec)
2)查看服务器的运行选项(一般为静态限制,可通过 my.cnf 文件配置,或 SET 修改)
使用 SHOW VARIABLES 语句,也可结合 LIKE 条件做模糊过滤。
默认也有 400 多个(接近 500 个)配置选项:
mysql> SHOW VARIABLES\G
*************************** 1. row ***************************
Variable_name: auto_increment_increment
Value: 1
*************************** 2. row ***************************
Variable_name: auto_increment_offset
Value: 1
*************************** 3. row ***************************
Variable_name: autocommit
Value: ON
*************************** 4. row ***************************
Variable_name: automatic_sp_privileges
Value: ON
*************************** 5. row ***************************
Variable_name: back_log
Value: 80
.. .. // 省略中间的大量状态值
.. ..
*************************** 486. row ***************************
Variable_name: version_comment
Value: MySQL Cluster Community Server (GPL)
*************************** 487. row ***************************
Variable_name: version_compile_machine
Value: x86_64
*************************** 488. row ***************************
Variable_name: version_compile_os
Value: Linux
*************************** 489. row ***************************
Variable_name: wait_timeout
Value: 28800
*************************** 490. row ***************************
Variable_name: warning_count
Value: 0
490 rows in set (0.01 sec)
: