上一篇中提到 安裝LUA及MySQL Proxy後,接下來就是RW splitting(讀寫分流)的部份了

整體的概念圖跟上一篇MySQL Proxy安裝方式相同,丫忠再補上一個對應port的圖表:

針對上圖的架構,首先需要了解幾點基本的觀念:

  • 所有寫入(ADD、UPDATE、DELETE)的動作都是針對MySQL Master
  • 所有讀取(SELECT)的動作都是大部分都是在MySQL Slave(部份在MySQL Master,因為涉及到是否同步完成的關係,請見下面 MySQL Proxy如何解決同步延遲問題 的說明)
  • MySQL Master與MySQL Slave已經建立起 同步(Replication)的機制
  • MySQL Proxy也一個MySQL 的客戶端(Client),也是一個MySQL的伺服器端(Server)

如果你對於上面的觀念都已經清楚後,對於上圖的流程我想應該很容易了解。丫忠就流程架構做個簡單說明:

1. 以往 所有應用程式(PHP)存取MySQL都是直接對應至MySQL Master,有了 MySQL Proxy當代理後,現在所有應用程式的連線都是連接至MySQL Proxy
2. 當MySQL Proxy接收到應用程式的SQL語法後,會自動判斷SQL語法是讀取還是寫入,再分別將寫入的SQL語法對應至MySQL Master、將讀取的SQL語法對應至MySQL Slave
3. 寫入MySQL Master的資料會透過Replication機制(binlog)同步至所有的MySQL Slave

看到這裡好像一切都很順利也沒有任何問題,如果你有意識到【當應用程式透過MySQL Proxy寫入資料到MySQL Master後, 此時應用程式又立即讀取剛寫入的資料;但是,MySQL Master還沒有同步至MySQL Slave,那麼應用程式讀取的資料不就是舊的資料嗎?】沒錯,當你有這樣的疑問時,表示你已經深入了解這個架構了,底下先針對MySQl Proxy如何解決同步延遲問題做說明

MySQL Proxy如何解決同步延遲問題

解決方式是在MySQL Master上新增一個自增表(count table),當MySQL Master接收到更新資料的動作時便會觸發這個觸發器,這個觸發器會更新自增表(count table)中的記錄,如下圖所示:

(圖片來源:http://hi.baidu.com)

因為自增表(count table)也會一起同步(replication)至MySQL Slave,當應用程式透過MySQL Proxy讀取資料時,MySQL Proxy會先向MySQL Master和MySQL Slave的自增表(count table)發送查詢請求,當MySQL Master和MySQL Slave的資料相同時,MySQL Proxy就可以認定MySQL Master和MySQL Slave的資料是一致的,接著把應用程式的請求對應至MySQL Slave主機上,否則就將請求發送至MySQL Master上,如下圖所示:

(圖片來源:http://hi.baidu.com)

透過自增表(count table)的方式就可以解決同步延遲的問題,ok~了解整個架構及克服同步延遲的問題後,再來就是實做的部份啦,底下將說明如何啟動MySQL Proxy及設定相關參數

本章應用一個範例架構來說明RW splitting的應用,架構中架設了一台MySQL Porxy、一台MySQL Master以及二台MySQL Slave,詳細訊息如下:

MySQL Proxy:192.168.10.250
MySQL Master:192.168.10.2
MySQL Slave1:192.168.10.3
MySQL Slave2:192.168.10.4

MySQL Proxy開啟後,預設會有2個port(4040及4041),port 4040為接受應用程式的port,port 4041為MySQL Proxy本身的管理port,詳細help的說明可以執行【/usr/local/mysql-proxy/bin/mysql-proxy –help-all】查看

如何啟動MySQL Proxy

$ /usr/local/mysql-proxy/bin/mysql-proxy \
> –daemon \
> –keepalive \
> –admin-username=root \
> –admin-password=123456 \
> –proxy-backend-addresses=192.168.10.2:3306 \
> –proxy-read-only-backend=192.168.10.3:3306 \
> –proxy-read-only-backend=192.168.10.4:3306 \
> –log-file=/var/log/mysql-proxy.log \
> –log-level=debug \
> –max-open-files=1024 \
> –proxy-lua-script=/usr/local/mysql-proxy/lua/rw-splitting.lua

要啟動MySQL Proxy就加了那麼多參數,代表的又是什麼意思呢?

  • –daemon:指定mysql-proxy為一個daemon(@@)
  • –keepalive丫忠在測試時會有mysql-proxy自動停止服務的情況,加上此參數後就解決這個問題
  • –admin-username:指定MySQL Proxy管理者端(port:4041)的登入帳號
  • –admin-password:指定MySQL Proxy管理者端(port:4041)的登入密碼
  • –proxy-backend-addresses:指定MySQL Master主機的位置及埠號(port)
  • –proxy-read-only-backend:指定MySQL Slave主機的位置及埠號(port),有多台Slave時, 一個 –proxy–read-only-backend 表示一台Slave
  • –log-file:指定儲存MySQL Proxy log的檔案位置
  • –log-level:指定要記錄log的等級
  • –max-open-files:指定最大檔案開啟數為1024,否則為有【could not raise RLIMIT_NOFILE to 8192, Invalid argument (22). Current limit still 1024.】的log訊息出現
  • –proxy-lua-script:指定MySQL Proxy要套用那一個script

上面的啟動方式,你可以用手動方式輸入啟動;另外,官網也提供了一個init script的shell下載,詳細下載請至 MySQL Proxy init script下載

再來,啟動MySQL Proxy的參數中有一個 –proxy-lua-script用來指定lua的檔案位置,這個 rw-splitting.lua檔案是 MySQL Proxy重點中的重點,至於要怎麼產生此 rw-splitting.lua呢?rw-splitting.lua檔案在MySQL Proxy原始安裝檔中就已經包含在裡面了,詳細rw-splitting.lua檔案位置在【mysql-proxy-0.8.0/lib/rw-splitting.lua】,請將此檔案拷貝至–proxy-lua-script找的到的位置

rw-splitting.lua目前尚未有一個穩定的版本,至目前0.8.0為止還在持續修正中,詳細的 Bug或修正內容,有興趣的可以至作者的網站查看( rw-splitting.lua作者),另外也有一個 bug修正的網址 以及針對 MySQL Proxy Lua Script 的主題

完成MySQL Proxy的啟動後,再來是測試是否MySQL Proxy可以真的達到讀寫分流的功能了,在測試前丫忠建議將 rw-splitting.lua的Debug功能打開,這樣才能清楚了解到 MySQL Proxy的流程及讀寫流程,請直接修改 rw-splitting.lua,將 is_debug = false 改成 is_debug = true,debug的log 會在應用程式執行時顯示出來,詳細修改後,如下圖所示:

MySQL Proxy測試寫入動作是否同步

這裡可以寫一個簡單的PHP程式,針對MySQL Proxy做寫入的動作,再至MySQL Master、MySQL Slave1及MySQL Slave2是否有同步更新即可驗證

$link = mysql_connect(‘192.168.10.250:4040′, ‘root’, ‘root_password’);
mysql_select_db(‘mytest’);
$sql=’UPDATE t1 SET t_name=’12345′ WHERE id=1;
$result = mysql_query( $sql);

MySQL Proxy測試讀取動作

丫忠剛開始的測試方式為直接在command下指令 做SELECT的動作;但是,這樣的方式是測試不出來的,錯誤的測試方式如下:

$ mysql -u root -p -P 4040 -h 192.168.10.250
mysql>SELECT * FROM t1;

丫忠再次強調,這樣的方式無法明顯測試出是否有從MySQL Slave讀取資料;而且,debug的記錄不會顯示出來

丫忠建議寫個簡單的PHP程式,跑個小迴圈,在debug log中就會顯示出 SELECT的資料是從那一台機器提供

$link = mysql_connect(‘192.168.10.250:4040′, ‘root’, ‘root_password’);
mysql_select_db(‘mytest’);
for($i=0;$i<20;$i++){
$sql=’SELECT * FROM t1′;
$result = mysql_query( $sql);
}

詳細 debug log的訊息就要請網友查看 rw-splitting debug訊息

另外,rw-splitting.lua 跟讀取較直接相關的參數有2個(min_idle_connections 及 max_idle_connections),可以直接修改這2個參數的值,看看有什麼變化,此部份及詳細分流的部份就要查看 rw-splittinglua 這隻lua程式了

MySQL Proxy 讀取出來的資料是亂碼

丫忠在測試過程式有遇到此問題,最後是修改 /etc/my.cnf 設定檔中,加入底下設定,即可解決亂碼問題(當然您要依據您的環境做修改)

default-character-set = utf8
skip-character-set-client-handshake
character-set-server = utf8
collation-server = utf8_general_ci
init-connect = SET NAMES utf8

本文相關的文章

    1. mysql proxy讀寫分流(一)-mysql proxy的安裝方式
    2. MySQL Slave_SQL_Running NO的解決方式
    3. MySQL Replication(Master Slave負載平衡)
    4. mysql 臨時表temporary table
    5. mysql(my.cnf)設定檔說明(二)
    6. mysql(my.cnf)設定檔說明

mysql proxy讀寫分流(二)-加入RW splitting的更多相关文章

  1. MySQL Proxy 实现MySQLDB 读写分离

    一.简述 MySQL Proxy是一个处于你的client端和MySQL server端之间的简单程序,它可以监测.分析或改变它们的通信.它使用灵活,没有限制,常见的用途包括:负载平衡,故障.查询分析 ...

  2. MySQL Proxy

    最近翻看了mysql proxy的资料,特发上来. mysql proxy的推荐使用方式是采用配置文件来完成,当前在命令行的执行如下:mysql-proxy -P 192.168.1.101:3306 ...

  3. Mysql读写分离方案-MySQL Proxy环境部署记录

    Mysql的读写分离可以使用MySQL Proxy和Amoeba实现,其实也可以使用MySQL-MMM实现读写分离的自动切换.MySQL Proxy有一项强大功能是实现"读写分离" ...

  4. MySQL Proxy 实现 MySQL 读写分离提高并发负载

    还在学习,学完了在写笔记 (这个先安装lua:https://www.cnblogs.com/fps2tao/p/9163959.html ) 工作拓扑: MySQL Proxy有一项强大功能是实现“ ...

  5. (转)MySQL Proxy使用

    转自: http://www.cnblogs.com/itech/archive/2011/09/22/2185365.html http://koda.iteye.com/blog/788862 h ...

  6. MySQL Proxy使用

    使用MySQL将读写请求转接到主从Server. 一 安装MySQL Proxy MySQL Proxy的二进制版非常方便,下载解压缩后即用. 解压缩的目录为: $mysql-proxy_instal ...

  7. MySQL主从(MySQL proxy Lua读写分离设置,一主多从同步配置,分库分表方案)

    Mysql Proxy Lua读写分离设置 一.读写分离说明 读写分离(Read/Write Splitting),基本的原理是让主数据库处理事务性增.改.删操作(INSERT.UPDATE.DELE ...

  8. DB proxy, mysql proxy

    db proxy 在大型互联网站的数据库部署中,部署最多的数据库为MySQL.随着MySQL中Innodb存储引擎对事物的支持,MySQL在互联网公司部署中,应用量越来越多.典型应用MySQL的公司有 ...

  9. 我的MYSQL学习心得(十二) 触发器

    我的MYSQL学习心得(十二) 触发器 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数 ...

随机推荐

  1. 前缀+排序 HDOJ 4311 Meeting point-1

    题目传送门 题意:给一些坐标轴上的点,选一个点,使得其他点到该点曼哈顿距离和最小 分析:这题有很强的技巧性,直接计算每个点的曼哈顿距离和是不可行的.这里用到了前缀的思想,先对点按照x从左到右排序,p[ ...

  2. 构造 BestCoder Round #52 (div.2) 1001 Victor and Machine

    题目传送门 题意:有中文版的 分析:首先要知道机器关闭后,w是清零的.所以一次(x + y)的循环弹出的小球个数是固定的,为x / w + 1,那么在边界时讨论一下就行了 收获:这种题目不难,理解清楚 ...

  3. stack(数组模拟) POJ 2559 Largest Rectangle in a Histogram

    题目传送门 /* 题意:宽度为1,高度不等,求最大矩形面积 stack(数组模拟):对于每个a[i]有L[i],R[i]坐标位置 表示a[L[i]] < a[i] < a[R[i]] 的极 ...

  4. SolrCloud索引富文本数据

    solrconfig配置文件: schema配置文件: 执行目录: /opt/solr-5.5.4/server/scripts/cloud-scripts -- 下载配置文件 ./zkcli.sh ...

  5. 【学习笔记】SIFT尺度不变特征 (配合UCF-CRCV课程视频)

    SIFT尺度不变特征 D. Lowe. Distinctive image features from scale-invariant key points, IJCV 2004 -Lecture 0 ...

  6. E. Dasha and Puzzle 数学题

    http://codeforces.com/contest/761/problem/E 给出一颗树,要求在坐标系中用平行于坐标轴的线描绘出来. 要求边不能相交,而且点的坐标唯一. 注意到2^1 + 2 ...

  7. WAMP配置虚拟目录

    1.启动wamp所有服务,输入localhost或localhost:端口号确保wamp环境正常无误. 2.设置httpd.conf 2.1打开文件:单击wamp在电脑右下角的图标=>wamp= ...

  8. Elasticsearch--集群管理_时光机&监控

    目录 Elasticsearch时光机 创建快照存储库 清理:删除旧的快照 监控集群状态和健康度 集群健康度API 索引统计API 状态API 节点信息API 节点统计API 集群状态API 挂起任务 ...

  9. (一)Redis for Windows正确打开方式

    目录 (一)Redis for Windows正确打开方式 (二)Redis for 阿里云公网连接 (三)Redis for StackExchange.Redis 下载地址 官网.中文网1 及 中 ...

  10. webstorm里直接调用命令行

    写代码写到一半要切换窗口出去敲命令行?webstorm的external tools可以帮你省下一点时间 举例说明,比如我要直接使用npm: ctrl+alt+s打开setting菜单,找到exter ...