摘要: 测试准备1、安装xtrabackup工具       以下测试安装xtrabackup备份恢复工具的二进制包,进行测试。安装的路径为mysql安装路径,本次测试mysql的安装路径为:/home/q/percona-server/。tar -xzf percona-xtraback-2.0.0-x86-64.tar.gzcp p...  阅读全文
posted @ 2013-04-08 18:29 小马歌 阅读(274) | 评论 (0)编辑 收藏
 
     摘要: 福昕阅读器是福昕公司推出的 Foxit Reader 首款简体中文版本,它是一款免费的PDF文档阅读器和打印器,具有令人难以置信的小巧体积,启动迅速且无需安装,支持 Windows 95/98/Me/2000/XP/2003/Vista 操作系统,其核心技术与 PDF 标准版1.7 完全兼容。目录公司概况软件简介突出特点软件功能有关插件版本历史常见问题软件出品商简介展开公司概况软件简介突...  阅读全文
posted @ 2013-04-08 11:45 小马歌 阅读(832) | 评论 (0)编辑 收藏
 

问题描述:ubuntu服务器为单网卡,设备名称为eth0,插入一块网卡后,增加新的网卡设备eth1,后来由于某种原因更换了第二换网卡,重启以后,网卡设置为eth0和eht2,想将网卡设备eth2改为eth1。

解决方法:终端输入:vi /etc/udev/rules.d/70-persistent-net.rules

出现以下文件

# This file was automatically generated by the /lib/udev/write_net_rules
# program, run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.

# PCI device 0x8086:0x10de (e1000e)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:25:65:b5:82:ca", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

# PCI device 0x8086:0x100e (e1000)
#SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0d:0c:69:af:b8", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

# PCI device 0x8086:0x100e (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0e:01:2c:09:9c", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

 

修改相对的设备名称,保存退出,重启网卡服务

posted @ 2013-04-08 11:41 小马歌 阅读(337) | 评论 (0)编辑 收藏
 

目的 在一台服务器上做主从复制,充分利用CPU资源。下面的文档首先说明如何在一台服务器开启多个MySQL

环境 MySQL 5.5

工具

mysql_install_db

mysqld_multi

配置过程

  1. 利用mysql_install_db生成数据库

mysql_install_db --datadir=/var/lib/mysql2 --user=mysql

mysql_install_db --datadir=/var/lib/mysql3 --user=mysql

……

mysql_install_db命令会自动创建datadir目录。

  1. 利用mysqld_multi工具生成配置文件

[root@ora01 ~]# mysqld_multi --example

# This is an example of a my.cnf file for mysqld_multi.

# Usually this file is located in home dir ~/.my.cnf or /etc/my.cnf

#

# SOME IMPORTANT NOTES FOLLOW:

#

# 1.COMMON USER

#

#   Make sure that the MySQL user, who is stopping the mysqld services, has

#   the same password to all MySQL servers being accessed by mysqld_multi.

#   This user needs to have the 'Shutdown_priv' -privilege, but for security

#   reasons should have no other privileges. It is advised that you create a

#   common 'multi_admin' user for all MySQL servers being controlled by

#   mysqld_multi. Here is an example how to do it:

#

#   GRANT SHUTDOWN ON *.* TO multi_admin@localhost IDENTIFIED BY 'password'

#

#   You will need to apply the above to all MySQL servers that are being

#   controlled by mysqld_multi. 'multi_admin' will shutdown the servers

#   using 'mysqladmin' -binary, when 'mysqld_multi stop' is being called.

#

# 2.PID-FILE

#

#   If you are using mysqld_safe to start mysqld, make sure that every

#   MySQL server has a separate pid-file. In order to use mysqld_safe

#   via mysqld_multi, you need to use two options:

#

#   mysqld=/path/to/mysqld_safe

#   ledir=/path/to/mysqld-binary/

#

#   ledir (library executable directory), is an option that only mysqld_safe

#   accepts, so you will get an error if you try to pass it to mysqld directly.

#   For this reason you might want to use the above options within [mysqld#]

#   group directly.

#

# 3.DATA DIRECTORY

#

#   It is NOT advised to run many MySQL servers within the same data directory.

#   You can do so, but please make sure to understand and deal with the

#   underlying caveats. In short they are:

#   - Speed penalty

#   - Risk of table/data corruption

#   - Data synchronising problems between the running servers

#   - Heavily media (disk) bound

#   - Relies on the system (external) file locking

#   - Is not applicable with all table types. (Such as InnoDB)

#     Trying so will end up with undesirable results.

#

# 4.TCP/IP Port

#

#   Every server requires one and it must be unique.

#

# 5.[mysqld#] Groups

#

#   In the example below the first and the fifth mysqld group was

#   intentionally left out. You may have 'gaps' in the config file. This

#   gives you more flexibility.

#

# 6.MySQL Server User

#

#   You can pass the user=... option inside [mysqld#] groups. This

#   can be very handy in some cases, but then you need to run mysqld_multi

#   as UNIX root.

#

# 7.A Start-up Manage Script for mysqld_multi

#

#   In the recent MySQL distributions you can find a file called

#   mysqld_multi.server.sh. It is a wrapper for mysqld_multi. This can

#   be used to start and stop multiple servers during boot and shutdown.

#

#   You can place the file in /etc/init.d/mysqld_multi.server.sh and

#   make the needed symbolic links to it from various run levels

#   (as per Linux/Unix standard). You may even replace the

#   /etc/init.d/mysql.server script with it.

#

#   Before using, you must create a my.cnf file either in /usr/my.cnf

#   or /root/.my.cnf and add the [mysqld_multi] and [mysqld#] groups.

#

#   The script can be found from support-files/mysqld_multi.server.sh

#   in MySQL distribution. (Verify the script before using)

#

上面是mysqld_multi工具的简单说明,下面是根据实际情况,修改的配置文件。为方便测试,将多实例的配置文件命名为

mysqld_multi.cnf。未指定的其他MySQL参数,将使用默认的。

 

[mysqld_multi]

mysqld     = /usr/bin/mysqld_safe

mysqladmin = /usr/bin/mysqladmin

#user       = multi_admin

#password   = my_password

 

[mysqld2]

socket     = /var/lib/mysql2/mysql2.sock

port       = 3307

#pid-file   = /var/lib/mysql2/hostname.pid2

datadir    = /var/lib/mysql2

#language   = /usr/share/mysql/mysql/english

user       mysql

 

[mysqld3]

socket     = /var/lib/mysql3/mysql3.sock

port       = 3308

#pid-file   = /var/lib/mysql3/hostname.pid3

datadir    = /var/lib/mysql3

#language   = /usr/share/mysql/mysql/swedish

user       mysql

 

注:我做测试的时候,把pid-filelanguage选项注释掉了。

  1. 启动

# mysqld_multi --defaults-extra-file=/etc/mysqld_multi.cnf report

Reporting MySQL servers

MySQL server from group: mysqld2 is not running

MySQL server from group: mysqld3 is not running

# mysqld_multi --defaults-extra-file=/etc/mysqld_multi.cnf start

等一会儿…………,注意start后面跟具体的数字,比如start 2,则单独开启mysqld2这个实例。

# mysqld_multi --defaults-extra-file=/etc/mysqld_multi.cnf report

Reporting MySQL servers

MySQL server from group: mysqld2 is running

MySQL server from group: mysqld3 is running

[root@ora01 mysql2]# netstat -tunlp

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name  

tcp        0      0 192.168.122.1:53            0.0.0.0:*                   LISTEN      3808/dnsmasq       

tcp        0      0 :::3307                     :::*                        LISTEN      24335/mysqld       

tcp        0      0 :::3308                     :::*                        LISTEN      24241/mysqld       

tcp        0      0 :::22                       :::*                        LISTEN      3537/sshd          

udp        0      0 192.168.122.1:53            0.0.0.0:*                               3808/dnsmasq       

udp        0      0 0.0.0.0:67                  0.0.0.0:*                               3808/dnsmasq       

连接

mysql -uroot -p -h127.0.0.1 -P3307

  1. 测试

如果--defaults-extra-file选项指定的配置文件中,未具体设置路径socket,则会用mysql默认的路径。

mysql> show variables like 'socket';

+---------------+---------------------------+

| Variable_name | Value                     |

+---------------+---------------------------+

| socket        | /var/lib/mysql/mysql.sock |

+---------------+---------------------------+

1 row in set (0.00 sec)

但是pid文件,会自动在数据目录内生成

mysql> show variables like '%pid%';

+---------------+---------------------------------+

| Variable_name | Value                           |

+---------------+---------------------------------+

| pid_file      | /var/lib/mysql2/ora01.dh.cn.pid |

+---------------+---------------------------------+

1 row in set (0.00 sec)

posted @ 2013-03-27 13:38 小马歌 阅读(312) | 评论 (0)编辑 收藏
 

Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过。但在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面。

因此,一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力 这样的方案来进行部署与实施的。

如下图所示:

下面是我在实际工作过程中所整理的笔记,在此分享出来,以供大家参考。

一、MySQL的安装与配置
具体的安装过程,建议参考我的这一篇文章:http://heylinux.com/archives/993.html
值得一提的是,我的安装过程都是源码包编译安装的,并且所有的配置与数据等都统一规划到了/opt/mysql目录中,因此在一台服务器上安装完成以后,可以将整个mysql目录打包,然后传到其它服务器上解包,便可立即使用。

二、MySQL主从复制
场景描述:
主数据库服务器:192.168.10.130,MySQL已经安装,并且无应用数据。
从数据库服务器:192.168.10.131,MySQL已经安装,并且无应用数据。

2.1 主服务器上进行的操作
启动mysql服务
/opt/mysql/init.d/mysql start

通过命令行登录管理MySQL服务器
/opt/mysql/bin/mysql -uroot -p'new-password'

授权给从数据库服务器192.168.10.131
mysql> GRANT REPLICATION SLAVE ON *.* to 'rep1'@'192.168.10.131' identified by ‘password’;

查询主数据库状态
Mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000005 | 261 | | |
+------------------+----------+--------------+------------------+

记录下 FILE 及 Position 的值,在后面进行从服务器操作的时候需要用到。

2.2 配置从服务器
修改从服务器的配置文件/opt/mysql/etc/my.cnf
将 server-id = 1修改为 server-id = 10,并确保这个ID没有被别的MySQL服务所使用。

启动mysql服务
/opt/mysql/init.d/mysql start

通过命令行登录管理MySQL服务器
/opt/mysql/bin/mysql -uroot -p'new-password'

执行同步SQL语句
mysql> change master to
master_host=’192.168.10.130’,
master_user=’rep1’,
master_password=’password’,
master_log_file=’mysql-bin.000005’,
master_log_pos=261;

正确执行后启动Slave同步进程
mysql> start slave;

主从同步检查
mysql> show slave status\G
==============================================
**************** 1. row *******************
Slave_IO_State:
Master_Host: 192.168.10.130
Master_User: rep1
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000005
Read_Master_Log_Pos: 415
Relay_Log_File: localhost-relay-bin.000008
Relay_Log_Pos: 561
Relay_Master_Log_File: mysql-bin.000005
Slave_IO_Running: YES
Slave_SQL_Running: YES
Replicate_Do_DB:
……………省略若干……………
Master_Server_Id: 1
1 row in set (0.01 sec)
==============================================

其中Slave_IO_Running 与 Slave_SQL_Running 的值都必须为YES,才表明状态正常。

如果主服务器已经存在应用数据,则在进行主从复制时,需要做以下处理:
(1)主数据库进行锁表操作,不让数据再进行写入动作
mysql> FLUSH TABLES WITH READ LOCK;

(2)查看主数据库状态
mysql> show master status;

(3)记录下 FILE 及 Position 的值。
将主服务器的数据文件(整个/opt/mysql/data目录)复制到从服务器,建议通过tar归档压缩后再传到从服务器解压。

(4)取消主数据库锁定
mysql> UNLOCK TABLES;

2.3 验证主从复制效果

主服务器上的操作
在主服务器上创建数据库first_db
mysql> create database first_db;
Query Ok, 1 row affected (0.01 sec)

在主服务器上创建表first_tb
mysql> create table first_tb(id int(3),name char(10));
Query Ok, 1 row affected (0.00 sec)

在主服务器上的表first_tb中插入记录
mysql> insert into first_tb values (001,’myself’);
Query Ok, 1 row affected (0.00 sec)

在从服务器上查看
mysql> show databases;
=============================
+--------------------+
| Database |
+--------------------+
| information_schema |
| first_db |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.01 sec)
=============================
数据库first_db已经自动生成

mysql> use first_db
Database chaged

mysql> show tables;
=============================
+--------------------+
| Tables_in_first_db |
+--------------------+
| first_tb |
+--------------------+
1 row in set (0.02 sec)
=============================
数据库表first_tb也已经自动创建

mysql> select * from first_tb;
=============================
+------+------+
| id | name |
+------+------+
| 1 | myself |
+------+------+
1 rows in set (0.00 sec)
=============================
记录也已经存在

由此,整个MySQL主从复制的过程就完成了,接下来,我们进行MySQL读写分离的安装与配置。

三、MySQL读写分离
场景描述:
数据库Master主服务器:192.168.10.130
数据库Slave从服务器:192.168.10.131
MySQL-Proxy调度服务器:192.168.10.132

以下操作,均是在192.168.10.132即MySQL-Proxy调度服务器 上进行的。

3.1 MySQL的安装与配置
具体的安装过程与上文相同。

3.2 检查系统所需软件包
通过 rpm -qa | grep name 的方式验证以下软件包是否已全部安装。
gcc* gcc-c++* autoconf* automake* zlib* libxml* ncurses-devel* libmcrypt* libtool* flex* pkgconfig*
libevent* glib*

若缺少相关的软件包,可通过yum -y install方式在线安装,或直接从系统安装光盘中找到并通过rpm -ivh方式安装。

3.3 编译安装lua
MySQL-Proxy的读写分离主要是通过rw-splitting.lua脚本实现的,因此需要安装lua。

lua可通过以下方式获得
从http://www.lua.org/download.html下载源码包

从rpm.pbone.net搜索相关的rpm包
download.fedora.redhat.com/pub/fedora/epel/5/i386/lua-5.1.4-4.el5.i386.rpm
download.fedora.redhat.com/pub/fedora/epel/5/x86_64/lua-5.1.4-4.el5.x86_64.rpm

这里我们建议采用源码包进行安装
cd /opt/install
wget http://www.lua.org/ftp/lua-5.1.4.tar.gz
tar zvfx lua-5.1.4.tar.gz
cd lua-5.1.4

vi src/Makefile
在 CFLAGS= -O2 -Wall $(MYCFLAGS) 这一行记录里加上-fPIC,更改为 CFLAGS= -O2 -Wall -fPIC $(MYCFLAGS) 来避免编译过程中出现错误。

make linux
make install

cp etc/lua.pc /usr/lib/pkgconfig/
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/lib/pkgconfig

3.4 安装配置MySQL-Proxy
MySQL-Proxy可通过以下网址获得:
http://mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-Proxy/

推荐采用已经编译好的二进制版本,因为采用源码包进行编译时,最新版的MySQL-Proxy对automake,glib以及libevent的版本都有很高的要求,而这些软件包都是系统的基础套件,不建议强行进行更新。
并且这些已经编译好的二进制版本在解压后都在统一的目录内,因此建议选择以下版本:
32位RHEL5平台:
http://mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-Proxy/mysql-proxy-0.8.1-linux-rhel5-x86-32bit.tar.gz
64位RHEL5平台:
http://mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-Proxy/mysql-proxy-0.8.1-linux-rhel5-x86-64bit.tar.gz

测试平台为RHEL5 32位,因此选择32位的软件包
wget http://mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-Proxy/mysql-proxy-0.8.1-linux-rhel5-x86-32bit.tar.gz

tar xzvf mysql-proxy-0.8.1-linux-rhel5-x86-32bit.tar.gz
mv mysql-proxy-0.8.1-linux-rhel5-x86-32bit /opt/mysql-proxy

创建mysql-proxy服务管理脚本
mkdir /opt/mysql-proxy/init.d/

vim mysql-proxy

 

复制代码
01    #!/bin/sh
02    #
03    # mysql-proxy This script starts and stops the mysql-proxy daemon
04    #
05    # chkconfig: - 78 30
06    # processname: mysql-proxy
07    # description: mysql-proxy is a proxy daemon to mysql
08     
09    # Source function library.
10    . /etc/rc.d/init.d/functions
11     
12    #PROXY_PATH=/usr/local/bin
13    PROXY_PATH=/opt/mysql-proxy/bin
14     
15    prog="mysql-proxy"
16     
17    # Source networking configuration.
18    . /etc/sysconfig/network
19     
20    # Check that networking is up.
21    [ ${NETWORKING} = "no" ] && exit 0
22     
23    # Set default mysql-proxy configuration.
24    #PROXY_OPTIONS="--daemon"
25    PROXY_OPTIONS="--admin-username=root --admin-password=password --proxy-read-only-backend-addresses=192.168.10.131:3306 --proxy-backend-addresses=192.168.10.130:3306  --admin-lua-script=/opt/mysql-proxy/lib/mysql-proxy/lua/admin.lua --proxy-lua-script=/opt/mysql-proxy/scripts/rw-splitting.lua"
26    PROXY_PID=/opt/mysql-proxy/run/mysql-proxy.pid
27     
28    # Source mysql-proxy configuration.
29    if [ -f /etc/sysconfig/mysql-proxy ]; then
30            . /etc/sysconfig/mysql-proxy
31    fi
32     
33    PATH=$PATH:/usr/bin:/usr/local/bin:$PROXY_PATH
34     
35    # By default it's all good
36    RETVAL=0
37     
38    # See how we were called.
39    case "$1" in
40      start)
41            # Start daemon.
42            echo -n $"Starting $prog: "
43            $NICELEVEL $PROXY_PATH/mysql-proxy $PROXY_OPTIONS --daemon --pid-file=$PROXY_PID --user=mysql --log-level=warning --log-file=/opt/mysql-proxy/log/mysql-proxy.log
44            RETVAL=$?
45            echo
46            if [ $RETVAL = 0 ]; then
47                    touch /var/lock/subsys/mysql-proxy
48            fi
49           ;;
50      stop)
51            # Stop daemons.
52            echo -n $"Stopping $prog: "
53            killproc $prog
54            RETVAL=$?
55            echo
56            if [ $RETVAL = 0 ]; then
57                    rm -f /var/lock/subsys/mysql-proxy
58                    rm -f $PROXY_PID
59            fi
60           ;;
61      restart)
62            $0 stop
63            sleep 3
64            $0 start
65           ;;
66      condrestart)
67           [ -e /var/lock/subsys/mysql-proxy ] && $0 restart
68          ;;
69      status)
70            status mysql-proxy
71            RETVAL=$?
72           ;;
73      *)
74            echo "Usage: $0 {start|stop|restart|status|condrestart}"
75            RETVAL=1
76           ;;
77    esac
78     
79    exit $RETVAL
复制代码
脚本参数详解:

==============================================
PROXY_PATH=/opt/mysql-proxy/bin //定义mysql-proxy服务二进制文件路径

PROXY_OPTIONS="--admin-username=root \ //定义内部管理服务器账号
--admin-password=password \ //定义内部管理服务器密码
--proxy-read-only-backend-addresses=192.168.10.131:3306 \ //定义后端只读从服务器地址
--proxy-backend-addresses=192.168.10.130:3306 \ //定义后端主服务器地址
--admin-lua-script=/opt/mysql-proxy/lib/mysql-proxy/lua/admin.lua \ //定义lua管理脚本路径
--proxy-lua-script=/opt/mysql-proxy/scripts/rw-splitting.lua" \ //定义lua读写分离脚本路径

PROXY_PID=/opt/mysql-proxy/run/mysql-proxy.pid //定义mysql-proxy PID文件路径

$NICELEVEL $PROXY_PATH/mysql-proxy $PROXY_OPTIONS \
--daemon \ //定义以守护进程模式启动
--keepalive \ //使进程在异常关闭后能够自动恢复
--pid-file=$PROXY_PID \ //定义mysql-proxy PID文件路径
--user=mysql \ //以mysql用户身份启动服务
--log-level=warning \ //定义log日志级别,由高到低分别有(error|warning|info|message|debug)
--log-file=/opt/mysql-proxy/log/mysql-proxy.log //定义log日志文件路径
==============================================

cp mysql-proxy /opt/mysql-proxy/init.d/
chmod +x /opt/mysql-proxy/init.d/mysql-proxy

mkdir /opt/mysql-proxy/run
mkdir /opt/mysql-proxy/log

mkdir /opt/mysql-proxy/scripts

配置并使用rw-splitting.lua读写分离脚本
最新的脚本我们可以从最新的mysql-proxy源码包中获取
cd /opt/install

wget http://mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-Proxy/mysql-proxy-0.8.1.tar.gz

tar xzvf mysql-proxy-0.8.1.tar.gz
cd mysql-proxy-0.8.1
cp lib/rw-splitting.lua /opt/mysql-proxy/scripts

修改读写分离脚本rw-splitting.lua
修改默认连接,进行快速测试,不修改的话要达到连接数为4时才启用读写分离
vim /opt/mysql-proxy/scripts/rw-splitting.lua
=============================
-- connection pool
if not proxy.global.config.rwsplit then
proxy.global.config.rwsplit = {
min_idle_connections = 1, //默认为4
max_idle_connections = 1, //默认为8
is_debug = false
}
end
=============================

修改完成后,启动mysql-proxy
/opt/mysql-proxy/init.d/mysql-proxy start

3.5 测试读写分离效果
创建用于读写分离的数据库连接用户
登陆主数据库服务器192.168.10.130,通过命令行登录管理MySQL服务器
/opt/mysql/bin/mysql -uroot -p'new-password'
mysql> GRANT ALL ON *.* TO 'proxy1'@'192.168.10.132' IDENTIFIED BY 'password';
由于我们配置了主从复制功能,因此从数据库服务器192.168.10.131上已经同步了此操作。

为了清晰的看到读写分离的效果,需要暂时关闭MySQL主从复制功能
登陆从数据库服务器192.168.10.131,通过命令行登录管理MySQL服务器
/opt/mysql/bin/mysql -uroot -p'new-password'

关闭Slave同步进程
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)

连接MySQL-Proxy
/opt/mysql/bin/mysql -uproxy1 -p'password' -P4040 -h192.168.10.132

登陆成功后,在first_db数据的first_tb表中插入两条记录
mysql> use first_db;
Database changed
mysql> insert into first_tb values (007,’first’);
Query Ok, 1 row affected (0.00 sec)
mysql> insert into first_tb values (110,’second’);
Query Ok, 1 row affected (0.00 sec)

查询记录
mysql> select * from first_tb;
=============================
+------+------+
| id | name |
+------+------+
| 1 | myself |
+------+------+
1 rows in set (0.00 sec)
=============================
通过读操作并没有看到新记录

mysql> quit
退出MySQL-Proxy

下面,分别登陆到主从数据库服务器,对比记录信息
首先,检查主数据库服务器
mysql> select * from first_tb;
=============================
+------+------+
| id | name |
+------+------+
| 1 | myself |
+------+------+
| 007 | first |
+------+------+
| 110 | second |
+------+------+
3 rows in set (0.00 sec)
=============================
两条新记录都已经存在

然后,检查从数据库服务器
mysql> select * from first_tb;
=============================
+------+------+
| id | name |
+------+------+
| 1 | myself |
+------+------+
1 rows in set (0.00 sec)
=============================
没有新记录存在

由此验证,我们已经实现了MySQL读写分离,目前所有的写操作都全部在Master主服务器上,用来避免数据的不同步;
另外,所有的读操作都分摊给了其它各个Slave从服务器上,用来分担数据库压力。

经验分享:
1.当MySQL主从复制在 show slave status\G 时出现Slave_IO_Running或Slave_SQL_Running 的值不为YES时,需要首先通过 stop slave 来停止从服务器,然后再执行一次本文 2.1与2.2 章节中的步骤即可恢复,但如果想尽可能的同步更多的数据,可以在Slave上将master_log_pos节点的值在之前同步失效的值的基础上增大一 些,然后反复测试,直到同步OK。因为MySQL主从复制的原理其实就是从服务器读取主服务器的binlog,然后根据binlog的记录来更新数据库。

2.MySQL-Proxy的rw-splitting.lua脚本在网上有很多版本,但是最准确无误的版本仍然是源码包中所附带的lib/rw-splitting.lua脚本,如果有lua脚本编程基础的话,可以在这个脚本的基础上再进行优化;

3.MySQL-Proxy实际上非常不稳定,在高并发或有错误连接的情况下,进程很容易自动关闭,因此打开--keepalive参数让进程自动 恢复是个比较好的办法,但还是不能从根本上解决问题,因此通常最稳妥的做法是在每个从服务器上安装一个MySQL-Proxy供自身使用,虽然比较低效但 却能保证稳定性;

4.一主多从的架构并不是最好的架构,通常比较优的做法是通过程序代码和中间件等方面,来规划,比如设置对表数据的自增id值差异增长等方式来实现两个或多个主服务器,但一定要注意保证好这些主服务器数据的完整性,否则效果会比多个一主多从的架构还要差;

5.MySQL-Cluster 的稳定性也不是太好;

6.Amoeba for MySQL 是一款优秀的中间件软件,同样可以实现读写分离,负载均衡等功能,并且稳定性要大大超过MySQL-Proxy,建议大家用来替代MySQL-Proxy,甚至MySQL-Cluster。

 

 

原文出处:http://heylinux.com/archives/1004.html

posted @ 2013-03-26 15:41 小马歌 阅读(395) | 评论 (0)编辑 收藏
 

google的开源项目总结

google开源项目值得我们一用的,这些项目很有意义,甚至可以直接用在我们自己的工作上!学习编程的的一个比较好的方式就是阅读优秀项目的源代码,从而能够了解作者的方法、思路、技巧,另外阅读源代码对于一些朋友是枯燥乏味的,这是就可以看看项目的readme,找到项目的闪光点,我们不做开拓者那我们就做实践者和使用者,呵呵,下面是这些项目的列表,在这里存档,已备今后查阅之用   

 

文本文件处理:

Google CRUSH (Custom Reporting Utilities for SHell)  

CRUSH是为命令行或shell scripts处理特定文字数据而制作的一系列工具,这里有指南

C++库和源代码:

Google Breakpad 

一个开源的多平台崩溃报告系统。   

Google GFlags 

Gflags是一个命令行标记的处理库,它可以替代“getopt()”,其内置对C++的支持比如string。指南在此。   

Google Glog Glog库可执行应用级的登陆,提供基于C++式的登陆API,可用于Linux、BSD和Windows。指南见此。 

Google PerfTools   

这个工具可让开发创建更强大的应用程序,特别是那些用C++模版开发的多线程应用程序,包括TCMalloc, heap-checker, heap-profiler 和cpu-profiler。指南见此还有这里。 

Google Sparse Hash   

非常节省内存的hash-map。指南见此。 

Omaha – Google Update   

Omaha,也就是Google Update,它可以保证你的软件随时升级到最新版本,目前很多Windows下的Google软件都是用Omaha升级的,包括Google Chrome和Google Earth,当然你也可以用于自己的应用程序。指南看这里还有这里。 

Protocol Buffers   

Protocol Buffers是一种可扩展编码序列数据的方式,Google在几乎所有内部RPC协议和文件格式都使用了Protocol Buffers。指南见此它可以用于很多语言而且被一些IDE所支持,比如NetBeans。 

互联网:

Google Code Pretiffy 这是一个Javascript模块和CSS文件,它可以让HTML页面里的部分源码高亮显示,支持C/C++, Java, Python, Ruby, PHP, VisualBasic, AWK, Bash, SQL, HTML, XML, CSS, JavaScript, Makefiles和部分Perl,不支持Smalltalk和所有的CAML。例子见此。 

SpriteMe – easy “CSS spirtes” SpriteMe使你可以更轻松的创造CSS Sprites(俗称雪碧……)就是把网站要用到的图片都堆在一张图片里,用CSS控制调用哪个区域。它有一个自己的官网在这里。 

Redacisaurus   

Reducisaurus是一个压缩CSS和JS文件的网络服务,基于YUI压缩算法,运行于App Engine。 

JaikuEngine   

JaikuEngine是一个运行于App Engine的微博系统,由jaiku.com运营。要查看移动客户端的源码可以看这里这里还有介绍。 

Selector Shell   

Selector Shell是一个基于浏览器的测试工具,它可以让你看到CSS在不同浏览器里的样式,用Javascript写的,你可以在这里测试。 

Google Feed Server   

Google Feed Server是一个开源Atom发布协议服务,基于Apache Abdera框架,允许开发者快速为当前数据源(比如数据库)配置feed。指南见这里这里。 

Melange, the Spice of Creation   

这个项目的目标是创建出一个适合开源贡献流程的框架,比如Google Summer of Code TM (GSoC)项目。使用这个框架你就可以用Google App Engine来运行Google Summer of Code项目,和其它类似项目比如Google Highly Open Participation TM Contest和GHOP。指南见此。 

NameBench   

它可以查找最快的DNS服务器给你的电脑用,在Mac OS X、Windows和UNIX系统下都有命令行也有用户界面可以帮你测试,这是Google工程师用20%自由时间写出来的。 

Rat Proxy   

一个半自动化的大型被动网络应用安全审查工具,专为精确的探测而优化,文档在此。 

TopDraw   

Top Draw是一个图形生成程序,使用简单的文字脚本,基于JavaScript编程语言,Top Draw可以创造出非常复杂和有趣的图形。支持Mac OS 10.5以上系统,使用XCode开发。 

etherpad   

开源的EtherPad,这是一个基于网络的实时合作文档编辑器,这个项目主要是为了演示代码而开发,帮助那些想在自己服务器部署Etherpad的人使用,这里有如何安装的指南。EtherPad使用JavaScript、Java和Comet服务器来建造实时协作服务。 

Chromium   

Chromium是开源版的Chrome浏览器,Chromium的目标是建立一个新一代的强大网络应用程序,它与Chrome有很多不同之处。这里有指导如何在Linux上编译Chromium。 

V8 Google’s open source JavaScript engine V8是Google的开源JavaScript引擎,用C++写成,用于Chrome浏览器之上。V8使用ECMAScript的ECMA-262第三版可运行于Windows XP、Vista、Mac OS 10.5和使用IA-32或ARM处理器的Linux。V8可独立运行也可嵌入到任何C++程序里使用,这里有指南。 

Chromium OS   

Chromium OS是开源版的Chrome OS操作系统,提供快速、简单而安全的网络体验,源码在此。 

Android   

Android是第一个免费、开源而且可完全自定义的移动平台,提供完整的堆栈:一个操作系统、中间件和重要的一用应用,它包含丰富的API可以让第三方开发者开发出强大的应用程序。 

MySQL工具:

Google MySQL Tools  

 

各种管理、维护和改进MySQL数据库性能的工具,由Google编写,包括: 

  • mypgrep.py:一个类似pgrep的工具来管理MySQL连接
  • compact_innodb.py:可导出和重载所有表格的密集型innodb数据文件

Google mMAIM 

mMAIM的目标是对MySQL的监控和分析更简单,且可以和任何环境整合使用。它可显示主/从同步状态,一些性能状态,可以返回大量“show”命令的状态等等。   

其它:

Stressful Application Test (stressapptest) 

Stressful Application Test试图让来自处理器和I/O到内存的数据尽量随机化,以创造出模拟现实的环境来测试现在的硬件设备是否稳定,Google就在使用它,现在是Apache 2.0许可,这里有介绍安装向导指南。   

Pop and IMAP Troubleshooter 

它用于诊断并解决客户端到邮件服务器的连接问题。   

OpenDuckBill 

Openduckbill是一个Linux下简单的命令行备份工具,可用于监视文件/目录在有变化后是否标记为备份,并传输这些变化到本地备份目录、远程NFS导出分卷或是用rsync命令导出到远程SSH服务器。见安装向导。   

ZXing 

ZXing(发音类似Zebra crossing)是Java的开源多格式1D/2D条码图像处理库,目的是使用内置在手机上的摄像头拍照并对条码进行解码,而不必与服务器通讯,它被用于Android系统。这里有向导支持的设备列表。 Tesseract OCR Engine 

Tesseract OCR引擎是1995年UNLV Accuracy测试的前三名之一,在1995和2006年之间它的进展不大,但依然是当前精度最高的OCR引擎。这个源码可读取二进制、灰阶或彩色图片并输出文字,内置一个TIFF阅读器可读取非压缩的TIFF文件,增加libtiff后也可读取压缩图片。指南问答。   

Neatx – Open Source NX server 

Neatx是一个开源NX服务,类似NoMachine公司商业的NX服务。NX协议比VNX更强大,它们的区别主要在:   

  • NX是X11客户端所以不会发送位图
  • NX可兼容X、VNC和Windows版的Remote Desktop
  • NX可缓存数据
  • NX安装简单

另外一个可选的项目可以看看Google的FreeNx。 

PSVM   

它是这个文件的代码,这是一个SVM的“支持所有核心”的版本,可多机并行运行,实例见此。 

GO  

Google开发的新编程语言,谷奥有报道。 

The Google Collections Library for Java   

这是一系列与Java 5以及更高版本有关的库,Google花钱给买过来了。 

Google styleguide  

每个主流的开源项目都有它自己的向导形式,比如一系列的演示代码。如果这些代码都按照“Style”的形式来演示,会更友好。

posted @ 2013-03-14 17:35 小马歌 阅读(422) | 评论 (0)编辑 收藏
 
from:http://blog.csdn.net/kerryzhu/article/details/8299383

2000年开始从事软件测试,逐渐形成自己的软件测试思想,而第一次比较清晰呈现自己的测试的思想是2007年出版的《全程软件测试》,正如前言所叙:“从项目启动的第一天起到需求和设计的评审阶段,从后期的缺陷修正到产品维护——在整个软件生命周期中,开发人员和测试人员愉快地合作、共同努力,将软件产品的开发效率和质量推到一个新的高度。”,这些思想在测试管理工作的体现就是让测试人员更早地融入项目中,更主动、更密切地与开发人员协作,与项目相关利益者合作,确保项目按时按质地完成,即:

  • 测试人员越快地发现缺陷,项目越能尽早结束;
  • 测试人员尽可能多地发现Bug,遗留在产品中的Bug就会越少,产品的质量就会越高; 
  • 测试人员和自己(开发人员)的工作都是为了相同的目标——按时、高质量地发布产品; 

而此后和业界的测试人员、开发人员交流更多,思考得更多,在测试上的思想更清晰,于是在2012年9月5日在新浪微博(http://weibo.com/1652927771/yArIqoCKW )上发表了自己的个人软件测试宣言:


宣言发布后,得到不少网友的肯定。最给力的,要属@培根芝士牛蛙堡:感觉总结的太到位,cant agree more了,最近在看《软测之魂》,很多观点都是异曲同工啊,虽说就简单四句话,但是每一句话展开去都能写一本书。还有@让测试飞起来又见右下八卦图亮点。每当遇到左、右难以分辩时就想到它,并以此为基点,偿试思考再进一步,思丝多而力争不乱。分割线不是直的哟,似乎体现开发中有测试(调试),测试中有开发,而又不完全符合对立统一。

当然,也有不同声音,例如:@胡争辉首先应当强调产品工程,然后在产品工程中强调需求工程,其次在需求工程的基础上强调品质保证工程。脱离的产品工程的品质保证工程是无本之木,无源之水。这实际和我宣言没有关系,这里丝毫没有否定产品工程,也没有否定需求工程,实际第一句“更鼓励事先确定验证的标准并以此来驱动开发”就是强调需求的重要性。需求是软件开发的源泉,而这里关注点是“软件测试”,比较局限于测试自身的内涵和测试与开发的关系。如果拓展出去,我需要发表我的“软件工程宣言”了。

还有其它有意义的补充:

  •  @程序员邹欣:值得开发,测试,项目管理人员思考。 认可内部测试的重要性, 但更重视产品对用户的长期影响;
  •  @王立杰-WangLijie:认可测试对质量的改善,但更提倡质量是內建的;
  •  与@Testin-Daiyibin 讨论之后,增加一条,即:认可自动化测试的价值,但更提倡测试分析和设计的创造性和系统性。

那下面回归主题,就我自己的软件测试宣言,逐条分别进行说明,并简要阐述如何将它们应用于实际的软件开发工作之中。

 

1. 认可测试的价值,但更鼓励事先确定验证的标准并以此来驱动开发 

首先认识测试的价值,测试是质量保证的重要手段之一,正如在我的博客中所讨论的“软件测试究竟发挥什么作用?”:

  • 对产品质量完成全面的评估,为软件产品发布(如验收测试)、软件系统部署(如性能规划测试)、软件产品鉴定(第三方独立测试)委托方和被委托方纠纷仲裁(第三方独立测试)和其它决策提供信息;
  • 通过持续的测试(包括需求评审、设计评审、代码评审等)可以对产品质量提供持续的、快速的反馈,从而在整个开发过程中不断地、及时地改进产品的质量,并减少各种返工,降低软件开发的成本;
  • 通过测试发现所要交付产品的缺陷,特别是尽可能地发现各种严重的缺陷,降低或消除产品质量风险,提高客户的满意度,扩大市场份额,提高客户的忠诚度。
  • 通过对缺陷进行分析,找出缺陷发生的根本原因(软件过程中的问题,包括错误的行为方式)或总结出软件产品的缺陷模式,避免将来犯同样的错误或产生类似的产品问题,达到缺陷预防的目的

所以软件测试的价值不容忽视,但是我们一直提倡“质量更是內建的(Quality is built in)”,软件产品的质量是在需求分析、功能设计、系统设计、编程等过程中逐渐形成的,事先清楚客户的需求,明确软件产品的验收标准,基于这些需求和验收标准来开发,开发人员清楚自己要实现的目标、清楚待实现系统的要求和限制,在工作中能够第一次将事情做对,或者说,第一次将事情做对的可能性会显著提高,在需求、设计、代码中引入的缺陷就会大大减少。理解这一点并不难,如果还是不能很好理解,就看看砖墙是如何砌成的?是先拉上水准线再墙砌,还是墙砌好之后再拉线来检测?


而且,对测试人员说,全生命周期的测试依据也明确了,能够及时提供明确的质量反馈,测试与开发之间也不容易引起的争议,测试效率也会明显改善。本句宣言和验收测试驱动开发(Acceptance Test Driven Development, ATDD)拥有共同的思想和内涵,无论是在传统研发流程中还是在敏捷过程中,都可以尝试这样去做。虽然在某些项目上需求不够清楚、或需求变化比较大,但也不能成为“自己懒于彻底分析需求”的借口,能明确60%的需求,也不能做到30%就停下来了。 否则,无论是“迭代”、还是“重构”,都是“返工”美化之后的代名词。难道企业希望自己团队常犯错误而不断修正吗?

 

2. 认可专业测试人员的不可替代的价值,但更鼓励开发人员做好测试

上一句已经回答了测试的价值,而这里是讨论测试工作由谁来做?测试有价值,但不一定由专职的测试人员来做,正如一些公司(如facebook)没有专职的测试人员,软件产品的研发也能正常开展。也许在某些初创的企业、特殊商业模式的软件服务、某些移动终端的且免费的产品等可以不要专职的测试人员,但对大多数软件产品、软件企业还是需要专业的测试人员,因为系统复杂、业务更复杂的原因,更可能是测试本身更需要方法和技术。当我们不能简单地掌握软件产品(系统)的测试方法和技术,就需要专业的测试人员。即使在相对低端的制造业,掌握其工作技能不是很难,但熟练工人的工作效率也是初级操作工的几倍。而软件测试所涉及的方法、技术与工具,从功能测试到性能测试、安全性测试、兼容测试、可达性测试到可靠性测试等,从测试计划、测试分析与设计到测试结果分析,从等价类划分、判定表、因果图到基于模型的测试、自动化测试等,已形成一个庞大的体系,没有专注,很难做得精,不能精通测试,又如何有良好的测试效率呢?没有专业的测试技能,测试的风险也很大。这些内容,在我的另一篇博客“专业测试团队会消亡还是新生”进行了充分讨论。正如网友在本博客上还评论说:“如果没有专业的测试团队,那么天上的飞机一定会无缘无故地掉下来,ICU里面的心电监护仪罢工也不会是新闻,核弹未接收到真正的发射命令而自行启动也不是没有可能,这个世界将不再是安全的世界

为什么更鼓励开发人员做好测试呢?这是因为:

  • 单元测试是基础,没有单元的质量,如何有系统的质量?而单元测试主要是在代码层次上展开,而且和编程交织在一起,编程和单元测试难以分开处理,所以单元测试最好由开发人员来做,确保良好的工作效率与工作质量;
  • 如果开发了一个测试工具,先让开发人员用起来好,还是只让测试人员用?无论是功能测试工具还是性能测试、安全性测试工具,都可以让开发人员先用,测试的效率会更高。一边构建、一边验证,更能及时发现问题,能更快调试和修正问题,将问题消除在萌芽之中。这也就是为什么我们一直提倡持续构建、持续测试;
  • 如果开发人员做更多测试,就更能认识到自己的问题,了解问题产生的原因,将来在设计、编程中更好地避免同样问题的发生,预防缺陷效果更好。

这里鼓励开发人员做的测试,主要集中在单元测试(功能、性能方面的测试)、集成测试等方面。而系统的测试、用户需求的进一步验证和确认、大规模的性能测试、兼容性测试、安全性测试等则有专业的测试人员完成。

 

3. 认可测试计划的价值,但更强调计划是一个基于风险不断调整的过程

这点比较容易理解,做一件事,如果没有计划就比较盲目,失败的可能性就很大。测试计划目的就是明确测试的目标、测试的需求(包括测试范围、测试任务优先级等)、测试风险、测试资源和进度安排等,但同时需求会发生变更、开发的设计与代码质量超出我们的预料、测试工作量估算不足以及其它新的测试风险等各种因素的影响,我们可能需要不断调整测试计划,以适应新的测试需求等。计划重要,但不是一成不变的,也就是我们强调:

  • 测试计划不能停留在文档上面,它是对测试过程的规划与指导,使测试工作开展得更顺利、更有效;
  • 测试计划不是一个文档,而是一个计划的过程,适时调整以及时满足项目新的需求;
  • 对测试计划的调整也是学习的过程,有利于将来(为下一个项目)制定出更可靠的测试计划。

 

4. 认可探索式测试的价值,但更希望测试是具有系统方法的、相对规范的过程

我们都知道,测试不能穷尽,测试不能做到百分之百,总是有不能测到的地方,总是有缺陷遗留下来,这就给我们留下了足够的探索空间。探索式测试(Exploratory Testing,ET)的出现正是因为在软件系统中存在许多未知的东西难以得到快速、简单的验证,需要我们转变思路,不要以固定的模式来完成测试,而是要换一种新的模式来进行测试,以提高测试效率。因为需求不清楚、时间紧等各种原因,探索式测试才更有效,在一定程度上是因为软件开发本身的问题,所以,我也戏称“敏捷开发”为“探索式开发”。从这个意义上讲,探索式测试方法是不得已而为之的一种方式。在传统行业,没有看到一种“探索式检验”(除了食品安全检验,在我国还不够成熟,可能会采用探索式检验,哈哈),而是有明确的技术规格,有相应的检测仪器或方法进行检验,可以明确地给出检查结果。

探索式测试作为明确的术语或概念,最早是由测试专家CemKaner博士在1983年提出的,距今天差不多有30年,但绝大多数测试人只是最近几年才听到或熟知这个概念。说明其价值是有限的,如果价值很高,也不至于我们现在才比较关注的。但最近几年探索式测试很热,为什么?

一方面要感谢James A. Whittaker撰写的《ExploratorySoftware Testing》一书,比较全面地介绍了探索式软件测试(国内是2010年引进本书的,但也有不足,我在为史亮和高翔写的《探索式测试实践之路》的序中谈到这一点),对推广探索式测试有很大的促进作用。另方面,在互联网时代,需求衍变越来越快;软件已经成为一种服务(SaaS),迭代周期越来越频繁。敏捷方法开始流行,被软件企业广泛采用,敏捷测试随之而生,正是探索式测试用武之时。而且探索式测试的确给人一些新鲜的感觉,将测试工作变成更有趣的探索式活动,在享受工作的同时完成测试,容易受到测试工程师的欢迎。

探索式测试也在不断发展,人们试图帮助它建立一套方法体系,例如James Bach提出的基于会话的测试管理(Session Based Test Management,简称 SBTM)。该管理方法将测试任务分解成一系列会话(Sessions,发生在特定时间盒内的会话活动,对软件系统的测试就是看成不断地问系统的过程,从系统那里获得答案,探索式测试的会话特征更为明显),测试人员在会话过程中完成一个特定测试任务的设计、执行和记录。

但从探索式测试的“探索”概念本身来看,还是强调“设计与执行”同时发生的特点来看,探索式测试更多强调人的创造性,强调随软件功能的使用对其理解不断深入来发现问题,更强调这种上下文驱动的思维模式,而对验收的标准、验证的具体指标缺乏关注,更谈不上测试需求的分析、测试的系统设计,在系统性和规范性方面有很大的欠缺,所以难以得到国际标准的支持,在多数软件产品的测试工作中探索式测试只能起着辅助、补充的作用。

任何严重的缺陷的遗漏可能给公司带来不可估量的损失,软件测试更注重对软件质量的全面评估,最大程度地减少软件产品的质量风险,从这个意义看,测试目标、测试需求、测试风险等都是非常重要的,需要认真分析,然后在此基础上进行系统的测试设计。测试的结果需要严格的覆盖率衡量,而要确保高覆盖率,需要事先进行精心的设计,从业务流程、数据流程、用户场景等各个方面进行细致分析,采用合适的测试方法设计出相应的测试用例来覆盖流程路径、数据输入空间以及各种产品使用的场景。事先能从需求覆盖出发来设计测试用例,事后还可以从代码覆盖来检验测试的效果。当然,更理想的方式是用基于模型的测试或形式化方法来验证系统的需求,给出更客观的、更准确的质量评估,我们对产品的发布就更有信心,客户就能得到高质量的产品或服务。

 

5. 认可发现缺陷的价值,但更重视对软件产品质量的全面评估与持续反馈

发现一个缺陷并得到修正,产品的质量就减少一份风险;在当前产品中发现的缺陷越多,就能更多地消除产品的质量风险,这是软件测试价值之一个方面的体现。但我们不能有这样的思想:测试人员发现的缺陷越多,测试人员的价值越大。例如,我们不能一直等开发人员把设计、代码都工作全部完成之后,我们再来发现问题,以体现测试的价值。我们更不能明明看着开发人员犯错误、或者明明知道开发人员可能会在某些地方犯错误,我们也不给予提醒、不给予帮助,而是等到他们做完工作,我们再把问题发现出来,以体现我们的价值。

正确的做法则是及时提供有关质量的反馈,可能是一种质量风险的提示,也可能是一种质量担心的倾诉,更可能是一种有关质量改进的、积极的建议。例如:

  • 在需求分析时,发现需求不够清晰,发现可能给开发、测试带来困惑的地方,都要及时指出来,并帮助纠正。
  • 如果发现文档中新增加的功能没有多大意义,或者是自己难以看清楚其功能对客户的价值,就要主动和产品经理沟通,建议拿掉这个功能,或让产品经理解释清楚、说服自己。
  • 如果觉得开发任务安排不合理,或觉得开发之前的讨论、培训不够,对业务理解还很肤浅,就要及时和开发沟通,帮忙消除这种潜在的质量风险;
  • 如果发现开发不重视单元测试、或者单元测试做得很少,就要协助开发做好单元测试,提供单元测试指导,提供单元测试框架,提供一切可以帮助开发改善单元测试的服务。
  • 如果发现个别的开发工程师不遵守编程规范,就要启动质量反馈机制…
  •  … …

这意味着:

  • 测试工作不是软件开发生命周期的某个环境、某个阶段性的工作,而是贯穿整个软件软件开发生命周期,测试人员无时无刻不在关注质量;
  • 测试人员不仅仅要关注已经存在的产品缺陷的问题,还要关注可能导致缺陷发生的问题,尽量帮助产品需求人员、设计人员、编程人员预防质量问题的发生。
  • 测试不仅仅是测试人员的工作,而且和软件开发的其他团队(人员)有关系;测试工作不是测试团队内部的事,而是整个开发团队的事。
posted @ 2013-03-14 10:26 小马歌 阅读(282) | 评论 (0)编辑 收藏
 
     摘要: 摘要:向程序员以外的人员介绍一些使用 Visual Basic for Applications (VBA) 编程来扩展 Microsoft Office 2010 的基本方法。包括 VBA 语言概述、有关如何在不同的 Office 2010 应用程序中访问 VBA 的一些关键的详细信息、简单编程示例以及一些应用程序示例。(13 个打印页) Kingfisher Computer Con...  阅读全文
posted @ 2013-03-05 17:24 小马歌 阅读(531) | 评论 (0)编辑 收藏
 
     摘要: Office 201035(共 38)对本文的评价是有帮助 - 评价此主题摘要:向还不是程序员的 Excel 高级用户介绍 Excel 2010 中的 Visual Basic for Applications (VBA)。本文提供 VBA 语言概述、有关如何在 Excel 2010 中访问 VBA 的说明、面向实际 Excel VBA 编程问题的解决方案的详细说明以及有关编程...  阅读全文
posted @ 2013-03-05 17:19 小马歌 阅读(484) | 评论 (0)编辑 收藏
 

泰坦尼克号,在世界航海史上曾被骄傲地称为“永不沉没的巨轮”。 爱德华·史密斯,拥有丰富航海经验的船长与泰坦尼克号,在1912年4月14日处女航中撞击冰山而葬身大西洋,还有1503名船员和乘客。

  2012年的苏宁正面临着同样的挑战。做了二十多年零售的张近东,其面临的现实挑战已经不是让苏宁如何避免撞上冰山,而是已经撞上了冰山,如何让这艘巨轮前行,而不是坐等沉没。

  “泰坦尼克号”是如何沉没的?

  泰坦尼克号设计中,如果船上的16个防水舱只有4个进水的话,船还可以浮在水上,但不幸的是有5个底舱的外壁被冰山撕裂了,弃船是必然的选择。

  苏宁作为中国最优秀的连锁零售商,如果在线零售只是占所有社会商品零售的20%也许没有影响,但不幸的是在过去的一年里,苏宁所处的家电3C品类,线上占比已经迅速从7%攀升至17%以上,而且还在加速度发展,弃线下发展线上也是必然的选择。苏宁不是如何预警,如何躲避冰山的问题,而是已经撞上了冰山。

  2012年底马云和王健林对赌未来10年,在线零售能否占到社会零售总额的一半。也许包含餐饮服务在内,未必能够实现,但仅仅看家电和3C品类,在可预见的三五年内线上必然会超过线下,苏宁根本就没有10年的转型时间窗口。否则,随着线下市场被蚕食,而线上无法打败竞争对手京东商城,苏宁会如同泰坦尼克号永远的沉没。

  当然,这绝对不仅仅是苏宁的命运,而是所有传统零售商所需要面对的挑战。

  苏宁急转弯

  2012年6月19日,苏宁增发55亿后,在其南京总部召开发布会,高调发布了“2011-2020新十年发展战略”,董事长张近东携高管团队集体亮相,从连锁店面、业绩、市场营销、电子商务等方面分别作了目标预期,并“撂下狠话”:苏宁在2020年将成为店面总数3500家、销售规模6500亿元(线下3500亿,线上3000亿)的超级服务提供商。

  时隔短短半年,苏宁为何再次伤筋动骨调整长期战略,必是事出有因。因为半年前制定的战略是根本没有办法完成的。不考虑线上苏宁易购收入,苏宁线下实体店收入2012年前三季度负增长1%,门店也从每年净新增300多家转为负增长,线下已经在萎缩已无可能增长。因此,线上收入变成了苏宁未来收入唯一增长点。为了适应新情况的变化,线上业务需要注入更多的资源,战略再次调整自然成为了必然。

  否则,结局会如同国美一样。

  国美电器11月19日公布了前三季度财务报告,国美前三季度净亏损6.87亿人民币,而去年同期净利润为人民币17.91亿元人民币。前三季度营收为360.57亿人民币,比去年同期人民币439.83亿人民币同比下滑约18%,前三季度国美电器的毛利率为15.88%,而去年同期的为18.85%,毛利率下滑了2.97%。已经通过消息渠道了解:黄光裕无心再战,百思买欲重返中国,黄则可能将国美出售给百思买。

  简单总结:回顾2010年张近东言电商破坏价值毫无价值,到2011年言电商只是传统零售的补充,再到2012年结束后大动干戈调整战略,将电商视为苏宁的未来。中国零售业正在发生着翻天覆地的变革,而苏宁不得不调整战略,调整资源应对新的挑战。

  苏宁放下的救生艇:提升线上业务地位

  鉴于中国在线零售的快速发展,苏宁于2009年下半年上线苏宁易购,算是正式进军在线零售。回顾历史,2010年20亿,2011年59亿,2012年180亿,2012年第三季度苏宁易购营收占苏宁整体营收的16.94%,放之四海都是让人瞠目的业绩。然而问题是,在不顾用户体验,采取非可持续低价促销(零元购)的增长,在2013年能够持续吗?难。

  期望苏宁电商能够有更大的突破,必须借力苏宁的各种资源,而原来的组织和业务架构体系是无法满足这些要求的。因此在此次战略调整中,与之前相比,最大变化是新建了三个经营事业部,连锁平台经营总部、电子商务经营总部和商品经营总部,将电子商务的线上业务重要性提升到与线下电商平等的位置。

  至于说三个经营事业部下面结合实体产品、内容产品、服务产品三大类的28个事业部,形成“平台共享+垂直协同”的运营组合,如何理解解读就不重要了。

  另外指望线上线下融合是没希望的,且不说很多用户根本就不去实体店体验再下单,就算用户去了实体店,难道就意味着到苏宁电商下单吗?苏宁的体验店,也可以是京东,可以是易迅网的体验店。至于线上线下价格同价,更是没有可能的。要么线下和线上同价,线下毛利润率19%降低到线上的7%以下吗?线上赚钱的生意就变成亏本生意,显然不可能。要么线上价格和线下同价,线上19%的毛利率怎么和坚持10%以下毛利率的京东、易迅网竞争。总而言之,关店会继续,剩余的门店资源,也看不出特别的价值来。

  简单总结:电子商务是苏宁的未来,线下变成了线上的支持力量,线下变成了线上的补充。线上打仗需要支援,线下要支持要配合,那么线上的地位就要提升,各方的利益需要协同协调。背水一战,成败在此一役,张近东下了一个大赌注。

  苏宁需升级改造

  不管苏宁张近东怎么做,苏宁改成“云商”,还是“商城”,这些事用户看不到的,也不需要去关注。用户在苏宁买东西,只关注商品,价格和服务。苏宁的调整,能够让苏宁的商品丰富度提高吗?能够让苏宁的商品价格更加便宜吗?或者还是能够显著提升苏宁的服务品质,让苏宁电商的配送速度提升到当日达,次日达吗?

  先让我们来比较一下苏宁京东之间在商品丰富度、成本效率和用户体验的差距。

  苏宁的SKU不超过150万(小半是图书),而京东超过200万,如果你认真比较每个品类,直观比较更加明显,苏宁仅完成了横向的品类扩张,深度还很欠佳。

  苏宁的整体库存周转天数在70天左右,而京东的整体库存周转天数为32天,具体到3C品类只有15天。苏宁的成本费用率上升到15-16%,而京东在8-9%左右(最新情况预估)。

  苏宁电商的用户体验,除了大家电能够做到次日达,其它包括3C在内基本都要3-5天送达,甚至6-7天。送的慢,而且预测的送达时间也非常不准。而了解到京东最新的一个数据是去年第二季度订单平均下单到出库时间不到1小时,52%的订单,在出库后的4.2小时送达客户。

  如何让商品更加丰富?需要庞大的合理布局的仓储体系,需要一个智能化的IT系统。如何让商品价格更低?需要高效的仓储物流体系,需要一个系统驱动的商品采销管理运营系统,做到低成本运营。如何让服务用户体验更好?还是需要一个成熟稳定的仓储物流体系,需要一个稳定的IT系统。当然,仓储物流以及IT系统,都需要一个能征善战的优秀团队。以上这些,苏宁有了吗?

  苏宁电商仓储,大家电能够共用集团的仓储资源,但是包括3C、日用百货在内的小件仓储,以及最后一公里,需要另外筹建。按照苏宁的规划,12个分布全国的小件仓要到2015年底才完成建设。电商一日千里,等得起三年时间吗?

  苏宁电商IT系统,苏宁是一家对IT系统不可谓不重视的零售企业。但相比较于优秀电商而言,还远远不够,否则就不会把核心系统交给第三方服务商了。因为无论是Amazon,还是国内的京东,易迅网都是自建的IT系统。至于交给第三方服务商如何,看用户投诉即可知。苏宁易购之前的投诉中,大部分来自IT系统,比如日常都出现这样的情况:网页打开速度慢甚至无法打开、商品无法正常下单,支付不成功,返券系统不默认……而这些问题在促销日更加多。IT系统,已经成为了苏宁电商发展的核心瓶颈,而且严重制约了后续的发展。

  简单总结:苏宁电商很重要,但是打造苏宁电商核心竞争力的两项重要能力仓储物流和IT系统,做得并不好,而且两三年内无望解决。所以苏宁电商必然还是会维持在一个高成本运营,以及较差的用户体验的运营状态。知己知彼方能百战百胜,苏宁对其竞争对手了解还不够深。

  苏宁应该急刹车

  昨日和同事晚餐,我说苏宁面临着巨大的挑战,是有可能出人意料出局的。同事赞同苏宁所面临的困境,也觉得苏宁新的战略也无太多的亮点,但不会出局。因为苏宁政府关系之强,而不会让它倒闭,苏宁背后几家PE不愿意让它倒。退一万步,苏宁在线下拥有大量地产资产,变卖了,也够苏宁活几十年。

  当然生意不是这么做的,从我个人的角度来看,苏宁不要急于完成它的6500亿,不要急于去打败京东。零售是马拉松长跑,不在一城一池得失,搭建一个规模化成长的基础才是关键所在。零售做好了,什么供应链金融、大数据,也就自然而然了。零售做不好,其它“云商”概念,如水中月镜中花,是没有意义的。

  简单总结:苏宁提“云商”概念,可以给投资人听,给政府听,得到更多的支持。但做好零售还是根本,还得继续关注成本效率,关注用户体验,因此现阶段改造仓储物流体系,完善IT系统,才是更加关键的,这些都需要时间,需要苏宁将电商刹车,慢下来。

  对苏宁的希望,别把马拉松长跑当百米冲刺

  我希望苏宁转型成功,为什么?因为无数的传统企业都在盯着看苏宁,之前无数的零售商品牌商企业都试过了,都失败了。如果像苏宁这样如此坚决转型,如此愿意投入海量资源,拥有如此优秀的执行力强的团队的零售商都转型失败了,传统零售商转型的心,真的要死了。

  借用我回同事的一句话结尾:2013年是电商关键的一年,可以说苏宁成败在此一役,但最重要的是如何打造一个低成本高效率,并保证用户体验的可规模化成长基础。零售,是马拉松长跑,不是100米冲刺。

posted @ 2013-02-22 16:10 小马歌 阅读(230) | 评论 (0)编辑 收藏
仅列出标题
共95页: First 上一页 28 29 30 31 32 33 34 35 36 下一页 Last