四台服务器部署cassandra集群 和 presto搜索引擎 及代码演示:

还有很多细节没有补充,有问题和疑问的地方 咋们一起探讨哇!

1.创建用户
    使用root用户登录应用服务器,执行以下操作:
        adduser cassandra
        passwd cassandra
    使用cassandra用户登录应用服务器验证是否安装python 2 和JDK 8(我使用jdk8版本是因为项目中cassandra配合presto搜索引擎使用,presto需要jdk8支持):
  python:一般linux机器自带python,如需安装请自行安装

  JDK:
    以下操作都是在四台linux服务器下进行操作:

  将jdk-8u92-linux-x64.tar.gz软件上传到root用户下的/usr/local目录下:

  解压jdk-8u92-linux-x64.tar.gz软件:

  tar -zxvf jdk-8u92-linux-x64.tar.gz

  修改/etc/profile配置文件:

  vi /etc/profile

 在文件末尾新增下面内容:
        #set java environment
        JAVA_HOME=/usr/local/jdk1.8.0_92/
        PATH=$JAVA_HOME/bin:$PATH
        CLASSPATH=$JAVA_HOME/jre/lib:$JAVA_HOME/lib
        export  JAVA_HOME  PATH  CLASSPATH

 使文件重新生效:
        source /etc/profile

2.创建省级目录
  mkdir product
  mkdir -p /home/cassandra/install/`date +%C%y%m%d`/
  将升级文件apache-cassandra-2.1.16-bin.tar.gz、presto-server-0.165.tar.gz、etc.tar.gz、presto-cli-0.165-executable.jar上传至对应环境的应用服务器升级目录:/home/cassandra/install/`date +%C%y%m%d`/
解压升级包:
cd  /home/cassandra/install/`date +%C%y%m%d`/
tar  -zxvf  etc.tar.gz
简要概述机器用途(UAT环境):
*.*.178.131(cassandra种子节点)(presto的coordinator节点)
*.*.178.132(cassandra种子节点)(presto的worker节点
*.*.178.133(cassandra普通节点)(presto的worker节点)
*.*.178.134(cassandra普通节点)(presto的worker节点)

3.安装cassandra:
使用cassandra用户登录应用服务器(四台机器),执行如下操作:
cd  /home/cassandra/install/`date +%C%y%m%d`/
tar -zvxf  apache-cassandra-2.1.16-bin.tar.gz  -C /home/cassandra/product/
cd /home/cassandra/product/apache-cassandra-2.1.16/conf
sed -i 's/seeds: "127.0.0.1"/seeds: "种子节点IP1,种子节点IP2"/g' cassandra.yaml

(将种子节点IP1,种子节点IP2修改为对应环境种子节点IP地址,种子节点选择 稳定的服务器)
sed -i 's/listen_address: localhost/listen_address: 各服务器IP/g' cassandra.yaml
(将localhost修改为各服务器IP地址)
sed -i 's/rpc_address: localhost/rpc_address: 个服务器IP/g' cassandra.yaml
(将localhost修改为各服务器IP地址)
sed -i 's/authenticator: AllowAllAuthenticator/authenticator: PasswordAuthenticator/g' cassandra.yaml
 //这个内存很重要,cassandra预处理的数据都缓存在这里 最大建议值 不要超过16G
sed -i 's/#MAX_HEAP_SIZE="4G"/MAX_HEAP_SIZE="8G"/g' cassandra-env.sh
sed -i 's/#HEAP_NEWSIZE="800M"/HEAP_NEWSIZE="1600M"/g' cassandra-env.sh
cd /home/cassandra/product/apache-cassandra-2.1.16/bin
sed -i 's/DEFAULT_REQUEST_TIMEOUT_SECONDS = 10/DEFAULT_REQUEST_TIMEOUT_SECONDS = 3600/g' cqlsh

启动服务器:
 在服务器*.*.178.131和*.*.178.132,执行如下代码:
 cd /home/cassandra/product/apache-cassandra-2.1.16/bin
 ./cassandra -p cassandra.pid
 输出INFO  06:22:29  Node /机器IP state jump to NORMAL 表示成功启动。
 再分别在服务器*.*.178.133和*.*.178.134上执行。
  cd /home/cassandra/product/apache-cassandra-2.1.16/bin
 ./cassandra -p cassandra.pid
  输出INFO  06:22:29 Node /机器IP state jump to NORMAL 表示成功启动,即可回车退出

四台cassandra服务器启动好后,查看集群状态 第一列 UN为正常状态:

cd /home/cassandra/product/apache-cassandra-2.1.16/bin
[cassandra@hadoop01 bin]$ ./nodetool status
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address        Load       Tokens  Owns (effective)  Host ID                               Rack
UN  *.*.178.131  159.37 KB  256     64.1%             6056ee11-f932-4a7c-a13e-632e143e2cbf  rack1
UN  *.*.178.132  141.05 KB  256     66.7%             d385b5d5-638d-4d9a-ae76-30b15846864d  rack1
UN  *.*.178.133  159.72 KB  256     69.2%             262c33b7-bf6e-4dfc-b2d0-3a90cbe66622  rack1

UN  *.*.178.134  159.72 KB  256     67.1%             262c33b7-bf6e-4dfc-b2d0-3a90cbe66622  rack1

4安装presto:
使用cassandra用户登录应用服务器(四台服务器) 执行如下操作:
cd  /home/cassandra/install/`date +%C%y%m%d`
cp presto-cli-0.165-executable.jar /home/cassandra/product/
cd /home/cassandra/product
mv presto-cli-*.jar  presto-cli
chmod 777 presto-cli
cd  /home/cassandra/install/`date +%C%y%m%d`
tar -zvxf  presto-server-0.165.tar.gz  -C /home/cassandra/product/
cp -r etc  /home/cassandra/product/presto-server-0.165/
mkdir /home/cassandra/product/presto-server-0.165/prestodata

①修改catalog属性:
cd /home/cassandra/product/presto-server-0.165/etc/catalog
sed -i 's/cassandra.contact-points=200.31.156.206,200.31.147.207/cassandra.contact-points=*.*.178.131,*.*.178.132/g'  cassandra.properties
(将*.*.178.131,*.*.178.132修改为对应环境种子节点IP地址)
②修改配置属性:
cd /home/cassandra/product/presto-server-0.165/etc
#presto的worker节点3台服务器(UAT为*.*.178.132,*.*.178.133和*.*.178.134),执行以下操作:
sed -i 's/coordinator=true/coordinator=false/g' config.properties
sed -i '/node-scheduler.include-coordinator/'d config.properties
sed -i '/discovery-server.enabled/'d config.properties

#使用cassandra用户登录4台应用服务器(UAT环境为:*.*.178.131、*.*.178.132、*.*.178. 133、*.*.178.134)
sed -i 's/discovery.uri=http:\/\/200.31.147.10:8089/discovery.uri=http:\/\/*.*.178.131:8089/g' config.properties
(将*.*.178.131修改为coordinator节点的地址,UAT环境为*.*.178.131)
sed -i 's/query.max-memory=30GB/query.max-memory=30GB/g' config.properties
(将30G修改为物理内存的60%  物理内存:查看  free -g)
sed -i 's/query.max-memory-per-node=20GB/query.max-memory-per-node=20GB/g' config.properties
(将20GB修改为物理内存的40% 物理内存:查看  free -g)

③ 修改节点信息:
sed -i 's/node.id=ffffffff-ffff-ffff-ffff-fffffffffff1/node.id=ffffffff-ffff-ffff-ffff-fffffffffff2/g' node.properties
(本操作只在三台worker节点上运行, fffffffffff2,fffffffffff3 , fffffffffff4)
node.id:(coordinator节点为ffffffff-ffff-ffff-ffff-fffffffffff1;其它三个work节点分别为ffffffff-ffff-ffff-ffff-fffffffffff2、ffffffff-ffff-ffff-ffff-fffffffffff3、ffffffff-ffff-ffff-ffff-fffffffffff4)
  ④修改jvm信息:
 sed -i 's/-Xmx40G/-Xmx20G/g' jvm.config
(20G修改为物理内存的70%  物理内存:查看  free -g)
启动服务器:
使用cassandra用户登录应用服务器(UAT环境为:*.*.178.131、*.*.178.132、*.*.178. 133、*.*.178.134),执行如下操作:
cd /home/cassandra/product/presto-server-0.165/bin
./launcher start

5.后续即可登录presto 或者 Cassandra 使用sql查询

cassndra 连接DB:
        cd /product/apache-cassandra-2.1.16/bin     ./cqlsh --request-timeout=3600 -u cassandra -p cassandra  *.*.178.131 (coordinator节点_IP)
    presto 连接cassandra数据库:
        cd /product    ./presto-cli --server IP:8089 --catalog cassandra --schema dep_ntpi(dep_ntpi数据库实例名)                
    presto 监控界面:     172.17.193.13:8089 ,可以监控presto查询 耗时,内存等状态

6.代码样例 ,Java 连接 Cassandra数据库 ,需要下载使用 cassandra-driver-core-2.0.9.2.jar ,代码如下
    a.连接数据库工具类

package com.cfets.util;

import org.apache.log4j.Logger;

import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.ConsistencyLevel;
import com.datastax.driver.core.HostDistance;
import com.datastax.driver.core.PoolingOptions;
import com.datastax.driver.core.QueryOptions;
import com.datastax.driver.core.Session; public class CassandraHandle {
private static final Logger logger = Logger.getLogger(CassandraHandle.class);
private Cluster cluster;
private Session session;
private String[] hosts;
private final static CassandraHandle cassandraHandle = new CassandraHandle();
public static CassandraHandle getInstance(){
return cassandraHandle;
}
/**
* Initialize cassandra hosts.
*/
private CassandraHandle(){
hosts = new String[]{ReadDbConfigFile.getProperty("cassandra.Ip"),
ReadDbConfigFile.getProperty("cassandra.Ip2"),
ReadDbConfigFile.getProperty("cassandra.Ip3"),
ReadDbConfigFile.getProperty("cassandra.Ip4")};
getConnectPool(hosts);
} /**
* Get cassandra ConnectionPool
*@author:houyao
*@date:2018年1月4日 下午3:44:47
*@Description:
*@param hosts
*/
private void getConnectPool(String[] hosts){
try {
QueryOptions qo = new QueryOptions();
//一致性级别
qo.setConsistencyLevel(ConsistencyLevel.QUORUM);
PoolingOptions poolingOptions = new PoolingOptions();
poolingOptions.setMaxSimultaneousRequestsPerConnectionThreshold(HostDistance.LOCAL, 32);
poolingOptions.setCoreConnectionsPerHost(HostDistance.LOCAL, 2);
poolingOptions.setMaxConnectionsPerHost(HostDistance.LOCAL, 4);
cluster = Cluster.builder().addContactPoints(hosts)
.withQueryOptions(qo)
.withCredentials(ReadDbConfigFile.getProperty("cassandra.name"), ReadDbConfigFile.getProperty("cassandra.password"))
.withPoolingOptions(poolingOptions)
.build(); this.session = cluster.connect();
} catch (Exception e) {
logger.error("CassandraHandle.getConnectPool() 连接异常: "+e.getMessage(),e);
e.printStackTrace();
}
} public Session getSession() {
return session;
} public void closeConn() {
cluster.close();
}
}

b. cassandra执行insert操作

package com.cfets.parser;

import java.util.Date;
import java.util.concurrent.ConcurrentLinkedQueue; import org.apache.log4j.Logger; import cn.com.cfets.data.MetaObject;
import cn.com.cfets.data.coretransaction.fxoption.Quote; import com.cfets.imt.DEPService;
import com.cfets.imt.common.AbstractParser;
import com.cfets.util.CassandraHandle;
import com.cfets.util.DateUtils;
import com.cfets.util.FileUtils;
import com.cfets.util.ReadConfigFile;
import com.datastax.driver.core.BatchStatement;
import com.datastax.driver.core.PreparedStatement;
import com.datastax.driver.core.Session; public class DataNTPI0021C0001 extends AbstractParser { private static final Logger logger = Logger.getLogger(DataNTPI0021C0001.class); private ConcurrentLinkedQueue<Quote> datas = new ConcurrentLinkedQueue<Quote>();
private static int oddOreven = Integer.parseInt(ReadConfigFile.getProperty("timestamp")); public DataNTPI0021C0001() {
new DealQThread().start();
} // 内部类
protected class DealQThread extends Thread { private ConcurrentLinkedQueue<Quote> queue; public void run() {
Session session=null;
BatchStatement bs=null;
PreparedStatement statement=null;
try {
session = CassandraHandle.getInstance().getSession();
statement = (PreparedStatement) session.prepare(" insert into DEP_NTPI.fx_optn_prc_dtl (ord_num,prdct_cd, prd, impld_vltlty, qt_cd, qt_tm, qt_st, dt_cnfrm, cn_shrt_nm, en_shrt_nm, qtng_instn_cd, qt_instn_trdr_cd, ccy_pair_cd, trdng_md_cd, qt_instn_lgl_grp_nm, qt_instn_cn_full_nm, qt_dir, qt_instn_cfets_instn_cd, qt_instn_en_full_nm, qt_vrty, trdng_mthd_cd) values (?,?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);");
while (true) {
try {
synchronized (DataNTPI0021C0001.class) {
queue = datas;
datas = new ConcurrentLinkedQueue<Quote>();
} if(session.isClosed()){
session = CassandraHandle.getInstance().getSession();
statement = (PreparedStatement) session.prepare(" insert into DEP_NTPI.fx_optn_prc_dtl (ord_num,prdct_cd, prd, impld_vltlty, qt_cd, qt_tm, qt_st, dt_cnfrm, cn_shrt_nm, en_shrt_nm, qtng_instn_cd, qt_instn_trdr_cd, ccy_pair_cd, trdng_md_cd, qt_instn_lgl_grp_nm, qt_instn_cn_full_nm, qt_dir, qt_instn_cfets_instn_cd, qt_instn_en_full_nm, qt_vrty, trdng_mthd_cd) values (?,?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);");
}
bs = new BatchStatement(); boolean flag=false;// if queue have message then flag = true ,next BatchStatement will be execute.
int timeStamp = oddOreven;//ord_num(cassandraDB)= currentTimeMillis* + timeStamp, timeStamp decide the ord_num=odd number or even number
long count;//memory currentTimeMillis*1000000
while (!queue.isEmpty()) {
flag=true;
Quote message = queue.poll();
logger.info("DATA_NTPI_0021_C_0001 JSON:"+FileUtils.toJSONString(message));
count = System.currentTimeMillis()*1000000;
timeStamp = timeStamp+2;//-1 ++2 ,every time add 2=odd number
bs.add(statement.bind(
//count+timeStamp replace DB.getSeqence("SEQ_FX_OPTN_DPTH_QT_DATA.NEXTVAL"),
//Attention: AA the First server=odd number ,the second server=even number
//now is odd number
count+timeStamp,
//DB.getSeqence("SEQ_FX_OPTN_PRC_DTL.NEXTVAL"),
message.isSetProductCode() ? message.getProductCode() : "",
message.isSetPeriod() ? message.getPeriod() : "",
message.isSetImpliedVolatility() ? message.getImpliedVolatility() + "" : "",
message.isSetQuoteCode() ? message.getQuoteCode(): "",
message.isSetQuoteTime() ? DateUtils.dateToString(message.getQuoteTime(),"yyyy-MM-dd HH:mm:ss") : "",
message.isSetQuoteStatus() ? message.getQuoteStatus() : "",
message.isSetDateConfirmed() ? DateUtils.dateToString(message.getDateConfirmed(),"yyyy/MM/dd") : "",
message.isSetChineseShortName() ? message.getChineseShortName() : "",
message.isSetEnglishShortName() ? message.getEnglishShortName() : "",
message.isSetQuotingInstitutionCode() ? message.getQuotingInstitutionCode() : "",
message.isSetQuoteInstitutionTraderCode() ? message.getQuoteInstitutionTraderCode() : "",
message.isSetCurrencyPairCode() ? message.getCurrencyPairCode() : "",
message.isSetTradingModeCode() ? message.getTradingModeCode() : "",
message.isSetQuoteInstitutionLegalGroupName() ? message.getQuoteInstitutionLegalGroupName() : "",
message.isSetQuoteInstitutionChineseFullName() ? message.getQuoteInstitutionChineseFullName() : "",
message.isSetQuoteDirection() ? message.getQuoteDirection() : "",
message.isSetQuoteInstitutionCfetsInstitutionCode() ? message.getQuoteInstitutionCfetsInstitutionCode(): "",
message.isSetQuoteInstitutionEnglishFullName() ? message.getQuoteInstitutionEnglishFullName() : "",
message.isSetQuoteVariety() ? message.getQuoteVariety() : "",
message.isSetTradingMethodCode() ? message.getTradingMethodCode() : ""));
if(bs.size()>=5000){
session.execute(bs);
bs.clear();
timeStamp = oddOreven;
}
}
if(flag){
session.execute(bs);
logger.info("DATA_NTPI_0021_C_0001类型的数据插入成功!");
}
} catch (Exception e1) {
logger.error("DATA_NTPI_0021_C_0001类型的数据插入失败!"+e1);
e1.printStackTrace();
} try {
Thread.sleep(1000);
} catch (InterruptedException e) {
break;
}
}
} catch (Exception e2) {
logger.error("DATA_NTPI_0021_C_0001获取cassandra连接失败:"+e2.getMessage(), e2);
}finally{
try{
session.close();
}catch(Exception ex){
logger.error("DATA_NTPI_0021_C_0001关闭cassandra的session异常:"+ex);
}
}

使用presto查询需要下载  presto-jdbc-0.100.jar

c.presto连接cassandra工具类

package com.cfets.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; public class PrestoUtils { static{
try {
Class.forName("com.facebook.presto.jdbc.PrestoDriver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} public static Connection getConnection(){
Connection conn = null;
try {
conn = DriverManager.getConnection(ReadDbConfigFile.getProperty("presto.url"),ReadDbConfigFile.getProperty("cassandra.name"),ReadDbConfigFile.getProperty("cassandra.password"));
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
} public static void release(Connection conn, Statement ps, ResultSet rs){
if(rs != null){
try{
rs.close();
}catch(SQLException e){
e.printStackTrace();
}
rs = null;
}
if(ps != null){
try{
ps.close();
}catch(SQLException e){
e.printStackTrace();
}
ps = null;
}
if(conn != null){
try{
conn.close();
}catch(SQLException e){
e.printStackTrace();
}
conn = null;
}
}
}

4.presto查询demo

package com.cfets.market;

import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.SimpleDateFormat; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import com.cfets.util.DB;
import com.cfets.util.PrestoUtils;
import com.cfets.vo.FxSptfwdswpMrktOrdrDpth; /**
* 外汇即期/远期/掉期档位行情(ODM)数据 转存oracle库
* @author wangzl
*/
public class FxSptfwdswpMrktOrdrDpthOrcl {
private final Logger logger = LoggerFactory.getLogger(FxSptfwdswpMrktOrdrDpthOrcl.class); /**
* 查询cassandra库数据
* @param targetDate
*/
public void loadDataFromPrestoFile(String targetDate) {
long start = System.currentTimeMillis();
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
conn = PrestoUtils.getConnection();
stmt = conn.createStatement();
long num = 0;
logger.info("DATA-TSS-0012 外汇即期/远期/掉期档位行情(ODM):开始执行 转存oracle库 操作!");
while(true){
String sql = "SELECT ORD_NUM,PRDCT_CD,DL_MKT_DT_TP,BID_RATE,ASK_RATE,PRD,MKT_DATA_UPD_TM,DT_CNFRM,CCY_PAIR_CD,TRDNG_MD_CD,CNTRCT_NM,TRDNG_MD,MKT_DPTH_INDCTR,CFETS_UNFD_CD,BID_QT_TM,ASK_QT_TM,BID_QT_AMNT,ASK_QT_AMNT FROM DEP_NTPI.FX_SWAP_MKT_ORDER_DEPTH WHERE ORD_NUM > "+num+" AND DT_CNFRM = '"+targetDate+"' LIMIT 1000000";
logger.info("DATA-TSS-0012 外汇即期/远期/掉期档位行情(ODM):开始查询 SQL:"+sql);
rs = stmt.executeQuery(sql);
if(rs.next()){
FxSptfwdswpMrktOrdrDpth fsmod = new FxSptfwdswpMrktOrdrDpth();
fsmod.setOrdNum(rs.getLong("ORD_NUM"));
fsmod.setPrdctCd(rs.getString("PRDCT_CD"));
fsmod.setDlMktDtTp(rs.getString("DL_MKT_DT_TP"));
fsmod.setBidRate(rs.getString("BID_RATE"));
fsmod.setAskRate(rs.getString("ASK_RATE"));
fsmod.setPrd(rs.getString("PRD"));
fsmod.setMktDataUpdTm(rs.getString("MKT_DATA_UPD_TM"));
fsmod.setDtCnfrm(rs.getString("DT_CNFRM"));
fsmod.setCcyPairCd(rs.getString("CCY_PAIR_CD"));
fsmod.setTrdngMdCd(rs.getString("TRDNG_MD_CD"));
fsmod.setCntrctNm(rs.getString("CNTRCT_NM"));
fsmod.setTrdngMd(rs.getString("TRDNG_MD"));
fsmod.setMktDpthIndctr(rs.getString("MKT_DPTH_INDCTR"));
fsmod.setCfetsUnfdCd(rs.getString("CFETS_UNFD_CD"));
fsmod.setBidQtTm(rs.getString("BID_QT_TM"));
fsmod.setAskQtTm(rs.getString("ASK_QT_TM"));
fsmod.setBidQtAmnt(rs.getString("BID_QT_AMNT"));
fsmod.setAskQtAmnt(rs.getString("ASK_QT_AMNT"));
long firstOrdNum = rs.getLong("ORD_NUM");
num = toInsertDB(fsmod,rs);
if(num == 0){//防止出现死循环
num = firstOrdNum;
}
}else{
break;
}
}
logger.info("DATA-TSS-0012 外汇即期/远期/掉期档位行情(ODM):转存oracle库正常结束! 花费时间:"+(System.currentTimeMillis() - start)+" ms!");
} catch (Exception e) {
e.printStackTrace();
logger.error("DATA-TSS-0012 外汇即期/远期/掉期档位行情(ODM):转存oracle库 出现异常:"+e.getMessage(),e);
} finally{
PrestoUtils.release(conn, stmt, rs);
}
}

Cassadra & presto 集群部署的更多相关文章

  1. Presto集群部署

    前言: 随着大数据的普及,大部分企业的大数据查询与统计渐渐出现瓶颈.虽说存储方面有分布式的HDFS,HBSE,MongoDB等可以应对,但是面对千万级别(1x10^7)界别的数据量查询时,以上组件也不 ...

  2. Presto集群部署和配置

    参考文档:1.https://blog.csdn.net/zzq900503/article/details/79403949 prosto部署与连接hive使用                 2. ...

  3. Quartz.net持久化与集群部署开发详解

    序言 我前边有几篇文章有介绍过quartz的基本使用语法与类库.但是他的执行计划都是被写在本地的xml文件中.无法做集群部署,我让它看起来脆弱不堪,那是我的罪过. 但是quart.net是经过许多大项 ...

  4. Openfire 集群部署和负载均衡方案

    Openfire 集群部署和负载均衡方案 一.   概述 Openfire是在即时通讯中广泛使用的XMPP协议通讯服务器,本方案采用Openfire的Hazelcast插件进行集群部署,采用Hapro ...

  5. 基于Tomcat的Solr3.5集群部署

    基于Tomcat的Solr3.5集群部署 一.准备工作 1.1 保证SOLR库文件版本相同 保证SOLR的lib文件版本,slf4j-log4j12-1.6.1.jar slf4j-jdk14-1.6 ...

  6. jstorm集群部署

    jstorm集群部署下载 Install JStorm Take jstorm-0.9.6.zip as an example unzip jstorm-0.9.6.1.zip vi ~/.bashr ...

  7. CAS 集群部署session共享配置

    背景 前段时间,项目计划搞独立的登录鉴权中心,由于单独开发一套稳定的登录.鉴权代码,工作量大,最终的方案是对开源鉴权中心CAS(Central Authentication Service)作适配修改 ...

  8. Windows下ELK环境搭建(单机多节点集群部署)

    1.背景 日志主要包括系统日志.应用程序日志和安全日志.系统运维和开发人员可以通过日志了解服务器软硬件信息.检查配置过程中的错误及错误发生的原因.经常分析日志可以了解服务器的负荷,性能安全性,从而及时 ...

  9. 理解 OpenStack + Ceph (1):Ceph + OpenStack 集群部署和配置

    本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...

随机推荐

  1. SharePoint 2013配置开发环境,需安装VS2012插件

    SharePoint 2013已经安装好了,接下来就是配置开发环境,安装VS2012,但是,装好了以后,发现没有SharePoint 2013开发的支持,如下图: 然后,去网上查找资料,VS2012对 ...

  2. ZYThumbnailTableView类似于小型阅读器

    Demo github地址: https://github.com/liuzhiyi1992/ZYThumbnailTableView  原文地址:http://zyden.vicp.cc/zythu ...

  3. SAP BADI的“多次使用”(multiple use)

    SAP中的某些BADI是不允许多用(multiple use)的,即不能同时存在多个活动的增强实施类.如下图中的这种,无论为其创建多少个实施类,都只有活动的那一个会被触发: tips : 业务加载项定 ...

  4. PM2 Quick Start

    PM2教程 @(Node)[负载均衡|进程管理器] [TOC] PM2简介 PM2 是一个带有负载均衡功能的Node应用的进程管理器. 当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永 ...

  5. Java语言概论

    第1章 ■    Java的发展简史及特点 ■    J2SDK的下载与安装 ■    Java应用程序的编写 ■    Eclipse的下载及使用 ■    正确安装使用J2SDK ■    使用记 ...

  6. Android设计开发笔记

    1.因为Android的开发是基于框架的开发:往对方指定的位置加代码:其运行的Message\Handler机制也决定了其单步跟踪也不方便,所以建立新代码时要多Log,这样不但便于调试,而且帮助你加深 ...

  7. MySQL快速生成本地测试数据

    利用数据的存储过程生成测试数据: 我们可以通过数据库的的 INSERT 语句直接在存储过程中向普通数据表中添加数据,但是 当我们添加到百万数据后,往普通表插入测试数据的性能就会明显降低.所以在这里建议 ...

  8. 【python进阶】深入理解系统进程1

    前言 之前程序执⾏都是⼀条腿⾛路,甚⾄是⽤⼀杆枪来打天下. 通过系统编程的学习,会让⼤家有“多条腿”⼀起⾛路,就好⽐有了⼀把机关枪. 此篇为深入理解进程第一篇,下面开始今天的说明~~~ 进程 多任务的 ...

  9. C#学习笔记 day_three

    C#学习笔记 day three Chapter 3 类型 3.3引用类型 引用类型的变量也成为对象,有六种类型:(1)对象类型 (2)字符串类型 (3)类类型 (4)数组类型 (5)接口类型 (6) ...

  10. Socket 异步通信

    最近在写数据通信的时候用到的东西!希望对大家有帮助 /// <summary> /// 获取或设置服务器IP地址 /// </summary> public string se ...