Weblogic安装

安装

我用的是weblogic的安装jar包:

java -jar wls_121200.jar

配置

*%WL_HOME%是weblogic的安装目录

配置域

用户 : weblogic 密码 : @weblogic

服务器名 : WeblogicServer

MySQL驱动修改

1、删除%WL_HOME%\wlserver\server\lib%WL_HOME%\wlserver\server\ext\jdbc\mysql下的lib mysql-connector-java-xxx.jar

2、将自己需要的版本mysql-connector-java-yyy.jar拷贝至%WL_HOME%\wlserver\common\lib

3、修改%WL_HOME%\wlserver\common\bin\commEnv.cmd

在SET WEBLOGIC_CLASSPATH变量后加入

%WL_HOME%/common/lib/mysql-connector-java-yyy.jar

启动参数修改

打开%WL_HOME%\user_projects\domains\base_domain\bin,编辑文件setDomainEnv:

set MEM_PERM_SIZE_64BIT=-XX:PermSize=512m
set MEM_MAX_PERM_SIZE_64BIT=-XX:MaxPermSize=512m

配置MQ地址

同样在上述文件中找到SET JAVA_OPTIONS=在后面添加参数:

-Dserver.rabbitmq.host=[IP_SERVER]
-Dclient.rabbitmq.host=[IP_CLIENT]

部署

[IP_WEBLOGIC]:[PORT]/console 打开控制台

服务->数据源中添加数据源

部署中添加项目

Java备份恢复MySQL数据库

  项目中需要在数据清算前对数据库进行备份,清算产生问题时对数据库进行恢复,要在程序里实现。

  一般备份MySQL用dump就可以了,如果需要在Java程序里实现,应该是调用系统命令就可以,也就是说用java里的Runtime就可以实现。

备份

第一版代码
Runtime rt = Runtime.getRuntime();
Process pro = rt.exec("mysqldump -uUSER -pPWD DATABASE> PATH/file.sql");

但是结果报错了。

其中有了两个问题:

  1. mysqldump不一定在环境变量中,即使在,有的时候这样执行也是执行不了的。
  2. 这种命令执行方式java不能识别重定向符 >。

修改如下:

    String time = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()).toString();
    Process pro = rt.exec("mysqldump -uUSER -pPWD --default-character=gbk -rPATH" + time + ".sql DATABASE");
    BufferedReader br = new BufferedReader(new InputStreamReader(pro.getErrorStream()));
    String errorLine = null;
    while ((errorLine = br.readLine()) != null) {
        System.out.println(errorLine);
    }
    br.close();  

其中exec的参数还可以写成字符串数组,能够解决不识别mysqldump的问题。另外,Process的waitFor方法会在执行后返回int值,如果为0则执行正常。

@Test
public void backupDB() throws Exception {
    Runtime rt = Runtime.getRuntime();
    Process pro = rt.exec(getCommand());
    BufferedReader br = new BufferedReader(new InputStreamReader(pro.getErrorStream()));
    String errorLine = null;
    while ((errorLine = br.readLine()) != null) {
        System.out.println(errorLine);
    }
    br.close();
    int result = pro.waitFor();
    if (result != 0) {
        throw new Exception("数据库备份失败! ");
    }
}  


private String[] getCommand() {
    String[] cmd = new String[3];
    String time = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()).toString();
    String os = System.getProperties().getProperty("os.name");
    if (os.startsWith("Win")) {
        cmd[0] = "cmd.exe";
        cmd[1] = "/c";
    } else {
        cmd[0] = "/bin/sh";
        cmd[1] = "-c";
    }
    StringBuilder arg = new StringBuilder();
    arg.append("mysqldump ");
    arg.append("-uUSR ");
    arg.append("-pPWD ");
    arg.append("--default-character=gbk ");
    arg.append("--skip-opt ");
    arg.append("--add-drop-database ");
    arg.append("--routines ");
    arg.append("--triggers ");
    arg.append("--compress ");
    arg.append("-r");
    arg.append("PATH");
    arg.append(time);
    arg.append(".sql ");
    arg.append("--databases DATABASE");
    cmd[2] = arg.toString();
    return cmd;
}  

说明

–default-character=gbk 指定字符集

–skip-opt 禁用将结果存入内存,否则大表会出现问题

–add-drop-database 在CREATE DATABASE之前加 drop语句

–routines 转储数据库中的函数和程序

–compress 压缩传输的信息

恢复

恢复是用mysql命令,方式和备份很像

@Test
public void restoreDB() throws Exception {
    Runtime rt = Runtime.getRuntime();
    Process pro = rt.exec(getCommand());
    BufferedReader br = new BufferedReader(new InputStreamReader(pro.getErrorStream()));
    String errorLine = null;
    while ((errorLine = br.readLine()) != null) {
        System.out.println(errorLine);
    }
    br.close();
    int result = pro.waitFor();
    if (result != 0) {
        throw new Exception("数据库恢复失败! ");
    }
}
private String[] getCommand() {
    String[] cmd = new String[3];
    String os = System.getProperties().getProperty("os.name");
    if (os.startsWith("Win")) {
        cmd[0] = "cmd.exe";
        cmd[1] = "/c";
    } else {
        cmd[0] = "/bin/sh";
        cmd[1] = "-c";
    }
    StringBuilder arg = new StringBuilder();
    arg.append("mysql ");
    arg.append("-uUSR ");
    arg.append("-pPWD ");
    arg.append("< ");
    arg.append(getFile());
    cmd[2] = arg.toString();
    return cmd;
}
private String getFile() {
    File dir = new File("PATH");
    String[] files = dir.list(new FilenameFilter() {
        @Override
        public boolean accept(File dir, String name) {
            return name.endsWith(".sql");
        }
    });
    return Collections.max(Arrays.asList(files));
}  

优化Python对MySQL批量插入的效率

之前测试cobar的效率,因为cobar不支持存储过程,所以需要应用程序插入数据,jdbc不灵活,用Python的MySQLdb模块可以实现。

  开始测试的时候用单条insert语句循环n次,最后commit,结果慢的要死,插一万条用了两分钟,十万条我去吃了个饭回来还在插。十万条用存储过程插单库也用了50多秒。

  从UC的这篇文章学习了一些SQL优化的知识。

  主要有三条: 1、insert的时候尽量多条一起插,不要单条插。这样可以减少日志量,降低日志刷盘数据量和频率,效率提高很多。

这是文章提供的测试对比:

2、在事务中进行插入。也就是每次部分commit,否则每条insert commit 创建事务的消耗也是不小的。

3、 数据插入的时候保持有序。比如Innodb用的是B+树索引,对B+树的插入如果是在索引中间就会需要树节点分裂合并,这也会有一定的消耗。

几种方法综合起来的测试数据如下:

  可以看到1000万以下数据的优化效果是明显的,但是单合并数据+事务的方式在1000万以上性能会有急剧下降,因为此时已经达到了innodb_buffer的上限,随机插入每次需要大量的磁盘操作,性能下降明显。而有序插入在1000万以上时也表现稳定,因为索引定位方便,不需要频繁对磁盘读写,维持较高性能。

据此修改了Python程序:

 import MySQLdb

 db=MySQLdb.connect(host='127.0.0.1', user='test', passwd='test', port=8066)

 cur=db.cursor()

 cur.execute('use dbtest')

 cur.execute('truncate table tb5')

 for t in range(0,100):

     sql = 'insert into tb5 (id, val) values '

     for i in range(1,100000):
            sql += ' ('+`t*100000+i`+', "tb5EXTRA"),'
     sql += ' ('+`t`+'00000, "tb5EXTRA")'

     cur.execute(sql)

     db.commit()

 cur.close()

 db.close()

共插入了1000万条数据,sublime显示用了333.3s,比之前插入10万条都减少了很多,测试插10万条只需要3s。

15个分库每个60十多万条。

  •   过程中有个问题,开始我的sql变量是连接所有插入条目的,但是16节点的cobar在输100万条的时候就连接断开了,而单库直接10条也插不进去,显示mysql连接断开。

  这个是sql语句长度限制的问题,在mysql的配置文件中有一个max_allowed_packet = 1M,10万条插入语句已经超过这个限额了,100万条分给16个cobar节点也超过了,所以可以把这个参数调大,或者代码里分段执行sql。

  •   还有一个问题是事务大小的问题,innodb_log_buffer_size参数决定这个,超限的话数据会写入磁盘,从而导致效率下滑,所以事务提交也不能攒得太大。

数据库中间件Cobar功能探究

一、 Cobar项目介绍

一)、Cobar背景概述

Cobar是提供分布式数据库服务的中间件,由阿里巴巴中间件团队开发,是阿里巴巴B2B前台应用访问数据库的统一入口,目前已在github上开源。

Cobar的分布式方案是分库和分表,可以按照业务需求将数据库中耦合度较低的表分到不同的分库中,也可以按照具体表的增长速度和数据量水平切分到不同的分库中,Cobar可以实现应用层与物理分库的双向透明,从而实现应用程序访问分布式数据库与访问单库无差别。 Cobar还可以配合MySQL的心跳和binlog实现备机的自动切换,保证数据节点的可靠性,从而实现高可用性。

但Cobar目前的版本是2013年发布的版本1.2.7,由于作者目前的工作重心不在Cobar,所以虽然会继续更新,进度不会很快。

二)、Cobar架构

其中前端是NIO实现的,通过MySQL协议与应用程序交互,后端也是通过MySQL协议与物理数据库交互。

三)、Cobar的约束

  官方文档对Cobar的适用场景和限制都有明确的说明。

  • 使用jdbc时,使用mysql-jdbc-5.1以上版本,推荐5.1.6或者5.1.12版本。

  • 不支持rewriteBatchedStatements=true参数设置。默认为false

  • 不支持useServerPrepStmts=true参数设置。默认为false

  • 不支持跨库(数据节点)的关联操作:join、分页、排序、子查询。

  • BLOB, BINARY, VARBINARY字段不能使用。若特殊需求需要这三种字段,禁止使用PreparedStatement的setBlob()或setBinaryStream()方法设置参数。

  • 不支持SAVEPOINT操作。

  • 不支持SET语句的执行,事务和字符集设置语句除外。

  • 对于拆分表(分库表),不能更新已有记录的拆分字段(分库字段)值。

  • 只支持MySQL数据节点。

  • 对于拆分表,插入操作须给出列名,必须包含拆分字段。  

二、应用背景

  随着业界的逐步去IOE化,分布式MySQL集群成为了一个实现高可用、高性能、可扩展的数据库解决方案。

  目前业内有很多MySQL集群方案供不同的使用场景选择,比如:

1.双主复制模式,不做数据拆分,可以综合运用keepalived和MySQL实现。

2.如果需要做数据库拆分,要求分布式事务,就可以考虑Cobar。

3.如果需要数据库拆分,不需要分布式事务,需要读写分离,则可以使用同样是阿里开源的中间件项目。

此外还有一些选择,比如MySQL Proxy,使用lua编写,但是官方维护已经终止;MySQL Cluster, 商用版也是收费的,社区版免费但是性能存疑;还有搜狐新近开源的C语言编写的MySQL分布式中间件DBProxy。

三、Cobar详细分析

  为了对Cobar的功能以及约束有一定的认识,搭建了简单的Cobar测试环境进行实验。实验中共使用了3种数据库方案:

1.MySQL单库方案

2.6节点Cobar方案

3.16节点Cobar方案

一)、环境搭建

  Cobar的release版本中包含配置文件、jar包以及日志文件。

  搭建Cobar环境需要根据情况配置rule.xml、schema.xml、server.xml。其中schema.xml定义了分库分表的规则以及数据节点和数据源的信息。rule.xml定义了水平分表的路由规则,但是目前的路由算法是Cobar源码中硬编码定的,能够配置的只是节点数等参数,如果需要根据业务需求定义路由算法,需要修改Cobar的源码。server.xml定义Cobar服务的信息,包括其作为一个数据源时的用户名密码等,还定义了包含的schema。

  bin目录下的文件是用来启动关闭cobar-server的,其中windows下用到的就是startup.bat,该批处理文件需要修改版本号以顺利运行:

启动Cobar后可以查看stdout.log,如果没有报异常则启动正常:

Cobar服务监听8066端口,在MySQL命令行和JDBC连接中,8066作为默认端口。

二)、基本功能测试

  本环节测试了基本的MySQL功能,查询,插入等。

  数据表分配如下:

  在schema.xml中定义了该schema的默认datanode,定义了tb2分布在dbtest2、dbtest3中。默认datanode的作用是存放未指定的表,比如创建tb1,就会默认放在dbtest1中。

  在rule.xml中为tb2定义了路由用的partitionCount和partitionLength,会按照特定字段进行分库操作。

1.insert

insert命令能够按照约定的路由规则插入特定的分库中。

为了简单测试cobar的插入效率,对tb2插入了10W条数据,结果显示要比单机MySQL插入10W条数据稍慢,随后测试16节点cobar插入10W条数据,速度已经和单机插入接近,如果多线程并发执行的话,cobar会有比较大的优势。

2.select

对上一步插入的数据进行select操作,每个分库结果会merge在一起但是merge的顺序是不确定的。

同样对cobar中的10W条数据进行查询,结果显示依旧是比单机慢:

Cobar:

单机MySQL:

三)、特定功能测试

  正常业务中的SQL语句不会仅仅只是insert、select,会用到聚合函数、内外连接、子查询等。官方文档里已经明确说明不支持跨库条件下的这些操作,具体测试如下。

1、order by

对数据id排序查询,单库中order by可以正常显示,对cobar进行相同的操作,可以返回结果,每个分库的结果集按照各自的order排序,最后merge的时候并不是全部排序,而是随机联接在一起。

2、sum count

sum常用来合计某些字段,count用来计数,都是比较常用的sql关键字。Cobar能够返回sum/count的结果,但依旧是每个分库各自统计。

用子查询也不能合并分库的sum,这两个sql查出来的结果是相同的。

3、join

join也是极其常用的sql关键字,但是在cobar中如果切分规则不同的两张表进行join,则构成了跨库。Cobar会报错,提示不存在共同分库中的相应表。而如果两张表采用相同的切分字段,相同的路由规则,那么两者是能够join的。 在测试环境中,tb1不是和tb4相同切分,如果和tb4 join,就会提示不存在dbtest3.tb1。

而如果和tb4切分相同的tb3和它join就可以实现。

4、exists

exists也可以用,但是也是要考虑在不在一个库中

tb3和tb4是按照相同的分片规则分布在数据库中的

5、子查询

子查询在跨库情况下也是不能实现的,但是如果能够限制过程中使用的都封闭在同一个分库中,那么子查询是可以成立的。

6、存储过程

在尝试插入10W条数据的时候,单机用到了存储过程,总共用时50余秒,同样语句用到cobar的时候,会显示语法错误,官方提示没有测试过存储过程,不推荐使用。

四、应用Cobar的问题及解决方案

     现实中有的业务是比较复杂的,功能实现中使用到的SQL语句也可能是很复杂的,可能遇到的问题如下:

一)、参数表

实际业务中会有一些读操作很多而对写要求不多的参数表,会频繁地和其他表进行join,但是cobar不支持跨库join,那么可行的方案就是在每个分库中保留一份参数表,以便每个分库都可以合法操作。

但这会带来两个问题:

1.参数表之间需要union操作,但是每个分库中有一份相同表的结果就是union操作不能够除去重复项。

可以在分表的schema外有一个单库的schema,所有对参数表的增删改操作都限制在该库中,其所产生的变化都同步到每个分库中。

2.不同分库的参数表需要同步,那么如何保持参数表的数据一致性也是必须要考虑的问题。

二)、跨库操作问题

1、分库分表问题

Cobar不支持跨库操作,但是很多操作已经证明只要是封闭在各自分库中就是可以实现的,比如子查询、join等。

那么关键的问题就是如何分库分表,需要按照业务的耦合关系将数据库拆分重组,将不能跨库的操作尽量限制在一个库中。

而且cobar当前的路由算法不一定能够满足复杂业务下的特异性分表方案,所以在有需求的情况下,还需要自定义cobar的路由算法,自定义路由算法需要extends PartitionFunction implements RuleAlgorithm。

2、sum/count

但是即使分库分表方案设计完善,还是不能解决sum/count等功能的不完善,需要把每个分库的结果再累加才是需要的结果。

解决这个问题有几个方案:

1.在应用程序中处理,实现比较简单,但是增加了模块间的耦合度,破坏了数据层与应用层的透明。

2.修改cobar源码,识别sql语句,在收到返回信息的时候进行处理。实现难度比较大,但是保持了模块间的低耦合。

三)、压力问题

  本次测试用的是虚拟机,单台虚拟机安装了8个MySQL实例,共实现了16个datanode,虚拟了10W条数据的简单操作,但和生产环境下的硬件条件以及压力情况是有很大区别的,只有在接近生产环境下真正进行了压力测试,才能得出cobar性能好坏的结论。

四)、事务问题

     分布式数据库要实现事务是比较困难的,很多对数据一致性要求不是很严格的场景都放弃了强一致性,而力求达到最终一致性。Cobar对于单库的事务是完全支持的,但是对于分布式事务不保证强一致性,分布式事务采用两阶段执行,即分为执行阶段和提交阶段。

  执行阶段:把前端连接上当前事务所使用到的后端连接绑定下来,并执行SQL语句。

  • 提交阶段:将commit命令分发到这些绑定的后端连接中。
  • 在整个事务过程中,执行阶段出错,可以回滚。提交阶段出错不可以回滚。可以说只要是commit之前,执行出现不一致,cobar会自动回滚。

cobar的分布式事务具体做到什么程度,在实际应用前还是需要测试的。

五)、主从备份问题

     Cobar支持基于MySQL的心跳(heartbeat)来实现主备机切换,当检测到主机心跳异常,会自动或手动切换到备机,但是故障排除后切换回主机需要手动,除非备机心跳也异常。   主从复制的过程中一致性的保证也是需要注意的问题。

六)、数据迁移问题

  当MySQL集群需要扩容时,就可能需要数据迁移,Cobar本身没有对数据迁移有很大的支持,也不支持mysqldump备份,需要备份时,必须在每个物理分库进行dump。数据迁移需要应用程序的DAO和Cobar还有后台迁移程序共同配合完成。  

五、总结

  通过对cobar的一系列探究,对其有了一定的认识,但是对于这个拥有800个源文件的顶尖数据库开源项目来说,还远远不够。单就应用来说,binlog同步的问题,事务一致性测试的问题,压力测试的问题,路由算法的问题,数据迁移的问题都是需要深入探讨研究的。

  Cobar在阿里3年的稳定运行,能够说明它是个成熟的项目,但是同时要意识到,它是契合阿里特定的业务的项目,任何的迁移都是需要论证的;而且在阿里的数据库中间件中,cobar只是上下游中的一环,有可靠的VIP设备,有跨机房同步的数据同步中间件,有先进的分布式消息系统,才能使cobar扬长避短。

  所以,cobar在实际项目中应用是可行的,但是应用过程中的问题是需要深入思考的。

Redhat安装Python2.7.8

想用Python操作Mysql,但是Redhat中的Python是2.4的,所以需要自己装下2.7

过程比较简单,下载源码包,解压。

运行:

./configure --prefix=/usr/local/python2.7 

然后编辑Modules/Setup文件,将如下几行取消注释:

SSL=/usr/local/ssl
_ssl _ssl.c \
        -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
        -L$(SSL)/lib -lssl -lcrypto
...
zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz

之后运行:

make all && make install && make clean && make distclean

之后将/usr/local/python2.7软链到/usr/bin下的python:

ln -sf /usr/local/python2.7 /usr/bin/python

一般情况下这样就好了,但是过程中我遇到几个问题:

1、make的时候报错,回显以error: openssl/rsa.h: No such file or directory开头的一坨错误信息

虽然我装了openssl,但是make的时候需要的是有头文件的版本,所以重新安开发版:

yum install openssl-devel

同理安装了zlib-devel.

2、装好以后可以进入Python的交互界面,但是很多按键异常,backspace也失灵

这个是readline的问题,可以在安装python前先安装readline:

yum install readline-devel

安装结束。

但是有些软件是依赖老版本的Python的,比如yum,可以打开/usr/bin/yum,将第一行的#!/usr/bin/python改为#!/usr/bin/python2.4.

Redhat配置多Mysql实例

申请了两台Redhat虚拟机做cobar的实验,空空如也什么都得装。原来在3个Arch上实现了3个datanode,想在Redhat上每个3个总共配6个Mysql实例。

复制多个实例

/var/lib目录下找到Mysql目录,将其复制两份,以端口号作后缀以区分:

cp -r /var/lib/mysql /var/lib/mysql3307
cp -r /var/lib/mysql /var/lib/mysql3308
chown -R mysql mysql3307
chown -R mysql mysql3308

配置参数

Mysql的配置文件是/etc/my.cnf,但是默认是没有的,在/usr/share/mysql/目录下有5个.cnf后缀的文件,可以根据自己机器内存大小选择一个文件复制为/etc/my.cnf:

/usr/share/mysql/my-small.cnf             64M内存
/usr/share/mysql/my-medium.cnf            128M内存
/usr/share/mysql/my-large.cnf             512M内存
/usr/share/mysql/my-huge.cnf              1-2G内存
/usr/share/mysql/my-innodb-heavy-4G.cnf   4G内存

我将my-huge.cnf复制为my.cnf。

酌情添加以下配置:

[mysqld_multi]
mysqld          = /usr/bin/mysqld_safe    
mysqladmin      = /usr/bin/mysqladmin 

[mysqld1]                                          
port            = 3306                      
socket          = /var/lib/mysql/mysql.sock   
pid-file        = /var/lib/mysql/mysql.pid         
datadir         = /var/lib/mysql 
user            = mysql               
skip-external-locking                              
key_buffer_size = 384M                                
max_allowed_packet = 1M                                    
table_open_cache = 512                               
sort_buffer_size = 2M                                 
read_buffer_size = 2M                                
read_rnd_buffer_size = 8M    
myisam_sort_buffer_size = 64M                        
thread_cache_size = 8                              
query_cache_size = 32M                               
server-id       = 1 

[mysqld2]                                          
port            = 3307                      
socket          = /var/lib/mysql3307/mysql.sock   
pid-file        = /var/lib/mysql3307/mysql.pid         
datadir         = /var/lib/mysql3307 
user            = mysql                
skip-external-locking                              
key_buffer_size = 384M                                
max_allowed_packet = 1M                                    
table_open_cache = 512                               
sort_buffer_size = 2M                                 
read_buffer_size = 2M                                
read_rnd_buffer_size = 8M    
myisam_sort_buffer_size = 64M                        
thread_cache_size = 8                              
query_cache_size = 32M                               
server-id       = 1

[mysqld3]                                          
port            = 3308                      
socket          = /var/lib/mysql3308/mysql.sock   
pid-file        = /var/lib/mysql3308/mysql.pid         
datadir         = /var/lib/mysql3308  
user            = mysql                
skip-external-locking                              
key_buffer_size = 384M                                
max_allowed_packet = 1M                                    
table_open_cache = 512                               
sort_buffer_size = 2M                                 
read_buffer_size = 2M                                
read_rnd_buffer_size = 8M    
myisam_sort_buffer_size = 64M                        
thread_cache_size = 8                              
query_cache_size = 32M                               
server-id       = 1

要注意其中的mysqld、mysqladmin后配置的目录参数视具体情况而定。

配置完将3个Mysql都启动:

mysqld_multi start

成功~

如果不能正常远程访问可以查看下防火墙配置和Mysql是否配置远程访问。

阿里数据库中间件Cobar环境搭建

装了CentOS7,结果死活连不上网,一直提示没有可用的网络设备,没工夫处理,以后再说,先用之前装好的CentOS6.4,Mysql安装包又下不下来,只好翻出了之前玩Storm装的Archlinux,总共有Alpha、Beta、Delta三台虚机,里头安装了JDK、MariaDB等等。

准备

测试中有一个schema,两张表tb1、tb2,其中tb1在一个库,tb2分为两个库。

几个Cobar的release包都先下载好。

数据准备,三个数据库表都建好:

#创建dbtest1
drop database if exists dbtest1;
create database dbtest1;
use dbtest1;
#在dbtest1上创建tb1
create table tb1(
id int not null,
gmt datetime);
#创建dbtest2
drop database if exists dbtest2;
create database dbtest2;
use dbtest2;
#在dbtest2上创建tb2
create table tb2(
id int not null,
val varchar(256));
#创建dbtest3
drop database if exists dbtest3;
create database dbtest3;
use dbtest3;
#在dbtest3上创建tb2
create table tb2(
id int not null,
val varchar(256));

注意系统的JAVA_HOME要配置好

配置

Cober的server目录下的conf中的是配置文件

schema.xml中需要修改三个数据库的ip和端口,账号和密码。

server.xml中需要修改Cobar的账号和密码。

启动

通过运行bin目录下的startup.bat来启动Cobar服务,

第一遍没起来,打开startup.bat,其中的APP_VERSION版本和release中的server版本不匹配,log4j的版本也不匹配,修改之后才能正确运行。

logs目录下有Cobar运行的log文件,stdout.log是服务运行的日志,正确运行时是这样:

23:13:00,876 INFO  ===============================================
23:13:00,876 INFO  Cobar is ready to startup ...
23:13:00,876 INFO  Startup processors ...
23:13:00,969 INFO  Startup connector ...
23:13:00,969 INFO  Initialize dataNodes ...
23:13:01,047 INFO  dnTest1:0 init success
23:13:01,063 INFO  dnTest3:0 init success
23:13:01,063 INFO  dnTest2:0 init success
23:13:01,063 INFO  CobarManager is started and listening on 9066
23:13:01,079 INFO  CobarServer is started and listening on 8066
23:13:01,079 INFO  ===============================================

测试

访问Cobar可以和访问Mysql一样的方式:

>mysql -utest -ptest -P8066 -Ddbtest

三个库看起来是在一个库,成功~

再实验在Arch下跑Cobar

  大部分步骤和Windows下一样,不同的是startup的启动,Linux下运行的是startup.sh。   先是报错:JAVA_HOME environment variable is not set.,但是我的JAVA_HOME已经设定了,虽然用的是openJDK,再查看到有人说JAVA_HOME不应该指向jre,但是openJDK下的java就是软链到jre的,所以把启动脚本中的if [ ! -e "$JAVA_HOME/bin/java" ]注释了。

  运行后又失败,没有报错,查看../logs/console.log

  1 OpenJDK Server VM warning: INFO: os::commit_memory(0x7b000000, 805306368, 0) failed; error='Cannot allocate memory' (errno=12)
  2 #
  3 # There is insufficient memory for the Java Runtime Environment to continue.
  4 # Native memory allocation (malloc) failed to allocate 805306368 bytes for committing reserved memory.
  5 # An error report file with more information is saved as:
  6 # /home/software/cobar-server-1.2.7/hs_err_pid623.log

原来是虚拟机内存不够分配,因为装Arch的时候为了多运行几个,每个只分配了256M内存,而startup.sh中配置如下:

JAVA_OPTS="-server -Xms1024m -Xmx1024m -Xmn256m -Xss256k"

堆内存分了1G,新生代占了整个Arch内存大小,线程栈256k。将参数修改后可以运行。

Archlinux 中使用Mysql

Archlinux中的官方源用的是MariaDB,现在随着人们对Oracle把控Mysql的不信任,更多人开始用MariaDB。

设置

  安装很简单,用pacman就行,其中的初始设置步骤如下:

# systemctl start mysqld  
# mysql_secure_installation  
# systemctl restart mysqld  

  其中的第二步可以设置或修改密码。如果还需要后续的修改可以在/etc/mysql/my.cnf中配置,比如添加skip-networking可以实现禁止网络访问。

设置远程

  在上步设置中设置了允许远程连接,但是账户还需配置,先进入MariaDB,执行命令:

MariaDB [(none)]> grant all privileges on *.* to 'root'@'192.168.125.%' identified by 'q' with grant option;

  其中root是远程连接用的账户名,q为密码,’%‘表示通配。

  需要的话可以设置mysql守护进程开机启动:sudo systemctl enable mysqld

Thrift的安装以及问题

对Thrift这个框架知之甚少,想先了解下,我自己的习惯是先安装好跑个小demo。
首先从这里下载到Thrift的包。
Thrift对于安装环境的要求是Unix/Linux系统,Windows要装需要配合cygwin。
解压安装包,进入,运行:

./configure  
make  
make install  

大体步骤是这样,但是中间遇到了很多问题。最主要的一个是在make的时候,运
行ruby的bunble这一步出错,显示如下:

Bundler could not find compatible versions for gem "bundler":
  In Gemfile:
      bundler (~> 1.3.1) ruby

    Current Bundler version:
      bundler (1.7.2)

This Gemfile requires a different version of Bundler.
Perhaps you need to update Bundler by running `gem install bundler`?  

Stackoverflow上的答案是这样

% gem install bundler -v '~> 1.0.0'
Successfully installed bundler-1.0.22
Then force rubygems to use the version you want (see this post):

% bundle _1.0.22_ install  

这个也是版本不对,只不过不是1.3.1的,但是执行了始终不对。装了1.3.1的
bundler但是默认识别的还是1.7.2的,于是用gem把高版本的删了,接着make才成
功,之后有装回来了。
ps:寻找答案过程中才知道墙内有个网站叫segmentfault,还有个网站叫
outofmemory,方知山寨之伟大~

Ubuntu下安装Sublime3的Markdown插件


开始打算用vim编辑markdown文件的,搜了下各种解决方案,也尝试了很久,
但还是不行,比如vim-instant-markdown(git),按照要求的各种依赖也都
安装了,但是用vim打开md文件还是悄然无声。 据说Sublime也可以支持markdown,所以就在Ubuntu下安装了一个Sublime3.
之后就可以安装markdown插件了。
按ctrl+~,输入命令:

import urllib.request,os; pf = 'Package Control.sublime-package';  
ipp = sublime.installed_packages_path();  
urllib.request.install_opener( urllib.request.build_opener(    \
urllib.request.ProxyHandler()) ); open(os.path.join(ipp, pf),  \
'wb').write(urllib.request.urlopen( 'http://sublime.wbond.net/'\
+ pf.replace(' ','%20')).read())  

之后可以安ctrl+shift+p,输入命令:

package, 选择install package  
markdown, 选择markdown preview  

重启sublime,打开一个md文件,输入命令:

markdown preview, 选择 preview in browser  

这样就可以预览了,但是不是实时的。


ps: 刚刚在编辑post的时候是用vim编辑的,结果久等的实时窗口终于来了。原来
它识别的是markdown后缀,而不是md后缀。 pss: 话说这个主题和配色好丑啊,有空了再弄吧。