gradle ssh plugin
提供gradle访问ssh执行命令、传输文件的功能。
安装
构建脚本中添加:
1 | plugins { |
使用
1 | remotes { |
可以使用此插件通过ssh自动部署应用程序。
tomcat热部署会持续的泄露PermGen内存,因此还是常规的部署更靠谱,不过应用程序会暂时中断。
References:
[1]gradle-ssh-plugin
[2]Deploy your App from Gradle
===
[erq]
提供gradle访问ssh执行命令、传输文件的功能。
安装
构建脚本中添加:
1 | plugins { |
使用
1 | remotes { |
可以使用此插件通过ssh自动部署应用程序。
tomcat热部署会持续的泄露PermGen内存,因此还是常规的部署更靠谱,不过应用程序会暂时中断。
References:
[1]gradle-ssh-plugin
[2]Deploy your App from Gradle
===
[erq]
gradle调用gulp任务的插件。
安装
build文件中添加如下行:
1 | plugins { |
调用gulp任务
插件将gulp task_name包装成gulp_task_name的方式从gradle调用。
可以从命令行上调用:
1 | $ gradle gulp_task_name |
这实际上会调用gulp task_name
更重要的,可以在构建文件中把gulp任务作为依赖:
1 | // runs "gulp build" as part of your gradle build |
References:
[1]gradle-gulp-plugin
===
[erq]
集群信息
集群的名字叫fooCluser,总共有两个节点在同一个数据中心。每个节点位于不同的机架。
数据中心的名字叫DC1,两个机架的名字分别为RAC1和RAC2。
两个节点的IP分别为192.168.0.100和192.168.0.101。
因为只有两个节点,两个节点都作为种子节点。
注意:要保证所有的节点安装相同版本的Cassandra
操作步骤
1 | $ sudo service cassandra stop |
1 | $ sudo rm -rf /var/lib/cassandra/data/system/* |
1 | cluster_name: 'fooCluster' |
不同的节点listen_address是不同的。如果需要开启thrift rpc server,还需设置rpc相关参数,对于当前版本的cassandra,rpc并不是必须的,只使用cql是可行的。
当初始化一个没有数据的新集群时,要设置auto_bootstrap参数为false。auto_bootstrap参数在cassandra.yaml中是没有的,其默认值为true,需要手动添加。种子节点是不需要bootstrap的,只有向集群中添加新的节点时,新加入的节点启动时需要bootstrap。
4. 机架感应配置
因为使用了GossipingPropertyFileSnitch,所以对应的数据中心、机架配置文件为cassandra-rackdc.properties
对于192.168.0.100节点,此文件内容设置为:
1 | dc = DC1 |
而对于192.168.0.101节点,则设置为:
1 | dc = DC1 |
注意:cassandra集群内的多个节点是可以放置于同一个机架内的,只不过cassandra认为,同一个机架内的节点容易一起失败,所以要尽量将数据分布到不同机架内的节点上。
5. 启动节点
先启动种子节点,每次启动一个,顺序启动所有种子节点后,再顺序启动其他节点。
1 | $ sudo service cassandra start |
1 | $ nodetool status |
References:
[1]Initializing a multiple node cluster (single data center)
===
[erq]
可以为现有集群添加一个新的数据中心,要求新添加数据中心的所有节点,要安装与原集群节点相同的cassandra版本。
操作步骤:
1 | $ sudo service cassandra stop |
auto_bootstrap: false
。auto_bootstrap默认是true,并且没有在cassandra.yaml文件中列出来。设置其他参数,比如seeds和endpoint_snitch,匹配原有集群的配置。num_tokens参数可以设置与原集群一致,但不要设置initial_token参数。核心的参数设置如下:
1 | cluster_name: 'fooCluster' |
seeds设置为每个数据中心两个节点或以上
如果数据中心之间需要跨网访问,broadcast_address需要设置为跨网访问的公网ip
1 | dc = DC4 |
1 | cqlsh> ALTER KEYSPACE system_auth WITH replication = {'class': 'NetworkTopologyStrategy', 'DC1':2,'DC2':1}; |
然后新添加数据中心的每一个节点上运行nodetool rebuild,并指定原数据中心的名字:
1 | $ nodetool rebuild -- name_of_existing_data_center |
多个节点可以同时运行此命令。
References:
[1]Adding a data center to a cluster
[2]Using multiple network interfaces
[3]Apache Cassandra Deployed on Private and Public Networks
[4]Adding nodes to an existing cluster
debian从官方源安装cassandra后,集群其实已经建立起来了,默认的集群名字为Test Cluster
直接更改/etc/cassandra/cassandra.yaml文件中的cluster_name,然后重新启动cassandra是行不通的。
有如下类似错误提示:
1 | ERROR \[main\] 2015-11-06 22:44:41,853 CassandraDaemon.java:635 - Fatal exception during initialization |
这是因为集群的名字存储在系统表中,当与配置文件中的集群名字不同时,就会出现以上错误。二者必须要一致才可以。
1 | cqlsh> UPDATE system.local SET cluster_name = 'test' where key='local'; |
修改完后还要flush一下节点。如果更改集群的名字,集群中所有的节点要逐一这样改过才行。
最好在集群初始化之初规划好集群的名字,不要随意更改集群名字。
References:
[1]Saved cluster name Test Cluster != configured name
[2]Cassandra says “ClusterName mismatch: oldClusterName != newClusterName” and refuses to start
[3]Troubleshooting cassandra: Saved cluster name XXXX != configured name YYYY
===
[erq]
debian使用apache源安装完成的cassandra节点,默认数据存储在/var/lib/cassandra/data目录下。
为了优化性能,可能将data与commitlog分别存储到不同的磁盘上。
比如,更改数据目录到/mnt/data/cassandra目录下,这是挂装的一个不同的磁盘驱动器。
首先停掉cassandra
1 | $ sudo service cassandra stop |
然后修改/etc/cassandra/cassandra.yaml
1 | data_file_directories: |
将/var/lib/cassandra/data目录下的所有东西全部拷贝或移动到/mnt/data/cassandra目录下
1 | $ sudo -u cassandra cp -r /var/lib/cassandra/data/* /mnt/data/cassandra |
或
1 | $ sudo -u cassandra mv /var/lib/cassandra/data /mnt/data/cassandra |
最后重新启动cassandra
1 | $ sudo service cassandra start |
===
[erq]
使用cassandra最最重要的事情不要忘记,架设一台时间服务器,所有的节点都与这台时间服务器定时同步,切记!
时间一致性对cassandra至关重要。
配置文件中添加如下行:
1 | server { |
References:
[1]NGINX as a WebSocket Proxy
===
[erq]
gradle ssh plugin使用的jsch library并不能识别debian系统~/.ssh/known_hosts里面的hostkey格式,从而报reject hostkey错误。
使用如下命令获取主机的hostkey
1 | $ ssh-keyscan -t rsa -p port host_ip_or_name |
将输出的主机key指纹添加到~/.ssh/known_hosts即可。
References:
[1]Remote tomcat deployment with Gradle
[2]Solution for com.jcraft.jsch.JSchException: reject HostKey problem on Ubuntu
===
[erq]
gulp-debug插件可以显示哪些文件经过了gulp的流水线(pipeline)
安装
1 | $ npm install --save-dev gulp-debug |
使用
1 | var gulp = require('gulp'); |
gulp运行时就会输出流中所有处理的文件名:
1 | \[22:20:36\] gulp-debug: foo.js |
使用gulp-util输出错误
1 | // minify js |
References:
[1]gulp-debug
[2]Utilities for gulp plugins
===
[erq]