实现MySQL读写分离,MySQL性能调优

实现MySQL读写分离

1.1 问题

本案例要求配置2台MySQL服务器+1台代理服务器,实现MySQL代理的读写分离:

  • 用户只需要访问MySQL代理服务器,而实际的SQL查询、写入操作交给后台的2台MySQL服务器来完成
  • 其中Master服务器允许SQL查询、写入,Slave服务器只允许SQL查询

1.2 方案

使用4台RHEL 7.2虚拟机,如图-1所示。其中192.168.4.10、192.168.4.20分别作为MySQL主、从服务器,是整个服务的后端;另一台 192.168.4.100作为MySQL代理服务器,是直接面向客户的服务前端;客户机192.168.4.120用作访问测试。

图-1

对比两种方式的读写分离效果——

  • MySQL主从复制:客户机访问Master服务器来写数据库,客户机访问Slave服务器来读数据库。这种情况下,需要客户端自行区分向何处写、从何处读。
  • MySQL主从复制+代理:客户机访问Proxy服务器,读、写请求交给Proxy识别,如果是写数据库操作则交给 Master,如果是读数据库操作则交给Slave处理,具体由分配策略控制。这种情况下,无需客户端区分读、写目标,而是由Proxy服务器代劳了,从 而降低了客户端程序的复杂度。

其中MySQL主、从复制结构的搭建参考前面的课程,这里不再赘述。

1.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:部署mysql-proxy代理服务器

1)安装mariadb官方提供的maxscale软件包

  1. [[email protected] ~]# rpm -ivh maxscale-2.1.2-1.rhel.7.x86_64.rpm

修改配置文件:

  1. [[email protected] pub]# [[email protected] ~]# grep -E -v ‘^#‘ /etc/maxscale.cnf
  2. [maxscale]
  3. threads=1
  4. [server1] #指定ip地址对应的名字
  5. type=server
  6. address=192.168.4.10 #主数据库服务器ip地址
  7. port=3306
  8. protocol=MySQLBackend
  9. [server2] #指定ip地址对应的名字
  10. type=server
  11. address=192.168.4.20 #从数据库服务器ip地址
  12. port=3306
  13. protocol=MySQLBackend
  14. [MySQL Monitor] #指定要监控的主机 和监控时连接的用户
  15. type=monitor
  16. module=mysqlmon
  17. servers=server1, server2 #前边定义的主机名
  18. user=scalemon # 用户名
  19. passwd=111111 # 密码
  20. monitor_interval=10000
  21. #[Read-Only Service]
  22. #type=service
  23. #router=readconnroute
  24. #servers=server1
  25. #user=myuser
  26. #passwd=mypwd
  27. #router_options=slave
  28. [Read-Write Service] #定义服务器列表
  29. type=service
  30. router=readwritesplit
  31. servers=server1, server2 #前边定义的主机名
  32. user=maxscale # 用户名
  33. passwd=111111 # 密码
  34. max_slave_connections=100%
  35. [MaxAdmin Service]
  36. type=service
  37. router=cli
  38. #[Read-Only Listener]
  39. #type=listener
  40. #service=Read-Only Service
  41. #protocol=MySQLClient
  42. #port=4008
  43. [Read-Write Listener]
  44. type=listener
  45. service=Read-Write Service
  46. protocol=MySQLClient
  47. port=4006
  48. [MaxAdmin Listener]
  49. type=listener
  50. service=MaxAdmin Service
  51. protocol=maxscaled
  52. socket=default
  53. [[email protected] ~]#

分别在主、从数据库服务器上添加授权用户(只在主服务器授权即可 从服务器会自动同步):

  1. [[email protected] pub]# mysql> grant replication slave, replication client on *.* to [email protected]‘%‘ identified by “111111”; //创建监控用户
  2. mysql> grant select on mysql.* to [email protected]‘%‘ identified by “111111”; //创建路由用户
  3. mysql> grant all on *.* to [email protected]‘%‘ identified by “111111”;
  4. //创建客户端访问用户

2)启动maxscale服务

  1. [[email protected] ~]# maxscale --config=/etc/maxscale.cnf
  2. [[email protected] ~]# netstat -utnalp | grep maxscale
  3. tcp 0 0 192.168.4.100:58960 192.168.4.10:3306 ESTABLISHED 19081/maxscale
  4. tcp 0 0 192.168.4.100:43508 192.168.4.20:3306 ESTABLISHED 19081/maxscale
  5. tcp6 0 0 :::4006 :::* LISTEN 19081/maxscale
  6. [[email protected] ~]# kill -9 19081        //通过杀进程的方式停止服务

步骤二:测试配置

1)在客户端192.168.4.120上使用上边授权用户student 连接代理服务器192.168.4.100:

  1. [[email protected] ~]# mysql -h192.168.4.100 -P4006 -ustudent -p111111
  2. MySQL [(none)]> select @@hostname; //显示当前访问的主机
  3. +----------------+
  4. | @@hostname |
  5. +----------------+
  6. | slave20 | //显示的是从服务器的主机名
  7. +----------------+
  8. Query OK, 0 rows affected (0.00 sec)
  9. MySQL [(none)]> insert into bbsdb.a values(111);//插入新纪录

客户端当前访问的是从数据库服务器,仍然能够插入纪录。表示成功。

2 MySQL性能调优

2.1 问题

基于一台普通版的MySQL服务器,执行下列操作:

  • 练习my.cnf配置相关选项
  • 启用慢查询日志
  • 查看各种系统变量、状态变量

2.2 步骤

实现此案例需要按照如下步骤进行。

步骤一:MySQL并发及连接控制

max_connections对应并发客户端连接的数量,增加该值会增加 mysqld 要求的文件描述符的数量。若这个数值太小,可能会经常出现“too many connections”错误。比如 默认的数值是151,可以将其改为1024。

1)查看当前已建立的连接数

  1. mysql> FLUSH STATUS;
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> SHOW GLOBAL STATUS LIKE ‘max_used_connections‘;
  4. +----------------------+-------+
  5. | Variable_name | Value |
  6. +----------------------+-------+
  7. | Max_used_connections | 5 |
  8. +----------------------+-------+
  9. 1 row in set (0.05 sec)

2)查看当前的最大连接数限制

  1. mysql> SHOW VARIABLES LIKE ‘max_connections‘;
  2. +-----------------+-------+
  3. | Variable_name | Value |
  4. +-----------------+-------+
  5. | max_connections | 151 |
  6. +-----------------+-------+
  7. 1 row in set (0.00 sec)

步骤二:MySQL缓存参数控制

当 Key_reads / Key_read_requests 较低时,可适当加大key_buffer_size的缓存值,以提高性能。而增大sort_buffer_size的值,可以显著提高ORDER和GROUP的响应速度。

1)查看key_read相关数值

  1. mysql> SHOW GLOBAL STATUS LIKE ‘key_read%‘;
  2. +-------------------+-------+
  3. | Variable_name | Value |
  4. +-------------------+-------+
  5. | Key_read_requests | 0 |
  6. | Key_reads | 0 |
  7. +-------------------+-------+
  8. 2 rows in set (0.00 sec)

2)查看当前的key_buffer_size缓存大小

  1. mysql> SHOW VARIABLES LIKE ‘key_buffer_size‘;
  2. +-----------------+---------+
  3. | Variable_name | Value |
  4. +-----------------+---------+
  5. | key_buffer_size | 8388608 |
  6. +-----------------+---------+
  7. 1 row in set (0.03 sec)

3)查看当前的sort_buffer_size大小

  1. mysql> SHOW VARIABLES LIKE ‘sort_buffer_size‘;
  2. +------------------+--------+
  3. | Variable_name | Value |
  4. +------------------+--------+
  5. | sort_buffer_size | 262144 |
  6. +------------------+--------+
  7. 1 row in set (0.00 sec)

4)查看检索表记录时的读取缓存大小

缓存值read_buffer_size和read_rnd_buffer_size会影响SQL查询的响应速度:

  1. mysql> SHOW VARIABLES LIKE ‘read_%_size‘;
  2. +----------------------+--------+
  3. | Variable_name | Value |
  4. +----------------------+--------+
  5. | read_buffer_size | 131072 |
  6. | read_rnd_buffer_size | 262144 |
  7. +----------------------+--------+
  8. 2 rows in set (0.00 sec)

步骤三:MySQL线程重用和开表控制

分析“已打开表的数量/当前可缓存表的数量”,比值不超过95%就基本正常。

1)查看当前已打开、一共打开过多少个表

  1. mysql> SHOW GLOBAL STATUS LIKE ‘open%tables‘;
  2. +---------------+-------+
  3. | Variable_name | Value |
  4. +---------------+-------+
  5. | Open_tables | 23 |
  6. | Opened_tables | 72 |
  7. +---------------+-------+
  8. 2 rows in set (0.01 sec)

2)查看当前可缓存多少个打开的表

  1. mysql> SHOW VARIABLES LIKE ‘table_open_cache‘;
  2. +------------------+-------+
  3. | Variable_name | Value |
  4. +------------------+-------+
  5. | table_open_cache | 2000 |
  6. +------------------+-------+
  7. 1 row in set (0.00 sec)

步骤四:MySQL调整示例:记录慢查询

1)调整my.cnf配置文件,启用慢查询

  1. [[email protected] ~]# vim /etc/my.cnf
  2. [mysqld]
  3. .. ..
  4. slow_query_log=1                             //启用慢查询
  5. slow_query_log_file=mysql-slow.log         //制定慢查询日志文件
  6. long_query_time=5                             //查询耗时超过5秒才记录
  7. log_queries_not_using_indexes=1             //记录未使用索引的查询
  8. [[email protected] ~]# service mysql restart
  9. Shutting down MySQL..... [确定]
  10. Starting MySQL.... [确定]

2)查看慢查询日志(mysqldumpslow工具)

  1. [[email protected] ~]# mysqldumpslow /var/lib/mysql/mysql-slow.log
  2. Reading mysql slow query log from /var/lib/mysql/mysql-slow.log
  3. Count: 1 Time=0.00s (0s) Lock=0.00s (0s) Rows=0.0 (0), [email protected]
  4. .. ..

3)了解与查询相关的缓存选项

查看当前的查询缓存大小:

  1. mysql> SHOW VARIABLES LIKE ‘query_cache%‘;
  2. +------------------------------+---------+
  3. | Variable_name | Value |
  4. +------------------------------+---------+
  5. | query_cache_limit | 1048576 |         //超过此大小则不再缓存
  6. | query_cache_min_res_unit | 4096 |
  7. | query_cache_size | 1048576 |         //缓存空间的大小
  8. | query_cache_type | OFF |
  9. | query_cache_wlock_invalidate | OFF |
  10. +------------------------------+---------+
  11. 5 rows in set (0.00 sec)

查看当前的查询缓存统计数据:

  1. mysql> SHOW GLOBAL STATUS LIKE ‘qcache%‘;
  2. +-------------------------+---------+
  3. | Variable_name | Value |
  4. +-------------------------+---------+
  5. | Qcache_free_blocks | 1 |
  6. | Qcache_free_memory | 1031368 |             //缓存中的空闲内存
  7. | Qcache_hits | 0 |
  8. | Qcache_inserts | 0 |
  9. | Qcache_lowmem_prunes | 0 |
  10. | Qcache_not_cached | 100 |             //不适合缓存的数量
  11. | Qcache_queries_in_cache | 0 |
  12. | Qcache_total_blocks | 1 |
  13. +-------------------------+---------+
  14. 8 rows in set (0.00 sec)

步骤五:关于MySQL状态和相关变量的查看

1)查看服务器的相关状态值(运行中动态变化)

使用SHOW GLOBAL STATUS语句,可结合LIKE条件做模糊过滤。

默认有400多个状态值:

  1. mysql> SHOW GLOBAL STATUS\G
  2. *************************** 1. row ***************************
  3. Variable_name: Aborted_clients
  4. Value: 0
  5. *************************** 2. row ***************************
  6. Variable_name: Aborted_connects
  7. Value: 0
  8. *************************** 3. row ***************************
  9. Variable_name: Binlog_cache_disk_use
  10. Value: 0
  11. *************************** 4. row ***************************
  12. Variable_name: Binlog_cache_use
  13. Value: 0
  14. *************************** 5. row ***************************
  15. Variable_name: Binlog_stmt_cache_disk_use
  16. Value: 0
  17. .. ..                                             //省略中间的大量状态值
  18. .. ..
  19. *************************** 435. row ***************************
  20. Variable_name: Threads_connected
  21. Value: 1
  22. *************************** 436. row ***************************
  23. Variable_name: Threads_created
  24. Value: 1
  25. *************************** 437. row ***************************
  26. Variable_name: Threads_running
  27. Value: 1
  28. *************************** 438. row ***************************
  29. Variable_name: Uptime
  30. Value: 5322
  31. *************************** 439. row ***************************
  32. Variable_name: Uptime_since_flush_status
  33. Value: 2283
  34. 439 rows in set (0.00 sec)

2)查看服务器的运行选项(一般为静态限制,可通过my.cnf文件配置,或SET修改)

使用SHOW VARIABLES语句,也可结合LIKE条件做模糊过滤。

默认也有400多个(接近500个)配置选项:

  1. mysql> SHOW VARIABLES\G
  2. *************************** 1. row ***************************
  3. Variable_name: auto_increment_increment
  4. Value: 1
  5. *************************** 2. row ***************************
  6. Variable_name: auto_increment_offset
  7. Value: 1
  8. *************************** 3. row ***************************
  9. Variable_name: autocommit
  10. Value: ON
  11. *************************** 4. row ***************************
  12. Variable_name: automatic_sp_privileges
  13. Value: ON
  14. *************************** 5. row ***************************
  15. Variable_name: back_log
  16. Value: 80
  17. .. ..                                             //省略中间的大量状态值
  18. .. ..
  19. *************************** 486. row ***************************
  20. Variable_name: version_comment
  21. Value: MySQL Cluster Community Server (GPL)
  22. *************************** 487. row ***************************
  23. Variable_name: version_compile_machine
  24. Value: x86_64
  25. *************************** 488. row ***************************
  26. Variable_name: version_compile_os
  27. Value: Linux
  28. *************************** 489. row ***************************
  29. Variable_name: wait_timeout
  30. Value: 28800
  31. *************************** 490. row ***************************
  32. Variable_name: warning_count
  33. Value: 0
  34. 490 rows in set (0.01 sec)

原文地址:https://www.cnblogs.com/xiaoren112/p/8318712.html

时间: 2024-08-08 17:53:24

实现MySQL读写分离,MySQL性能调优的相关文章

Mysql千万级数据性能调优配置

背景: 笔者的源数据一张表大概7000多万条,数据大小36G,索引6G,加起来表空间有40G+,类似的表有4张,总计2亿多条 数据库mysql,引擎为innodb,版本5.7,服务器内存256G,物理内存几个T,硬件参数杠杠的,然而处理这些数据踩了不少坑,因 为之前没做过这方面的工作,现在记录下清洗的过程,详细的业务清洗过程和规则均记录在https://gitee.com/yanb618/zhirong/wikis 感受: 清洗从表名,字段名,字段类型,字段值,索引创建与删除做起,每每看到那秒数

Mysql读写分离-Mysql router

原理:MySQL router根据端口来区分读写,把连接读写端口的所有请求发往master,连接只读端口的所有请求以轮询方式发往多个slave,从而实现读写分离 主:   SQL-Master      192.168.200.101/24 从:   SQL-Slave      192.168.200.102/24,192.168.200.103/24 mysql-router 192.168.200.104/24 使用rpm安装mysql-router rpm -ivh https://de

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作为MyS

主从同步、读写分离、mysql性能调优(软优化)

配置mysql主从同步1 主从同步的作用:让slave身份的数据库服务器自动同步 master身份的数据库服务器上的数据. 一.主数据库服务器的配置192.168.4.121 用户授权mysql> grant replication slave on *.* to [email protected]"192.168.4.11" identified by "123456";2 启用binlog日志vim /etc/my.cnf[mysqld]server_id

29_MySQL读写分离 MySQL多实例 、MySQL性能调优

版本:5.7.28 mysql51:192.168.4.51 主mysql52:192.168.4.52 从mysql50:192.168.4.50 客户机 1.实现MySQL读写分离搭建一主一从结构配置maxscale代理服务器测试分离配置 1.1 搭建一主一从结构192.168.4.51 主192.168.4.52 从测试OK 1.2 实现mysql读写分离1.2.1 配置数据读写分离服务器:192.168.4.50]# wget https://downloads.mariadb.com/

全栈必备——MySQL性能调优

对于全栈而言,数据库技能不可或缺,关系型数据库或者nosql,内存型数据库或者偏磁盘存储的数据库,对象存储的数据库或者图数据库--林林总总,但是第一必备技能还应该是MySQL.从LAMP的兴起,到Mariadb的出现,甚至PG的到来,熟练的MySQL技能都是大有用武之地的. MySQL数据库技术的方方面面也是很多,这里只涉及必备的性能调优,推崇从下向上的性能调优,主要包括运行环境,配置参数,SQL性能,和系统架构设计调优. 运行环境调优 这里是Linux的天下,MySQL 运行环境的调优往往和L

MySQL性能调优与架构设计——第 17 章 高可用设计之思路及方案

第 17 章 高可用设计之思路及方案 前言: 数据库系统是一个应用系统的核心部分,要想系统整体可用性得到保证,数据库系统就不能出现任何问题.对于一个企业级的系统来说,数据库系统的可用性尤为重要.数据库系统一旦出现问题无法提供服务,所有系统都可能无法继续工作,而不像软件中部分系统出现问题可能影响的仅仅只是某个功能无法继续服务.所以,一个成功的数据库架构在高可用设计方面也是需要充分考虑的.本章内容将针对如何构建一个高可用的 MySQL 数据库系统来介绍各种解决方案以及方案之间的比较. 17.1 利用

MySQL性能调优与架构设计——第 14 章 可扩展性设计之数据切分

第 14 章 可扩展性设计之数据切分 前言 通过 MySQL Replication 功能所实现的扩展总是会受到数据库大小的限制,一旦数据库过于庞大,尤其是当写入过于频繁,很难由一台主机支撑的时候,我们还是会面临到扩展瓶颈.这时候,我们就必须许找其他技术手段来解决这个瓶颈,那就是我们这一章所要介绍恶的数据切分技术. 14.1 何谓数据切分 可能很多读者朋友在网上或者杂志上面都已经多次见到关于数据切分的相关文章了,只不过在有些文章中称之为数据的 Sharding.其实不管是称之为数据的 Shard

MySQL基础普及《MySQL管理之道:性能调优、高可用与监控》

最近工作的内容涉及MySQL运维内容,陆陆续续读了几本相关的书,其中一本是<MySQL管理之道:性能调优.高可用与监控>. 内容涵盖性能调优(包括sql优化等).备份.高可用,以及读写分离等,对于普及MySQL基础非常有用.记录一下,以便于后面查阅. 附目录: 1章 MariaDB架构与历史1 1.1 MariaDB的介绍 1 1.2 MariaDB和MySQL的兼容性 2 1.3 MariaDB 10.0新增的功能 3 1.3.1 更多的存储引擎 4 1.3.2 速度的提升 5 1.3.3