搭建cassandra 集群

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了搭建cassandra 集群相关的知识,希望对你有一定的参考价值。

参考技术A 注意:如果服务器有防火墙千万记得开放端口

首先准备3个服务器并装好cassandra

一、清理cassandra数据目录

 二、修改cassandra配置

需要对3个服务器上的cassandra配置中的属性seeds、rpc_address、listen_address进行修改

首先登陆到服务器中

服务器192.168.88.96 :

服务器192.168.88.100 :

服务器192.168.88.113 :

开放服务器端口7000、7001、9160、9042 我的服务器是centos7 

  开放端口

    重新启动防火墙:

    查看防火墙状态

在每个实例上启动cassandra:

并验证Cassandra集群设置是否成功:

    nodetool status

Cassandra:集群环境搭建和测试

当前版本:apache-cassandra-3.0.24CentOS7,jdk1.8

1. 声明

当前内容主要为本人记录搭建apache cassandra集群,并测试向集群中添加keyspace

主要内容:

  1. 搭建集群环境
  2. 测试向集群环境中插入keyspace

准备环境

ip开放端口
192.168.1.1037000、7001、9042、9160
192.168.1.1047000、7001、9042、9160

2. 开放端口

开放 7000、7001、9042、9160端口

firewall-cmd --zone=public --add-port=7000/tcp --permanent
firewall-cmd --zone=public --add-port=7001/tcp --permanent
firewall-cmd --zone=public --add-port=9042/tcp --permanent
firewall-cmd --zone=public --add-port=9160/tcp --permanent
systemctl restart firewalld.service
firewall-cmd --reload

3. 清除之前的数据和日志

主要为清空之前的数据data文件夹和logs文件夹(cassandra中)

rm -rf data/
rm -rf logs/

4. 集群配置

修改192.168.1.103中的conf文件夹中cassandra.conf文件内容为

seed_provider:
    # Addresses of hosts that are deemed contact points. 
    # Cassandra nodes use this list of hosts to find each other and learn
    # the topology of the ring.  You must change this if you are running
    # multiple nodes!
    - class_name: org.apache.cassandra.locator.SimpleSeedProvider
      parameters:
          # seeds is actually a comma-delimited list of addresses.
          # Ex: "<ip1>,<ip2>,<ip3>"
          - seeds: "192.168.1.104,192.168.1.103"
listen_address: 192.168.1.103
broadcast_address: 192.168.1.103
rpc_address: 192.168.1.103

修改192.168.1.104中的conf文件夹中cassandra.conf文件内容为

seed_provider:
    # Addresses of hosts that are deemed contact points. 
    # Cassandra nodes use this list of hosts to find each other and learn
    # the topology of the ring.  You must change this if you are running
    # multiple nodes!
    - class_name: org.apache.cassandra.locator.SimpleSeedProvider
      parameters:
          # seeds is actually a comma-delimited list of addresses.
          # Ex: "<ip1>,<ip2>,<ip3>"
          - seeds: "192.168.1.104,192.168.1.103"
listen_address: 192.168.1.104
broadcast_address: 192.168.1.104
rpc_address: 192.168.1.104

主要为修改:

  1. seeds为集群目标的各个节点的ip地址并使用分隔符分割
  2. listen_address、broadcast_address、rpc_address都是修改为本机地址

5. 启动集群中的各个节点

就像前面的正常启动即可:./bin/cassandra


出现Handshaking表示握手成功,即集群间的通信已经正常了

6. 查看集群状态

./nodetool status


表示集群间的状态为正常

7. 测试向集群中添加keyspace

主要参考使用java方式操作cassandra,所以这里就不贴出pom依赖了

public class OperationKeyspaceTest 
	private static final String DEFATUL_HOST = "192.168.1.103";
	private static final int DEFAULT_PORT = 9042;

	public static void main(String[] args) 
		// 查询当前cassandra的版本
		// 创建keyspace,如果该keyspace已经存在了那么就会报错Keyspace test already exists
		 createKeyspace("test_cluster");
		// 查看当前的keyspaces
		showKeyspaces();
		// 修改当前的keyspace
		//updateKeyspace("test");
		//showKeyspaces();
		// 删除keyspace
		//deleteKeyspace("test_cluster");
		//showKeyspaces();
	

	// 修改当前的keyspace的副本数量为1
	private static void updateKeyspace(String keyspace) 
		execute((session) -> 
			session.execute("ALTER KEYSPACE "+keyspace+"  WITH replication = 'class': 'SimpleStrategy', 'replication_factor' : 1;");
		);
	

	// 展示所有的keyspace
	private static void showKeyspaces() 
		execute((session) -> 
			Metadata metadata = session.getMetadata();
			Optional<String> clusterName = metadata.getClusterName();
			if (clusterName.isPresent()) 
				System.out.println("clusterName:" + clusterName.get());
			
			Iterator<Entry<UUID, Node>> iterator = metadata.getNodes().entrySet().iterator();
			while (iterator.hasNext()) 
				Entry<UUID, Node> next = iterator.next();
				System.out.println("key=" + next.getKey() + ",value=" + next.getValue());
			
			// 这里没有任何的keyspace
			Map<CqlIdentifier, KeyspaceMetadata> keyspaces = metadata.getKeyspaces();
			keyspaces.forEach((k, v) -> 
				System.out.println("key=" + k + ",value=" + v);
			);
			
		);
	
	
	// 手动创建keyspace
	private static void createKeyspace(String keyspace) 
		execute((session) -> 
			session.execute("CREATE KEYSPACE "+keyspace+" WITH replication = 'class': 'SimpleStrategy', 'replication_factor' : 3 ");
		);
	
	
	// 删除keyspace
	private static void deleteKeyspace(String keyspace) 
		execute((session) -> 
			session.execute("DROP KEYSPACE "+keyspace);
		);
	

	private static CqlSession createCqlSession() 
		return CqlSession.builder()
				.addContactPoint(new InetSocketAddress("192.168.1.103", DEFAULT_PORT))
				.addContactPoint(new InetSocketAddress("192.168.1.104", DEFAULT_PORT))
				.build();
	

	private static void execute(SessionHandler handler) 
		try (CqlSession session = createCqlSession()) 
			handler.handler(session);
		
	

	interface SessionHandler 
		void handler(CqlSession session);
	

执行结果:

查看各个节点中的变化


集群测试成功

8. 总结

1. cassandra的集群非常简单,但是一定要注意开放端口,否则每个节点的cassandra就是一个单独的节点,虽然测试添加还是可以执行但是会出现超时错误

2.集群中的使用java方式操作时,只要继续添加节点就可以了原来的代码可以保持不变

以上是关于搭建cassandra 集群的主要内容,如果未能解决你的问题,请参考以下文章

Cassandra:集群环境搭建和测试

cassandra集群搭建

Cassandra集群:一,搭建一个三节点的集群

低成本搭建多可用区域高可用Cassandra集群

Cassandra数据库从入门到精通系列之一:认识Cassandra数据库

将数据从单节点 cassandra 集群迁移到另一个单节点 cassandra 集群