ǰÑÔ£º
ËѺüÔÆ¾°×÷ΪËѺüµÄpaasƽ̨£¬ÔÚ2014Äê5ÔÂ22ÈÕµÄÔÆ¼ÆËã´ó»áÉÏÕýʽ·¢²¼Á˹«²â¡£³õ²â£¬×¢²áÓû§±ØÐëÏÈÉêÇëÑûÇëÂë²ÎÓ빫²â»áÔùËÍÓû§100Ôªµç×Óȯ£¬¾¹ýʵÃûÈÏÖ¤Ö®ºó»áÔÙÔùËÍ100µç×Óȯ£¬Ä¿²â¿ÉÒÔ¶ÔÊÔÓÃÓû§»ù±¾app¹»ÅܰëÄê¡£
³ýÁËÓû§ÖÐÐĵÄһЩ»ù±¾°²È«ÐÅÏ¢ÉèÖú͸÷ÖÖÕ˵¥Í⣬ÎÒÏëÖ÷Òª¶ÔÆä¿ØÖÆÌ¨µÄʹÓýøÐÐÑо¿Ò»·¬¡£
·Ï»°²»¶à˵£¬ÔÚ°ó¶¨ÓÊÏä²¢³äÖµ10Ôª³ÉÕýʽÓû§Ö®ºó£¬ÎÞ×èµ²½øÐи÷ÖÖ²âÊÔ°É¡£
dashboardºÜÇåиɾ»£¬ÊÇÒ»¸ö¶ÔÓû§»ù±¾Ïû·ÑÇé¿öºÍʹÓÃ×ÊÔ´·þÎñµÄ»ù±¾¸ÅÀÀ¡£

Ò»¡¢À´´´½¨¸öÓ¦ÓÃ
ÕâÀïÐèҪѡÔñÑ¡ÔñÓ¦ÓõĻù±¾ÀàÐÍÊÇweb»òºǫ́worker£»
ÔËÐл·¾³ÐèÒªÊÂÏÈÑ¡ÔñºÃ£¬Æäjava¾ÍÌṩÈýÖÖ²»Í¬µÄÔËÐл·¾³£¬Ö§³ÖÓïÑÔÀàÐÍҲͦ¶àµÄ£¬»ù±¾µÄÖ÷Á÷ÓïÑÔ¶¼ÓÐÖ§³Öµ½ÁË£»
ʵÀýÀàÐÍÒ²¾ÍÊÇÈÝÆ÷ÀàÐÍ£¬Ê¹ÓÃlinux lxc¼¼Êõ£¬ÌṩÁËÁùÖÖ²»Í¬µÄÈÝÆ÷À´ÔËÐÐÎÒÃǵijÌÐò¡£

´´½¨³É¹¦Ö®ºó£¬»áÓÐһЩĬÈϵÄÅäÖá£
ÓòÃû£ºcstest.sohuapps.com °æ±¾£º1 ʵÀýÅäÖãº3-8£¬¿ÉÒÔ×Ô¶¨ÒåÅäÖà ÈÝÆ÷ÀàÐÍ£ºC2£¬¿ÉÒÔ×Ô¶¨ÒåÅäÖà ð¤ÐԻỰ£º¹Ø±Õ£¬¿ÉÒÔ×Ô¶¨ÒåÅäÖà ÍâÍø·ÃÎÊ£º¹Ø±Õ£¬¿ÉÒÔ×Ô¶¨ÒåÅäÖà git·þÎñ£ºgit@git.cloudscape.sohu.com:cs/cstest.git£¬¾ÝÁ˽âºóÐø»á¿ªÆôgit push×Ô¶¯²¿Êð¹¦ÄÜ¡£ ×Ô¶¯µ÷¶È£º¿ªÆô£¬¿ÉÒÔ×Ô¶¨Ò广ÔòÒýÇæ£¬Õâ¸ö±È½ÏÅ£±Æ£¬Ä¿²â¹úÄÚpaas»¹Ã»ÓÐÖ§³Öµ½ÕâµãµÄ¡£</span> |
±ÊÕß·¢ÏÖ£¬
Èç¹ûÎÒÃÇûÓÐÉÏ´«³ÌÐò°ü£¬Ëü»á¸ù¾ÝÎÒÃÇ´´½¨Ó¦ÓÃÑ¡ÔñµÄÔËÐл·¾³Ìṩһ¸öĬÈϵijÌÐò°ü·Åµ½Ó¦Óõİ汾1ÖС£
Æô¶¯Ö®ºó£¬·ÃÎÊÓòÃû http://cstest.sohuapps.com
¾ÍÄÜ¿´µ½Ò»¸öºÜ¼òµ¥µÄhello world£¡
¶þ¡¢Ïê½â´úÂë°ü
¾¹ý±È½ÏÉîÈëµÄÁ˽⣬´úÂë°ü½á¹¹Ê×ÏÈÎÞÂÛÄÄÖÖÓïÑÔ¶¼Ö»ÄÜÊÇzip°üµÄ½á¹¹£¬½â¿ªÖ®ºóµÄ±ê׼Ŀ¼ÈçÏ£º

²»ÄÑ·¢ÏÖ£¬ÓÐÕâÑù¼¸¸öÎļþ»òÕßĿ¼£º

È»ºó£¬ÎÒÒªÖØµãÆÊÎöÒ»ÏÂÕâ¸öapp.yamlÎļþ£¬ËüµÄÅäÖÃÓÐÎÞ¡¢ÊÇ·ñÕýÈ·¡¢¾ßÌå²ÎÊýÉèÖÃÖ±½Ó¾ö¶¨appµÄ
ÔËÐÐ×´¿öºÍ¼à¿Ø×´Ì¬¡£
¶ÔÓÚËѺüÔÆ¾°paasÉÏÌṩµÄ°ËÖÖÔËÐл·¾³£¬ËüÃǵÄapp.yamlÅäÖö¼ÊDz»Ò»ÑùµÄ£¬ÉõÖÁ ÓÚpythonÓëpython
on webpyµÄapp.yamlÅäÖö¼ÊDz»Ò»ÑùµÄ¡£
ÏÂÃæÎÒ¶ÔÓÚÔÆ¾°ÌṩµÄÁùÖÖÓïÑÔ£¬°ËÀà»·¾³µÄÅäÖýøÐÐÏêϸ½éÉÜ£¬²¢ÎªÃ¿¸öÔËÐл·¾³Ìṩһ¸ö¿ÉÔËÐеÄÄ£°å³ÌÐò°ü£¬Îª´ó¼ÒÌṩ²Î¿¼¡£
2.0 È«²¿²ÎÊý
Ê×ÏÈÌùÉÏÒ»ÕÅÌṩµÄËùÓвÎÊýÅäÖ㬵«²¢²»ÊÇÿ¸öÔËÐеÄÓïÑÔ¶¼ÄÜʹÓá£

2.1 Java on jetty
appid: 666666666 start: $JETTY_START tcp_health: false tcp_health_port: [8001, 8002] try_restart: {fall: 10, enable: true} web_health: true web_health_conf: path: / success: [200, 201, 403, 301, 302] timeout: 500ms |
2.2 Java on resin
appid: 666666666 start: $RESIN_START tcp_health: false tcp_health_port: [8001, 8002] try_restart: {fall: 10, enable: true} web_health: true web_health_conf: path: / success: [200, 201, 403, 301, 302] timeout: 500ms |
2.3 Java on tomcat
appid: 666666666 start: $TOMCAT_START tcp_health: false tcp_health_port: [8001, 8002] try_restart: {fall: 10, enable: true} web_health: true web_health_conf: path: / success: [200, 201, 403, 301, 302] timeout: 500ms |
2.4 PHP
appid: 666666666 start: $PHP_FPM_START |
2.5 LUA
appid: 666666666 start: $LUA_START |
2.6 NODEJS
appid: 666666666 start: $LUA_START |
2.6 NODEJS
appid: 666666666 web_health: true web_health_conf: path: / timeout: 500ms success: [200,201,403,301,302] try_restart: enable: true fall: 10 start: $NODEJS $USER_DIR/app/main.js |
2.7 PYTHON
appid: 666666666 start: $UWSGI_START |
2.8 PYTHON with WEBPY
appid: 666666666 start: $PYTHON $USER_DIR/bin/main.py 8080 try_restart: {fall: 10, enable: true} web_health: true web_health_conf: path: / success: [200, 201, 403, 301, 302] timeout: 500ms |
2.9 RUBY ON RAILS
appid: 666666666 web_health: true start: /opt/apps/ruby/bin/unicorn_rails -c /opt/src/app/unicorn.rb -D stop: kill $(cat /opt/conf/unicorn.pid) |
×ܽáһϣ¬
appidÊÇÃ²ËÆ9Î»Ëæ»úÊý×Ö£¬startÊÇÆä¸ù¾ÝÅäÖÃÃüÁîÆô¶¯µÄ²ÎÊý£¬ÕâÁ©²ÎÊýÊDZØÐëµÎ¡£
´ÓÆäapp.yamlµÄÅäÖÃÀ´¿´£¬Æä¸ñʽҪÇóÊǺÜÑϸñµÄ£¬±ØÐëÑϸñ°´ÕÕ yamlµÄ¸ñʽÌîд£¬°üÀ¨¿Õ¸ñ£¬Ëõ½øµÈ·½Ã棬±ÈÕâ¾ÍÔÚÕâ·½Ãæ³Ô¹ý¿÷¡£
Æä´Î£¬´ÓÆäÿÖÖÔËÐл·¾³µÄÅäÖÃÀ´¿´£¬¸÷Ïî²ÎÊý²¢²»ÊÇÔÚÿ¸öÔËÐл·¾³ºÍÓïÑÔÖж¼ÄÜÖ§³Öµ½µÄ£¬ÐèÒª×öЩµ÷Õû£¬±ÊÕß×î´ó»¯µÄʹÓÃÁËÕâЩ²ÎÊý¡£
×îºó£¬ÒªÊ¹ÓÃʾÀý´úÂëÖ»ÐèÒª£¬ÐÞ¸Äzip°üÖÐapp.yamlÖеÄappidΪÄãµÄappid¼´¿É¡£
Èý¡¢¸ß¼¶½ø½×
ÌṩÓïÑÔÖ§³ÖÌ«¶à£¬²»ÄÜ̾̾¾ãµ½£¬ÏÂÃæÒÔjavaΪÀý£¬½éÉÜÒ»ÏÂËѺüÔÆ¾°ÌṩµÄһЩ¸ß¼¶¹¦ÄÜ¡£
3.1 ÈÕÖ¾Êä³ö
ËѺüÔÆ¾°¶ÔÈÕÖ¾Êä³öλÖÃÒªÑϸñÒªÇóµÄ£¬²»ÄÜËæ±ã×Ô¶¨Òå·¾¶£¬Ö»ÄÜÊä³öµ½ /opt/logsĿ¼Ï£¬¶øÇÒ×Ô¶¨ÒåµÄÈÕÖ¾ÎļþÊDz»»á±»²É¼¯ºÍ±£´æµÄ£¬Èç¹ûÏëÒª±»Ôƾ°paasÊÕ¼¯²¢±£´æ±ØÐëдµ½ËüÃÇÔ¤¶¨ÒåµÄ»·¾³±äÁ¿
${LOG_FILE}ÖС£
ÓÉÓÚ±ÊÕßʹÓÃlog4j×÷ΪÈÕÖ¾Êä³ö£¬Òò´Ë£¬¸ø´ó¼ÒÌṩһ¸ölog4jµÄÅäÖÃÆ¬¶Î£¬ÈçÏ£º
log4j.rootCategory=INFO,FILE log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=[%d{yyyy-MM-dd HH\:mm\:ss}]%-5p %c(line\:%L) %x-%m%n log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender log4j.appender.FILE.Threshold = INFO log4j.appender.FILE.File=${LOG_FILE} log4j.appender.FILE.layout=org.apache.log4j.PatternLayout log4j.appender.FILE.layout.ConversionPattern=[%d{yyyy-MM-dd HH\:mm\:ss}]%-5p %c(line\:%L) %x-%m%n |
¹þ£¬ÊDz»ÊǺܼòµ¥ÄØ¡£
µ«ÊÇ£¬ÒªÖªµÀÈç¹ûҪʹÓÃlog4jµÄÅäÖ㬻¹ÐèÒª×öÒ»Ð©ÌØ¶¨µÄÅäÖ㬱ÈÈçÐèÒªÅäÖÃÒ»¸öservletÀ´¼ÓÔØlogj.propertiesÎļþ£¬²»¶à˵£¬×ÔÐÐËÑË÷£¬±ÊÕߺóÃæÒ²»á¸½ÉÏ´úÂë°ü¹©¸÷λ¿´¹ÙϸϸÑо¿¡£
ʹÓõķ½Ê½²»ÍâºõÈçÏ£º
Logger log = LoggerFactory.getLogger(LogTest.class); log.info("info| " + Thread.currentThread().getName() + " is running!"); log.warn("warn| there is some warning messages"); log.debug("debug| I am doing system debug"); log.error("error| sorry ,some errors happend!"); log.trace("trace| unknown messages following!"); |
3.2 ·þÎñʹÓÃ
×ݹÛËѺüÔÆ¾°ÌṩµÄ·þÎñ£¬mysql£¬memcache£¬redis£¬storageµÈ»ù±¾·þÎñ¶¼Ö§³Ö£¬Âú×ãÁËÎҵĴ󲿷ÖÐèÇ󣬱ÊÕß½öÒÔʹÓÃredisΪÀý½éÉÜÒ»ÏÂÈçºÎ¸ß´óÉϵÄʹÓÃredisµÄ»º´æ·þÎñ¹¦ÄÜ¡£
Ê×ÏÈÐèÒªµ½·þÎñÖÐÈ¥ÉêÇëÒ»¸öredis·þÎñ£¬¼ÇסÊÇ¿ÉÒÔ×Ô¶¨Òå·þÎñÃû³ÆµÄŶ¡£

È»ºó±ÊÕß¾ßÌå½éÉÜһϴúÂëÖеÄʹÓ÷½°¸¡£
ËüÃÇ»áÌṩһ¸öURL¸æËßÎÒÃÇ¿ÉÓõķþÎñÁÐ±í£¬È»ºóÒ²ÌṩÁË»ñÈ¡·þÎñÁбíÈÏÖ¤ËùÐèÒªµÄUIDºÍpassword¡£
±ÊÕß½¨ÒéʹÓÃÌṩµÄuidºÍpasswordÀ´ÔÚ×Ô¼ºµÄ³ÌÐòÖж¯Ì¬»ñÈ¡£¬http restµÄgetÇëÇó·½Ê½£¬Äã¶®µÃ¡£
ÌùÉÏÁ½¶Î´úÂ룬À´»ñÈ¡redisʵÀý£¬²¢¹¹½¨Ê¹ÓÃËü¡£
static List<RedisInstanceNode>
getNodes(String uid, String password) throws ServiceException { Map<String, String> params = ParamUtils.getDefaultParams(); params.put("uid", uid); params.put("password", password); String endpoint = "http://internal.cloudscape.sohu.com"; String action = "/redis/service_instance/nodes"; String url = endpoint + action; int timeout = HttpUtils.getRestTimeout(); if (httpService == null) { httpService = new HttpServiceImpl(); } HttpService.HttpResult result
=httpService.httpGet(url, params, timeout); String info = result.getResult(); Map<String, JsonNode> res = JsonUtils.readValueAsJson(info); JsonNode nodesJson = res.get(ApiKeys._nodes); if (nodesJson == null || nodesJson.isNull()) { log.info("open api return error message, ap
pinfos is empty , code: " + result.getCode() + ", message: " + res.get(ApiKeys._message)); return Collections.emptyList(); } List<RedisInstanceNode> list =
(List<RedisInstanceNode>) JsonUtils.readValueAsList( sonUtils.writeValueAsString(nodesJson),
ArrayList.class, RedisInstanceNode.class); return list; } |
//<span style="font-family: Arial, Helvetica, sans-serif;">
(b)¡¢</span><span style="font-family: Arial, Helvetica, sans-serif;">
¸ù¾Ý·µ»ØµÄʵÀýnodesÁÐ±í¹¹½¨redis Á¬½Ó³Ø£¬±ÊÕßʹÓÃÁËÇ¿´óµÄjedis¡£</span> |
private static ShardedJedisPool pool;
|
for (RedisInstanceNode redis : nodes) { String ip = redis.getIp(); int port = redis.getPort(); int master = redis.getIsMaster(); JedisShardInfo jsi; if (master == 1) { jsi = new JedisShardInfo(ip, port, "master"); jsi.setPassword(key); jsi.setTimeout(3600000); shards.add(jsi); } else { continue; } } JedisPoolConfig jpc = new JedisPoolConfig(); jpc.setMaxActive(500);// ×î´ó»î¶¯ÊµÀýÊýÄ¿ jpc.setMaxIdle(200);// ×î´óֹͣʵÀýÊýÄ¿ jpc.setMaxWait(5000);// ×î´óµÈ´ýʱ¼ä jpc.setTestOnBorrow(false); pool = new ShardedJedisPool(jpc, shards);
|
//£¨c£©¡¢Ê¹ÓÃÁ¬½Ó³Ø£¬½øÐÐÊý¾ÝsetÓëget |
try { jedis = pool.getResource(); jedis.setex("test-key", defaultTimeout, "test-value"); } catch (Exception ex) { log.error(ex.getMessage(), ex); if (jedis != null) { pool.returnBrokenResource(jedis); } } finally { if (jedis != null) { pool.returnResource(jedis); } } |
ºÃÁË£¬ÕâÑù¾ÍÄÜʹÓÃredis·þÎñÁË£¬ÆäÓàµÄ¼¸Àà·þÎñÀàËÆ°É¡£
3.3 ssh怬
Ê×ÏÈ˵£¬Õâ¸ö¹¦ÄܱØÐëÔÞÒ»¸ö£¬¸ÒÓÚ°Ñssh¹¦ÄÜ¿ª·Å³öÀ´£¬ÊÇÒ»¸öºÜ´óµÄÓÂÆø¡£
Éϸöͼ£¬

¿ÉÒÔ¿´µ½¿ÉÒÔΪÿ¸öʵÀýµ¥¶ÀµÄ¿ªÆôSSH¹ÜÀí¹¦ÄÜ£¬Õâ¾ÍÏ൱ÓÚÊǸöVPSÀ£¬Ç°ÌáÊÇÒªÉÏ´«Á˹«Ô¿Ö®ºó²ÅÄÜʹÓÃÕâôǿ´óµÄ¹¦ÄÜ¡£
¸ù¾ÝÌṩµÄsshÃüÁ¿ÉÒԵǼµ½ÈÝÆ÷½øÐв鿴ÁË¡£

²»¹ý£¬±ðʧÍû£¬ºÜ¶àÃüÁîÊDz»ÄÜʹÓõÄŶ£¬¿´À´ÊǶÔÃüÁî½øÐÐÁ˾«¼òÄØ¡£²»¹ýÕâÒѾÊǺÜÇ¿´óÁË£¬½øÈ¥ÄÜ¿´µ½ÎÒÃǵÄ×Ô¼ºµÄÈÕÖ¾Á˺ͽø³ÌµÈÐÅÏ¢¡£
ÆÚ´ýδÀ´ÓиüºÃ¸üÇ¿´óµÄ¹¦ÄÜ¡£
ËäÈ»ÓÐÕâô¶àºÃ´¦£¬µ«ÊÇ»¹ÊÇÓÐһЩ²»×ãÒªÍÂһ͵ġ£
1¡¢ºÜ±§Ç¸£¬sshµÄ¹ÜÀí¹¦Äܲ»ÄÜÿ¸öʵÀý¶¼ÄÜ´ò¿ª£¬×î¶àÖ»ÄÜÆðÁ½¸ö£¬ºÃÔÚ¿ÉÒԹرգ¬×Ô¼ºÄÜ×ÔÓÉÇл»¡£
2¡¢È»ºó£¬ÆäÍ£Ö¹ºÍÐ¶ÔØappµÄµØ·½Òþ²ØµÄºÜÉî°¡£¬ÀàËÆÓÚgithubÉϵÄÒªdeleteÒ»¸öÏîĿһÑù£¬ÒªÉî²ãÒþ²Ø£¬¿ÉÄÜΪÁËÈ·±£Óû§²»Îó²Ù×÷°É¡£
3¡¢ÅäÖÃapp.yaml±È½ÏÂé·³£¬ÓиöÄ£°å¶ÔÓ¦¸ÄÊǺõãµÄ¡£
4¡¢·þÎñ¿ª·ÅµÄËäÈ»»ù±¾µÄ¹»Ó㬵«ÊÇ»¹ÊÇÉÙÁ˵㣬ÏñºÜ¶àcdnÄÅ£¬mongodb°¡£¬´æ´¢ÀàµÄ·þÎñ¶¼Ã»ÓУ¬ÆÚ´ýºÜ¿ì¿ª·Å¡£
|