`
han.zoo
  • 浏览: 26435 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

mysql proxy 连接池, 连接分发测试

阅读更多

mysql proxy 0.8.2

mysql :5.5.17

测试proxy最大连接设置为2时,3个连接执行SQL,连接共用,连接切换

 

 

 

服务器情况:
mysql server : host vms-005
mysql proxy: host vms-004

配置:
mysql proxy 连接池: min=1 max=2,只设置读写库proxy-backend-addresses,未设置只读slave

database两个:db1 & db2

 

测试1连接切换:

连接1 & 连接2

1、连接1登录
mysql -h192.168.110.90 -uops -p -Ddb1

MYSQL观察:

mysql> select * from information_schema.processlist where user='ops';
+--------+------+----------------------+------+---------+------+-------+------+
| ID     | USER | HOST                 | DB   | COMMAND | TIME | STATE | INFO |
+--------+------+----------------------+------+---------+------+-------+------+
| 503433 | ops  | 192.168.110.90:54247 | db1   | Sleep   |    3 |       | NULL |
+--------+------+----------------------+------+---------+------+-------+------+
1 row in set (0.00 sec)


2、连接2登录
mysql -h192.168.110.90 -P3306 -uops -p -Ddb2
MYSQL观察: 看到连接2把连接1的db修改
mysql> select * from information_schema.processlist where user='ops';
+--------+------+----------------------+------+---------+------+-------+------+
| ID     | USER | HOST                 | DB   | COMMAND | TIME | STATE | INFO |
+--------+------+----------------------+------+---------+------+-------+------+
| 503441 | ops  | 192.168.110.90:54255 | db2  | Sleep   |    3 |       | NULL |
| 503433 | ops  | 192.168.110.90:54247 | db2   | Sleep   |    3 |       | NULL |
+--------+------+----------------------+------+---------+------+-------+------+
2 rows in set (0.00 sec)



3、连接1查询
mysql> select * from tb1;
+----+-------+
| id | name  |
+----+-------+
|  1 | conn1 |
+----+-------+
1 row in set (0.00 sec)

MYSQL观察:这个查询说明proxy会记住db 并改回了db1
mysql> select * from information_schema.processlist where user='ops';
+--------+------+----------------------+------+---------+------+-------+------+
| ID     | USER | HOST                 | DB   | COMMAND | TIME | STATE | INFO |
+--------+------+----------------------+------+---------+------+-------+------+
| 503441 | ops  | 192.168.110.90:54255 | db2  | Sleep   |   30 |       | NULL |
| 503433 | ops  | 192.168.110.90:54247 | db1   | Sleep   |    2 |       | NULL |
+--------+------+----------------------+------+---------+------+-------+------+
2 rows in set (0.00 sec)


4、连接1设置为db2
mysql> use db2;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MYSQL观察: 两边同为db2 了
mysql> select * from information_schema.processlist where user='ops';
+--------+------+----------------------+------+---------+------+-------+------+
| ID     | USER | HOST                 | DB   | COMMAND | TIME | STATE | INFO |
+--------+------+----------------------+------+---------+------+-------+------+
| 503441 | ops  | 192.168.110.90:54255 | db2  | Sleep   |    3 |       | NULL |
| 503433 | ops  | 192.168.110.90:54247 | db2  | Sleep   |    3 |       | NULL |
+--------+------+----------------------+------+---------+------+-------+------+
2 rows in set (0.00 sec)



5\连接2设置为db1
mysql> use db1;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MYSQL观察: use db1 和select 不同,将2个process 都改为了db1
mysql> select * from information_schema.processlist where user='ops';
+--------+------+----------------------+------+---------+------+-------+------+
| ID     | USER | HOST                 | DB   | COMMAND | TIME | STATE | INFO |
+--------+------+----------------------+------+---------+------+-------+------+
| 503441 | ops  | 192.168.110.90:54255 | db1   | Sleep   |    2 |       | NULL |
| 503433 | ops  | 192.168.110.90:54247 | db1   | Sleep   |    2 |       | NULL |
+--------+------+----------------------+------+---------+------+-------+------+
2 rows in set (0.00 sec)

 

 

--分隔--------------------------------------------------------------------------------------------------------------------------------------------

 

测试2事务:
从proxy 开始三个连接: 1连接db1, 2连接db2, 3连接db1
从mysql server 登录观察连接情况

注意:我们proxy最大连接设置为2
mysql server : set global general_log=on;


步骤
1、连接1登录db1
mysql -h192.168.110.90 -P3306 -uops -p123 -Ddb1
2、连接2登录db2
mysql -h192.168.110.90 -P3306 -uops -p123 -Ddb2
3、连接3登录db1
mysql -h192.168.110.90 -P3306 -uops -p123 -Ddb1

4、从mysql端看连接
mysql> select * from information_schema.PROCESSLIST where USER='ops';
+--------+------+----------------------+------+---------+------+-------+------+
| ID     | USER | HOST                 | DB   | COMMAND | TIME | STATE | INFO |
+--------+------+----------------------+------+---------+------+-------+------+
| 465633 | ops  | 192.168.110.90:60239 | db1  | Sleep   |    7 |       | NULL |
| 465622 | ops  | 192.168.110.90:60228 | db1  | Sleep   |    7 |       | NULL |
+--------+------+----------------------+------+---------+------+-------+------+
2 rows in set (0.00 sec)
可以看到三个连接登录成功,后端产生两个连接。
注意:连接的DB均为db1,也就是proxy将所有的连接改为了,最后一次登录的DB1

5、连接1查看自己的进程ID
mysql> status;
--------------
mysql  Ver 14.14 Distrib 5.1.41, for pc-linux-gnu (i686) using readline 5.1

Connection id:        465622
...略...................


6、连接2查看自己的进程ID
mysql> status;
--------------
mysql  Ver 14.14 Distrib 5.1.41, for pc-linux-gnu (i686) using readline 5.1

Connection id:        465633

...略...................

7、连接3查看自己的进程ID
mysql> status;
--------------
mysql  Ver 14.14 Distrib 5.1.41, for pc-linux-gnu (i686) using readline 5.1

Connection id:        465633

 

8、连接1在DB1建表,并插入1条记录
mysql> CREATE TABLE `tb1` (
    ->   `id` int(11) DEFAULT NULL,
    ->   `name` varchar(32) DEFAULT NULL,
    -> primary key (id)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.01 sec)


mysql> insert into tb1 values(1,'con1');
Query OK, 1 row affected (0.00 sec)


9、连接2在DB2建表,并插入1条记录
mysql> CREATE TABLE `tb2` (
    ->   `id` int(11) DEFAULT NULL,
    ->   `name` varchar(32) DEFAULT NULL,
    -> primary key (id)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.01 sec)

mysql> insert into tb2 values(1,'a');
Query OK, 1 row affected (0.00 sec)


10、再次观察三个连接的进程ID,没有变化!

11、从这里开始很关键,我要进行的操作是在连接3上进行两条SQL
use db2 和 select * from tb2

在执行第一句use db2 时,连接3会用连接2的进程,但是执行完这一句后不立即执行第二句。 而是在连接2中用for update 锁住记录,目的是让执行的第二句SQL进行连接进程切换,

 

我们期望切换到连接1的进程中执行.我们知道连接1是连接着db1的,如果连接3的进程切换没有将DB信息带给连接1。则会报连接1的db1中没有tb2表.(但实时并非预期,后面会有说明)


连接3、
mysql> use db2;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed


连接2、
mysql> select * from tb2 where id=1 for update;
+----+------+
| id | name |
+----+------+
|  1 | a    |
+----+------+
1 row in set (0.00 sec)


连接3、
mysql> select * from tb2 where id=1;
ERROR 2013 (HY000): Lost connection to MySQL server during query
mysql> select * from tb2 where id=1;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    477951
Current database: db2

+----+-------+
| id | name  |
+----+-------+
|  1 | a     |
+----+-------+
1 row in set (0.00 sec)


我们看到连接3并没有通过proxy连接切换到连接1。
而是直接报错返回。
等重新执行相同SQL时重新建立了连接
477951
并且记住了上次连接的DB1
也突破了proxy的设置max=2

这里连接正确的将DB信息带到了其他连接中。重复执行了多次,均正常.

分享到:
评论

相关推荐

    mysql高并发解决方案

    首先,我们要理解在PHP和MySQL环境中,高并发可能导致的问题,如数据库连接池过载、SQL查询效率低下、数据一致性问题等。以下是一些关键的解决方案: 1. **数据库优化**:对SQL语句进行优化,避免全表扫描,合理...

    rdms-proxy.rar

    源代码可能会使用各种编程语言如Java、Python或Golang编写,其中可能包含了数据库连接池、查询处理、事务管理等相关模块。配置文件则会定义服务运行参数,如端口号、数据库连接信息、日志级别等。 总的来说,"rdms-...

    mysql读写分离实现可用.pdf

    应用程序Client(如基于c3p0的连接池)的所有写操作将自动路由到Master,而读操作会被分发到Slave。这样,即使在高并发的情况下,也能有效平衡数据库负载,提升系统整体性能。 需要注意的是,虽然读写分离能提高...

    MySQL读写分离

    - min-idle-connections参数设置连接池的最小空闲连接数,推荐为event-threads整倍数。 - instance参数允许在同一台机器上运行多个Atlas实例,但每个实例需要使用不同的端口和配置文件。 - 默认情况下,Atlas会...

    Amoeba-art.pdf

    - **连接池**:没有专门的连接池概念,每个客户端连接独立对应后端MySQL的一个连接。 - **技术支持**:主要依靠官方论坛等社区支持。 - **多核多CPU支持**:虽然支持多核环境,但在实际使用中可能无法充分利用多核或...

    mysql mycat 中间件安装与使用

    MyCAT的主要功能是作为数据库连接池,提高数据库系统的并发处理能力和负载均衡能力。相比于MySQL Proxy,MyCAT在性能上更优,能更好地处理大规模数据和高并发场景。 MyCAT的安装步骤如下: 1. 从官方网站...

    简单了解mysql mycat 中间件

    1. 数据库连接池:MyCat 可以被视为一个数据库连接池,它管理和优化数据库连接,提高数据库访问效率。相比 MySQL Proxy,MyCat 在性能和功能上更胜一筹。 2. 分布式数据库:MyCat 允许我们将数据分布到多个数据库...

    构建基于LAMP的网站架构.pptx

    4. **DB连接池**:MySQL Proxy用于解决并发连接数和读写分离。 5. **关系数据库**:常用MySQL,提供双主多从架构以保证冗余和高可用性。 6. **NoSQL**:如MongoDB、Cassandra等,适用于非结构化数据存储。 7. **...

    Nginx模块开发与架构解析

    此外,书中还会涉及Nginx与其他技术的集成,如与PHP-FPM的配合实现动态内容处理,或者与MySQL的连接池配合提高数据库访问效率。同时,对于安全性和日志记录等运维方面也会有详细的讲解,帮助读者全面掌握Nginx在实际...

    7-2+BIGO海量数据的Ad-Hoc分析实践与改进.pdf

    此外,Presto Proxy的工作原理是接收客户端请求,通过内部的MySQL连接池与各个Presto集群通信,根据查询ID和集群信息将查询路由到适当的Presto实例。这种方式提高了查询的并发性和系统的整体可用性。 通过这些改进...

    Nginx负责均衡

    Nginx不仅可以分发流量,减轻单个服务器的压力,还可以通过健康检查等功能动态调整服务器池,而MySQL的数据同步则确保了数据的一致性,即使在故障情况下也能快速恢复服务。这种结合使用的方式在大型网站和企业级应用...

    构建基于LAMP的网站架构

    - **DB连接池**:通过MySQLProxy等工具管理数据库连接,减少建立新连接的时间。 - **内容检索服务器**:使用Shpinx、Xapian等工具来加速数据检索过程。 - **防攻击系统**:实施防护措施抵御DDoS攻击、慢连接等威胁。...

    NGINX负载均衡安装配置手册范本.doc

    常见的四层负载均衡器有LVS,而七层负载均衡器包括haproxy和MySQL Proxy。某些硬件设备如F5和Alteon同时支持四层和七层负载均衡,性能上可能优于软件解决方案。 **技术原理** 四层负载均衡器在接收到客户端的TCP ...

    Tomcat与Java_Web开发技术详解2

    - **连接池技术**:使用C3P0或HikariCP等连接池组件来管理数据库连接,提高性能和稳定性。 #### 四、Tomcat高级功能 - **集群部署**: - 随着访问量的增加,单一Tomcat实例可能无法满足需求。通过集群部署,可以...

    林子雨大数据技术原理及应用第六章课后作业答案.docx

    2. 读写分离:读写操作分别由主库和从库处理,Proxy服务器自动识别并分发SQL语句,提高系统负载均衡。 3. 分库分表(Sharding):用户可以指定分库分表规则,通过特定字段将数据分布到多个实例,实现水平扩展。 4....

    agent-sql-2.1.6.jar.zip

    例如,它可能提供了SQL语句的自动改写、缓存策略、连接池管理等功能。在"agent-sql-2.1.6.jar.zip"中,这个SQL代理可能具有特定版本的特性,例如错误修复、性能提升或新功能的引入。 版本号"2.1.6"提示我们这是该...

    Liferay集群负载均衡配置

    - **软件负载均衡器**:如Nginx、HAProxy或Apache mod_proxy_balancer,它们是开源且灵活的解决方案,可以根据需求进行配置。 负载均衡器的配置主要包括以下策略: - **轮询(Round Robin)**:最简单的策略,按...

    运维流程文档

    - 增加`maxProcessors`和`acceptCount`的值以扩大连接池大小。 - 调整`minProcessors`参数确保有足够的线程处于空闲状态。 ### 结语 本文详细介绍了一名新入职运维人员从初识公司IT环境到最终掌握复杂运维技能的...

Global site tag (gtag.js) - Google Analytics