MaxScale初探
内容预览:
1、MaxScale简介
2、MaxScale安装
3、MaxScale配置
4、MaxScale简单测试
5、MaxScale Debug Interface和CLI
6、MaxScale调试
7、可用资源
(文中图片普遍偏小,请点击看高清大图)
1、MaxScale简介
项目地址:https://github.com/skysql/MaxScale/
MaxScale是由http://www.skysql.com/开发的一款MySQL数据库中间件。
MaxScale是什么(摘自Github/MaxScale):
The SkySQL MaxScale is an intelligent proxy that allows forwarding of
database statements to one or more database servers using complex rules,
a semantic understanding of the database statements and the roles of
the various servers within the backend cluster of databases. MaxScale is designed to provide load balancing and high availability
functionality transparantly to the applications. In addition it provides
a highly scalable and flexibile architecture, with plugin components to
support different protocols and routing decissions. MaxScale is implemented in C and makes entensive use of the
asynchronous I/O capabilities of the Linux operating system. The epoll
system is used to provide the event driven framework for the input and
output via sockets.
简单的说就是:MaxScale是一个支持高可用,负载均衡,具有良好的可扩展性,高性能的基于事件驱动的同时具有代理和管理功能的中间件。
Architecture:
如图所示,MaxScale由以下几个模块组成:
Protocol,Router,Monitor,Authentication,Filter and logging.
MaxScale运行在clinet与server之间,起到一个”Exchange”的作用.
需要知道的是:client并不会直接与server建立连接,而是通过MaxScale来做连接创建和数据交换,MaxScale接收client的请求,经过(或不经过)Filter处理当前的Request,然后通过Router将client发送的request发送到后端server,server返回的数据经过(或不经过)处理之后再返回给client。MaxScale同时维护client请求的连接和到server的连接。
Client与Server、MaxScale之间的关系如图:
1)Protocol:分为client protocol和back-end protocol.
client目前尽支持MySQL以及MariaDB,
back-end目前支持以下几种类型的后端集群:
MySQL Replication
MariaDB Replication
Galera Cluster on both MySQL and MariaDB
MySQL Server with NDB storage engine
2)Router:Connection-based Routing和Statement-based Routing.
Connection-based
Routing:client连接到maxscale之后,会为该client维护一个路由,同一个连接会始终通过这条路由,并且不检查当前连接下的产生
的不同的请求,该路由一旦创建便会一直存在直到客户端连接断开。适合读请求和写请求使用不同的连接的场景。
Statement-based Routing:对同一个连接产生的不同的请求动态的路由到一个或多个后端的数据库做处理。此类型路由可使得应用程序端操作非常简单,读写分离以及负载均衡均对应用透明。
当MaxScale发现一个正在被客户端使用的连接在连接到后端server时发生错误导致连接失败的时候,MaxScale会自动重建一个到后端server的新的连接用来代替失效的连接,使得让客户端无感。
3)Authentication:
MaxScale
用从后端服务器获取到的user表作为客户端授权的依据,为了能验证用户连接,MaxScale从后端数据库中读取mysql.user表信息,并将此用
户信息缓存在MaxScale端,当用户连接进来会根据缓存的信息判断是否通过验证,如果当前缓存无此用户,会从后端数据库中更新用户信息,并作验证。
4)Filter & Logging:
Filter可比作database-level firewall,它可用于对某些特殊statement进行过滤或者Rewrite。适用于简单类型的语句容错,以及语句的自动转换。
Rewrite:
Fault Tolerance:
5)Monitor:
用于对后端数据库池的实时监控,目前只支持MySQL master/slave replication和Galera cluster。
2、MaxScale安装
安装准备工作
测试环境准备:
CentOS 6.5 x86_64:172.16.238.128 Master MySQL-5.6.19
CentOS 6.5 x86_64:172.16.238.129 Slave MySQL-5.6.19
CentOS 6.5 x86_64:172.16.238.130 Slave MySQL-5.6.19
CentOS 6.5 x86_64:172.16.238.131 Slave MySQL-5.6.19
CentOS 6.5 x86_64:172.16.238.132 MaxScale
配置好主从,并开启半同步。
安装包下载地址:
Binary package:https://downloads.skysql.com/files/SkySQL/MaxScale
Source package:http://github.com/skysql/MaxScale
从binary包安装
1)解压:
tar -zxvf maxscale.1.0.0-beta.tar.gz
2)将解压的文件夹拷贝到安装目录即可:
mv maxscale-1.0.0-beta /usr/local/maxscale
3)maxscale程序启动需要读取两个环境变量MAXSCALE_HOME和LD_LIBRARY_PATH
export MAXSCALE_HOME=/usr/local/maxscale
export LD_LIBRARY_PATH=/usr/local/maxscale/lib
如果需要永久生效还需将这两行添加到profile或者.bashrc
4)拷贝MySQL配置文件 my.cnf 到 $MAXSCALE_HOME/mysql/.
cp /etc/my.cnf /usr/local/maxscale/mysql/my.cnf
5)拷贝默认配置文件
cd /usr/local/maxscale/etc/
cp MaxScale_template.cnf MaxScale.cnf
默认配置使用了3000,3001,3002三个mysql监听端口,根据实际情况修改即可。
6)启动maxscale
MaxScale默认会根据$MAXSCALE_HOME变量从$MAXSCALE_HOME/etc目录中查找配置文件MaxScale.cnf。
如果变量$MAXSCALE_HOME没有设置,则查找/etc/MaxScale.cnf文件。
以下三种启动方式均可:
export MAXSCALE_HOME=/usr/local/maxscale
/usr/local/maxscale/bin/maxscale
或者
/usr/local/maxscale/bin/maxscale -c /usr/local/maxscale/
或者
/usr/local/maxscale/bin/maxscale -f /usr/local/maxscale/etc/MaxScale.cnf
从源码安装
作者原文:https://groups.google.com/forum/#!topic/maxscale/1NA_0Ni58X4
下文根据实际情况有所修改:
1)获取源码原文:
我不用git工具下载,而是直接从Github获取源码zip包
wget https://github.com/skysql/MaxScale/archive/master.zip -O MaxScale-src-1.0.zip
2)配置MariaDB安装源(由于只用于编译maxscale故不用安装MariaDB-server)
vi /etc/yum.repos.d/mariadb.repo
写入 :
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/5.5/centos6-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
保存退出。
3)安装MariaDB-devel
(请直接安装mariadb-devel,没必要尝试mysql-devel,因为,我尝试过了,原因,你试试就知道)
yum install MariaDB-devel
如果网络不给力就直接下载rpm包(比如我)
wget https://downloads.skysql.com/files/MariaDB/yum/5.5/centos6-amd64/rpms/MariaDB-5.5.38-centos6-x86_64-devel.rpm
如果安装过程中发现提示冲突,那是因为已有mysql相关的包,请直接卸载即可rpm -e 或者yum remove。
4)安装编译MaxScale所需必要依赖:
yum -y install make gcc gcc-c++ ncurses-devel bison glibc-devel openssl-devel libaio-devel telnet
5)修改源码包中的配置文件
unzip MaxScale-src-1.0.zip
cd /root/MaxScale-master/
vi 修改根目录下 build_gateway.inc 文件中以下几项
ROOT_PATH := $(HOME)/MaxScale-master (此处需注意,$HOME指的是当前用户环境变量HOME,我用root运行,解压后文件夹为/root/MaxScale-master,如果是其他位置直接用绝对路径)
INC_PATH := /usr/include
MYSQL_ROOT := $(INC_PATH)/mysql
EMBEDDED_LIB := /usr/lib64 (mariadb-devel安装后libmysqld.a在这个目录下)
ERRMSG := /usr/share/mysql/english
保存退出
6)开始编译
make depend
make all
make DEST=/usr/local/maxscale/ install
7)拷贝启动脚本和配置文件
cp etc/init.d/maxscale /etc/init.d/
cp etc/MaxScale_template.cnf /usr/local/maxscale/etc/MaxScale.cnf
8)maxscale程序启动需要读取两个环境变量MAXSCALE_HOME和LD_LIBRARY_PATH
export MAXSCALE_HOME=/usr/local/maxscale
export LD_LIBRARY_PATH=/usr/local/maxscale/lib
如果需要永久生效还需将这两行添加到profile或者.bashrc
9)这时启动maxscale和binary安装方式类似,也可以使用service maxscale start启动
可以任选一种方式安装使用,安装完成后各个文件位置如下图:
需要注意的就是etc目录下的passwd文件是在debug interface创建用户之后自动生成的。
3、MaxScale配置和启动
针对各项配置详细解读请看安装包里面的文档MaxScale Configuration And Usage Scenarios.pdf
配置文件主要结构如下图所示:
1)详细配置如下:
配置文件为/usr/local/maxscale/etc/MaxScale.cnf
grep -v "^#" /usr/local/maxscale/etc/MaxScale.cnf | grep -v "^$"
[maxscale]
threads=1
[MySQL Monitor]
type=monitor
module=mysqlmon
servers=server1,server2,server3,server4
user=maxmonuser
passwd=C891A19D7EFAF3B59AF7948E5AE3B998
[RW Split Router]
type=service
router=readwritesplit
servers=server1,server2,server3,server4
max_slave_replication_lag=5
user=maxuser
passwd=A71E58147EBD73986D3D074E80F00DB9
[Read Connection Router]
type=service
router=readconnroute
router_options=slave
servers=server1,server2,server3,server3
user=maxuser
passwd=A71E58147EBD73986D3D074E80F00DB9
[HTTPD Router]
type=service
router=testroute
servers=server1,server2,server3,server4
[Debug Interface]
type=service
router=debugcli
servers=server1
[CLI]
type=service
router=cli
[RW Split Listener]
type=listener
service=RW Split Router
protocol=MySQLClient
port=4006
enable_root_user=1
[Read Connection Listener]
type=listener
service=Read Connection Router
protocol=MySQLClient
port=4008
enable_root_user=1
[Debug Listener]
type=listener
service=Debug Interface
protocol=telnetd
port=4442
address=127.0.0.1
[HTTPD Listener]
type=listener
service=HTTPD Router
protocol=HTTPD
port=6444
[CLI Listener]
type=listener
service=CLI
protocol=maxscaled
address=127.0.0.1
port=6603
[server1]
type=server
address=172.16.238.128
port=3306
protocol=MySQLBackend
[server2]
type=server
address=172.16.238.129
port=3306
protocol=MySQLBackend
[server3]
type=server
address=172.16.238.130
port=3306
protocol=MySQLBackend
[server4]
type=server
address=172.16.238.131
port=3306
protocol=MySQLBackend
2)配置里面用到的user需要在后端的各个mysql server里面建立用户并授权。
create user 'maxuser'@'172.16.238.132' identified by 'maxpwd';
grant SELECT on mysql.user to 'maxuser'@'172.16.238.132';
maxmonuser用于监控后端服务器状态
create user 'maxmonuser'@'172.16.238.132' identified by 'maxmonpwd';
grant REPLICATION SLAVE on *.* to 'maxmonuser'@'172.16.238.132';
grant REPLICATION CLIENT on *.* to 'maxmonuser'@'172.16.238.132';
另 外新建一个maxscale用于测试,此用户不在配置文件中,且尽量不用root用户,因为maxscale默认不允许root连接后端数据库,需要在管 理界面enable root “some service” 才能开放root登录,目前maxscale还不支持类似172.16.238.%以%作模糊匹配的主机地址,会报错
create user 'maxscale'@'%' identified by 'maxscalepass';
grant ALL PRIVILEGES on *.* to 'maxscale'@'172.16.238.132';
为了使得配置文件中不以明文方式存放密码,maxscale自带了加密工具用于获取加密后的字符串,maxscale在读取加密字符串之后会自动解密。
进入/usr/local/maxscale/bin/目录
./maxkeys $MAXSCALE_HOME/etc/.secrets
加密maxuser密码
./maxpasswd maxpwd
A71E58147EBD73986D3D074E80F00DB9
加密maxmonuser密码
./maxpasswd maxmonpwd
C891A19D7EFAF3B59AF7948E5AE3B998
至此,MaxScale配置完成,现在启动MaxScale。
3)启动MaxScale
[root@db132 bin]# /usr/local/maxscale/bin/maxscale
SkySQL MaxScale 0.7.0 Mon Jun 30 23:03:54 2014
——————————————————
Info : MaxScale will be run in a daemon process.
See the log from the following log files :
Error log : /usr/local/maxscale/log/skygw_err1.log
Message log : /usr/local/maxscale/log/skygw_msg1.log
Trace log : /usr/local/maxscale/log/skygw_trace1.log
Debug log : /usr/local/maxscale/log/skygw_debug1.log
Listening MySQL connections at 0.0.0.0:4006
Listening MySQL connections at 0.0.0.0:4008
Listening http connections at 0.0.0.0:6444
Listening telnet connections at 127.0.0.1:4442
或直接启动服务
[root@db132 ~]# service maxscale start
Starting MaxScale: maxscale (pid 54649) is running… [ OK ]
启动服务后,观察启动日志:
1.0beta版还会加载libmaxscaled.so模块。
4、MaxScale简单测试
1)连接测试,通过maxscale监听的端口4006或者4008连接后端数据库,默认会route到master
[root@db132 bin]# mysql -umaxscale -pmaxscalepass -h172.16.238.132 -P4006
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6385
Server version: 5.5.35-MariaDB MySQL Community Server (GPL)
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.
mysql>
准备工作:
创建一个库d,并简单的表t,并在每个server中开启general log。
2)测试查询
mysqlslap -umaxscale -pmaxscalepass -h172.16.238.132 -P4006 \
--create-schema=d --query=select.sql \
--concurrency=6 --number-of-queries 1 --iterations=1 --debug-info
查询语句:
cat select.sql
select * from t;
select * from t;
select * from t;
执行结果:
可以看到查询被均匀的路由到三个从库。
3)测试插入
mysqlslap -umaxscale -pmaxscalepass -h172.16.238.132 -P4006 \
--create-schema=d --query=insert.sql \
--concurrency=1 --number-of-queries 4 --iterations=1 --debug-info
cat insert.sql
insert into t values(20,'x');
insert into t values(30,'xx');
insert into t values(40,'xxx');
insert into t values(50,'xxxx');
执行结果:
可以看到,主库接收了所有写操作,并且全部同步到了从库,从库可看到更新操作记录。
4)测试更新
mysqlslap -umaxscale -pmaxscalepass -h172.16.238.132 -P4006 \
--create-schema=d --query=update.sql \
--concurrency=1 --number-of-queries 1 --iterations=1 --debug-info
cat update.sql
update t set str='yy' where id=2;
执行结果:
同样,更新操作的操作记录跟插入类似,主库上执行,然后同步到从库。
5)测试事务
[root@db129 mysql]# mysql -umaxscale -pmaxscalepass -h172.16.238.132 -P4006
测试两次事务操作,一次提交,一次不提交。
mysql> begin;
mysql> select * from t where id=1 for update;
mysql> update t set str='zz' where id=1;
mysql> \q
mysql> begin;
mysql> select * from t where id=1 for update;
mysql> update t set str='zz' where id=1;
mysql> commit;
mysql> \q
执行结果:
可以看到,第一次开启事务,执行操作,不提交,在主库上看到更新操作记录,从库无记录,第二次开始事务并提交,从库会更新生效的一条记录。
读写测试基本完成,目前未发现任何问题,还需在物理机上测试看看高并发下的处理能力。
maxscale对每个后端server作定期检查,检查的时间间隔由参数monitor_interval控制,默认10000ms。
MaxScale会根据语句类型作路由,在trace日志中可以看到如下记录:
5、MaxScale Debug Interface 和 CLI
前面的配置中可以看到,定义了一个Debug Interface和一个CLI service,MaxScale可以通过telnet连接到Debug Interface进行一系列的管理操作,同时也可以通过CLI做相关操作。
Debug Interface
1)使用telnet登录管理界面:
#telnet 127.0.0.1 4442
默认用户名是admin,密码是skysql
可以使用add user username password 覆盖默认的用户名密码
使用show users可以看到当前的所有用户
2)控制monitor
monitor可以定义多个,如果需要停用monitor可以使用shutdown命令。
show,shutdown,restart monitor
3)控制service
maxscale可以同时开启多个Router并监听端口,如果需要关闭其中某个类型的router,可以使用shutdown命令,重新启用使用restart命令。(下图重启失败,应该是bug,尝试多次)
show,shutdown,restart service
4)控制server
如果需要临时对某个主机进行维护,可以设置server为maintenance状态,maxscale将不会再派发请求到该server,维护完成后,清楚此状态即可。
show,set,clear server
5)控制log
enable启用
disable停用
MaxScale> enable log debug
MaxScale> enable log trace
6)停机维护
对于service down的mysql服务器,可以手动设置维护模式,以不影响其他server,但是mascale会不停的探测该server是否重新运行。
server down之后master会发出如下两种提示,设置maintenance之后err信息将停止。
#msg
Jul 8 23:06:02 db132 MaxScale[53927]: Backend server 172.16.238.131:3306 state : NO STATUS
#err
Jul 8 23:06:12 db132 MaxScale[53927]: Error : Monitor was unable to connect to server 172.16.238.131:3306 : "Can't connect to MySQL server on '172.16.238.131' (111)"
其他命令可自由发挥。
CLI(1.0beta)
CLI模式即可以在shell中直接使用maxadmin工具查看maxscale的状态,需要配置CLI 以及 CLI Listener两个Section。
可能你要问这个工具跟debug interface有什么区别?
区别就在于跟交互式的debug interface相比,maxadmin可以用于监控任何一个需要监控的对象,servers,service,dcbs,sessions,users等等。你可以把要检查的内容列出来像写shell脚本那样写入脚本中一起执行。
6、MaxScale调试模式
maxscale支持debug模式
#gdb maxscale
(gdb) run --d
此时ctl+c即可进入调试模式,可以调用一些function。
call printAllServers()
call printAllSessions()
call printServer(xxx)和call printSession(xxx)
结果跟debug interface和maxadmin输出结果一样。
MaxScale里面还有一个很重要的概念,那就是DCB(Descriptor Control Block )
一 个DCB(Descriptor Control Block)表示一个在MaxScale内部的连接的状态,每个来自client的连接、到后端server的连接、以及每个listener都会被分配 一个DCB,这些连接的状态统计由这些DCB来完成。每个DCB并不会有特定的名字用于查询,而是直接使用具有唯一性的内存地址。
一个DCB的生命周期:
同样可以通过Debug Interface查看DCB相关信息:
压测的时候可以看到DCB状态变化:
7、可用资源
几个非常直观的介绍:
http://www.slideshare.net/izoratti/140116-max-scale-for-effectivemysql
http://www.slideshare.net/skysql/maxscale-the-pluggibale-router-mariadb-roadshow-2014-paris
http://www.slideshare.net/skysql/maxscale-the-pluggable-router-36239961
http://files.meetup.com/107604/MaxScale_Overview_DBA_Hangout20140122.pdf
https://mariadb.com/resources/maxscale(Demo)
较老版本的一个安装配置文档:
http://www.skysql.com/blogs/anderskarlsson/maxscale-rest-us-part-1
http://www.skysql.com/blogs/anderskarlsson/maxscale-rest-us-part-2
http://www.skysql.com/blogs/anderskarlsson/maxscale-rest-us-part-3
http://www.skysql.com/blogs/anderskarlsson/maxscale-rest-us-part-4
Google Group:https://groups.google.com/forum/#!forum/maxscale
Bug Report:http://bugs.skysql.com/enter_bug.cgi?product=Maxscale
以及安装包里自带的非常有用的几个Document:
Documentation/
├── Debug And Diagnostic Support.pdf
├── filters
│ ├── QLA Filter.pdf
│ ├── Regex Filter.pdf
│ ├── Tee Filter.pdf
│ └── Top Filter.pdf
├── history
│ ├── MaxScale 0.5 Release Notes.pdf
│ ├── MaxScale 0.6 Release Notes.pdf
│ └── MaxScale 0.7 Release Notes.pdf
├── internal
│ └── DCB states.pdf
├── MaxAdmin The MaxScale Administration And Monitoring Client.pdf
├── MaxScale 1.0beta Release Notes.pdf
├── MaxScale Configuration And Usage Scenarios.pdf
└── MaxScale HA with Corosync and Pacemaker.pdf
Coming Soon:
MaxScale结合MHA
MaxScale结合Pacemaker+Corosync
更详细的测试(Filter)
压力测试
以上内容完全基于本人理解得来,如有理解有误的地方还请指出,以便及时改正。
部分bug已通过Google Group反馈给该软件的作者,当前的各个版本,包括最新版1.0beta版仍存在很多运行不顺畅的地方,所以遇到问题,要从多方面去考虑,去排查,如果能确定是bug,直接反馈就可以了。
本文出自 “张跃的部落格” 博客,请务必保留此出处http://mrcto.blog.51cto.com/1923168/1437287
MaxScale初探的更多相关文章
- 初探领域驱动设计(2)Repository在DDD中的应用
概述 上一篇我们算是粗略的介绍了一下DDD,我们提到了实体.值类型和领域服务,也稍微讲到了DDD中的分层结构.但这只能算是一个很简单的介绍,并且我们在上篇的末尾还留下了一些问题,其中大家讨论比较多的, ...
- CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探
CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码 ...
- 从273二手车的M站点初探js模块化编程
前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数 ...
- JavaScript学习(一) —— 环境搭建与JavaScript初探
1.开发环境搭建 本系列教程的开发工具,我们采用HBuilder. 可以去网上下载最新的版本,然后解压一下就能直接用了.学习JavaScript,环境搭建是非常简单的,或者说,只要你有一个浏览器,一个 ...
- .NET文件并发与RabbitMQ(初探RabbitMQ)
本文版权归博客园和作者吴双本人共同所有.欢迎转载,转载和爬虫请注明原文地址:http://www.cnblogs.com/tdws/p/5860668.html 想必MQ这两个字母对于各位前辈们和老司 ...
- React Native初探
前言 很久之前就想研究React Native了,但是一直没有落地的机会,我一直认为一个技术要有落地的场景才有研究的意义,刚好最近迎来了新的APP,在可控的范围内,我们可以在上面做任何想做的事情. P ...
- 【手把手教你全文检索】Apache Lucene初探
PS: 苦学一周全文检索,由原来的搜索小白,到初次涉猎,感觉每门技术都博大精深,其中精髓亦是不可一日而语.那小博猪就简单介绍一下这一周的学习历程,仅供各位程序猿们参考,这其中不涉及任何私密话题,因此也 ...
- Key/Value之王Memcached初探:三、Memcached解决Session的分布式存储场景的应用
一.高可用的Session服务器场景简介 1.1 应用服务器的无状态特性 应用层服务器(这里一般指Web服务器)处理网站应用的业务逻辑,应用的一个最显著的特点是:应用的无状态性. PS:提到无状态特性 ...
- NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例
一.消息队列场景简介 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更复杂,可能包含嵌入对象.消息被发送到队列中,“消息队列”是在消息的传输过程中保存消息的容器 ...
随机推荐
- iPhone各尺寸 app界面设计尺寸规范
ip6: 375 * 667 pt @2x ~ 750 x 1334 ip6+: 414 * 736 pt @3x ~ 1242 x 2208 ip5: 320 * 568 pt @2x ~ 6 ...
- Spring 中 ApplicationContext 和 BeanFactory 的区别,以及 Spring bean 作用域
//从ApplicationContext 中取 bean ApplicationContext ac = new ClassPathXmlApplicationContext ( "com ...
- [Qt Creator 快速入门] 第3章 窗口部件
从这一章开始正式接触Qt的窗口部件.在第2章曾看到 Qt Creator 提供的默认基类只有 QMainWindow.QWidget 和 QDialog 这3种.QMainWindow 是带有菜单栏和 ...
- ACM_同余+暴力找规律
小光的忧伤 Time Limit: 2000/1000ms (Java/Others) Problem Description: 锴神:我尊重作者原意,你们出什么我就加什么.于是小光打了道水题(也就是 ...
- Linux环境下RPM包相互依赖的解决办法
Linux环境下安装Oracle11gR2提示缺少"Package: elfutils-libelf-devel-0.125 FAILED"包,按照提示安装该包时又提示缺少依 ...
- 常用JavaScript代码库(又名:WFang.js)
1.根据公司项目封装ajax请求,结合layer框架一起使用 /*提取接口公共部分*/ var ApiConf = { server:"http://localhost:8080/Batte ...
- [ TJOI 2012 ] 防御
\(\\\) Description 有 \(n\) 人,第 \(i\) 个人有一个护甲值 \(a_i\). 有 \(m\) 次操作,分为以下两种: \(A\ l\ r\ x\) 对编号在 \([l, ...
- [ TJOI 2007 ] 线段
\(\\\) \(Description\) 一个\(N\times N\) 的网格,每行有一段要必走,求从\((1,1)\)到\((N,N)\)的最短路长度. \(N\le 2\times10^4\ ...
- CSS知识点整理(1):CSS语法,层叠次序,选择器,其他重要方面。
1. css的全称 2. CSS的层叠次序:优先级由低到高 ·浏览器设置 ·外部样式表 或者 内部样式表 —— 就近原则 ·内联样式 3. CSS的3种形式,以及每种形式的语法格式 ——注意样式表的为 ...
- tomcat 访问IP直接访问项目
apache-tomcat-7.0.52\conf下server.xml文件 <Connector connectionTimeout="20000" port=" ...