搭建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;
#就此最简单的读写分离测试成功 |