mysql

實驗環境:
10.10.4.81 mysql-proxy
10.10.4.82 mysql master ---write
10.10.4.83 mysql slave ---read
三臺服務器上均搭建mysql服務
82、83主從同步詳細過程略
81mysql-proxy
一、編譯安裝lua
mysql-proxy的讀寫分離主要是通過rw-splitting.lua腳本實現的,因此需要安裝lua.
wget http://www.lua.org/ftp/lua-5.1.4.tar.gz
#tar zxvf lua-5.1.4.tar.gz
#cd lua-5.1.4
vi src/Makefile
在 CFLAGS= -O2 -Wall $(MYCFLAGS) 這一行記錄里加上-fPIC,更改爲 CFLAGS= -O2 -Wall -fPIC $(MYCFLAGS) 來避免編譯過程中出現錯誤。
#make linux
#make install
#cp etc/lua.pc /usr/lib/pkgconfig/
#export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/lib/pkgconfig
二、安裝配置mysql-proxy
測試平臺爲centos 32位,因此選擇32位的軟件包
#wget http://mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-Proxy/mysql-proxy-0.8.1-linux-rhel5-x86-32bit.tar.gz
#tar xzvf mysql-proxy-0.8.1-linux-rhel5-x86-32bit.tar.gz
#mv mysql-proxy-0.8.1-linux-rhel5-x86-32bit /opt/mysql-proxy
創建mysql-proxy服務管理腳本
#mkdir /opt/mysql-proxy/init.d/
#vi /opt/mysql-proxy/init.d/mysql-proxy
vim mysql-proxy
#!/bin/sh
#
# mysql-proxy This script starts and stops the mysql-proxy daemon
#
# chkconfig: - 78 30
# processname: mysql-proxy
# description: mysql-proxy is a proxy daemon to mysql
# Source function library.
. /etc/rc.d/init.d/functions
#PROXY_PATH=/usr/local/bin
PROXY_PATH=/opt/mysql-proxy/bin
prog="mysql-proxy"
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
# Set default mysql-proxy configuration.
#PROXY_OPTIONS="--daemon"
PROXY_OPTIONS="--admin-username=root --admin-password=password --proxy-read-only-backend-addresses=10.10.4.83:3306 --proxy-
backend-addresses=10.10.4.82:3306 --admin-lua-script=/opt/mysql-proxy/lib/mysql-proxy/lua/admin.lua --proxy-lua-
script=/opt/mysql-proxy/scripts/rw-splitting.lua"
PROXY_PID=/opt/mysql-proxy/run/mysql-proxy.pid
# Source mysql-proxy configuration.
if [ -f /etc/sysconfig/mysql-proxy ]; then
. /etc/sysconfig/mysql-proxy
fi
PATH=$PATH:/usr/bin:/usr/local/bin:$PROXY_PATH
# By default it's all good
RETVAL=0
# See how we were called.
case "$1" in
start)
# Start daemon.
echo -n $"Starting $prog: "
$NICELEVEL $PROXY_PATH/mysql-proxy $PROXY_OPTIONS --daemon --pid-file=$PROXY_PID --user=mysql --log-level=debug --
log-file=/opt/mysql-proxy/log/mysql-proxy.log
RETVAL=$?
echo
if [ $RETVAL = 0 ]; then
touch /var/lock/subsys/mysql-proxy
fi
;;
stop)
# Stop daemons.
echo -n $"Stopping $prog: "
killproc $prog
RETVAL=$?
echo
if [ $RETVAL = 0 ]; then
rm -f /var/lock/subsys/mysql-proxy
rm -f $PROXY_PID
fi
;;
restart)
$0 stop
sleep 3
$0 start
;;
condrestart)
[ -e /var/lock/subsys/mysql-proxy ] && $0 restart
;;
status)
status mysql-proxy
RETVAL=$?
;;
*)
echo "Usage: $0 {start|stop|restart|status|condrestart}"
RETVAL=1
;;
esac
exit $RETVAL
腳本詳解註釋:/opt/mysql-proxy/libexec/mysql-proxy --admin-username=root --admin-password=password --proxy-read-only-backend
-addresses=10.10.4.83:3306 --proxy-backend-addresses=10.10.4.82:3306 --admin-lua-script=/opt/mysql-proxy/lib/mysql-
proxy/lua/admin.lua --proxy-lua-script=/opt/mysql-proxy/scripts/rw-splitting.lua --daemon --pid-file=/opt/mysql-
proxy/run/mysql-proxy.pid --user=mysql --log-level=debug --log-file=/opt/mysql-proxy/log/mysql-proxy.log
//--admin-username=root 指定管理員用戶
//--admin-password=password 指定管理員密碼
//--proxy-read-only-backend-address=10.10.4.83:3306只讀數據庫
//--proxy-backend-address=10.10.4.82:3306 寫的數據庫
//--admin-lua-script=/opt/mysql-proxy/lib/mysql-proxy/lua/admin.lua lua管理腳本路徑
//--proxy-lua-script=/opt/mysql-proxy/scripts/rw-splitting.lua 指定lua腳本,在這裏,使用的是rw-splitting腳本,用於讀寫分離
//--daemon 採用daemon方式啓動
//--pid-file=/opt/mysql-proxy/run/mysql-proxy.pid 定義mysql-proxyPID文件路徑
//--user=mysql 以mysql用戶身份啓動服務
//--log-level=debug //定義log日誌級別,由高到低分別有(error|warning|info|message|debug)
//--log-file=/opt/mysql-proxy/log/mysql-proxy.log 定義log日誌文件路徑
#chmod +x /opt/mysql-proxy/init.d/mysql-proxy
#mkdir /opt/mysql-proxy/run
#mkdir /opt/mysql-proxy/log
#mkdir /opt/mysql-proxy/scripts
三、配置並使用rw-splitting.lua讀寫分離腳本.
最新的腳本我們可以從最新的mysql-proxy源碼包中獲取
#wget http://mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-Proxy/mysql-proxy-0.8.1.tar.gz
#tar xzvf mysql-proxy-0.8.1.tar.gz
#cd mysql-proxy-0.8.1
#cp lib/rw-splitting.lua /opt/mysql-proxy/scripts
修改讀寫分離腳本 rw-splitting.lua
修改默認連接,進行快速測試,不修改的話達到連接數爲4時才啓動讀寫分離
#vi /opt/mysql-proxy/scripts/rw-splitting.lua
-- connection pool
if not proxy.global.config.rwsplit then
proxy.global.config.rwsplit = {
min_idle_connections = 1, //默認爲4
max_idle_connections = 1, //默認爲8
is_debug = false
}
end
修改完成後,啓動mysql-proxy
#/opt/mysql-proxy/init.d/mysql-proxy start
四、測試讀寫分離效果
創建用戶讀寫分離的數據庫連接用戶
登錄主數據庫服務器10.10.4.82,通過命令行登錄管理mysql服務器
爲了清晰的看到讀寫分離的效果,需要暫時關閉mysql主從複製的功能。
#mysql -uroot -ppassword
mysql>grant all privileges on test.* to 'root'@'%' identified by 'password';(82/83都授權)
在主mysql數據庫中的test數據庫常見表,並插入數據
mysql>use test;
Database changed
mysql>create table first_tb(id int(3),name char(10));
Query Ok, 1 row affected (0.00 sec)
mysql>insert into first_tb values (1,'myself');
Query Ok, 1 row affected (0.00 sec)
mysql>select * from first_tb;
+------+-------+
| id | name |
+------+-------+
| 1 | myself |
+------+-------+
1 row in set (0.00 sec)
在從10.10.4.83mysql數據庫中的test數據庫創建表,並插入數據
mysql>use test;
Database changed
mysql>create table first_tb(id int(3),name char(10));
Query Ok, 1 row affected (0.00 sec)
mysql>insert into first_tb values (2,'yours');
Query Ok, 1 row affected (0.00 sec)
mysql>select * from first_tb;
+------+-------+
| id | name |
+------+-------+
| 2 | yours |
+------+-------+
1 row in set (0.00 sec)
兩個環境均已搭建OK
然後在10.10.4.81mysql-proxy服務器上登錄
#mysql -uroot -ppassword -h10.10.4.81 -P4040 test
mysql> use test;
Database changed
mysql> select * from first_tb;
+------+--------+
| id | name |
+------+--------+
| 1 | myself |
+------+--------+
4 rows in set (0.00 sec)
顯示讀取的數據爲10.10.4.82主數據庫中的數據
再重新打開一個mysql-proxy終端同樣select一下
#mysql -uroot -ppassword -h10.10.4.81 -P4040 test
mysql> use test;
Database changed
mysql> select * from first_tb;
+------+--------+
| id | name |
+------+--------+
| 2 | yours |
+------+--------+
4 rows in set (0.00 sec)
再之後的連接請求過來,select到的全部爲10.10.4.83從庫上的數據;
然後在10.10.4.81mysql-proxy上插入一條數據:
#mysql -uroot -ppassword -h10.10.4.81 -P4040 test
mysql> use test;
mysql>insert into first_tb values (110,'second');
然後分別去主從服務器上查看信息
mysql> select * from first_tb; (主10.10.4.82)
+------+--------+
| id | name |
+------+--------+
| 1 | myself |
| 110 | second |
+------+--------+
4 rows in set (0.00 sec)
mysql> select * from first_tb; (從10.10.4.83)
+------+--------+
| id | name |
+------+--------+
| 2 | yours |
+------+--------+
4 rows in set (0.00 sec)
可見寫到主數據庫(10.10.4.82)中了,讀寫分離完成!
由此,我們已經實現了mysql讀寫分離,目前所有的寫操作都全部在master主服務器上,用來避免數據的不同步;
另外,所有的讀操作都分攤給了slave從服務器,分擔數據庫的壓力
後注:
[root@kdq81 ~]# mysql -uroot -ppassword -h127.0.0.1 -P4041
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.0.99-agent-admin
Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> select * from help;
+------------------------+------------------------------------+
| command | description |
+------------------------+------------------------------------+
| SELECT * FROM help | shows this help |
| SELECT * FROM backends | lists the backends and their state |
+------------------------+------------------------------------+
2 rows in set (0.00 sec)
mysql> select * from backends;
+-------------+-----------------+-------+------+------+-------------------+
| backend_ndx | address | state | type | uuid | connected_clients |
+-------------+-----------------+-------+------+------+-------------------+
| 1 | 10.10.4.82:3306 | up | rw | NULL | 0 |
| 2 | 10.10.4.83:3306 | up | ro | NULL | 0 |
+-------------+-----------------+-------+------+------+-------------------+
2 rows in set (0.00 sec)
backend_ndx:1表示該數據庫是主庫,2表示該數據庫是從庫
state:提示DB處於一個什麼狀態
在/opt/mysql-proxy/lib/mysql-proxy/lua/admin.lua中有定義
state有三種狀態:up /down/unkown
type有三種狀態:rw /ro /unknow

本文出自 “Just do it !” 博客,請務必保留此出處http://wjpinrain.blog.51cto.com/1109471/716288


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章