分类归档:技术

技术类

系统高并发优化tips

1 Linux 调 参数,和非root
2 数据库和程序在一个机架
3 tomcat,jvm 用 7 最新。调优
4 一台多tomcat, 1台tengine 单独一台机器
5 mysql 主从 非集群
6 数据库缓存 memcached
7 sql 优化
8 mybatis 或者jpa jdbc 而不是hibernate
9 mybatis 不查多表,用程序控制(n+1 问题,因为有缓存,不存在n的问题,但是程序要查询n+1次,不过程序是集群的,多台机器。不够就加机器。而且前端有tengine 反向代理。应用服务器的机器,比数据库服务器机器廉价)
10 session,集群session。memcached。 最好不用session,而是用oauth2 token这种。方便横向拓展。单台服务器里,也要用缓存timecachemap(RotatingMap)。
11 数据不要做外键约束,要做索引
12 分表,分库 ,水平分隔,垂直分隔,对无用的历史数据进行清理备份
13 不要全文搜索
14 资源文件 做cdn
15 使用restful 风格api,所有get请求都是资源
16 前端和后端分离,用json。最好前端封装成 application。
17 程序技术选型时,选用比较稳定,快速的组件,比如用fastjson,而不是gson等。
18 程序可以使用分布式,比如dubbo甚至yarn等。
————
19 数据库换成redis,Cassandra ,hbase等
20 使用 mapreduce,storm等。

科学的使用Google

最近Google一直打不开。so,写一篇简短的文章介绍一下。

曾经的smarthost,不能用了。貌似goagent也不好用。

不过,改hosts肯定可以的。原因是Google服务器的容错机制。

只要能连连接Google任何一台服务器,就能使用Google的任何服务,不包括YouTube。

方法,改hosts。

1.hosts 这个是我的host

2. 如果不能使用,可以换成其他ip

3.其他ip 在这里找吧。googleip

4.登录Google账户,使用https上网。

安装strom

第0步,安装jdk
从oracle官方下载jdk6,xxx.bin的。给它执行权限 chmod a+x xxx.bin
./xxx.bin
然后把解压出来的java目录放到/usr/java/jdk,
然后配置环境变量(不懂vi的,看一眼手册去)
vim /etc/profile
 export JAVA_HOME=/usr/java/jdk
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
export JRE_HOME=$JAVA_HOME/jre
保存退出
source /etc/profile
sudo update-alternatives –install /usr/bin/java java /usr/java/jdk/bin/java 300
sudo update-alternatives –install /usr/bin/javac javac /usr/java/jdk/bin/javac 300
sudo update-alternatives –install /usr/bin/jar jar /usr/java/jdk/bin/jar 300
sudo update-alternatives –config java
第一步,安装Python2.7.2
wget http://www.python.org/ftp/python/2.7.2/Python-2.7.2.tgz
tar zxvf Python-2.7.2.tgz
cd Python-2.7.2
./configure
make
make install
vi /etc/ld.so.conf
追加/usr/local/lib/
sudo ldconfig
第二步,安装zookeeper
wget http://labs.mop.com/apache-mirror/zookeeper/zookeeper-3.3.5/zookeeper-3.3.5.tar.gz
tar -zxvf zookeeper-3.3.5.tar.gz
cp -R zookeeper-3.3.5 /usr/local/
ln -s /usr/local/zookeeper-3.3.5/ /usr/local/zookeeper
vim /etc/profile (设置ZOOKEEPER_HOME和ZOOKEEPER_HOME/bin)
export ZOOKEEPER_HOME=”/usr/local/zookeeper”
export PATH=$PATH:$ZOOKEEPER_HOME/bin
cp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo.cfg (用zoo_sample.cfg制作$ZOOKEEPER_HOME/conf/zoo.cfg)
mkdir /var/zookeeper
mkdir /var/log/zookeeper
根据Zookeeper集群节点情况,在conf目录下创建Zookeeper配置文件zoo.cfg:
tickTime=2000
dataDir=/var/zookeeper/
clientPort=2181
initLimit=5
syncLimit=2
server.0=192.168.1.11:2888:3888
其中,dataDir指定Zookeeper的数据文件目录;其中server.id=host:port:port,id是为每个Zookeeper节点的编号,保存在dataDir目录下的myid文件中,zoo1~zoo3表示各个Zookeeper节点的hostname,第一个port是用于连接leader的端口,第二个port是用于leader选举的端口。
在dataDir目录下创建myid文件,文件中只包含一行,且内容为该节点对应的server.id中的id编号。
第三步,安装zeromq以及jzmq
jzmq的安装貌似是依赖zeromq的,所以应该先装zeromq,再装jzmq。
1)安装zeromq:
wget http://download.zeromq.org/zeromq-2.2.0.tar.gz
tar zxf zeromq-2.2.0.tar.gz
cd zeromq-2.2.0
./configure
make
make install
sudo ldconfig (更新LD_LIBRARY_PATH)
zeromq安装完成。
注意:如有有依赖报错,需要安装:
jzmq dependencies 依赖包
sudo yum install uuid*
sudo yum install libtool
sudo yum install libuuid
sudo yum install libuuid-devel
2)安装jzmq
yum install git
git clone git://github.com/nathanmarz/jzmq.git
cd jzmq
./autogen.sh
./configure
make
make install
然后,jzmq就装好了.
注意:在./autogen.sh这步如果报错:autogen.sh:error:could not find libtool is required to run autogen.sh,这是因为缺少了libtool,可以用#yum install libtool*来解决。
第四步,安装Storm
wget http://cloud.github.com/downloads/nathanmarz/storm/storm-0.8.1.zip
unzip storm-0.8.1.zip
mv storm-0.8.1 /usr/local/
ln -s /usr/local/storm-0.8.1/ /usr/local/storm
vim /etc/profile
export STORM_HOME=/usr/local/storm-0.8.1
export PATH=$PATH:$STORM_HOME/bin
首先弄好环境:
启动zookeeper:
zkServer.sh  start
配置storm:
文件在/usr/local/storm/conf/storm.yaml
内容:
 storm.zookeeper.servers:
     – 192.168.1.11
 storm.zookeeper.port: 2181
 nimbus.host: “192.168.1.11”
 storm.local.dir: “/home/storm/workdir”
 supervisor.slots.ports:
  – 6700
  – 6701
  – 6702
  – 6703
这个脚本文件写的不咋地,所以在配置时一定注意在每一项的开始时要加空格,冒号后也必须要加空格,否则storm就不认识这个配置文件了。
说明一下:storm.local.dir表示storm需要用到的本地目录。nimbus.host表示那一台机器是master机器,即nimbus。storm.zookeeper.servers表示哪几台机器是zookeeper服务器。storm.zookeeper.port表示zookeeper的端口号,这里一定要与zookeeper配置的端口号一致,否则会出现通信错误,切记切记。当然你也可以配superevisor.slot.port,supervisor.slots.ports表示supervisor节点的槽数,就是最多能跑几个worker进程(每个sprout或bolt默认只启动一个worker,但是可以通过conf修改成多个)。
启动Storm各个后台进程
最后一步,启动Storm的所有后台进程。和Zookeeper一样,Storm也是快速失败(fail-fast)的系统,这样Storm才能在任意时刻被停止,并且当进程重启后被正确地恢复执行。这也是为什么Storm不在进程内保存状态的原因,即使Nimbus或Supervisors被重启,运行中的Topologies不会受到影响。
以下是启动Storm各个后台进程的方式:
1 Nimbus: 在Storm主控节点上运行”bin/storm nimbus >/dev/null 2>&1 &”启动Nimbus后台程序,并放到后台执行;
2 Supervisor: 在Storm各个工作节点上运行”bin/storm supervisor >/dev/null 2>&1 &”启动Supervisor后台程序,并放到后台执行;
3 UI: 在Storm主控节点上运行”bin/storm ui >/dev/null 2>&1 &”启动UI后台程序,并放到后台执行,启动后可以通过http://{nimbus host}:8080观察集群的worker资源使用情况、Topologies的运行状态等信息。
启动ui,可以通过 ip:8080/ 查看运行i情况。
向集群提交任务
1)启动Storm Topology:
storm jar allmycode.jar org.me.MyTopology arg1 arg2 arg3
其中,allmycode.jar是包含Topology实现代码的jar包,org.me.MyTopology的main方法是Topology的入口,arg1、arg2和arg3为org.me.MyTopology执行时需要传入的参数。
2)停止Storm Topology:
storm kill {toponame}
其中,{toponame}为Topology提交到Storm集群时指定的Topology任务名称。
https://github.com/nathanmarz/storm-starter
是maven项目,直接导入maven项目即可。但是国内无法下载twitter4j,需要自己手动下载,然后将pom中的twitter4j换成本地。Mvn install 即可。
使用命令启动
storm jar storm-starter-0.0.1-SNAPSHOT-jar-with-dependencies.jar storm.starter.WordCountTopology test2
http://{nimbus host}:8080  查看test2 运行情况
storm kill test2 关闭
注:本人使用windows 64位系统。vmware的8.x的虚拟机。服务器为centos 6.x 64位,jdk为 oracle 6 ,jvm为hotspot。虚拟机内存为 1.3g,注意,本人笔记本为 因特尔处理器,i5系列。需要在bios中开启虚拟化功能,默认不开启。我同学笔记本貌似amd,安装不了 centos 64位。 由于内存限制,只能开一台虚拟机,没办法模拟真实的集群了。

ORACLE+SQL性能优化

ORACLE SQL性能优化系列

  1. 访问Table的方式

ORACLE 采用两种访问表中记录的方式:

  1. 全表扫描

全表扫描就是顺序地访问表中每条记录. ORACLE采用一次读入多个数据块(database block)的方式优化全表扫描.

  1. 通过ROWID访问表

你可以采用基于ROWID的访问方式情况,提高访问表的效率,  ROWID包含了表中记录的物理位置信息..ORACLE采用索引(INDEX)实现了数据和存放数据的物理位置(ROWID)之间的联系. 通常索引提供了快速访问ROWID的方法,因此那些基于索引列的查询就可以得到性能上的提高.

阅读全文 ……

伪分布式安装部署CDH4.2.1与Impala

http://www.cloudera.com/content/cloudera-content/cloudera-docs/CDH4/latest/CDH4-Quick-Start/cdh4qs_topic_3_3.html
http://www.cloudera.com/content/cloudera-content/cloudera-docs/Impala/latest/Installing-and-Using-Impala/Installing-and-Using-Impala.html

From Zero to Impala in Minutes

什么是Impala?
Cloudera发布了实时查询开源项目Impala,根据多款产品实测表明,它比原来基于MapReduce的Hive SQL查询速度提升3~90倍。Impala是Google Dremel的模仿,但在SQL功能上青出于蓝胜于蓝。

1. 安装JDK
$ sudo yum install jdk-6u41-linux-amd64.rpm

阅读全文 ……

googlezon

影片地址:http://mccd.udc.es/orihuela/epic/ols-master.swf
原版地址:http://www.robinsloan.com/epic/本片作者非常大胆的预言Google将与Amazon合并、传统­新闻媒体将衰败式微、Googlezon将击败微软Newsbo­tster,然后推出 EPIC独霸天下,非常的有趣!让人感到这­世界运转越来越快,媒体生态变化迅速,没有高瞻远瞩和创新思维与­灵活反应,大概就没有机会长存了。

阅读全文 ……

一个真实的推荐系统

 我给大家说一个真实的推荐系统,
今天我没加班,回家去超市买点点心。
一起我在上一个公司,就不加班,没晚上我都去买点心。
今天那个妹子问我,怎么好久没来了?
我说加班!!
然后要了枣泥的点心2块。

她说,这边有豆沙的,要不要来两个?
我果断要2个。

因为天天买,所以在她的大脑里产生了大量数据,
根据我喜欢的口味,比如枣泥馅,推荐给我豆沙馅的(新品)。

豆沙馅,和枣泥馅有一个共同的特点,都是甜的。这就叫聚集。
因为妹子是卖糕点的,所以会接触有很多顾客。其他顾客,买枣泥馅的,可能也买了豆沙馅的。所以,妹子就推荐给我了。这叫协同过滤。
其实亚马逊也是这样的。没啥新鲜的东西。只不过他们计算机多而已。

get/set 注入取值的时候会出现问题

get/set 注入取值的时候会出现问题。
set、get注入spring,struct2 根据对象注入而不是类。
例如 一下是正确
例子1 eclipse会正确生成
private User user;
public User getUser(){
return this.user;
}
public User setUser(User user){
this.user=user;
}
例子2 eclipse会正确生成
private User aaa;
public User getAaa(){
return this.user;
}
public User setAaa(User user){
this.user=user;
}
以下是错误的 eclipse不会这样生成,下面是我手写的
private User aaa;
public User getUser(){
return this.aaa;
}
public User setUser(User user){
this.aaa=user;
}
问题所在,如果不注意,

private TPuser tPuser;

public TPuser gettPuser() {
return tPuser;
}

public void settPuser(TPuser tPuser) {
this.tPuser = tPuser;
}
注意get,set后面不是大写,struct2,和spring 只认 对象(private Aaa bbb)中间的bbb把首字母大写然后加上get,set既getBbb(),setBbbb();
在强调一遍get,set是对象,不是类!!

探索Java语言与JVM中的Lambda表达式

头(->)将前两者分隔开。

注意:Lambda表达式的语法仍可能会面临改变,但在撰写本文的时候,下面示例中所展示的语法是能够正常工作的。

Lambda表达式非常倚重类型推导,与Java的其它语法相比,这显得极其不同寻常。
让我们进一步考虑之前已经看过的一个示例(请见清单11)。如果看看ActionListener的定义,可以发现它只有一个方法(请见清单12)。 阅读全文 ……