LVS+MYCAT+读写分离+MYSQL主备同步部署手册

1          配置MYSQL主备同步…. 2

1.1       测试环境… 2

1.2       配置主数据库… 2

1.2.1         编辑my.cnf文件… 2

1.2.2         重启数据库… 2

1.3       锁定主数据库DDL操作… 2

1.4       主备已有数据同步… 2

1.5       停止从服务… 3

1.6       配置备用数据库… 3

1.6.1         编辑my.cnf文件… 3

1.6.2        登录主数据库查看master状态… 3

1.6.3        执行change master to系列命令… 3

1.7       重启从服务… 4

1.8       解锁主数据库… 4

1.9       验证主从同步… 4

2     MYCAT安装与配置…. 4

2.1       MYCAT安装… 4

2.2       参数设置… 4

2.2.1         rule.xml 4

2.2.2         server.xml 5

2.2.3         router.xml 6

2.2.4         schema.xml 6

2.3       启动和使用MyCat. 7

2.3.1         启动MyCat 7

2.3.2         访问MyCat 7

2.3.3         自测… 7

3     KEEPALIVED配置…. 7

4     mycat服务器执行脚本…. 10

5          总体测验…. 11

5.1       网络架构图… 11

5.2       客户机测试环境… 12

5.3       MYSQL主备同步测试… 12

5.4       MYCAT测试… 13

5.4.1         配置mycat主从策略和分片策略… 13

5.4.2         测试mycat连接… 19

5.4.3         测试mycat读写分离… 20

5.4.4         测试mycat数据节点容错… 20

5.4.5         测试mycat节点容错… 21

1      配置MYSQL主备同步

1.1  测试环境

mysql版本:5.6.24;

操作系统版本:Linux-3.13-0-32

主数据库IP:192.168.10.3;

主数据库名:db351353;

备用数据库IP:192.168.10.4;

备用数据库名:db352354。

1.2  配置主数据库

1.2.1           编辑my.cnf文件

#服务器唯一ID,一般取IP最后一段

server_id = 3

#启用二进制日志

log_bin=mysql_bin

#需要备份的数据库名  多个库以逗号分隔

Binlog_do_db =db351353

#若涉及及同步函数或者存储过程需要配置,否则主备会产生异常不能同步

log_bin_trust_function_creators=TRUE

1.2.2           重启数据库

# service myql.server restart

1.3  锁定主数据库DDL操作

mysql> flush tables with read lock;

1.4  主备已有数据同步

用navicat for mysql将主数据库数据同步到备数据库

1.5  停止从服务

mysql>stop slave;

1.6  配置备用数据库

1.6.1           编辑my.cnf文件

#服务器唯一ID,一般取IP最后一段

server_id = 5

1.6.2      登录主数据库查看master状态

mysql>show master status;

1.6.3       执行change master to系列命令

mysql> change master to

master_host=’192.168.10.3′,

master_user=’iom’,–该用户要有Repl_slave_priv权限,没有可用grant replication slave on *.* to ‘iom’@’%’ identified by ‘xf4851213’授权

master_password=’123’,

master_log_file=’mysql_bin.000005’, –根据主服务器show master status出来的File结果填写

master_log_pos=1192; –根据主服务器show master status出来的Position结果填写

1.7  重启从服务

mysql>start slave;

1.8  解锁主数据库

mysql> unlock tables;

1.9  验证主从同步

在备份数据库上执行

mysql>show slave status;

slave_IO_running和slave_SQL_running 为yes。

主数据库新建一个表,往表里插入几条数据,备份数据库可以同步过来表和表中的数据。

2       MYCAT安装与配置

2.1  MYCAT安装

参见 MyCat_In_Action_CN.doc

2.2  参数设置

重点介绍rule.xml schema.xml router.xml server.xml log4j.xml

2.2.1           rule.xml

分片规则配置文件,mycat支持的所有分片规则都在这个文件里。定义一个规则需要两个节点,一个是tableRule,一个是function。

以一致性哈希分片为例,function节点定义了分片规则的实现类与初始化参数和分片规则的算法名称。

属性name为规则算法名称

class为规则实现类

property子节点为初始化规则的参数,使用seed count virtualBucketTimes就可初始化一致性哈希规则

<function name=”murmur” class=”org.opencloudb.route.function.PartitionByMurmurHash”>

<property name=”seed”>0</property><!– 默认是0–>

<property name=”count”>2</property><!– 要分片的数据库节点数量,必须指定,否则没法分片–>

<property name=”virtualBucketTimes”>160</property><!– 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍–>

</function>

tableRule节点定义了分片规则名(注意此处是规则名,前面的function节点的name属性是算法名)rule子节点指定用来分片的数据库表字段和分片算法名,也就是前面的function节点的name属性。

<tableRule name=”sharding-by-murmur”>

<rule>

<columns>id</columns>

<algorithm>murmur</algorithm>

</rule>

</tableRule>

任何自定义的分片规则也可以这样配置

2.2.2           server.xml

此文件用来配置mycat全局参数

<system>节点

<property name=”defaultSqlParser”>druidparser</property>,指定SQL解析器,默认是fdbparser,经测试druidparser效率更高

<property name=”sequnceHandlerType”>1</property>,指定mycat自动序列号生成方式。0:在借助本地文件生成序列号,1:借助数据库生成序列号,更多信息请参考Mycat in action

<property name=”serverPort”>8066</property>指定mycat服务端口号,mycat通过这个端口接收数据库客户端的访问请求。

另外还有一个9066端口没有出现在配置文件中,用来接收mycat监控命令、查询mycat运行状况、重新加载配置文件等。更多信息请参考Mycat in action。

<user>节点

name属性指定mycat用户名

<property name=”password”>password</property><!—用户密码–>

<property name=”schema”>database_name</property><!—数据库名,用客户端建立连接后要操作的数据库名 –>

<property name=”readOnly”>false</property><!—指定是不是只读库–>

可以有多个user节点。

2.2.3           router.xml

<queryRouter schema=”schema”><!—没太搞清楚这个文件的意义,我把schema属性、<name>、<queryNode>都配置成了一样的,而且都与要连接的数据库名保持一致 –>

<!—schema的值会在schema.xml用到 –>

<dataNode>

<name>dataNodeName</name>

<queryNode>queryNode</queryNode>

</dataNode>

</queryRouter>

2.2.4           schema.xml

<schema name=”TESTDB” checkSQLschema=”true” sqlMaxLimit=”100″>

其中checkSQLschema表明是否检查并过滤SQL中包含schema的情况,如逻辑库为 TESTDB,则可能写为select * from TESTDB.aaa,此时会自动过滤TESTDB,SQL变为select * from aaa,若不会出现上述写法,则可以关闭属性为false

<schema name=”schema”><!—就是router.xml命名的schema–>

<table name=”table_name” <!—要与它代理的数据库物理表名一致–>

primaryKey=”pk” <!—被用作主键的字段名–>

dataNode=”dataNodeName” <!—下面将会出现的dataNode节点–>

rule=”sharding-by-murmur”<!—rule.xml的tableRule节点name属性值,指定这个节点表示用这个规则执行分片–>

authIncrement=”true”><!—插入数据时是否由mycat自动生成分片,指定true时,如果insert sql内没有指定主键的值,而主键又是自增长的,mycat会自动插入生成主键的代码,并在生成主键时按照指定的分片规则将数据保存到数据库–>

<!—mycat有自己的自增序列命令,更多信息请参考Mycat in action–>

<!—此处可以指定多个table子节点,一个table节点表示一张表–>

</schema>

<dataNode name=”dataNodeName” dataHost=”localhost“ database=”database”/>

<!—分别是节点名,就是schema节点里的table子节点dataNode属性

dataHost是节点主机名,在下面要出现的dataHost定义

database数据库名

–>

<dataHost name=”localhost” maxCon=”1000” minCon=”10” balance=”0”

wrteType=”0” dbType=”mysql” dbDriver=”native>

<!—name属性是dataHost名

maxCon minCon分别是连接到物理数据库的最大最小连接数

dbType指定数据库类型

dbDriver只有两个取值,分别是native和jdbc。native为mycat自带驱动,只支持mysql,jdbc为使用jdbc实现连接数据库,指定什么数据库的jdbc驱动就可以访问什么数据库,更灵活,但效率不如native

可以有多个dataHost节点

–>

<heartbeat>select 1</heartbeat><!—保持连接不断的心跳sql–>

<writeHost host=”hostM1” url=”localhost:3306” user=”user” password=”password”>

<reeadHost host=”hostS1” url=”localhost:3306″ user=”root” password=”123456″/>

</writeHost>

<!—可以有多个writeHost,一个writeHost里要吧有多个readHost–>

</dataHost>

2.3  启动和使用MyCat

2.3.1           启动MyCat

# mycat console

2.3.2           访问MyCat

访问MyCat同访问MySQL的方式完全相同, 常用访问方式如下:

mysql –h 127.0.0.1 –u test –p test -P8066 –DTESTDB

2.3.3           自测

可以自己编写一些语句进行测试,看是否按规则进行分配。

3      KEEPALIVED配置

编辑/etc/keepalived/keepalived.cnf文件,红色字体是为mycat新加的

global_defs {

router_id LVS_MASTER   #BACKUP上修改为LVS_BACKUP

}

vrrp_instance VI_1 {

state MASTER

interface eth0

virtual_router_id 51

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

192.168.10.252       #virtual server

192.168.10.253       #mycat

}

}

virtual_server 192.168.10.252 8080 {

delay_loop 6

lb_algo rr

lb_kind DR

#lb_kind NAT

#    persistence_timeout 3

protocol TCP

real_server 192.168.10.3 8080 {

weight 3

TCP_CHECK {

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

connect_port 8080

}

}

real_server 192.168.10.4 8080 {

weight 3

TCP_CHECK {

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

connect_port 8080

}

}

}

virtual_server 192.168.10.253 8066 {

delay_loop 6

lb_algo rr

lb_kind DR

#lb_kind NAT

#    persistence_timeout 3

protocol TCP

real_server 192.168.10.3 8066 {

weight 3

TCP_CHECK {

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

connect_port 8066

}

}

real_server 192.168.10.4 8066 {

weight 3

TCP_CHECK {

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

connect_port 8066

}

}

}

4      mycat服务器执行脚本

lvs_mycat.sh脚本内容:

#!/bin/bash

VIP=192.168.10.253

case “$1” in

start)

ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP

/sbin/route add -host $VIP dev lo:0

echo “1” >/proc/sys/net/ipv4/conf/lo/arp_ignore

echo “2” >/proc/sys/net/ipv4/conf/lo/arp_announce

echo “1” >/proc/sys/net/ipv4/conf/all/arp_ignore

echo “2” >/proc/sys/net/ipv4/conf/all/arp_announce

sysctl -p >/dev/null 2>&1

echo “lvs_vip server start ok!”;;

stop)

ifconfig lo:0 down

/sbin/route del $VIP >/dev/null 2>&1

echo “0” >/proc/sys/net/ipv4/conf/lo/arp_ignore

echo “0” >/proc/sys/net/ipv4/conf/lo/arp_announce

echo “0” >/proc/sys/net/ipv4/conf/all/arp_ignore

echo “0” >/proc/sys/net/ipv4/conf/all/arp_announce

echo “lvs_vip server stoped.”;;

*)

echo “arg start|stop.”

exit 1

esac

exit 0

在脚本所在目录执行#./lvs_mycat.sh start;脚本主要作用是为服务器的回环接口设定虚拟IP,并屏蔽该IP的arp请求和应答。

5      总体测验

5.1  网络架构图

客户机IP:192.168.10.1

负载机VIP:192.168.10.253

主mycat和mysql1在同一个服务器上,IP为:192.168.10.3

从mycat和mysql2在同一个服务器上,IP为:192.168.10.4

mysql1上创建两个数据库db351353(主),db352354(备),mysql2上创建两个数据库db352354(主),db351353(备);mysql2上db351353是mysql1上db351353的备用库,mysql1上的db352354是mysql2上db352354的备用库。

5.2  客户机测试环境

安装navicat for mysql,创建5个数据连接:

  • 直连mysql1数据库 连接名:mysql1 ip:168.10.3 端口:3306
  • 直连mysql2数据库 连接名:mysql2 ip:168.10.4 端口:3306
  • 直连主mycat 连接名:mycat1 ip:168.10.3 端口:8066
  • 直连从myca2 连接名:mycat2 ip:168.10.4 端口:8066
  • 连接lvs 连接名:keepalived ip:168.10.253 端口:8066

5.3  MYSQL主备同步测试

在mysql1上的db351353 添加数据:

DROP TABLE IF EXISTS `so`;

CREATE TABLE `so` (

`so_nbr` int(8) NOT NULL DEFAULT ‘0’,

`local_net_id` int(8) DEFAULT NULL,

`proc_inst_id` int(8) DEFAULT NULL,

`prod_id` varchar(8) DEFAULT NULL,

PRIMARY KEY (`so_nbr`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `so` VALUES (‘1’, ‘351’, null, null);

在mysql2上的db352354添加数据:

DROP TABLE IF EXISTS `so`;

CREATE TABLE `so` (

`so_nbr` int(8) NOT NULL DEFAULT ‘0’,

`local_net_id` int(8) DEFAULT NULL,

`proc_inst_id` int(8) DEFAULT NULL,

`prod_id` varchar(8) DEFAULT NULL,

PRIMARY KEY (`so_nbr`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `so` VALUES (‘2’, ‘352’, null, null);

在各自的备份库上能查到对应的数据,可参考1.9

5.4  MYCAT测试

5.4.1           配置mycat主从策略和分片策略

按so表本地网水平分片,351和353放到节点dn1,352和354放到节点dn2。

5.4.1.1        schema.xml内容:

红色字体为注释,实际文件里没有,注意dn2节点的主从连接库顺序,按说明应该配在前面的写入数据库为主数据库,后面的写入数据库为从数据库,但dn2节点却正好相反,原因待查。

<?xml version=”1.0″?>

<!DOCTYPE mycat:schema SYSTEM “schema.dtd”>

<mycat:schema xmlns:mycat=”http://org.opencloudb/”>

<schema name=”TESTDB” checkSQLschema=”false” sqlMaxLimit=”100″>

<table name=”prod” primaryKey=”prod_id” type=”global”  dataNode=”dn1,dn2″ />

<table name=”so” primaryKey=”so_nbr” dataNode=”dn1,dn2″

rule=”sharding-by-intfile”>

</table>

</schema>

<dataNode name=”dn1″ dataHost=”hostdn1″ database=”db351353″ />

<dataNode name=”dn2″ dataHost=”hostdn2″ database=”db352354″ />

<dataHost name=”hostdn1″ maxCon=”1000″ minCon=”10″ balance=”1″

writeType=”0″ dbType=”mysql” dbDriver=”native”>

<heartbeat>select user()</heartbeat>

<!– can have multi write hosts –>

<writeHost host=”hostM1″ url=”192.168.10.3:3306″ user=”iom”–dn1节点主连接库

password=”xf4851213″>

<!–                   <readHost host=”hostS1″ url=”192.168.10.4:3306″ user=”iom” password=”123″ /> –>

</writeHost>

<writeHost host=”hostM2″ url=”192.168.10.4:3306″ user=”iom”–dn1节点从连接库

password=”123″/>

</dataHost>

<dataHost name=”hostdn2″ maxCon=”1000″ minCon=”10″ balance=”1″

writeType=”0″ dbType=”mysql” dbDriver=”native”>

<heartbeat>select user()</heartbeat>

<writeHost host=”host2M1″ url=”192.168.10.3:3306″ user=”iom” –dn2节点从连接库

password=”xf4851213″>

<!–                    <readHost host=”hostS1″ url=”192.168.0.3:3306″ user=”iom” password=”xf4851213″ />–>

</writeHost>

<writeHost host=”host2M2″ url=”192.168.10.4:3306″ user=”iom”–dn2节点主连接库

password=”123″/>

</dataHost>

</mycat:schema>

5.4.1.2        rule.xml内容

红色字体为注释,实际文件里没有。

<?xml version=”1.0″ encoding=”UTF-8″?>

<!–

– Licensed under the Apache License, Version 2.0 (the “License”);

– you may not use this file except in compliance with the License.

– You may obtain a copy of the License at

–      http://www.apache.org/licenses/LICENSE-2.0

– Unless required by applicable law or agreed to in writing, software

– distributed under the License is distributed on an “AS IS” BASIS,

– WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

– See the License for the specific language governing permissions and

– limitations under the License.

–>

<!DOCTYPE mycat:rule SYSTEM “rule.dtd”>

<mycat:rule xmlns:mycat=”http://org.opencloudb/”>

<tableRule name=”rule1″>

<rule>

<columns>id</columns>

<algorithm>func1</algorithm>

</rule>

</tableRule>

<tableRule name=”rule2″>

<rule>

<columns>user_id</columns>

<algorithm>func1</algorithm>

</rule>

</tableRule>

<tableRule name=”sharding-by-intfile”>

<rule>

<columns>local_net_id</columns> –按本地网分片

<algorithm>hash-int</algorithm>

</rule>

</tableRule>

<tableRule name=”auto-sharding-long”>

<rule>

<columns>id</columns>

<algorithm>rang-long</algorithm>

</rule>

</tableRule>

<tableRule name=”mod-long”>

<rule>

<columns>id</columns>

<algorithm>mod-long</algorithm>

</rule>

</tableRule>

<tableRule name=”sharding-by-murmur”>

<rule>

<columns>id</columns>

<algorithm>murmur</algorithm>

</rule>

</tableRule>

<function name=”murmur” class=”org.opencloudb.route.function.PartitionByMurmurHash”>

<property name=”seed”>0</property><!– 默认是0–>

<property name=”count”>2</property><!– 要分片的数据库节点数量,必须指定,否则没法分片–>

<property name=”virtualBucketTimes”>160</property><!– 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍–>

<!–

<property name=”weightMapFile”>weightMapFile</property>

节点的权重,没有指定权重的节点默认是1。以properties文件的格式填写,以从0开始到count-1的整数值也就是节点索引为key,以节点权重值为值。所有权重值必须是正整数,否则以1代替 –>

<!–

<property name=”bucketMapPath”>/etc/mycat/bucketMapPath</property>

用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,会把虚拟节点的murmur hash值与物理节点的映射按行输出到这个文件,没有默认值,如果不指定,就不会输出任何东西 –>

</function>

<function name=”hash-int” class=”org.opencloudb.route.function.PartitionByFileMap”>

<property name=”mapFile”>partition-hash-int.txt</property>

</function>

<function name=”rang-long” class=”org.opencloudb.route.function.AutoPartitionByLong”>

<property name=”mapFile”>autopartition-long.txt</property>

</function>

<function name=”mod-long” class=”org.opencloudb.route.function.PartitionByMod”>

<!– how many data nodes  –>

<property name=”count”>3</property>

</function>

<function name=”func1″ class=”org.opencloudb.route.function.PartitionByLong”>

<property name=”partitionCount”>8</property>

<property name=”partitionLength”>128</property>

</function>

</mycat:rule>

5.4.1.3        partition-hash-int内容:

红色字体为注释,实际文件里没有。

351=0         –分配到dn1节点

352=1          –分配到dn2节点

353=0

354=1

5.4.2           测试mycat连接

客户机navicat打开mycat1连接,能看到一个数据库TESTDB,数据库中能查到db351353和db352354两个数据库的所有数据。mycat2连接亦同。

5.4.3           测试mycat读写分离

测试目的:由4.4.1.1可知,dn1连接的主数据库是mysql1的db351353,从数据库是mysql2的db351353,balance值为1,此模式下从数据库也为读数据库。mycat增删改操作应通过mysql1的db351353进行,读操作应通过mysql2的db351353进行。

测试方法:客户机通过navicat的mysql2连接更改db351353的so表记录,这样db351353在mysql1和mysql2上有两份不同的数据,在客户机navicat的mycat1连接上查看so表本地网为351的数据是否与mysql2相同,如相同则测试通过。测试过后要恢复mysql2上db351353的数据,以免影响剩余的测试。

5.4.4           测试mycat数据节点容错

测试目的:由4.4.1.1可知,dn1连接的主数据库是mysql1的db351353,从数据库是mysql2的db351353,如果mysql1服务挂掉,dn1节点的增删改操作应自动切换到mysql2的db351353。

测试方法:在mysql1主机上执行 #service mysql.server stop; 在客户机navicat的mycat1连接上看是否能正常查询so表数据,如果查询正常,修改so表本地网为351的数据,在客户机navicat的mysql2连接上查看db351353的so表数据是否和修改的一样,如果一样则测试通过。

注意:如果mysql1服务重新启动,则mysql1的db351353为从数据库,不会重新变为主数据库。

5.4.5           测试mycat节点容错

测试目的:mycat1和mycat2单个节点宕掉,不影响客户机使用数据库。

测试方法:客户机navicat使用keepalived连接,能正常查询和增删改数据。在mycat1上执行#mycat stop;客户机keepalived连接仍能正常使用。mycat1上执行#mycat console,mycat2上执行#mycat stop,客户机keepalived连接能正常使用。mycat2上执行#mycat console,客户机keepalived连接能正常使用,且数据请求路由和keepalived所配lb_algo策略相同。

LVS+MYCAT+读写分离+MYSQL主备同步部署手册的更多相关文章

  1. 【转载】LVS+MYCAT+读写分离+MYSQL主备同步部署手册(邢锋)

    LVS+MYCAT+读写分离+MYSQL主备同步部署手册 1          配置MYSQL主备同步…. 2 1.1       测试环境… 2 1.2       配置主数据库… 2 1.2.1  ...

  2. LVS+MYCAT读写分离+MYSQL同步部署手册(第三版)

    1      配置MYSQL主备同步 1.1    测试环境 mysql版本:5.6.24: 操作系统内核版本:Linux-3.13-0-32 主数据库IP:192.168.10.3: 主数据库名:d ...

  3. Mycat实现读写分离,主备热切换

    实验环境:ubutu server 14 Master IP:172.16.34.212 Slave IP:172.16.34.34.156 Mycat server IP:172.16.34.219 ...

  4. MyCat读写分离+MySql主从(一主一从)

    数据库一直在项目担当着一位核心的角色,是所有项目结构中的底层,说白了,我们程序员进行项目开发都是在和数据打交道,而数据都是保存在数据库中,如mysql.oracle.postgresql等等,如果一个 ...

  5. MySQL主备同步延迟

    今天看到mycat的日志,发现在wrapper.log中频繁warning:slave延迟23006秒 查看数据指标: show engine innodb status正常,而且slave的拷贝点在 ...

  6. mysql主从同步+mycat读写分离+.NET程序连接mycat代理

    背景 最近新项目需要用到mysql数据库,并且由于数据量大的原因,故打算采用1主1从(主数据库负责增.删.改操作:从数据库负责查操作)的数据库架构,在实现主从之后还要实现读写分离的代理,在网上搜寻了很 ...

  7. Mysql之Mycat读写分离及分库分表

    ## 什么是mycat ```basic 1.一个彻底开源的,面向企业应用开发的大数据库集群 2.支持事务.ACID.可以替代MySQL的加强版数据库 3.一个可以视为MySQL集群的企业级数据库,用 ...

  8. centos MySQL主从配置 ntsysv chkconfig setup命令 配置MySQL 主从 子shell MySQL备份 kill命令 pid文件 discuz!论坛数据库读写分离 双主搭建 mysql.history 第二十九节课

    centos  MySQL主从配置 ntsysv   chkconfig  setup命令  配置MySQL 主从 子shell  MySQL备份  kill命令  pid文件  discuz!论坛数 ...

  9. MySQL高可用(一)主备同步:MySQL是如何保证主备一致的

    主备同步,也叫主从复制,是MySQL提供的一种高可用的解决方案,保证主备数据一致性的解决方案. 在生产环境中,会有很多不可控因素,例如数据库服务挂了.为了保证应用的高可用,数据库也必须要是高可用的. ...

随机推荐

  1. JavaScript获取元素CSS属性

    function getDefaultStyle(obj,attribute){ return obj.currentStyle?obj.currentStyle[attribute]:documen ...

  2. PhpSms 稳定可靠的php短信发送库

    可能是目前最聪明.优雅的PHP短信发送库了.从此不再为各种原因造成的个别短信发送失败而烦忧! phpsms的任务均衡调度功能由toplan/task-balancer提供. GitHub地址:http ...

  3. IE自动跳转到标准模式

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

  4. 连载《一个程序猿的生命周期》-28、被忽悠来的单身HR(女同志)

    一个程序猿的生命周期 微信平台 口   号:职业交流,职业规划:面对现实,用心去交流.感悟. 公众号:iterlifetime 百木-ITer职业交流奋斗 群:141588103    微   博:h ...

  5. git 学习使用总结三(远程仓库操作)

    这篇文章仅供自己以后翻阅加深记忆,要系统的学习 git 教程(中文版),请移步到 liaoxuefeng.com 学习 git 教程部分. pull, fetch, clone, push, chec ...

  6. Android 实现页面的延时跳转

    Android APP在初次使用的时候往往会出现APP的首页标志,然后几秒之后进入导航页,今天就记录一下,首页的延时跳转的两种方法: 第一种使用Handler延时跳转,在onCreate的方法中加入一 ...

  7. Apache http Server 2.4 安装与配置

    前言 Apache官网从2.2之后,不再提供windows的msi或exe安装版本,现在Apache http Server有两个分支2.2及2.4 注意事项 如果之前有安装2.2的版本,请先卸载 A ...

  8. Unity 实现物体破碎效果(转)

    感谢网友分享,原文地址(How to Make an Object Shatter Into Smaller Fragments in Unity),中文翻译地址(Unity实现物体破碎效果) In ...

  9. u3d_Shader_effects笔记4 BRDF

    1.英文意思 bidirectional reflectance distribution function bidirectional :双向的 reflectance :反射 distributi ...

  10. session和cookie的区别和联系

    使用session会在客户端生成一个文件,这个文件是以session_id来命名,用来保存文件:生成的文件保存在这个路径中:session.save_path = "D:/wampstack ...