mycat结合双主复制实现读写分离模式
简介:应用程序仅需要连接mycat,后端服务器的读写分离由mycat进行控制,后端服务器数据的同步由MySQL主从同步进行控制。
本次实验环境架构图

服务器主机规划
| 主机名 | IP | 功能 | 备注 |
|---|---|---|---|
| linux-node1 | 192.168.56.11 | mycat | 需要安装MySQL不用启动 |
| linux-node2 | 192.168.56.12 | mysql-master1,mysql-slave1 | slave1端口:3307 |
| linux-node3 | 192.168.56.13 | mysql-master2,mysql-slave2 | slave2端口:3307 |
实战演示
安装MySQL数据库
创建mysql用户
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
安装MySQL
yum install -y libaio
cd /usr/local/src/
wget http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz
tar -zxf mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz
cp -rf mysql-5.7.17-linux-glibc2.5-x86_64 /data/app/mysql-3306
cp -rf mysql-5.7.17-linux-glibc2.5-x86_64 /data/app/mysql-3307
chown -R mysql:mysql /data/app/mysql-3306
chown -R mysql:mysql /data/app/mysql-3307
/data/app/mysql-3306/bin/mysqld --initialize-insecure --user=mysql --basedir=/data/app/mysql-3306 --datadir=/data/app/mysql-3306/data
/data/app/mysql-3307/bin/mysqld --initialize-insecure --user=mysql --basedir=/data/app/mysql-3307 --datadir=/data/app/mysql-3307/data
生成my.cnf 配置文件
需要修改的参数:
- server-id:保证每个配置文件唯一。
- 两台master的自增长ID必须不同。
linux-node2
master端
cat > /data/app/mysql-3306/my.cnf<<EOF
[client]
port = 3306
socket = /data/app/mysql-3306/mysql.sock
[mysqld]
port = 3306
user = mysql
server-id = 1
bind-address = 0.0.0.0
basedir = /data/app/mysql-3306
datadir = /data/app/mysql-3306/data
socket = /data/app/mysql-3306/mysql.sock
pid-file = /data/app/mysql-3306/mysql.pid
log-error = /data/app/mysql-3306/mysqld.log
skip-name-resolve
log_bin = mysql-bin
log-slave-updates
auto-increment-increment = 2
auto-increment-offset = 1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
EOF
chown mysql.mysql /data/app/mysql-3306/my.cnf
slave端
cat > /data/app/mysql-3307/my.cnf<<EOF
[client]
port = 3307
socket = /data/app/mysql-3307/mysql.sock
[mysqld]
port = 3307
user = mysql
server-id = 11
bind-address = 0.0.0.0
basedir = /data/app/mysql-3307
datadir = /data/app/mysql-3307/data
socket = /data/app/mysql-3307/mysql.sock
pid-file = /data/app/mysql-3307/mysql.pid
log-error = /data/app/mysql-3307/mysqld.log
skip-name-resolve
log_bin = mysql-bin
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
EOF
chown mysql.mysql /data/app/mysql-3307/my.cnf
linux-node3
master端
cat > /data/app/mysql-3306/my.cnf<<EOF
[client]
port = 3306
socket = /data/app/mysql-3306/mysql.sock
[mysqld]
port = 3306
user = mysql
server-id = 2
bind-address = 0.0.0.0
basedir = /data/app/mysql-3306
datadir = /data/app/mysql-3306/data
socket = /data/app/mysql-3306/mysql.sock
pid-file = /data/app/mysql-3306/mysql.pid
log-error = /data/app/mysql-3306/mysqld.log
skip-name-resolve
log_bin = mysql-bin
log-slave-updates
auto-increment-increment = 2
auto-increment-offset = 2
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
EOF
chown mysql.mysql /data/app/mysql-3306/my.cnf
slave 端
cat > /data/app/mysql-3307/my.cnf<<EOF
[client]
port = 3307
socket = /data/app/mysql-3307/mysql.sock
[mysqld]
port = 3307
user = mysql
server-id = 22
bind-address = 0.0.0.0
basedir = /data/app/mysql-3307
datadir = /data/app/mysql-3307/data
socket = /data/app/mysql-3307/mysql.sock
pid-file = /data/app/mysql-3307/mysql.pid
log-error = /data/app/mysql-3307/mysqld.log
skip-name-resolve
log_bin = mysql-bin
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
EOF
chown mysql.mysql /data/app/mysql-3307/my.cnf
启动MySQL进程
linux-node2和linux-node3都执行如下命令
touch /data/app/mysql-3306/mysqld.log && chown mysql.mysql /data/app/mysql-3306/mysqld.log
sed -i 's#/usr/local/mysql#/data/app/mysql-3306#g' /data/app/mysql-3306/bin/mysqld_safe
/data/app/mysql-3306/bin/mysqld_safe --defaults-file=/data/app/mysql-3306/my.cnf --basedir=/data/app/mysql-3306 --datadir=/data/app/mysql-3306/data --user=mysql &
touch /data/app/mysql-3307/mysqld.log && chown mysql.mysql /data/app/mysql-3307/mysqld.log
sed -i 's#/usr/local/mysql#/data/app/mysql-3307#g' /data/app/mysql-3307/bin/mysqld_safe
/data/app/mysql-3307/bin/mysqld_safe --defaults-file=/data/app/mysql-3307/my.cnf --basedir=/data/app/mysql-3307 --datadir=/data/app/mysql-3307/data --user=mysql &
检查端口是否正常
ss -lntup |egrep '3306|3307'
tcp LISTEN 0 80 *:3306 *:* users:(("mysqld",19973,22))
tcp LISTEN 0 80 *:3307 *:* users:(("mysqld",20537,22))
MySQL双主配置
第一步先配置主从模式
linux-node2
master端
cd /data/app/mysql-3306/
./bin/mysql -uroot -p -S mysql.sock -P 3306
mysql> CREATE USER 'repl'@'192.%' IDENTIFIED BY 'mysql';
Query OK, 0 rows affected (0.05 sec)
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.%';
Query OK, 0 rows affected (0.00 sec)
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 613 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
slave端
cd /data/app/mysql-3307/
./bin/mysql -uroot -p -S mysql.sock -P 3307
mysql> CHANGE MASTER TO MASTER_HOST='192.168.56.12',
-> MASTER_PORT=3306,
-> MASTER_USER='repl',
-> MASTER_PASSWORD='mysql',
-> MASTER_LOG_FILE='mysql-bin.000001',
-> MASTER_LOG_POS=613;
Query OK, 0 rows affected, 2 warnings (0.04 sec)
mysql> start slave;
Query OK, 0 rows affected (0.02 sec)
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.56.12
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 613
Relay_Log_File: linux-node2-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
linux-node3
master端
cd /data/app/mysql-3306/
./bin/mysql -uroot -p -S mysql.sock -P 3306
mysql> CREATE USER 'repl'@'192.%' IDENTIFIED BY 'mysql';
Query OK, 0 rows affected (0.05 sec)
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.%';
Query OK, 0 rows affected (0.00 sec)
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 613 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
slave端
cd /data/app/mysql-3307/
./bin/mysql -uroot -p -S mysql.sock -P 3307
mysql>
CHANGE MASTER TO MASTER_HOST='192.168.56.13',
MASTER_PORT=3306,
MASTER_USER='repl',
MASTER_PASSWORD='mysql',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=613;
Query OK, 0 rows affected, 2 warnings (0.04 sec)
mysql> start slave;
Query OK, 0 rows affected (0.02 sec)
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.56.13
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 613
Relay_Log_File: linux-node2-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
第二步配置双主模式
检查两个master端的binlog位置
linux-node2 master端
cd /data/app/mysql-3306/
./bin/mysql -uroot -p -S mysql.sock -P 3306
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 613 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
linux-node3 master端
cd /data/app/mysql-3306/
./bin/mysql -uroot -p -S mysql.sock -P 3306
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 613 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
node2-master 上配置跟node3同步
CHANGE MASTER TO MASTER_HOST='192.168.56.13',
MASTER_PORT=3306,
MASTER_USER='repl',
MASTER_PASSWORD='mysql',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=613;
mysql> start slave;
Query OK, 0 rows affected (0.03 sec)
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.56.13
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 613
Relay_Log_File: linux-node2-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
node3-master 上配置跟node2同步
CHANGE MASTER TO MASTER_HOST='192.168.56.12',
MASTER_PORT=3306,
MASTER_USER='repl',
MASTER_PASSWORD='mysql',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=613;
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.56.12
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 613
Relay_Log_File: linux-node3-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
开始验证结果
在node2-master主机上创建数据
mysql> create database test;
Query OK, 1 row affected (0.01 sec)
mysql> use test;
Database changed
mysql> create table temp(id int,name varchar(64));
Query OK, 0 rows affected (0.11 sec)
mysql> insert into temp values(1,'aaa');
Query OK, 1 row affected (0.28 sec)
mysql> CREATE TABLE temp2(id INT PRIMARY KEY NOT NULL AUTO_INCREMENT ,nname VARCHAR(64));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into temp2(nname) values('bbb');
Query OK, 1 row affected (0.01 sec)
mysql> select * from test.temp;
+------+------+
| id | name |
+------+------+
| 1 | aaa |
+------+------+
1 row in set (0.01 sec)
mysql>
在node2-slave端查看数据是否存在
mysql> select * from test.temp;
+------+------+
| id | name |
+------+------+
| 1 | aaa |
+------+------+
1 row in set (0.00 sec)
mysql>
在node3-master端查看数据是否存在
mysql> select * from test.temp;
+------+------+
| id | name |
+------+------+
| 1 | aaa |
+------+------+
1 row in set (0.00 sec)
mysql>
在node3-slave端查看数据是否存在
mysql> select * from test.temp;
+------+------+
| id | name |
+------+------+
| 1 | aaa |
+------+------+
1 row in set (0.00 sec)
mysql>
在node3-master主机上创建数据
mysql> use test;
mysql> insert into temp2(nname) values('ddd');
Query OK, 1 row affected (0.02 sec)
mysql> insert into temp2(nname) values('fff');
Query OK, 1 row affected (0.00 sec)
mysql> select * from test.temp2;
+----+-------+
| id | nname |
+----+-------+
| 1 | bbb |
| 2 | ddd |
| 4 | fff |
+----+-------+
3 rows in set (0.00 sec)
在node3-slave端查看数据是否存在
mysql> select * from test.temp2;
+----+-------+
| id | nname |
+----+-------+
| 1 | bbb |
| 2 | ddd |
| 4 | fff |
+----+-------+
3 rows in set (0.00 sec)
mysql>
在node2-master端查看数据是否存在
mysql> select * from test.temp2;
+----+-------+
| id | nname |
+----+-------+
| 1 | bbb |
| 2 | ddd |
| 4 | fff |
+----+-------+
3 rows in set (0.00 sec)
mysql>
在node2-slave端查看数据是否存在
mysql> select * from test.temp2;
+----+-------+
| id | nname |
+----+-------+
| 1 | bbb |
| 2 | ddd |
| 4 | fff |
+----+-------+
3 rows in set (0.00 sec)
mysql>
结论
- 在任意一个master端更新数据,其他任意端都可以更新数据。
- 两台服务器配置了间隔自增长,数据不同冲突。
mycat安装
cd /usr/local/src
wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
tar -zxf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
mv mycat /data/app/mycat-1.6
ln -s /data/app/mycat-1.6 /data/app/mycat
修改schema.xml 的配置文件
balance="1": 全部的readHost与stand by writeHost参与select语句的负载均衡。writeType="0": 所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个 writeHost,重新启动后以切换后的为准,切换记录在配置文件中:dnindex.properties 。switchType="1": 1 默认值,自动切换。
cd /data/app/mycat
cp conf/schema.xml conf/schema.xml.bak
cat > conf/schema.xml <<EOF
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1"></schema>
<dataNode name="dn1" dataHost="node1" database="test" />
<dataHost name="node1" maxCon="10" minCon="5" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1">
<heartbeat>select user()</heartbeat>
<writeHost host="master1" url="192.168.56.12:3306" user="root" password="mysql">
<readHost host="slave2" url="192.168.56.13:3307" user="root" password="mysql" />
</writeHost>
<writeHost host="master2" url="192.168.56.13:3306" user="root" password="mysql">
<readHost host="slave2" url="192.168.56.13:3307" user="root" password="mysql" />
</writeHost>
</dataHost>
</mycat:schema>
EOF
启动mycat服务
./bin/mycat start
ss -lntup |egrep '(8066|9066)'
tcp LISTEN 0 100 :::8066 :::* users:(("java",16546,79))
tcp LISTEN 0 100 :::9066 :::* users:(("java",16546,75))
验证mycat服务是否正常
第一步:在linux-node2-master端配置mycat连接账号
mysql> GRANT ALL PRIVILEGES ON *.* TO root@'192.%' IDENTIFIED BY 'mysql';
Query OK, 0 rows affected, 1 warning (0.07 sec)
第二步:在mycat服务器上安装mysql服务,但是不启动。
具体步骤省略,详细内容可以参考上面的MySQL安装。
第三步:使用mysql的客户端连接mycat
cd /data/app/mysql/
./bin/mysql -uroot -p -P 8066 -h 192.168.56.11 ##连接mycat,初始密码123456
mysql> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB |
+----------+
1 row in set (0.00 sec)
mysql> use TESTDB;
mysql> insert into temp2(nname) values('eee');
Query OK, 1 row affected (0.09 sec)
mysql> insert into temp2(nname) values('ggg');
Query OK, 1 row affected (0.01 sec)
linux-node3-slave 端查看数据是否同步
mysql> select * from test.temp2;
+----+-------+
| id | nname |
+----+-------+
| 1 | bbb |
| 2 | ddd |
| 4 | fff |
| 5 | eee |
| 7 | ggg |
+----+-------+
5 rows in set (0.00 sec)
根据查询结果发现数据写入到了linux-node3-slave端。
测试一台master端挂了服务自动迁移
关闭linux-node2-master的服务
mysql> shutdown;
Query OK, 0 rows affected (0.01 sec)
shell > ss -lntup |grep 3306 ## 确认端口已经关闭。
mycat端插入新的数据查看数据是否同步
mysql> insert into temp2(nname) values('mmmm');
Query OK, 1 row affected (0.07 sec)
mysql> insert into temp2(nname) values('nnnn');
Query OK, 1 row affected (0.01 sec)
linux-node3-slave端查看数据是否同步
mysql> select * from test.temp2;
+----+-------+
| id | nname |
+----+-------+
| 1 | bbb |
| 2 | ddd |
| 4 | fff |
| 5 | eee |
| 7 | ggg |
| 8 | mmmm |
| 10 | nnnn |
+----+-------+
7 rows in set (0.00 sec)
mysql>
linux-node2-slave端查看数据是否同步
mysql> select * from test.temp2;
+----+-------+
| id | nname |
+----+-------+
| 1 | bbb |
| 2 | ddd |
| 4 | fff |
| 5 | eee |
| 7 | ggg |
+----+-------+
5 rows in set (0.00 sec)
mysql>
因为linux-node2的master端已经挂了,故数据不能同步。
测试一台master端挂掉,数据访问是否正常
登录到mycat服务器上执行如下命令:
mysql> select * from temp2;
+----+-------+
| id | nname |
+----+-------+
| 1 | bbb |
| 2 | ddd |
| 4 | fff |
| 5 | eee |
| 7 | ggg |
| 8 | mmmm |
| 10 | nnnn |
+----+-------+
7 rows in set (0.00 sec)
mysql> select * from temp2;
+----+-------+
| id | nname |
+----+-------+
| 1 | bbb |
| 2 | ddd |
| 4 | fff |
| 5 | eee |
| 7 | ggg |
| 8 | mmmm |
| 10 | nnnn |
+----+-------+
7 rows in set (0.00 sec)
执行多次发现结果一样,说明在一台master端挂掉的情况下,其连接的slave端也被剔除,因此数据完整性可以保证。
参考
故障汇总
第一次配置的时候maser端没有配置log-slave-updates导致,node3-slave上没有node2-master端的数据。
解释:
从库开启log-bin参数,如果直接往从库写数据,是可以记录log-bin日志的,但是从库通过I0线程读取主库二进制日志文件,然后通过SQL线程写入的数据,是不会记录binlog日志的。也就是说从库从主库上复制的数据,是不写入从库的binlog日志的。所以从库做为其他从库的主库时需要在配置文件中添加log-slave-updates参数。
解决办法:
[mysqld]
log-slave-updates
mycat结合双主复制实现读写分离模式的更多相关文章
- Mysql + keepalived 实现双主热备读写分离【转】
Mysql + keepalived 实现双主热备读写分离 2013年6月16日frankwong发表评论阅读评论 架构图 系统:CentOS6.4_X86_64软件版本:Mysql-5.6.12 ...
- Mysql双主加Keepalived+读写分离
一.MySQL于keepalived简介** 前言: 在企业中,数据库高可用一直是企业的重中之重,中小企业很多都是使用mysql主从方案,一主多从,读写分离等,但是单主存在单点故障,从库切换成主库需要 ...
- mycat 1.6.6.1安装以及配置docker 安装mysql 5.7.24 双主多从读写分离主主切换
mycat和mysql的高可用参考如下两个图 简介:应用程序仅需要连接HAproxy或者mycat,后端服务器的读写分离由mycat进行控制,后端服务器数据的同步由MySQL主从同步进行控制. 服务器 ...
- MySQL集群系列2:通过keepalived实现双主集群读写分离
在上一节基础上,通过添加keepalived实现读写分离. 首先关闭防火墙 安装keepalived keepalived 2台机器都要安装 rpm .el6.x86_64/ 注意上面要替换成你的内核 ...
- MySQL自动化安装(双主多从读写分离)
shell #!/bin/bash # Create by # version 1.0 # // # # check out lockfile whether or not exist IsInput ...
- Mycat高可用解决方案三(读写分离)
Mycat高可用解决方案三(读写分离) 一.系统部署规划 名称 IP 主机名称 配置 192.168.199.112 mycat01 2核/2G Mysql主节点 192.168.199.110 my ...
- mysql双主复制总结
双主复制: 1).在两台服务器上各自建立一个具有复制权限的用户: 2).修改配置文件: # 主服务器A上 [mysqld] server-id = 10 log-bin = mysql-bin rel ...
- mysql主主复制(双主复制)配置步骤
以前我们介绍的都是主从复制,这里给各位介绍一个双主复制了,下面都希望两个主服务器数据自动复制的话可参考一下此文章. MySQL主主复制结构区别于主从复制结构.在主主复制结构中,两台服务器的任何一台 ...
- mysql传统主从、双主复制+keepalived配置步骤
mysql主从.主主复制(双主复制)配置步骤 一:MySQL复制: MySQL复制简介: 将master服务器中主数据库的ddl和dml操作通过二进制日志传到slaves服务器上,然后在master服 ...
随机推荐
- Java基础教程(20)--数字和字符串
一.数字 在用到数字时,大多数情况下我们都会使用基本数据类型.例如: int i = 500; float gpa = 3.65f; byte mask = 0xff; 然而,有时候我们既需要 ...
- 神奇的datetime和datetime,一毫秒引发的血案
今天才发现C#的datetime和sqlserver的daetime是多么的不一样.首先最小和最大值不一样这是众所周知的,其实精度也是一大坑. 比如 DateTime.Today.AddMillise ...
- MySQL 命令登录
本地登录 MySQL客户端:https://dev.mysql.com/downloads/installer/ 在本地安装好客户端,配置好环境变量,即可直接在命令提示符中登录 简单点: 需要根据提示 ...
- 动态We API层(动态生成js)
ABP动态webapi前端怎么调用? 研究abp项目时,页面js文件中一直不明白abp.services... 是从哪里来的 在调试SimpleTaskSystem的AngularJs demo时,一 ...
- .NET4.5新特性async和await修饰符实现异步编程
开篇 每一个版本的.net都会引入一些新的特性,这些特性方便开发人员能够快速实现一些功能.虽然.net版本一直在更新,但是新版本对旧版本的程序都是兼容的,在这一点上微软做的还是非常好的.每次学一个新内 ...
- System.Collections空间下的Hashtable类与System.Collections.Specialized下的StringDictionary的一点小区别
哎.有一周没有写自己的博客. 最近在做一个调用web服务的小程序,没有使用c#自动生成的代理类,而是使用http-get.post.以及soap的方式去请求的,使用这http请求这种方式需要自己去拼参 ...
- 从敲入 URL 到浏览器渲染完成、对HTTP协议的理解
1. 大致过程 当你这样子回答的时候: 用户输入 url 地址,浏览器查询 DNS 查找对应的请求 IP 地址 建立 TCP 连接 浏览器向服务器发送 http 请求,如果服务器段返回以 301 之类 ...
- bzoj2111ZJ2010排列计数_solution
-by bzoj http://www.lydsy.com/JudgeOnline/problem.php?id=2111 考虑第i个位置上的数字的可能性只取决于第i/2位置上的数,以及剩余数集的大小 ...
- MySql基本学习知识点:
1.Mysql的简介: (1):常识: MySQL是一种关系数据库管理系统,是一种开源软件 由瑞典MySQL AB公司开发,2008年1月16号被Sun公司收购.2009年,SUN又被Oracle收购 ...
- js中list 和 map还有string的部分操作
1.创建list或者数组 var list = []; list中添加元素:list.push("hello"); 如果没有先定义为数组类型不能使用 push方法 判断list ...