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信息带到了其他连接中。重复执行了多次,均正常.
分享到:
相关推荐
首先,我们要理解在PHP和MySQL环境中,高并发可能导致的问题,如数据库连接池过载、SQL查询效率低下、数据一致性问题等。以下是一些关键的解决方案: 1. **数据库优化**:对SQL语句进行优化,避免全表扫描,合理...
源代码可能会使用各种编程语言如Java、Python或Golang编写,其中可能包含了数据库连接池、查询处理、事务管理等相关模块。配置文件则会定义服务运行参数,如端口号、数据库连接信息、日志级别等。 总的来说,"rdms-...
应用程序Client(如基于c3p0的连接池)的所有写操作将自动路由到Master,而读操作会被分发到Slave。这样,即使在高并发的情况下,也能有效平衡数据库负载,提升系统整体性能。 需要注意的是,虽然读写分离能提高...
- min-idle-connections参数设置连接池的最小空闲连接数,推荐为event-threads整倍数。 - instance参数允许在同一台机器上运行多个Atlas实例,但每个实例需要使用不同的端口和配置文件。 - 默认情况下,Atlas会...
- **连接池**:没有专门的连接池概念,每个客户端连接独立对应后端MySQL的一个连接。 - **技术支持**:主要依靠官方论坛等社区支持。 - **多核多CPU支持**:虽然支持多核环境,但在实际使用中可能无法充分利用多核或...
MyCAT的主要功能是作为数据库连接池,提高数据库系统的并发处理能力和负载均衡能力。相比于MySQL Proxy,MyCAT在性能上更优,能更好地处理大规模数据和高并发场景。 MyCAT的安装步骤如下: 1. 从官方网站...
1. 数据库连接池:MyCat 可以被视为一个数据库连接池,它管理和优化数据库连接,提高数据库访问效率。相比 MySQL Proxy,MyCat 在性能和功能上更胜一筹。 2. 分布式数据库:MyCat 允许我们将数据分布到多个数据库...
4. **DB连接池**:MySQL Proxy用于解决并发连接数和读写分离。 5. **关系数据库**:常用MySQL,提供双主多从架构以保证冗余和高可用性。 6. **NoSQL**:如MongoDB、Cassandra等,适用于非结构化数据存储。 7. **...
此外,书中还会涉及Nginx与其他技术的集成,如与PHP-FPM的配合实现动态内容处理,或者与MySQL的连接池配合提高数据库访问效率。同时,对于安全性和日志记录等运维方面也会有详细的讲解,帮助读者全面掌握Nginx在实际...
此外,Presto Proxy的工作原理是接收客户端请求,通过内部的MySQL连接池与各个Presto集群通信,根据查询ID和集群信息将查询路由到适当的Presto实例。这种方式提高了查询的并发性和系统的整体可用性。 通过这些改进...
Nginx不仅可以分发流量,减轻单个服务器的压力,还可以通过健康检查等功能动态调整服务器池,而MySQL的数据同步则确保了数据的一致性,即使在故障情况下也能快速恢复服务。这种结合使用的方式在大型网站和企业级应用...
- **DB连接池**:通过MySQLProxy等工具管理数据库连接,减少建立新连接的时间。 - **内容检索服务器**:使用Shpinx、Xapian等工具来加速数据检索过程。 - **防攻击系统**:实施防护措施抵御DDoS攻击、慢连接等威胁。...
常见的四层负载均衡器有LVS,而七层负载均衡器包括haproxy和MySQL Proxy。某些硬件设备如F5和Alteon同时支持四层和七层负载均衡,性能上可能优于软件解决方案。 **技术原理** 四层负载均衡器在接收到客户端的TCP ...
- **连接池技术**:使用C3P0或HikariCP等连接池组件来管理数据库连接,提高性能和稳定性。 #### 四、Tomcat高级功能 - **集群部署**: - 随着访问量的增加,单一Tomcat实例可能无法满足需求。通过集群部署,可以...
2. 读写分离:读写操作分别由主库和从库处理,Proxy服务器自动识别并分发SQL语句,提高系统负载均衡。 3. 分库分表(Sharding):用户可以指定分库分表规则,通过特定字段将数据分布到多个实例,实现水平扩展。 4....
例如,它可能提供了SQL语句的自动改写、缓存策略、连接池管理等功能。在"agent-sql-2.1.6.jar.zip"中,这个SQL代理可能具有特定版本的特性,例如错误修复、性能提升或新功能的引入。 版本号"2.1.6"提示我们这是该...
- **软件负载均衡器**:如Nginx、HAProxy或Apache mod_proxy_balancer,它们是开源且灵活的解决方案,可以根据需求进行配置。 负载均衡器的配置主要包括以下策略: - **轮询(Round Robin)**:最简单的策略,按...
- 增加`maxProcessors`和`acceptCount`的值以扩大连接池大小。 - 调整`minProcessors`参数确保有足够的线程处于空闲状态。 ### 结语 本文详细介绍了一名新入职运维人员从初识公司IT环境到最终掌握复杂运维技能的...