1. 程式人生 > >MySQL數據庫主從復制的讀寫分離--ProxySQL

MySQL數據庫主從復制的讀寫分離--ProxySQL

linux、mysql

本實驗使用一主一從一代理,三臺設備,具體步驟如下:

1、完成主從復制的配置,請參考此文http://panpangao.blog.51cto.com/10624093/1981418

2、在代理服務器上安裝proxysql軟件包 proxysql-1.4.2-1-centos7.x86_64.rpm

rpm -ql proxysql    #軟件安裝後生成的文件
/etc/init.d/proxysql
/etc/proxysql.cnf   #代理的所有配置全在此文件下修改,理解其中各個字段的含義很重要
/usr/bin/proxysql   #單獨的一個服務
/usr/share/proxysql/tools/proxysql_galera_checker.sh
/usr/share/proxysql/tools/proxysql_galera_writer.pl

3、在代理服務器上修改proxysql配置文件

vim /etc/proxysql.cnf
datadir="/var/lib/proxysql"
#代理服務器的數據目錄,此目錄下包含proxysql的日誌文件、進程文件、數據庫文件
admin_variables=
{
        admin_credentials="admin:admin"
        mysql_ifaces="127.0.0.1:6032;/tmp/proxysql_admin.sock"
}
#此配置段定義proxysql的管理信息,只有admin用戶才能管理並且只能在本機操作,監聽端口是6032,並且還監聽套接字

mysql_variables=
{
        threads=4  
        max_connections=2048  
        default_query_delay=0
        default_query_timeout=36000000
        have_compress=true
        poll_timeout=2000
        interfaces="0.0.0.0:3306;/tmp/mysql.sock"  //監聽本機所有ip地址的3306端口,同時監聽本機套接字
        default_schema="information_schema"
        stacksize=1048576
        server_version="5.5.30"
        connect_timeout_server=3000
        monitor_history=600000
        monitor_connect_interval=60000
        monitor_ping_interval=10000
        monitor_read_only_interval=1500
        monitor_read_only_timeout=500
        ping_interval_server_msec=120000
        ping_timeout_server=500
        commands_stats=true
        sessions_sort=true
        connect_retries_on_failure=10
}
#此配置段是數據的變量定義,一般保持默認值即可

mysql_servers =
(
        {
                address = "192.168.1.101" #後端主服務器地址
                port = 3306               # 後端服務器端口
                hostgroup = 0             # 主服務器所在組,與從服務器不一樣
                status = "ONLINE"         # default: ONLINE
                weight = 1                # default: 1
                compression = 0           # default: 0
        },
         
        {
                address="192.168.1.106"
                port=3306
                hostgroup=1
                status = "ONLINE"
                weight = 1
                compression = 0
        }
)
#此配置段定義後端MySQL服務器信息,每個服務器配置在一個花括號內,不同服務器花括號之間以逗號隔開

mysql_users:
(
        {
                username = "dbadmin"   # no default , required
                password = "centos"    # default: ‘‘
                default_hostgroup = 0  # default: 0,即主MySQL
                active = 1        # default: 1
        }
)
#此配置段指明訪問代理時連接數據庫的賬號信息,要提前在MySQL服務器上授權此用戶,不出就不再贅述如何授權的操作

mysql_query_rules:
(
        {
                rule_id=1
                active=1
                match_pattern="^SELECT .* FOR UPDATE$" #當查詢任何條目且以UPDATE結尾的語句,代理會將此操作交由主MySQL服務器處理
                destination_hostgroup=0
                apply=1
        },
        {
                rule_id=2
                active=1
                match_pattern="^SELECT"    #當以SELECT語句開始進行查詢操作,代理會將此操作交由從MySQL處理
                destination_hostgroup=1
                apply=1
        }
)
#此配置段指明對數據庫查詢的規則

mysql_replication_hostgroups=
(
        {
                writer_hostgroup=0
                reader_hostgroup=1
                comment="test repl 1"  #僅是提示信息而已
       }

)
#本配置段實現讀寫分離,即讀操作交給從MySQL處理,寫操作交給主MySQL處理

以上將proxysql配置完成,啟動服務

service  proxysql  start
ss -ntlp
#此時能夠看到3306端口和6032端口是打開的,3306用於連接數據庫處理數據,6032在本機進行管理數據庫
mysql -S /tmp/proxysql_admin.sock -uadmin -padmin
#此操作就可以管理數據庫

4、測試

為了直觀顯示proxysql代理到主MySQL與從MySQL的效果,我們按照下面的步驟來測試:

1)在從MySQL服務器上配置復制過濾器,詳細請參考此文http://panpangao.blog.51cto.com/10624093/1981556

SET @@global.replicate_ignore_db=mydb;
#從服務器上在執行SQL線程時就不會從中繼日誌中重放此數據庫,即從服務器上是沒有此數據庫的
#此步驟的目的就是在從服務器上執行SELECT命令時是失敗的,這樣proxysql調度就能夠看到效果

2)在主服務器上創建mydb數據庫並生成相應的表

create database mydb;  
use mydb;  
CREATE TABLE s1 (id int ,name varchar(30));
insert into s1 values(1,‘tom‘);
select * from s1;   
#創建數據庫、表,插入字段,查看表內容
#在主服務器上SELECT語句是能夠執行的

3)在客戶端測試

mysql -udbadmin -pcentos -h192.168.1.107
#此賬號密碼是proxysql的配置段‘mysql_users’定義的
MySQL [(none)]> USE mydb;
Database changed
MySQL [mydb]> SHOW TABLES;
+----------------+
| Tables_in_mydb |
+----------------+
| s1             |
+----------------+
1 row in set (0.00 sec)
#進入我們創建的數據庫中能查到s1表

MySQL [mydb]> SELECT id,name FROM s1;
ERROR 1049 (42000): Unknown database ‘mydb‘
#但是在執行SELECT查詢時卻顯示無mydb數據庫,這說明proxysql已經將請求調度到從mysql上了,而從服務器是復制過濾掉了

MySQL [mydb]> select id,name from s1;
+------+------+
| id   | name |
+------+------+
|    1 | tom  |
+------+------+
1 row in set (0.00 sec)
#但是我們將指令換成小寫就可以查看,因為配置段mysql_query_rules中定義以SELECT開頭調度到從服務器註意是大寫字母
#也就是說,當我們使用小寫的select查詢語句時proxysql並不識別而是調度到主服務器上,所以能夠查詢到

通過上述測試,我們實現了主從復制的讀寫分離功能

本文出自 “a_pan” 博客,謝絕轉載!

MySQL數據庫主從復制的讀寫分離--ProxySQL