首頁 資料庫 mysql教程 ProxySQL讀寫分離從配置到使用

ProxySQL讀寫分離從配置到使用

Jul 21, 2017 am 09:55 AM
分離 讀寫

在美團點評DBProxy讀寫分離使用說明文章中已經說明了使用目的,本文介紹ProxySQL的使用方法以及和DBProxy的效能差異。具體的介紹可以看官網的相關說明,而這個中間件也是percona推的一款中間件。其特性和其他讀寫分離的中間件差距不大,具體的會在文中介紹。本文大致簡單的介紹在使用過程中的一些說明,也可以看官方的wiki獲得使用幫助。

環境: 

Distributor ID:    Ubuntu
Description:    Ubuntu 14.04.5 LTS
Release:   14.04#codename: 
percona網站:

https://www.percona.com/downloads/proxysql/

github/官網:


https://github .com/sysown/proxysql/releases



#我們先來看看自己的環境:

MHA已經建置:

master:172.16.16.35:3306slave:172.16.16.35:3307slave:172.16.16.34:3307
登入後複製
MHA manager在172.16.16.34,設定檔如下:

#

[root@localhost bin]# cat /etc/masterha/app1.cnf
[server default]
manager_log=/var/log/mha/app1/manager.log
manager_workdir=/var/log/mha/app1.log
master_binlog_dir=/home/mysql/db3306/log/master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
password=123456ping_interval=1remote_workdir=/tmp
repl_password=123456repl_user=root
report_script=/usr/local/bin/send_report
shutdown_script=""ssh_user=root
user=root
[server1]
hostname=172.16.16.35port=3306[server2]
candidate_master=1check_repl_delay=0hostname=172.16.16.34port=3306[server3]
hostname=172.16.16.35port=3307
登入後複製
 
下面我們基於這樣一套MHA環境建構讀寫分離。

1:安裝ProxySQL軟體,這個我們部署到172.16.16.34上
[root@localhost bin]# sudo yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm[root@localhost bin]# yum install proxysql
登入後複製
 
#最後有以下提示:

Installed:
proxysql.x86_64 0:1.3.7-1.1.el6
Complete!
登入後複製
 
#也就是安裝完成了。然後查一下具體的檔案:

[root@localhost bin]# find / -name proxysql/var/lib/proxysql/var/run/proxysql/etc/rc.d/init.d/proxysql/usr/bin/proxysql
登入後複製
 
#發現確實已經將ProxySQL安裝成功了

2 :啟動設定ProxySQL
看一下設定檔:
[root@localhost bin]# cat /etc/proxysql-admin.cnf
# proxysql admin interface credentials.
export PROXYSQL_USERNAME="admin"export PROXYSQL_PASSWORD="admin"export PROXYSQL_HOSTNAME="localhost"export PROXYSQL_PORT="6032"
 # PXC admin credentials for connecting to pxc-cluster-node.
export CLUSTER_USERNAME="admin"export CLUSTER_PASSWORD="admin"export CLUSTER_HOSTNAME="localhost"export CLUSTER_PORT="3306"
 # proxysql monitoring user. proxysql admin script will create this user in pxc to monitor pxc-nodes.
export MONITOR_USERNAME="monitor"export MONITOR_PASSWORD="monit0r"
 # Application user to connect to pxc-node through proxysql
export CLUSTER_APP_USERNAME="proxysql_user"export CLUSTER_APP_PASSWORD="passw0rd"
 # ProxySQL read/write hostgroup
export WRITE_HOSTGROUP_ID="10"export READ_HOSTGROUP_ID="11"
 # ProxySQL read/write configuration mode.
export MODE="singlewrite"
登入後複製
 
啟動:

#
[root@localhost bin]# proxysql-admin --config-file=/etc/proxysql-admin.cnf --enable
This script will assist with configuring ProxySQL (currently only Percona XtraDB cluster in combination with ProxySQL is supported)
ProxySQL read/write configuration mode is singlewrite
ProxySQL is not running; please start the proxysql service
登入後複製
 
現在來說ProxySQL 的路由已經啟動,提示我們要啟動proxysql service

[root@localhost bin]# service proxy
proxy proxysql proxysql-admin proxysql_galera_checker proxysql_node_monitor
[root@localhost bin]# service proxysql start
Starting ProxySQL: DONE![root@localhost bin]# mysql -uadmin -padmin -h127.0.0.1 -P6032
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1Server version: 5.7.14 (ProxySQL Admin Module)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
登入後複製
 
可以看到我們已經登入成功了,這裡要說明的是proxysql的預設設定檔是在:

[root@localhost bin]# find / -name proxysql.cnf/etc/proxysql.cnf
登入後複製
 
接下來我們開始設定ProxySQL:

[root@localhost bin]# mysql -uadmin -padmin -h127.0.0.1 -P6032
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2Server version: 5.7.14 (ProxySQL Admin Module)
 
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql> show databases;+-----+---------+-------------------------------+
| seq | name | file |
+-----+---------+-------------------------------+
| 0 | main | |
| 2 | disk | /var/lib/proxysql/proxysql.db |
| 3 | stats | |
| 4 | monitor | |
+-----+---------+-------------------------------+4 rows in set (0.00 sec)
 
mysql> use admin
Database changed
mysql> show tables;+--------------------------------------+
| tables |
+--------------------------------------+
| global_variables |
| mysql_collations |
| mysql_query_rules |
| mysql_replication_hostgroups |
| mysql_servers |
| mysql_users |
| runtime_global_variables |
| runtime_mysql_query_rules |
| runtime_mysql_replication_hostgroups |
| runtime_mysql_servers |
| runtime_mysql_users |
| runtime_scheduler |
| scheduler |
+--------------------------------------+13 rows in set (0.00 sec)
登入後複製
下面加入主從訊息:

mysql> insert into mysql_servers(hostgroup_id,hostname,port,weight,max_connections,max_replication_lag,comment) values(100,'172.16.16.35',3306,1,1000,10,'test');
Query OK, 1 row affected (0.00 sec)
mysql> insert into mysql_servers(hostgroup_id,hostname,port,weight,max_connections,max_replication_lag,comment) values(101,'172.16.16.34',3306,1,1000,10,'test');
Query OK, 1 row affected (0.00 sec)
mysql> insert into mysql_servers(hostgroup_id,hostname,port,weight,max_connections,max_replication_lag,comment) values(101,'172.16.16.35',3307,1,1000,10,'test');
Query OK, 1 row affected (0.00 sec)
mysql> select * from mysql_servers;+--------------+--------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| hostgroup_id | hostname | port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment |
+--------------+--------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| 100 | 172.16.16.35 | 3306 | ONLINE | 1 | 0 | 1000 | 10 | 0 | 0 | test |
| 101 | 172.16.16.34 | 3306 | ONLINE | 1 | 0 | 1000 | 10 | 0 | 0 | test |
| 101 | 172.16.16.35 | 3307 | ONLINE | 1 | 0 | 1000 | 10 | 0 | 0 | test |
+--------------+--------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+3 rows in set (0.00 sec)
登入後複製
 
然後加入讀寫映射(主要是MHA後端切換的時候保證ProxySQL也能夠自動切換):

#
mysql> insert into mysql_replication_hostgroups values(100,101,'masterha') ;
Query OK, 1 row affected (0.00 sec)
mysql> select * from mysql_replication_hostgroups;+------------------+------------------+----------+
| writer_hostgroup | reader_hostgroup | comment |
+------------------+------------------+----------+
| 100 | 101 | masterha |
+------------------+------------------+----------+1 row in set (0.00 sec)
登入後複製
 
為ProxySQL新增監控帳號:

mysql> GRANT SUPER, REPLICATION CLIENT ON *.* TO 'proxysql'@'172.16.16.%' IDENTIFIED BY 'proxysql';
Query OK, 0 rows affected, 1 warning (0.09 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.10 sec)
登入後複製
 
#設定監控帳號(在proxySQL當中進行設定):

##
mysql> set mysql-monitor_username='proxysql';
Query OK, 1 row affected (0.00 sec)
mysql> set mysql-monitor_password='proxysql';
Query OK, 1 row affected (0.00 sec)
mysql> load mysql variables to runtime;
Query OK, 0 rows affected (0.00 sec)
mysql> save mysql variables to disk;
Query OK, 74 rows affected (0.02 sec)
登入後複製
 
PS:有時候runtime_mysql_servers的status不為ONLINE狀態的話可以透過查看monitor.mysql_server_ping_log這個表來查看具體的報錯資訊。

mysql> select * from monitor.mysql_server_ping_log;
然後配置程式帳號,簡單點統一使用root:123456最高權限來設定:
mysql> insert into mysql_users(username,password,active,default_hostgroup,transaction_persistent) values('root','123456',1,100,1);
Query OK, 1 row affected (0.00 sec)
mysql> select * from mysql_users;+----------+----------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+
| username | password | active | use_ssl | default_hostgroup | default_schema | schema_locked | transaction_persistent | fast_forward | backend | frontend | max_connections |
+----------+----------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+
| root | 123456 | 1 | 0 | 100 | NULL | 0 | 1 | 0 | 1 | 1 | 10000 |
+----------+----------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+1 row in set (0.00 sec)
登入後複製
 
設定完成以後開始重新載入並儲存我們的設定:

##

mysql> load mysql servers to runtime;
Query OK, 0 rows affected (0.01 sec)
mysql> save mysql servers to disk;
Query OK, 0 rows affected (0.08 sec)
mysql> load mysql users to runtime;
Query OK, 0 rows affected (0.00 sec)
mysql> save mysql users to disk;
Query OK, 0 rows affected (0.03 sec)
登入後複製
#接下來開始設定路由規則:

mysql> INSERT INTO mysql_query_rules(active,match_pattern,destination_hostgroup,apply) VALUES(1,'^SELECT.*FOR UPDATE$',100,1);
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO mysql_query_rules(active,match_pattern,destination_hostgroup,apply) VALUES(1,'^SELECT',101,1);
Query OK, 1 row affected (0.00 sec)
mysql> LOAD MYSQL QUERY RULES TO RUNTIME;
Query OK, 0 rows affected (0.00 sec)
mysql> SAVE MYSQL QUERY RULES TO DISK;
Query OK, 0 rows affected (0.04 sec)
登入後複製
至此設定已經完成了

3:測試讀寫分離

在172.16.16.35上連結proxySQL埠6033,並且做簡單的select操作:
#
[root@localhost ~]# mysql -uroot -p123456 -h172.16.16.34 -P6033
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 22Server version: 5.7.14 (ProxySQL)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> select * from maxiangqian.test;+-----+------+
| id | name |
+-----+------+
| 1 | qq |
| 2 | qq |
| 4 | aa |
| 11 | a |
| 111 | a |
+-----+------+5 rows in set (0.04 sec)
登入後複製
 
然後在進行查詢看一下:

mysql> select * from stats_mysql_query_digest;
登入後複製
登入後複製
可以看到已經完成了讀寫分離了。

mysql> select @@server_id;+-------------+
| @@server_id |
+-------------+
| 353307 |
+-------------+1 row in set (0.01 sec)
登入後複製
 
看server ID已經路由到了172.16.16.35:3307這個從庫上了。
測一下for update:

mysql> select * from maxiangqian.test for update;+-----+------+
| id | name |
+-----+------+
| 1 | qq |
| 2 | qq |
| 4 | aa |
| 11 | a |
| 111 | a |
+-----+------+5 rows in set (0.00 sec)
登入後複製
再查看
##
mysql> select * from stats_mysql_query_digest;
登入後複製
登入後複製

已經自動路由到了主庫。
至此ProxySQL+MySQL MHA讀寫分離測試完成。 。 。未完待續

5:關於ProxySQL的思考以及簡單的指令
#
ProxySQL透過以上方式是可以實現讀寫分離,但是這種方式真的就沒有問題了嗎,如果是一些比如查詢訂單狀態的這種要求實時性非常高的SQL的話,似乎被路由到了從庫就會出現BUG。我們可以選擇在程式端控制這些參數,ProxySQL只作為一個負載平衡來使用,為ProxySQL建立多個帳號,一個讀寫,一個只讀。然後程式去實作讀寫分離。
ProxySQL是分三層設計運行的,分別為RUNTIME ,MEMORY ,DISK :
RUNTIME 代表的是ProxySQL目前生效的配置,包括 global_variables, mysql_servers, mysql_users, mysql_query_rules。無法直接修改這裡的配置,必須從下一層load進來。
MEMORY 是平時在mysql命令列修改的main 裡頭配置,可以認為是SQLite資料庫在記憶體的鏡像
DISK / CONFIG FILE 持久儲存的那份配置,一般在$(DATADIR )/proxysql.db,在重啟的時候會從硬碟載入。 /etc/proxysql.cnf檔案只在第一次初始化的時候用到,完了後,如果要修改監聽端口,還是需要在管理命令行裡修改,再save 到硬碟
常用命令:
LOAD MYSQL SERVERS TO RUNTIME -- 讓修改後的配置生效,也就是從MEMORY 把參數LOAD過來,等價於LOAD MYSQL USERS FROM MEMORY,這個語句的語法比較單間,FROM代表從上層LOAD過來, TO代表從本層到某層。例如前面我們設定了MySQL的監控帳號,但還是要執行LOAD和SAVE儲存變數並且讓變數生效。

 

以上是ProxySQL讀寫分離從配置到使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何使用Java 9中的模組系統來分離和隔離程式碼 如何使用Java 9中的模組系統來分離和隔離程式碼 Jul 30, 2023 pm 07:46 PM

如何使用Java9中的模組系統來分離和隔離程式碼隨著軟體規模不斷擴大,程式碼的複雜度也不斷增加。為了更好地組織和管理程式碼,Java9引入了模組系統。模組系統的出現解決了傳統的包依賴的問題,使得程式碼的分離和隔離更加容易和靈活。本文將介紹如何使用Java9中的模組系統來實現程式碼的分離和隔離。一、模組的定義在Java9中,我們可以使用module關鍵字來定義

如何使用 PHP 實現資料快取和讀寫功能 如何使用 PHP 實現資料快取和讀寫功能 Sep 05, 2023 pm 05:45 PM

如何使用PHP實現資料快取和讀寫功能快取是提高系統效能的重要方式,透過快取可以將頻繁使用的資料儲存在記憶體中,以提高資料的讀取速度。在PHP中,我們可以使用各種方法來實現資料快取和讀寫功能。本文將介紹兩種常用的方法:使用檔案快取和使用記憶體快取。一、使用檔案快取檔案快取是將資料儲存在檔案中,以便後續讀取。下面是一個使用檔案快取實現資料讀寫的範例程式碼:

Golang前後端分離開發中前端技術選擇建議。 Golang前後端分離開發中前端技術選擇建議。 Mar 05, 2024 pm 12:12 PM

標題:Golang前後端分離開發中前端技術選擇建議隨著Web應用程式的複雜性和需求不斷增加,前後端分離開發模式變得越來越流行。在這種開發模式下,後端負責處理業務邏輯,前端負責展示頁面和與使用者交互,兩者透過API進行通訊。對於使用Golang作為後端語言的開發團隊來說,選擇合適的前端技術至關重要。本文將探討在Golang前後端分離開發中,建議選擇的前端技術,並

實戰:Linux上硬碟io讀寫測試 實戰:Linux上硬碟io讀寫測試 Feb 19, 2024 pm 03:40 PM

概念fio,又稱為FlexibleIOTester,是JensAxboe編寫的應用程式。 Jens是LinuxKernel中blockIOsubsystem的維護者。 FIO是一種用於測試網路檔案系統和磁碟效能的工具,常用於驗證機型和比較檔案系統效能。它能自動將fio指令傳送到群集機器列表,並收集小檔案的IOPS和大檔案的吞吐量資料。 rw=[mode]rwmixwrite=30在混合讀寫的模式下,寫佔30%moderead順序讀write順序寫readwrite順序混合讀寫randwrite隨機寫r

揭秘 Java 檔案操作的內部原理 揭秘 Java 檔案操作的內部原理 Feb 28, 2024 am 08:22 AM

檔案系統APIJava檔案操作的內部原理與作業系統的檔案系統api密切相關。在Java中,檔案操作是由java.NIO套件中的java.nio.file模組提供的。本模組提供了檔案系統API的封裝,使Java開發者能夠在不同的作業系統上使用統一的API進行檔案操作。檔案物件當Java程式需要存取檔案時,它首先需要建立一個java.nio.file.Path物件。 Path物件代表了檔案系統中的一個路徑,可以是絕對路徑也可以是相對路徑。一旦建立了Path對象,就可以使用它來取得文件的各種屬性,例如名稱

解密Java中處理DBF檔案的讀取和寫入方法 解密Java中處理DBF檔案的讀取和寫入方法 Mar 29, 2024 pm 12:39 PM

解密Java中處理DBF檔案的讀取和寫入方法DBF(dBASEFile)是一種常見的資料庫檔案格式,通常用於儲存表格資料。在Java程式中,處理DBF檔案的讀取和寫入是一個比較常見的需求。本文將介紹如何使用Java解密此過程,並提供具體的程式碼範例。一、讀取DBF檔案在Java中,讀取DBF檔案通常需要藉助第三方函式庫,例如使用dbfread函式庫。首先需要在項目

PHP開發者必備:MySQL讀寫分離實作方法詳解 PHP開發者必備:MySQL讀寫分離實作方法詳解 Mar 04, 2024 pm 04:36 PM

PHP開發者是在網站開發過程中,經常會面對資料庫操作的情況,而MySQL作為非常流行的資料庫管理系統,其讀寫分離是提高網站效能的重要手段之一。在PHP開發中,實現MySQL讀寫分離可以大幅提升網站的並發存取能力和使用者體驗。本文將詳細介紹MySQL讀寫分離的實作方法,並提供具體的PHP程式碼範例,幫助PHP開發者更能理解並應用讀寫分離功能。什麼是MySQL讀

如何透過靜態資源分離提升Java網站的存取速度? 如何透過靜態資源分離提升Java網站的存取速度? Aug 04, 2023 pm 03:21 PM

如何透過靜態資源分離提升Java網站的存取速度?隨著互聯網的快速發展,越來越多的人使用網站來獲取資訊和交流。對於一個Java網站來說,存取速度是至關重要的,它直接影響使用者體驗和網站的成功與否。其中,靜態資源的載入速度是影響網站造訪速度的重要因素之一。本文將介紹如何透過靜態資源分離來提升Java網站的存取速度。什麼是靜態資源首先,我們需要先明確什麼是靜態資

See all articles