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软件包

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

修改配置文件:

[[email protected] pub]# [[email protected] ~]# 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
    [[email protected] ~]#

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

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

2)启动maxscale服务

[[email protected] ~]# maxscale --config=/etc/maxscale.cnf
    [[email protected] ~]# 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      
    [[email protected] ~]# kill -9 19081        //通过杀进程的方式停止服务

步骤二:测试配置

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

[[email protected] ~]# 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配置文件,启用慢查询

[[email protected] ~]# 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              //记录未使用索引的查询
    [[email protected] ~]# service  mysql  restart
    Shutting down MySQL.....                                   [确定]
    Starting MySQL....                                         [确定]

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

[[email protected] ~]# 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), [email protected]
    .. ..

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)

原文地址:https://www.cnblogs.com/baichuanhuihai/p/8330934.html

时间: 2024-10-11 23:24:48

Database基础(六):实现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

实现MySQL读写分离 部署集群基础环境(有图)

实现MySQL读写分离 部署集群基础环境 1 实现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主.从服务器,是整个服

Mysql读写分离(mysql-proxy)

MySQL-Proxy是一个处于你的client端和MySQL server端之间的简单程序,它可以监测.分析或改变它们的通信.它使用灵活,没有限制,常见的用途包括:负载平衡,故障.查询分析,查询过滤和修改等等. MySQL-Proxy就是这么一个中间层代理,简单的说,MySQL-Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,可以实现复杂的连接控制和过滤,从而实现读写分离和负载平衡.对于应用来说,MySQL-Proxy是完全透明的,应用则只需要连接

使用Amoeba实现mysql读写分离机制

Amoeba的实用指南 http://docs.hexnova.com/amoeba/ 如何实现mysql读写分离 : 通常来说有两种方式: 1,应用程序层实现 2,中间件层实现 应用层实现 应用层实现是指在应用程序内部及连接器中实现读写分离. 例如: com.mysql.jdbc.replicationdriver mysqlnd_ms 优点: 程序内部实现读写分离,安装即可使用 减少部署难度. 访问压力在一定级别以下,性能很好. 缺点: 架构一旦调整,代码要更这变, 不够灵活. 难以实现高级

keepalived+amoeba+mysql-mmm+mysql实现mysql读写分离及高可用

最近尝试了一下mysql的读写分离和高可用的搭建.搭好之后体验了一下,效果还不错.这里跟大家分享一下. 1.首先介绍一下mysql-mmm这个工具是干嘛使的? 众所周知,mysql自身提供了AB复制.我们也可以很轻松的实现master-master双向复制,同时再为其中的一个master节点搭建一个slave库.这样就实现了master1与master2之间的双向复制,同时master1与slave1之间主从复制这样的架构.这样整个体系中就存在两个master,正常情况下只有一个master对外

详解MySQL读写分离

主从复制的原理MySQL的主从复制和读写分离两者有着紧密的联系,首先要部署主从复制,只有主从复制完成了才能在此基础上进行数据的读写分离. 读写分离的原理简单来说,读写分离就是只在主服务器上写,只在从服务器上读.基本原理是让主数据库处理事务性查询,而从服务器处理select查询.数据库复制被用来把事务性查询导致的变更同步到从数据库中. 基于中间代理层实现:代理一般位于客户端和服务器之间,代理服务器接到客户段的请求通过判断后转发到后端数据库. 实验环境1 一台centos7作为客户端测试IP为192

MySQL读写分离(ProxySQL)

MySQL读写分离(ProxySQL) 读写分离原理 读写分离就是用户在发送请求时,请求经过中间件,中间件将请求中的读和写操作分辨出来将读请求发送给后端的从服务器,将写请求发送给后端的主服务器,再又主服务器通过主从复制将数据复制给其他从服务器 常见MySQL中间件 名称 公司 站点地址 mysql-proxy Oracle https://downloads.mysql.com/archives/proxy Atlas Qihoo https://github.com/Qihoo360/Atla

基于MYCAT中间件实现MYSQL读写分离

基于mycat实现mysql读写分离 完成主从复制的配置 /* 主节点:192.168.47.101 从节点:192.168.47.102 */ /*mycat为同一网段客户端*/ /* 修改主节点基础配置文件 */ /* */ [mysqld] server-id=101 log-bin /*重启服务 */ #systemctl restart mariadb /*创建从节点的账号 */ CREATE USER 'xie'@'192.168.47.102' IDENTIFIED BY '123