本實驗使用一主一從一代理,三臺設備,具體步驟以下:
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並不識別而是調度到主服務器上,因此可以查詢到
經過上述測試,咱們實現了主從複製的讀寫分離功能