mysql-proxy+keepalived對mysql做讀寫分離
mysql-proxy+keepalived對mysql做讀寫分離
一拓撲圖
前幾天,我透過Amoeba 對mysql做了讀寫分離,但是開發用zabbix連線資料庫後,發現不能批次執行dml語句。後來我感覺應該是amoeba的不足引起的。
於是,我就換成了mysql-proxy來做讀寫分離。
此次架構和上次相比有所調整。此次有三個實體機,我做成了master-->master-->slave的形式,其中一個寫兩個讀。
按照正常做法,應該是5臺機器,其中兩個是mysql-proxy(互為冗餘)和三個mysql資料庫。但是為了節省機器,並且也不影響整體的效能。經過我的思量,就做成了上圖所示的兩個主庫一個從庫的形式。我把mysql-proxy放在了兩個負責讀的資料庫上,其互為冗餘。
為了實現故障轉移,我對mysql資料庫和mysql-proxy都用keepalived做成了高可用。上述三臺機器中,可以壞掉其中任何一臺機器,並且可以自動切換到對應備機而不需要人工干預,可以說實現了高可用和資料的冗餘。
都說mysql是輕量級資料庫,我感覺配置mysql確實挺輕巧,不像oracle那麼複雜(可能由於我對mysq認識不足)。
和amoeba相比,我感覺mysql-proxy功能有點生硬。amoeba可以設定讀庫是輪詢、基於權重還是HA。但是mysql-prxoy是lua語言編寫(amoeba是java編寫),只是透過一個指令碼實現讀寫分離的,所以還沒像amoeba那樣設定靈活。
一開始,我以為mysql-proxy的兩個讀庫只能讀一個呢,後來我用shell指令碼批次執行讀操作,才發現大量的查詢都是丟向了第一個讀庫(10.72.23.88),只有少量的查詢丟向了第二個讀庫。本文後面有我的測試實驗,可以參考。
二、部署步驟
關於mysql、mysql-proxy、keepalived的安裝在此省略,如果你需要可以參見我的另外一篇文章:http://blog.itpub.net/28916011/viewspace-1603009/。
1、keepalived for mysql-proxy的配置
10.72.23.89(mysql-proxy主)
[root@zabbixsrvbjdb02 proxy]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id Hadb_1
}
vrrp_sync_group VGM {
group {
mysqlproxy
}
}
vrrp_script chk_mysql_proxy {
script "killall -0 mysql-proxy"
#script "/tcp/127.0.0.1/3308"
#script "/opt/amoeba.sh"
interval 1
}
# vvrp_instance define #
vrrp_instance mysqlproxy {
state MASTER
interface eth0
virtual_router_id 49
priority 200
advert_int 1
authentication {
auth_type PASS
auth_pass hamysqlproxy11
}
virtual_ipaddress {
10.72.23.91
}
track_script {
chk_mysql_proxy
}
}
10.72.23.88(mysql-proxy備)
[root@zabbixsrvbjdb01 local]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id Hadb_1
}
vrrp_sync_group VGM {
group {
VI_HA
}
}
vrrp_script chk_mysql {
script "killall -0 mysqld"
#script "/tcp/127.0.0.1/3307"
#script "/opt/amoeba.sh"
interval 1
}
vrrp_script chk_mysql_proxy {
script "killall -0 mysql-proxy"
#script "/tcp/127.0.0.1/3306"
#script "/opt/amoeba.sh"
interval 1
}
# vvrp_instance define #
vrrp_instance VI_HA {
state BACKUP
interface eth0
virtual_router_id 46
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass hamysql11
}
virtual_ipaddress {
10.72.23.87
}
track_script {
chk_mysql
}
}
vrrp_instance mysql_proxy {
state BACKUP
interface eth0
virtual_router_id 49
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass hamysqlproxy11
}
virtual_ipaddress {
10.72.23.91
}
track_script {
chk_mysql_proxy
}
}
2、keepalived for mysql 的配置
10.72.23.90(mysql資料庫主2)
[root@zabbixsrvbjdb04 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id Hadb_1
}
vrrp_sync_group VGM {
group {
VI_HA
}
}
vrrp_script chk_mysql {
script "killall -0 mysqld"
#script "/tcp/127.0.0.1/3307"
#script "/opt/amoeba.sh"
interval 1
}
# vvrp_instance define #
vrrp_instance VI_HA {
state MASTER
interface eth0
virtual_router_id 46
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass hamysql11
}
virtual_ipaddress {
10.72.23.87
}
track_script {
chk_mysql
}
}
10.72.23.88(mysql資料庫主1)
[root@zabbixsrvbjdb01 local]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id Hadb_1
}
vrrp_sync_group VGM {
group {
VI_HA
}
}
vrrp_script chk_mysql {
script "killall -0 mysqld"
#script "/tcp/127.0.0.1/3307"
#script "/opt/amoeba.sh"
interval 1
}
vrrp_script chk_mysql_proxy {
script "killall -0 mysql-proxy"
#script "/tcp/127.0.0.1/3306"
#script "/opt/amoeba.sh"
interval 1
}
# vvrp_instance define #
vrrp_instance VI_HA {
state BACKUP
interface eth0
virtual_router_id 46
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass hamysql11
}
virtual_ipaddress {
10.72.23.87
}
track_script {
chk_mysql
}
}
vrrp_instance mysql_proxy {
state BACKUP
interface eth0
virtual_router_id 49
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass hamysqlproxy11
}
virtual_ipaddress {
10.72.23.91
}
track_script {
chk_mysql_proxy
}
}
3、關於mysql-proxy 兩個讀庫分配比例的測試
隨便找兩個其他機器作為客戶端,連線mysql-proxy測試兩個讀庫訪問情況。
[root@node1 ~]# cat 1.sh
for((i=1;i<10000;i++))
do
mysql -h10.72.23.91 -uroot -pxxx -e "select * from czx.czxt" >> /tmp/czx.txt
done
在測試機1上執行的結果:
[root@node1 ~]# sh 1.sh
[root@node1 ~]# cat /tmp/czx.txt |grep 89 |wc -l
820
[root@node1 ~]# cat /tmp/czx.txt |grep 88 |wc -l
9179
在測試機2上執行的結果:
[root@dg ~]# sh 1.sh
[root@dg ~]# cat /tmp/czx.txt |grep 89 |wc -l
800
[root@dg ~]# cat /tmp/czx.txt |grep 88 |wc -l
9199
可以看出mysql-proxy分配讀請求在兩個資料庫上是1:11分配的。
注意,此測試如果只用一臺客戶端機器來訪問mysql-proxy,會看到讀操作只分配到一個機器上(我的是讀操作都分配到了10.72.23.88機器上了,沒有看到將讀分配到10.72.23.89上)。我想這個原因可能就是高併發訪問mysql-proxy時,才會將讀操作分配到不同的讀庫上。
4、啟動mysql-proxy的方法
1、先在10.72.23.88上繫結vip 91
ifconfig eth0:0 10.72.23.91 netmask 255.255.255.0
2、再在10.72.23.88上啟動myql-proxy
/usr/local/proxy/bin/mysql-proxy -P 10.72.23.91:3306 -b 10.72.23.87:3307 -r 10.72.23.88:3307 -s /usr/local/proxy/share/doc/mysql-proxy/rw-splitting.lua
3、重啟10.72.23.88的網路,當掉vip 91
service network restart
4、關閉10.72.23.88的keepalived
service keepalived stop
4、在10.72.23.89上繫結vip 91
ifconfig eth0:0 10.72.23.91 netmask 255.255.255.0
5、在10.72.23.89上啟動mysql-proxy
/usr/local/proxy/bin/mysql-proxy -P 10.72.23.91:3306 -b 10.72.23.87:3307 -r 10.72.23.88:3307 -r 10.72.23.89:3307 -s /usr/local/proxy/share/doc/mysql-proxy/rw-splitting.lua &
6、重啟10.72.23.89的網路,當掉vip 91
service network restart
7、啟動10.72.23.88的keepalived
8、我在10.72.23.89上加了個每分鐘執行的指令碼,用來判斷寫資料庫10.72.23.90是否當機,如果寫資料庫當機,就將89的mysql-proxy代理許可權交給88來管理:
[root@zabbixsrvbjdb02 script]# cat check_remote_mysql
#!/bin/bash
nmap -sT -p 3307 -oG – 10.72.23.90 |grep open
status=`echo $?`
if [ $status -eq 1 ];then
pkill -9 mysql-proxy
fi
完。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28916011/viewspace-1617532/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL Amoeba讀寫分離MySql
- Amoeba for mysql讀寫分離MySql
- MySQL讀寫分離AtlasMySql
- 【Mysql】mysql-proxy讀寫分離MySql
- MySQL + Atlas --- 部署讀寫分離MySql
- Amoeba for MySQL讀寫分離配置MySql
- mysql讀寫分離(PHP類)MySqlPHP
- ProxySQL實現MySQL讀寫分離MySql
- MySQL 讀寫分離的好處MySql
- mysql優化之讀寫分離MySql優化
- 探究MySQL MGR的讀寫分離MySql
- Amoeba 實現 MySQL 讀寫分離MySql
- mysql讀寫分離Amoeba的部署MySql
- MySQL cetus 中介軟體 讀寫分離MySql
- MYSQL 主從 + ATLAS 讀寫分離 搭建MySql
- 配置\清除 MySQL 主從 讀寫分離MySql
- Mysql之讀寫分離架構-AtlasMySql架構
- Mysql 高可用(MHA)-讀寫分離(Atlas)MySql
- MySQL主從複製讀寫分離MySql
- Amoeba+Mysql 實現讀寫分離MySql
- MySQL 讀寫分離介紹及搭建MySql
- mysql-proxy實現讀寫分離MySql
- mysql讀寫分離的最佳實踐MySql
- MySQL 官宣:支援讀寫分離了!!MySql
- docker+atlas+mysql實現讀寫分離DockerMySql
- MySQL 中讀寫分離資料延遲MySql
- mysql讀寫分離實戰準備一MySql
- haproxy+keepalived+mycat+mysql (讀寫分離)MySql
- MySQL主從複製與讀寫分離MySql
- [Mysql]主從複製和讀寫分離MySql
- Mysql讀寫分離方案-MySQL Proxy環境部署記錄MySql
- 搭建MySQL主從實現Django讀寫分離MySqlDjango
- Mysql-主從複製與讀寫分離MySql
- Mysql讀寫分離方案-Amoeba環境部署記錄MySql
- ProxySQL實現Mysql讀寫分離 - 部署手冊MySql
- MySQL 中介軟體Atlas 實現讀寫分離MySql
- Redis的讀寫分離Redis
- Laravel讀寫分離原理Laravel