MySQL數據庫主從複製的讀寫分離--ProxySQL

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

一、完成主從複製的配置,請參考此文http://panpangao.blog.51cto.com/10624093/1981418 sql

二、在代理服務器上安裝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

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

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
#此操做就能夠管理數據庫

四、測試centos

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

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

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

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

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

3)在客戶端測試app

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並不識別而是調度到主服務器上,因此可以查詢到

經過上述測試,咱們實現了主從複製的讀寫分離功能

相關文章
相關標籤/搜索