OneProxy并发查询

1、OneProxy安装

[root@redhat Desktop]# mv oneproxy-rhel6-linux64-v5.7-ga.tar.gz/usr/local

[root@redhat Desktop]# cd /usr/local/

[root@redhat local]# tar zxvf oneproxy-rhel6-linux64-v5.7-ga.tar.gz

[root@redhat local]# cd oneproxy/

[root@redhat oneproxy]# cat demo.sh

#/bin/bash

#

exportONEPROXY_HOME=/data/oneproxy

#valgrind --leak-check=full --show-reachable=yes \

${ONEPROXY_HOME}/oneproxy--keepalive --proxy-address=:3307 \

  --vip-address=192.168.1.120/eth0:0 \

  --proxy-master-addresses=192.168.1.20:3306@server1 \

  --proxy-slave-addresses=192.168.1.119:3306@server1 \

  --proxy-user-list=test/1378F6CC3A8E8A43CA388193FBED5405982FBBD3@test \

  --proxy-part-tables=${ONEPROXY_HOME}/part.txt\

  --proxy-charset=gbk_chinese_ci \

  --event-threads=4--proxy-group-security=server1:0 \

  --log-file=${ONEPROXY_HOME}/oneproxy.log \

  --pid-file=${ONEPROXY_HOME}/oneproxy.pid

修改相关语句

[root@redhat oneproxy]# cat demo.sh

#/bin/bash

#

export ONEPROXY_HOME=/usr/local/oneproxy

#valgrind --leak-check=full --show-reachable=yes \

${ONEPROXY_HOME}/oneproxy--keepalive --proxy-address=:3307 \

  --vip-address=192.168.1.120/eth0:0 \

  --proxy-master-addresses=192.168.1.128:3306@data1 \

  --proxy-master-addresses=192.168.1.132:3306@data2\

  --proxy-user-list=test/1378F6CC3A8E8A43CA388193FBED5405982FBBD3@test \

  --proxy-part-tables=${ONEPROXY_HOME}/hashpart.txt \

  --proxy-charset=gbk_chinese_ci \

  --proxy-group-security=server1:0 \

  --proxy-group-policy=data1:master-only\

  --proxy-group-policy=data2:master-only \

  --log-file=${ONEPROXY_HOME}/oneproxy.log \

  --pid-file=${ONEPROXY_HOME}/oneproxy.pid

注释:

A) --proxy-user-list=test/1378F6CC3A8E8A43CA388193FBED5405982FBBD3@test其中第一个test为连接proxy的用户名,该用户名也是用来连接后端数据库的用户名;1378F6CC3A8E8A43CA388193FBED5405982FBBD3为test用户的加密口令;最后一个test为各个数据库节点中的test数据库。

B)口令加密。启动OneProxy之后,进入管理端口,然后键入passwd

# mysql -uadmin -h 127.0.0.1 -P4041 -pOneProxy

mysql> passwd test;

+------+------------------------------------------+

| TEXT | PASSWORD                                 |

+------+------------------------------------------+

| test | 1378F6CC3A8E8A43CA388193FBED5405982FBBD3 |

+------+------------------------------------------+

1 row in set (0.00 sec)

C) 分表文件hashpart.txt 

[root@redhatoneproxy]# cat hashpart.txt

[

  {

       "table" :"bigtable",

       "pkey" : "id",

       "type" : "int",

       "method" : "hash",

       "partitions": 256,

       "groups":["data1","data2"]

  }

]

其中table:拆分的表;pkey:分表列;type:分表列类型,目前支持的类型为int和char;method:分区方法,目前支持hash,range,list,global

4)安装数据节点,并赋予用户相应权限。

A)MySQL安装(安装步骤略)

B)权限分配

登录到各个底层数据库所在的linux主机上,运行如下命令:

mysql-uroot -p -e "grant all privileges on *.* to test@'%' identified by 'test'"

5)启动

sh ./demo.sh

6)检查后端数据库节点状态 

进入管理端口(默认端口为4041 

mysql -uadmin -h 127.0.0.1 -P4041 -pOneProxy 

然后键入 

list backend;  

wKiom1X5JZLi7nawAAK7uWszmQg875.jpg

status这一栏为UP,表示集群正常。 

7)创建表 

登录OneProxy的转发端口 mysql-h -P3307 -utest –ptest

注意:端口3307需要打开

C:\Users\jing>mysql -h192.168.1.120 -P3307 -utest-ptest 

DDL语句:

CREATE TABLE `bigtable` (

`id` bigint(20) NOT NULL,

`start` datetime DEFAULT NULL,

`icol3` int(11) DEFAULT NULL COMMENT ' 1-10 ',

`icol4` int(11) DEFAULT NULL COMMENT ' 1-100 ',

`icol5` int(11) DEFAULT NULL COMMENT ' 1-1000 ',

`icol6` int(11) DEFAULT NULL,

`vcol7` varchar(20) DEFAULT NULL,

`vcol8` varchar(20) DEFAULT NULL,

`vcol9` varchar(30) DEFAULT NULL,

`vcol10` varchar(20) DEFAULT NULL,

 PRIMARY KEY (`id`) ) ;

执行这个语句,会看到报错: 

ERROR 1044 (42000): Access denied due to securitypolicy, DDL disabled or DML restricted!

解释:由于OneProxy为了安全起见,默认是禁止DDL语句的。

解决办法:从OneProxy管理端口,运行如下命令

C:\Users\jing>mysql -h192.168.1.120 -P4041-uadmin -pOneProxy -e "set gaccess data1:master-only"

C:\Users\jing>mysql -h192.168.1.120 -P4041-uadmin -pOneProxy -e "set gaccess data2:master-only"

再次登录到OneProxy的转发端口,运行DDL命令即可成功。

经过上面的步骤之后,256个表就在2个底层数据库中创建好了,分别为bigtable_0 , bigtable_1.....bigtable_255。

2、OneProxy测试

2.1、order by排序测试

2.1.1插入测试数据       

在redhat(192.168.1.128)主机下的test数据库下的表bigtable_0插入测试数据

wKiom1X45mPAsVB6AAThPli40A0671.jpg

在master(192.168.1.132)主机下的test数据库下的表bigtable_1插入测试数据

wKioL1X46ImQr1AVAAYLSo9FbRs941.jpg

测试排序结果

CMD下连接上vip地址

C:\Users\jing> mysql -h192.168.1.120 -P3307 -utest -ptest

2.1.2、没有使用oreder by排序的情况

使用order by排序的情况(使用id号进行排序):

wKioL1X46HujKWUHAAWZzph9BQ4698.jpg

id号是主键,不同的表有相同的id号也不会发生冲突

wKiom1X45iLgehVdAAaemsaS5JE279.jpg

2.1.3、使用order by排序的情况(使用icol3号进行排序)


wKioL1X46EyQTPW2AAW1T2JksCg477.jpg  

2.2、group by分组测试

wKiom1X45cHBGc7TAADQTvkDAMc977.jpg

2.3、已经建好的两个表,OneProxy实现并发查询

  已经建好的两个表(不通过OneProxy进行分库分表),OneProxy要实现并发查询,对表名的格式有要求,表名后缀必须以“_0”、“_1”……结尾。可以通过建立视图的方法(相当于给原来的表建立一个表别名)来解决这个问题。

测试过程:

1)在主机为192.168.1.128 apex_db库下,有一个表名为apex_tb,给表名apex_tb建立一个视图apex_tb_0, 

wKioL1X45-KhdboaAAFX380IS74383.jpg

2)在主机为192.168.1.132 apex_db库下,有一个表名为apex_tb,给表名apex_tb建立一个视图apex_tb_1

wKiom1X45ZvghtxmAAG27NjvBZM754.jpg

3)通过以上的操作OneProxy就可以并发查询已经建好的两个表(要求表结构相同)。2.4、存储过程测试结论:不支持存储过程

wKiom1X45XiAgek2AADxeteIY9A893.jpg

可以建立存储过程,但是不能用call进行调用。