あなたは、パフォーマンスを犠牲にすることなく、スケーラビリティと高可用性を必要とする場合は、Apache Cassandraの「データベース」の正しい選択です。
コモディティ・ハードウェアやインフラストラクチャのフォールトトレランスのリニアなスケーラビリティと実績のあるクラウドは、ミッションクリティカルなデータのための完璧なプラットフォームになります。
複数のデータセンターのレプリケーション間カサンドラ・サポートは、それがユーザーのために低レイテンシーを提供し、その種の最高で、そしてユーザーが後ろに座るとリラックスすることができ、文化の中で生き残る(停電)を中断することができます。
カサンドラ
カサンドラはすぐに中断されない大量のデータを管理することができます。
カサンドラクエリ言語(CQL)で
カサンドラ設定ファイル
DataStaxドキュメント
火花カサンドラ・コネクタ
本番環境の安定バージョン3.11.4。注FLINK -コネクタ-カサンドラクライアントdatastaxバージョン。
スタンドアローンおよびクラスタ構成
デフォルトの設定ファイル
1 |
./conf/cassandra.yaml |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
最小構成: CLUSTER_NAME:クラスタ名の 種子:クラスタノード種のコンマ区切りリストとIPアドレス storage_port:RPC通信のためのクラスタノード間のポート番号。デフォルトの7000には、セキュリティ上の理由から、外部のネットワークにさらされていません。 listen_address:ノードについてノードのIPアドレスは、互いに通信します。あなたもなく、同じ時間とlisten_address設定で、カードの特定の使用を指定listen_interfaceを設定することができます。 native_transport_port:アクセスクライアントポートを使用。 ユーザー名パスワード設定(ユーザーは、一般的に異なる役割を作成し、適切な権限DDLとDMLを割り当てる): 認証:PasswordAuthenticator オーソ:CassandraAuthorizerの ディレクトリ構成: data_file_directories:データファイルの保存場所は、複数のディスクなどの1つのまたは複数のディレクトリ、することができ commitlog_directory:commitlogファイルが置かれている場所、パフォーマンス上の理由から、データファイルやディレクトリは異なるディスク上に保存することができます saved_caches_directory:キャッシュファイルディレクトリ hints_directory:ディレクトリのヒント などJVM_OPTSのようcassandra-env.sh設定ファイルの環境変数、 ログ出力: logbackを使用して、編集logback.xmlファイルが変更されます。出力SYSTEM.LOGにINFOデフォルトの出力レベル、DEBUG.LOGにデバッグレベル。カサンドラは、コンソールにフォアグラウンドのINFOレベルのログ出力で実行されます。 |
クライアントAPIおよびクライアントツール
FLINK-コネクタカサンドラをdatastaxに基づいているジャーを用いFLINK。
API示例代码:
com.datastax.driver.core.querybuilder.Insert
com.datastax.driver.core.querybuilder.Update
com.datastax.driver.core.querybuilder.Select
com.datastax.driver.core.querybuilder.Delete
これは、Navicatはクライアントが使用するRazorSQLに似ているクエリ、編集、検索、およびデータベースの管理します。
構築されたテーブル、クエリ、およびプラグインの更新
テーブルを作成するには
1 2 3 4 5 6 7 8 |
テーブルexcelsior.tをドロップ。 表excelsior.t(作成 PK INT、 T INT、 S VARCHAR、 VのVARCHAR、 主キー(PK、t)を )。 |
お問い合わせ
1 |
excelsior.tから*を選択します。 |
プラグインのアップデート
1 2 |
excelsior.t挿入(PK、T) の値(5,6)。 |
1 2 |
insert into excelsior.t (pk, t, s) values (5,6,'s2'); |
1 2 |
insert into excelsior.t (pk, t, s) values (5,6,'s5'); |
1 2 |
insert into excelsior.t (pk, t, s) values (5,6,null); |
1 2 |
insert into excelsior.t (pk, t, s, v) values (5,6,'s6','v8'); |
1 2 |
insert into excelsior.t (pk, t, v) values (5,6,'v9'); |
异步Job
创建表
构造10万条消息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
for (int i = 0; i < 100000; i++) { POJO pojo = new POJO(); int j = random.nextInt(5); pojo.setAid("ID000-" + i); pojo.setAname("NAME-" + i); pojo.setAstyle("STYLE000-" + j); pojo.setEnergy(new BigDecimal(random.nextInt(1000)).setScale(2, RoundingMode.HALF_UP)); pojo.setAge((j == 0 ? 1 : j) * 13); long time = System.currentTimeMillis(); pojo.setTt(new Date(time)); pojo.setLogTime(time); ZoneId shanghaiZoneId = ZoneId.of("Asia/Shanghai"); ZonedDateTime shanghaiZonedDateTime = ZonedDateTime.now(shanghaiZoneId); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); pojo.setCreateTime(shanghaiZonedDateTime.format(formatter)); pojo.setUpdateTime(shanghaiZonedDateTime.format(formatter)); pojo.setAstatus("0" + j); String value = gson.toJson(pojo); producer.send(new ProducerRecord<String, String>(AsyncCassandraJob.class.getSimpleName(), Integer.toString(i), value)); System.out.println(value); } |
AsyncCassandraRequest
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
/** * AsyncCassandraRequest */ public class AsyncCassandraRequest extends RichAsyncFunction<POJOWrapper, String> { private static final long serialVersionUID = -3713249881014861537L; Logger logger = LoggerFactory.getLogger(AsyncCassandraRequest.class); private transient Cluster cluster; private transient ListenableFuture<Session> session; @Override public void open(Configuration parameters) throws Exception { // 配置与Cassandra集群之间的Socket连接参数 SocketOptions so = new SocketOptions() // 读取数据超时时间 默认12000 .setReadTimeoutMillis(30000) // 连接超时时间 默认5000 .setConnectTimeoutMillis(30000); // 连接池相关的参数 PoolingOptions poolingOptions = new PoolingOptions() // 每个连接的最大并发请求数 默认-2147483648 .setMaxRequestsPerConnection(HostDistance.LOCAL, 32768) // 每个Cassandra节点多少个连接 核心连接数和最大连接数 .setConnectionsPerHost(HostDistance.LOCAL, 4, 10) // 心跳间隔 默认30秒 .setHeartbeatIntervalSeconds(60) // 连接池超时时间 默认5000 .setPoolTimeoutMillis(30000); // 写数据时的数据一致性级别 QUORUM=至少成功写入Q个复制节点(Q=N/2+1) QueryOptions queryOptions = new QueryOptions().setConsistencyLevel(ConsistencyLevel.QUORUM); // 重试策略 如果做了预合并 加上Cassandra的插入式更新,可以多尝试几次直到成功 // DowngradingConsistencyRetryPolicy:会降级的一致性,意思是重试之后的一致性要比初次的一致性级别低,也就是会保证最终一致性 // 使用LoggingRetryPolicy包装一下 RetryPolicy retryPolicy = new LoggingRetryPolicy(DowngradingConsistencyRetryPolicy.INSTANCE); cluster = Cluster.builder().addContactPoint("127.0.0.1").withSocketOptions(so) .withClusterName("Test Cluster") // .withCredentials("username", "password") .withPoolingOptions(poolingOptions) .withQueryOptions(queryOptions) .withRetryPolicy(retryPolicy) // 负载均衡策略 RoundRobinPolicy Hash取模 .withLoadBalancingPolicy(new RoundRobinPolicy()) .withPort(9042).build(); session = cluster.connectAsync(); } @Override public void close() throws Exception { if (cluster != null) { cluster.close(); } } @Override public void timeout(POJOWrapper input, ResultFuture<String> resultFuture) { logger.info("timeout: " + input); } @Override public void asyncInvoke(POJOWrapper input, ResultFuture<String> resultFuture) throws Exception { System.out.println("asyncInvoke: " + Thread.currentThread().getName()); ListenableFuture<ResultSet> resultSet = Futures.transform(session, new AsyncFunction<Session, ResultSet>() { @Override public ListenableFuture<ResultSet> apply(Session session) throws Exception { System.out.println(CqlHelper.createInsertQuery(input, false)); return session.executeAsync(CqlHelper.createInsertQuery(input, false)); } }); Futures.addCallback(resultSet, new FutureCallback<ResultSet>() { @Override public void onSuccess(@Nullable ResultSet rows) { System.out.println("rows: " + rows); resultFuture.complete(Arrays.asList("success")); } @Override 公共ボイドONFAILURE(Throwableをスロー可能){ throwable.printStackTrace()。 } })。 } } |
10万データウェアハウジング
時間