搭建Amoeba讀寫分離和測試v1.0php
1.
首先部署兩臺mysql ,創建測試庫和表,並創建起主從複製
#yum 安裝mysql
yum –y install mysql
#設置/etc/my.cnf
[client]
port = 3306
socket = /var/lib/mysql/mysql.sock
[mysqld]
port = 3306
socket = /var/lib/mysql/mysql.sock
datadir = /data
skip-locking
key_buffer = 16M
max_allowed_packet = 1M
table_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
skip-federated
log-bin=mysql-bin
server-id = 1 #master id=1 ;slave id =2
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
[isamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[myisamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
#創建測試庫dbtest
create database dbtest;
#創建測試表tb1
use dbtest;
CREATE TABLE `tb1` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(32) default NULL,
PRIMARY KEY (`id`)
);
#設置響應的複製權限
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'rep'@'%' IDENTIFIED BY 'rep123';
FLUSH PRIVILEGES;
#創建主從複製關係
reset master;
show master status;
change master to
master_host='192.168.100.14',
master_port=3306,
master_user='rep',
master_password='rep123',
master_log_file='mysql-bin.000001',
master_log_pos=98;
slave start;
show slave status\G;
show full processlists;
#在master插入數據查看binlog是否同步
insert into tb1(name) values ('123');
#創建amoeba使用的賬號並設置權限
grant all on dbtest.* to webuser@'%' identified by 'webuser123';
grant all on dbtest.* to webuser@'cloud1' identified by 'webuser123';
grant all on dbtest.* to webuser@'cloud2' identified by 'webuser123';
grant all on dbtest.* to webuser@'cloud3' identified by 'webuser123';
FLUSH PRIVILEGES;
|
2.
設置amoeba所須要的JDK環境
#下載安裝jdk1.7
http://www.oracle.com/technetwork/java/javase/downloads/index.html
tar zxvf jdk-7u10-linux-i586.gz
#/etc/profile增長環境變量
pathmunge /opt/jdk1.7.0_10/bin
export JAVA_HOME=/opt/jdk1.7.0_10
export JRE_HOME=/opt/jdk1.7.0_10/jre
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
#驗證java
java -version
|
3.
下載安裝amoeba
#下載Amoeba,
http://sourceforge.net/projects/amoeba/files/
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C aomeba-mysql/
#修改配置文件,指定訪問mysql的port 和schema;訪問mysql的user和password; mysql的master 和slave ip
cd /opt/amoeba-mysql/conf
vi dbServers.xml
<!-- mysql port -->
<property name="port">3306</property>
<!-- mysql schema -->
<property name="schema">dbtest</property>
<!-- mysql user -->
<property name="user">webuser</property>
<!-- mysql password -->
<property name="password">webuser123</property>
……
<dbServer name="master" parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.100.14</property>
</factoryConfig>
</dbServer>
<dbServer name="slave1" parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.100.16</property>
</factoryConfig>
</dbServer>
<dbServer name="multiPool" virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
<property name="loadbalance">1</property>
<!-- Separated by commas,such as: server1,server2,server1 -->
<property name="poolNames">slave1</property>
</poolConfig>
</dbServer>
#修改配置文件,指定對外的用戶名密碼,以及讀寫分離的策略
vi amoeba.xml
<property name="user">webuser</property>
<property name="password">webuser123</property>
….
<property name="LRUMapSize">1500</property>
<property name="defaultPool">master</property>
<property name="writePool">master</property>
<property name="readPool">multiPool</property>
<property name="needParse">true</property>
#啓動amoeba
/opt/amoeba-mysql/bin/amoeba start &>/dev/null &
#關閉 amoeba
/opt/amoeba-mysql/bin/amoeba stop
|
4.
利用php進行讀寫分離測試
#寫入腳本 insert_dbtest.php
<?php
$mysqli=mysqli_connect("192.168.100.13","webuser","webuser123","dbtest","8066");
class runtime
{
var $StartTime = 0;
var $StopTime = 0;
function get_microtime()
{
list($usec, $sec) = explode(' ', microtime());
return ((float)$usec + (float)$sec);
}
function start()
{
$this->StartTime = $this->get_microtime();
}
function stop()
{
$this->StopTime = $this->get_microtime();
}
function spent()
{
return round(($this->StopTime - $this->StartTime) * 1000, 1);
}
}
$runtime= new runtime;
$runtime->start();
for($i=1;$i<10;$i++){
$ins = "insert into `tb1`(`name`) values ('$i')";
mysqli_query($mysqli,$ins);
}
$runtime->stop();
echo "insert sucess! 頁面執行時間: ".$runtime->spent()." 毫秒\n";
mysqli_close($mysqli);
?>
#讀腳本select_dbtest.php
<?php
$mysqli=mysqli_connect("192.168.100.13","webuser","webuser123","dbtest","8066");
class runtime
{
var $StartTime = 0;
var $StopTime = 0;
function get_microtime()
{
list($usec, $sec) = explode(' ', microtime());
return ((float)$usec + (float)$sec);
}
function start()
{
$this->StartTime = $this->get_microtime();
}
function stop()
{
$this->StopTime = $this->get_microtime();
}
function spent()
{
return round(($this->StopTime - $this->StartTime) * 1000, 1);
}
}
$runtime= new runtime;
$runtime->start();
$ins = "select * from tb1;";
$res = mysqli_query($mysqli,$ins);
$rows = mysqli_num_rows($res);
echo $rows;
$runtime->stop();
//echo "insert sucess! 頁面執行時間: ".$runtime->spent()." 毫秒\n";
mysqli_close($mysqli);
?>
|
5.
利用tcpdump進行抓包分析 讀寫是否分離到master和slave
#在mysql master和salve上分別進行抓包,192.168.100.13爲amoeba server
tcpdump -i any -s 0 -A -n -p port 3306 and src 192.168.100.13|grep -i 'SELECT\|INSERT'
#運行insert腳本
php insert_dbtest.php
#看到master上有數據產生
[root@cloud3 ~]# tcpdump -i any -s 0 -A -n -p port 3306 and src 192.168.100.13|grep -i 'SELECT\|INSERT'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes
.m..$\=:'....insert into `tb1`(`name`) values ('1')erisign-grs.com.w...
'....insert into `tb
'....insert into `tb1`(`name`) values ('2')ervers.net..nstld.ve
.m..$].1'....insert into `tb1`(`name`) values ('3')..O...l.G.a...d{}..Q
.m..$]..'....insert into `tb1`(`name`) values ('4')ervers.net..nstld.ve
.m..$]..'....insert into `tb1`(`name`) values ('5')ervers.net..nstld.ve
.m.&$]..'....insert into `tb1`(`name`) values ('6')ervers.net..nstld.ve
.m..$].!'....insert into `tb1`(`name`) values ('7')..O...l.G.a...d{}..Q
#運行select腳本
php select_dbtest.php
#看到slave上有數據產生
[root@cloud2 scripts]# tcpdump -i any -s 0 -A -n -p port 3306 and src 192.168.100.13|grep -i 'SELECT\|INSERT'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes
.o9.$\.).....select * from tb1;.X7.:`@...>._..b..
.o9.$`._.....select * from
.ow.$`._.....select * from tb1;.X7.:`@...>._..b..
.ow.$a.!.....select * from
.p=^$a.!!....select @@version_comment limit 1.b....TRIBES-E..e,
.p=_$a..!....select @@vers
.p{h$b.......select * from tb1;.............webus
.p{i$b.......select * from tb1;
#就此最簡單的讀寫分離測試成功 |