實現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.十、192.168.4.20分別做爲MySQL主、從服務器,是整個服務的後端;另外一臺 192.168.4.100做爲MySQL代理服務器,是直接面向客戶的服務前端;客戶機192.168.4.120用做訪問測試。mysql

圖-1sql

對比兩種方式的讀寫分離效果——數據庫

  • MySQL主從複製:客戶機訪問Master服務器來寫數據庫,客戶機訪問Slave服務器來讀數據庫。這種狀況下,須要客戶端自行區分向何處寫、從何處讀。
  • MySQL主從複製+代理:客戶機訪問Proxy服務器,讀、寫請求交給Proxy識別,若是是寫數據庫操做則交給 Master,若是是讀數據庫操做則交給Slave處理,具體由分配策略控制。這種狀況下,無需客戶端區分讀、寫目標,而是由Proxy服務器代勞了,從 而下降了客戶端程序的複雜度。

其中MySQL主、從複製結構的搭建參考前面的課程,這裏再也不贅述。vim

1.3 步驟

實現此案例須要按照以下步驟進行。後端

步驟一:部署mysql-proxy代理服務器緩存

1)安裝mariadb官方提供的maxscale軟件包服務器

  1. [root@bogon ~]# rpm -ivh maxscale-2.1.2-1.rhel.7.x86_64.rpm

修改配置文件:併發

  1. [root@pxysvr pub]# [root@bogon ~]# 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. [root@bogon ~]#

分別在主、從數據庫服務器上添加受權用戶(只在主服務器受權便可 從服務器會自動同步):socket

  1. [root@pxysvr pub]# mysql> grant replication slave, replication client on *.* to scalemon@'%' identified by 「111111」; //建立監控用戶
  2. mysql> grant select on mysql.* to maxscale@'%' identified by 「111111」; //建立路由用戶
  3. mysql> grant all on *.* to student@'%' identified by 「111111」;
  4. //建立客戶端訪問用戶    

2)啓動maxscale服務

  1. [root@bogon ~]# maxscale --config=/etc/maxscale.cnf
  2. [root@bogon ~]# 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. [root@bogon ~]# kill -9 19081        //經過殺進程的方式中止服務

步驟二:測試配置

1)在客戶端192.168.4.120上使用上邊受權用戶student 鏈接代理服務器192.168.4.100:

  1. [root@bogon ~]# 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. [root@dbsvr1 ~]# 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. [root@dbsvr1 ~]# service mysql restart
  9. Shutting down MySQL..... [肯定]
  10. Starting MySQL.... [肯定]

2)查看慢查詢日誌(mysqldumpslow工具)

  1. [root@dbsvr1 ~]# 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), 0users@0hosts
  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)
相關文章
相關標籤/搜索