Database基础(六):实现MySQL读写分离、MySQL性能调优
一、实现MySQL读写分离
目标:
本案例要求配置2台MySQL服务器+1台代理服务器,实现MySQL代理的读写分离:
- 用户只需要访问MySQL代理服务器,而实际的SQL查询、写入操作交给后台的2台MySQL服务器来完成
- 其中Master服务器允许SQL查询、写入,Slave服务器只允许SQL查询
方案:
使用4台RHEL 7.2虚拟机,如下图所示。其中192.168.4.10、192.168.4.20分别作为MySQL主、从服务器,是整个服务的后端;另一台 192.168.4.100作为MySQL代理服务器,是直接面向客户的服务前端;客户机192.168.4.120用作访问测试。

对比两种方式的读写分离效果——
- MySQL主从复制:客户机访问Master服务器来写数据库,客户机访问Slave服务器来读数据库。这种情况下,需要客户端自行区分向何处写、从何处读。
- MySQL主从复制+代理:客户机访问Proxy服务器,读、写请求交给Proxy识别,如果是写数据库操作则交给Master,如果是读数据库操作则交给Slave处理,具体由分配策略控制。这种情况下,无需客户端区分读、写目标,而是由Proxy服务器代劳了,从而降低了客户端程序的复杂度。
其中MySQL主、从复制结构的搭建参考前面的课程,这里不再赘述。
步骤:
步骤一:部署mysql-proxy代理服务器
1)安装mariadb官方提供的maxscale软件包
[root@bogon ~]# rpm -ivh maxscale-2.1.2-1.rhel.7.x86_64.rpm
修改配置文件:
[root@pxysvr pub]# [root@bogon ~]# grep -E -v '^#' /etc/maxscale.cnf
[maxscale]
threads=1
[server1] #指定ip地址对应的名字
type=server
address=192.168.4.10 #主数据库服务器ip地址
port=3306
protocol=MySQLBackend
[server2] #指定ip地址对应的名字
type=server
address=192.168.4.20 #从数据库服务器ip地址
port=3306
protocol=MySQLBackend
[MySQL Monitor] #指定要监控的主机 和监控时连接的用户
type=monitor
module=mysqlmon
servers=server1, server2 #前边定义的主机名
user=scalemon # 用户名
passwd=111111 # 密码
monitor_interval=10000
#[Read-Only Service]
#type=service
#router=readconnroute
#servers=server1
#user=myuser
#passwd=mypwd
#router_options=slave
[Read-Write Service] #定义服务器列表
type=service
router=readwritesplit
servers=server1, server2 #前边定义的主机名
user=maxscale # 用户名
passwd=111111 # 密码
max_slave_connections=100%
[MaxAdmin Service]
type=service
router=cli
#[Read-Only Listener]
#type=listener
#service=Read-Only Service
#protocol=MySQLClient
#port=4008
[Read-Write Listener]
type=listener
service=Read-Write Service
protocol=MySQLClient
port=4006
[MaxAdmin Listener]
type=listener
service=MaxAdmin Service
protocol=maxscaled
socket=default
[root@bogon ~]#
分别在主、从数据库服务器上添加授权用户(只在主服务器授权即可 从服务器会自动同步):
[root@pxysvr pub]# mysql> grant replication slave, replication client on *.* to scalemon@'%' identified by “111111”; //创建监控用户
mysql> grant select on mysql.* to maxscale@'%' identified by “111111”; //创建路由用户
mysql> grant all on *.* to student@'%' identified by “111111”; //创建客户端访问用户
2)启动maxscale服务
[root@bogon ~]# maxscale --config=/etc/maxscale.cnf
[root@bogon ~]# netstat -utnalp | grep maxscale
tcp 0 0 192.168.4.100:58960 192.168.4.10:3306 ESTABLISHED 19081/maxscale
tcp 0 0 192.168.4.100:43508 192.168.4.20:3306 ESTABLISHED 19081/maxscale
tcp6 0 0 :::4006 :::* LISTEN 19081/maxscale
[root@bogon ~]# kill -9 19081 //通过杀进程的方式停止服务
步骤二:测试配置
1)在客户端192.168.4.120上使用上边授权用户student 连接代理服务器192.168.4.100:
[root@bogon ~]# mysql -h192.168.4.100 -P4006 -ustudent -p111111
MySQL [(none)]> select @@hostname; //显示当前访问的主机
+----------------+
| @@hostname |
+----------------+
| slave20 | //显示的是从服务器的主机名
+----------------+
Query OK, 0 rows affected (0.00 sec)
MySQL [(none)]> insert into bbsdb.a values(111);//插入新纪录
客户端当前访问的是从数据库服务器,仍然能够插入纪录。表示成功。
二、MySQL性能调优
目标:
基于一台普通版的MySQL服务器,执行下列操作:
- 练习my.cnf配置相关选项
- 启用慢查询日志
- 查看各种系统变量、状态变量
步骤:
步骤一: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)
Database基础(六):实现MySQL读写分离、MySQL性能调优的更多相关文章
- 三十五.MySQL读写分离 MySQL多实例 、MySQL性能调优
1.实现MySQL读写分离 搭建一主一从结构 配置maxscale代理服务器 测试分离配置 1.1 搭建一主一从结构 192.168.4.51 主 192.168.4.52 从 测试OK 1. ...
- Mysql千万级数据性能调优配置
背景: 笔者的源数据一张表大概7000多万条,数据大小36G,索引6G,加起来表空间有40G+,类似的表有4张,总计2亿多条 数据库mysql,引擎为innodb,版本5.7,服务器内存256G,物理 ...
- mysql 开启日志与性能调优
#查看日期情况 #show variables like '%general%'; #开启日志 #SET GLOBAL general_log = 'On'; #指定日志文件 #SET GLOBAL ...
- mysql读写分离 主从同步
MySQL主从复制与读写分离的实现 转载 2013年01月17日 18:20:12 MySQL主从复制与读写分离 MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy) ...
- mysql读写分离实战
一个完整的MySQL读写分离环境包括以下几个部分: 应用程序client database proxy database集群 在本次实战中,应用程序client基于c3p0连接后端的database ...
- 使用Amoeba实现mysql读写分离机制
Amoeba的实用指南 http://docs.hexnova.com/amoeba/ 如何实现mysql读写分离 : 通常来说有两种方式: 1,应用程序层实现 2,中间件层实现 应用层实现 应用层实 ...
- 基于MYCAT中间件实现MYSQL读写分离
基于mycat实现mysql读写分离 完成主从复制的配置 /* 主节点:192.168.47.101 从节点:192.168.47.102 */ /*mycat为同一网段客户端*/ /* 修改主节点基 ...
- LVS+MYCAT+读写分离+MYSQL主备同步部署手册
LVS+MYCAT+读写分离+MYSQL主备同步部署手册 1 配置MYSQL主备同步…. 2 1.1 测试环境… 2 1.2 配置主数据库… 2 1.2.1 ...
- 【转载】LVS+MYCAT+读写分离+MYSQL主备同步部署手册(邢锋)
LVS+MYCAT+读写分离+MYSQL主备同步部署手册 1 配置MYSQL主备同步…. 2 1.1 测试环境… 2 1.2 配置主数据库… 2 1.2.1 ...
随机推荐
- 接触python的第2天:了解变量和打印
1变量不用定义类型, 可以直接赋值 >>> a =5 >>> a 5 >>> a='hello' >>> a 'hello' 2 ...
- web uploader 上传大文件总结
这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...
- 转载--关于FPGA设计数字信号处理电路的心得
FPGA使用的越来越广泛,除了可用于设计控制电路以为,数字信号处理电路更是FPGA的强项和难点.个人可以说才刚刚入门FPGA设计,也做过一些数字信号处理方面的电路设计,记录下个人心得体会. (一)善用 ...
- 实验1 C语言环境使用和数据类型 运算符 表达式
Part1 经过练习我发现自己经长会漏掉分号,有时输入法不同,打出来的括号前后不同,还有转义字符的使用,大小写转化之间的表达.还有打字速度比较慢. Part2 #include<stdio.h& ...
- [杂题]:C/c(二分答案)
题目传送门(内部题54) 输入格式 第一行一个整数表示$n$.第二行$n$个整数表示初始序列.(这行原题没有,是我加的)接下来$2n$行每行两个整数,分别表示$X_i,Y_i$.数据保证至少存在一种方 ...
- JS 中的offset、scroll、client总结
经常碰到offset.scroll.client这几个关键字,每次都要各种实验,这里总结一下. 两张图镇楼,随时翻阅 1. offset offset 指偏移,包括这个元素在文档中占用的所有显示宽度, ...
- 网络命令-nc(一)
一直在linux环境下编程,但却没有用过nc命令,不过最近发现Netcat这个命令-nc,发现真的蛮强大的, 为了备忘,就写了这个博客吧,不求全,只求把自己觉得很有用的命令整理出来,这篇文章估计要长期 ...
- 洛谷P4169 [Violet]天使玩偶/SJY摆棋子(CDQ分治)
[Violet]天使玩偶/SJY摆棋子 题目传送门 解题思路 用CDQ分治开了氧气跑过. 将输入给的顺序作为第一维的时间,x为第二维,y为第三维.对于距离一个询问(ax,ay),将询问分为四块,左上, ...
- Android深度探索-卷1第四章心得体会
这一章的和三章的git用法有联系,so,吧上一章的git基本用法搞好了再来,具体的方法就是看书上网查,这里就不做详细步骤介绍了.这章就有点意思了,是源码的下载和编译,有能看的,能自己鼓捣的,本章介绍的 ...
- Dijkstra的优先队列
模板 #include<iostream> #include<cstring> #include<algorithm> #include<cmath> ...