对于 akka-cluster 这样的分布式软件系统来说, 选择配套的数据库类型也是比较讲究的, 最好也是分布式的, 如 cassandra, 能保证良好的 HA 特性. 前面的例子里示范 akka-persistence 时已经使用了 cassandra 作为 journal 和 snapshot-store. 一直以来基本上都在一部 MacBook Pro 上开发, 测试 akka-cluster 相关软件. 这次在腾讯云上租了两台 8G,50G 的服务器, 安装了 Ubuntu 16.04.1 LTS 操作系统, 想着可以在一个真正的环境下试试 cassandra cluster 的安装部署和实际使用. 先是试着在 Ubuntu 上安装部署:
在 Ubuntu 上安装 cassandra, 跟着下面的步骤做:
- echo "deb http://www.apache.org/dist/cassandra/debian 311x main" | sudo tee -a /etc/apt/sources.list.d/cassandra.sources.list
- curl https://www.apache.org/dist/cassandra/KEYS | sudo apt-key add -
- sudo apt-get update
- sudo apt-get install cassandra
我安装的是 cassandra v3.11.3 版本, 所以用了 debian 311x main 来注明. 安装完毕后可以用 status 看看 cassandra 是不是已经启动, start,stop cassandra 可以用下面的命令:
- sudo service cassandra status // 检查运行状态
- sudo service cassandra start // 启动 cassandra
- sudo service cassandra stop // 停止 cassandra
现在我们可以用 sudo service cassandra start 启动 cassandra
然后开启 cqlsh, 输入:
- use system;
- describe table local
注意显示的 system.local 表列名:
- CREATE TABLE system.local (
- key text PRIMARY KEY,
- bootstrapped text,
- broadcast_address .NET,
- cluster_name text,
- cql_version text,
- data_center text,
- gossip_generation int,
- host_id uuid,
- listen_address .NET,
- native_protocol_version text,
- partitioner text,
- Rack text,
- release_version text,
- rpc_address .NET,
- schema_version uuid,
- thrift_version text,
- tokens set<text>,
- truncated_at map<uuid, blob>
- ...
列名里包括了配置文件 cassandra.YAML 中的许多配置如 cluster_name,listen_address,rpc_address 等. 在安装 cassandra 时已经存放了 cassandra.YAML 的初始值. 所以必须记住如果修改 cassandra.YAML 里涉及这些配置后必须把所有 system 表删掉让 cassandra 自己根据新的. YAML 文件配置重新创建这些 system 表.
我尝试建一个两个节点 node 的 cluster:
配置 cluster:
- server1 172.27.0.8
- server2 172.27.0.7
用 server1 做 seednode. 配置 cluster 需要修改 cassandra.YAML 文件, 具体路径如下:
sudo nano /etc/cassandra/cassandra.YAML
需要修改文件里的配置参数:
cluster_name : 统一集群名称
seed_provider : seed 节点地址清单 (以, 号分割)
listen_address : 集群节点之间使用 gossip 协议通讯地址
rpc_address : 客户端连接地址
endpoint_snitch : 节点所属数据中心, 机架
在修改 cassandra.YAML 文件之前先停了 cassandra: sudo service cassandra stop
下面是 server1 的设置:
- cluster_name: 'TestPOS Cluster'
- listen_address: 172.27.0.8
- rpc_address: 172.27.0.8
- - seeds: 172.27.0.8
- endpoint_snitch: SimpleSnitch
切记!!! 修改完毕在启动 cassandra 之前必须首先删除 cassandra 的系统数据表 system*:
sudo rm -rf /var/lib/cassandra/data/system/*
然后启动 cassandra: sudo service cassandra start
好了, 现在可以用 nodetool 命令来检查这个节点的启动状态: sudo nodetool status
结果显示 server1 已经成功启动了.
下面开始配置 server2:
在修改 cassandra.YAML 文件之前先停了 cassandra: sudo service cassandra stop
- cluster_name: 'TestPOS Cluster'
- listen_address: 172.27.0.7
- rpc_address: 172.27.0.7
- - seeds: 172.27.0.8
- endpoint_snitch: SimpleSnitch
删除 cassandra 的系统数据表 system*:
sudo rm -rf /var/lib/cassandra/data/system/*
然后启动: sudo service cassandra start
现在可以用 nodetool 命令来检查这个集群中所有节点的启动状态: sudo nodetool status
很遗憾, 只能看到 server2 一个节点.
这种现象说明 server1,server2 之间没有沟通. 它们应该是通过各自的 7000 端口交流的, 估计是租赁的虚拟服务器没有开启这个端口. 在 server1 上用 nc -vc 172.27.0.7 7000 得到证实. 尝试用 iptables, ufw 等防火墙指令都无法解决问题, 看来要留给网络管理部门了.
做了些调研, 下面是 cassandra 需要使用的端口说明:
- 7199 JMX monitoring port
- 1024 - 65355 Random port required by JMX. Starting with Java 7u4 a specific port can be specified using the com.sun.management.jmxremote.rmi.port property.
- 7000 Inter-node cluster
- 7001 SSL inter-node cluster
- 9042 CQL Native Transport Port
- 9160 Thrift
另外, 如果需要完整卸载 cassandra, 可以用 : sudo apt-get purge cassandra
...
再试试用两部 MacBook Pro 来构建一个 2-node-cluster:
手头刚好有两部 MacBook Pro, 可以试试在 Mac 上安装部署 cassandra cluster.
用 homebrew 下载和安装 cassandra 特别容易:
- brew update
- brew install cassandra
brew info cassandra 可以获取 cassandra 安装情况如版本等
直接用 nodetool status 来检查 cassandra 是否已经启动
start,stop 命令如下:
- brew services start cassandra
- brew services stop cassandra
或者
- launchctl load ~/Library/LaunchAgents/homebrew.mxcl.cassandra.plist
- launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.cassandra.plist
两部 MacBook Pro IP 地址: 用 mac1 当作 seednode
- mac1 192.168.1.30
- mac2 192.168.1.24
下面是 brew 安装后 cassandra 的一些重要文件路径:
- Properties:
- /usr/local/etc/cassandra
- Logs:
- /usr/local/var/log/cassandra
- Data:
- /usr/local/var/lib/cassandra/data
配置 mac1:
- brew services stop cassandra
- sudo nano /usr/local/etc/cassandra/cassandra.YAML
- cluster_name: 'TestPOS Cluster'
- listen_address: 192.168.1.30
- rpc_address: 192.168.1.30
- - seeds: 192.168.1.30
- endpoint_snitch: SimpleSnitch
同样, 谨记要清除 system 表: sudo rm -rf /usr/local/var/lib/cassandra/data/system*
brew services start cassandra
nodetool status 显示节点 mac1 已经启动
配置 mac2:
- brew services stop cassandra
- sudo nano /usr/local/etc/cassandra/cassandra.YAML
- cluster_name: 'TestPOS Cluster'
- listen_address: 192.168.1.24
- rpc_address: 192.168.1.24
- - seeds: 192.168.1.30
- endpoint_snitch: SimpleSnitch
同样, 谨记要清除 system 表: sudo rm -rf /usr/local/var/lib/cassandra/data/system*
brew services start cassandra
用: nc -vc 192.168.1.30 7000 检查 mac1 的 7000 端口, 果然是开启的
nodetool status 显示 mac1,mac2 两个节点都已经启动了
当前的 endpoint_snitch 使用了 SimpleSnitch. 但在生产环节里需要配置:
endpoint_snitch: GossipingPropertyFileSnitch
然后在 / usr/local/etc/cassandra/cassandra-rackdc.properties 文件里定义本节点的物理位置 (数据中心, 机架)
最后还要删除 / usr/local/etc/cassandra/cassandra-topology.properties 文件
来源: https://www.cnblogs.com/tiger-xc/p/10362389.html