CockroachDB TO:第 2 卷

这是一个新的系列文章,涵盖了简短的“今天我学到了”主题,因为我剥离了 CockroachDB 的各个层。这是为了类似于发行说明。我决定将它与这些帖子的格式混合起来,因为它们可能无法证明整个博客的合理性。 阅读第 1 卷。

主题 1$COCKROACH_URL使用连接字符串保存键入的环境变量

  1. 节省打字
  2. 可以存储密码而不是每次都传入提示
  3. 传递额外的会话参数,而不是一直重新输入它们

我发现自己每次都打开多个命令提示符并访问同一个集群。$COCKROACH_URL是一个方便的技巧,可以节省每次输入连接字符串的时间。让我们以 CockroachDB 免费套餐为例,它带有一个长连接字符串,顺便说一句,其中还包括一个密码。解决此问题的一种方法是将连接字符串保存在环境变量中。这里的额外好处是密码与变量一起存储,是的,它不安全,但它肯定比每次以明文形式输入密码要好。它的工作方式类似于PGPASSWORD环境变量,是的,这不是最佳实践。

给定我的免费套餐连接字符串

postgresql://user:password@free-tier.gcp-us-central1.cockroachlabs.cloud:26257/defaultdb?sslmode=verify-full&sslrootcert='$HOME'/.postgresql/root.crt&options=--cluster%3Dclustername

设置变量

export COCKROACH_URL='postgresql://user:password@free-tier.gcp-us-central1.cockroachlabs.cloud:26257/defaultdb?sslmode=verify-full&sslrootcert='$HOME'/.postgresql/root.crt&options=--cluster%3Dclustername'

连接到集群

cockroach sql --url $COCKROACH_URL

## Enter ? for a brief introduction.#username@free-tier.gcp-us-central1.cockroachlabs.cloud:26257/defaultdb>

所以这很好,你可以传递额外的会话变量,比如application_nametimezone

export COCKROACH_URL="postgresql://user:password@free-tier.gcp-us-central1.cockroachlabs.cloud:26257/defaultdb?sslmode=verify-full&sslrootcert=$HOME/.postgresql/root.crt&options=--cluster%3Dclustername&application_name=demopurposes&timezone=America/New_York"

我之前提到的一点是,如果您运行ps命令,则能够查看存储在环境变量中的密码。缓存密码的首选方法是通过.pgpass文件。这就是我们接下来要研究的内容。


主题 2 使用.pgpassCockroachDB

CockroachDB 二进制文件目前不支持密码文件,但我们仍然可以利用psql密码身份验证以安全的方式访问 CockroachDB。根据要求设置密码文件

hostname:port:database:username:password

CockroachDB Free Tier 连接模式方便地在Connection parameters选项卡中显示所有必需的连接参数。

所以最终结果看起来像

free-tier.gcp-us-central1.cockroachlabs.cloud:26257:artem-freetier-3090.defaultdb:artem:thepassword

保存文件,将其存储在您的主目录中应用适当的权限并导出PGPASSFILE环境变量。

vi ~/.pgpasschmod 600 ~/.pgpassexport PGPASSFILE='/Users/artem/.pgpass'

然后你可以连接到 CockroachDB

psql -h free-tier.gcp-us-central1.cockroachlabs.cloud -p 26257 -d artem-freetier-3090.defaultdb

爪哇

psql (13.4, server 13.0.0)SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)Type "help" for help.artem-freetier-3090.defaultdb=>

注意我没有传递密码。CockroachDB 免费层中的数据库名称是必需的,因为它对我的集群是唯一的。另请注意,我使用的是二进制psql而不是cockroach二进制,因为后者目前不支持.pgpass.


application_name主题 3 以编程方式查找

假设您想在连接到活动会话时查看 application_name 会话变量,您可以使用以下查询来执行此操作:

select current_setting('application_name');

让我们使用我们的免费层集群使用第一个主题中的 `$COCKROACH_URL

export  COCKROACH_URL = "postgresql://user:password@free-tier.gcp-us-central1.cockroachlabs.cloud:26257/defaultdb?sslmode=verify-full&sslrootcert=$HOME/.postgresql/root.crt&options=--cluster% 3Dclustername&application_name=演示目的&timezone=America/New_York"br蟑螂 sql  -- url  $COCKROACH_URL

我使用了以下 application_name 变量&application_name=demopurposes。我们可以像这样获取会话变量

爪哇

artem@free-tier.gcp-us-central1.cockroachlabs.cloud:26257/defaultdb> SELECT current_setting('application_name');  current_setting-------------------  demopurposes

事实上,我们可以使用SELECT current_setting(‘timezone’);.

 current_setting--------------------  America/New_York


主题 4 强制重试

使用 CockroachDB 的应用程序开发人员很快意识到,需要在SERIALIZABLE隔离操作的数据库中解决事务重试问题。我们有关于重试主题的大量文档,我将其留给您阅读。总是逃避最初努力的一个项目是如何重现争用和围绕它的代码。我们有兴趣将其用于开发目的,但我不能说我们将在多长时间内看到这一点。取而代之的是,我们可以在 sql 中强制 CockroachDB 中的事务重试。

爪哇

BEGIN TRANSACTION; SAVEPOINT cockroach_restart; SELECT 1;SELECT crdb_internal.force_retry('1h':::INTERVAL);

这将产生一个40001错误,可以在 CockroachDB 中安全地重试。现在您可以在应用程序中围绕它进行编码。

root@localhost:26257/defaultdb> BEGIN TRANSACTION; SAVEPOINT cockroach_restart; SELECT 1;  ?column?------------         1(1 row)Note: timings for multiple statements on a single line are not supported. See https://go.crdb.dev/issue-v/48180/v21.1.root@localhost:26257/defaultdb  OPEN> SELECT crdb_internal.force_retry('1h':::INTERVAL);ERROR: restart transaction: crdb_internal.force_retry(): TransactionRetryWithProtoRefreshError: forced by crdb_internal.force_retry()SQLSTATE: 40001HINT: See: https://www.cockroachlabs.com/docs/v21.1/transaction-retry-error-reference.html

您的 sql shell 将在剩余的时间间隔内保持事务打开,在我们的例子中为 1 小时。我们可以通过发出回滚来释放 shell。

root@localhost:26257/? ERROR> rollback;ROLLBACK

主题 5 强制恐慌,失败注入

CockroachDB 没有官方的故障注入工具来协助进行混沌测试 CockroachDB。以下是强制内核恐慌和以编程方式注入故障的下一个最佳方法。当您在 Kubernetes StatefulSet 中运行 CockroachDB 时,一位客户提出了一个问题,即如何在灾难面前测试对查询性能的影响。StatefulSet 将确保 CockroachDB 的 pod 将保持副本最少,并在某些 pod 失败时创建新的 pod。使用以下命令,您可以在新 pod 重新联机时注入故障并测试查询性能。

SELECT crdb_internal.force_panic('some message');

我会谨慎使用此命令,因为它会终止执行它的节点。在我的单节点实例中,我看到以下输出

ERROR: driver: bad connectionwarning: connection lost!opening new connection: all session settings will be lostwarning: error retrieving the transaction status: dial tcp [::1]:26257: connect: connection refusedwarning: connection lost!opening new connection: all session settings will be lostwarning: error retrieving the database name: dial tcp [::1]:26257: connect: connection refusedroot@localhost:26257/? ?> qERROR: driver: bad connectionFailed running "sql"

和日志

I210823 18:44:06.077245 292 2@gossip/gossip.go:567 ? [n1] 167 +gossip server (0/3 cur/max conns, infos 0/0 sent/received, bytes 0B/0B sent/received)I210823 18:44:06.188169 65 2@server/status/runtime.go:569 ? [n1] 168  runtime stats: 320 MiB RSS, 266 goroutines (stacks: 3.8 MiB), 52 MiB/91 MiB Go alloc/total (heap fragmentation: 7.6 MiB, heap reserved: 10 MiB, heap released: 183 MiB), 36 MiB/40 MiB CGO alloc/total (0.6 CGO/sec), 1.1/1.0 %(u/s)time, 0.0 %gc (0x), 58 KiB/33 KiB (r/w)net** ERROR: [n1,client=[::1]:52686,hostnossl,user=root] a SQL panic has occurred while executing the following statement:* SELECT crdb_internal.force_panic('some message')*** ERROR: [n1,client=[::1]:52686,hostnossl,user=root] a panic has occurred!* panic: some message* (1) attached stack trace*   -- stack trace:*   | github.com/cockroachdb/cockroach/pkg/sql.(*Server).ServeConn.func1*   |     /go/src/github.com/cockroachdb/cockroach/pkg/sql/conn_executor.go:482*   | [...repeated from below...]* Wraps: (2) while executing: SELECT crdb_internal.force_panic(_)* Wraps: (3) attached stack trace

现在我必须重新启动我的实例,这可能是结束这篇文章的一个好点。

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年7月9日
下一篇 2022年7月9日

相关推荐