在CentOS 8上设置三节点CockroachDB集群

时间:2020-02-23 14:31:27  来源:igfitidea点击:

规模,规模,规模!扩展所有内容是一个术语,我们在走廊中漫步时会听到几次。
无论我们是在业务开发部门还是在技术部门,扩展业务规模或者扩展容器服务器都是我们熟悉的知识。

对于那些负责管理数据库的人员,CockroachDB在这里可以对数据库扩展需求进行排序。
CockroachDB是一种主伸缩器,具有最小的工作量和强大的结果。
在本教程中,我们将在三个节点上安装和配置CockroachDB,并演示如何复制一个节点中的数据并在三个节点中可用。
那就是CockroachDB?

CockroachDB是云原生的分布式SQL数据库,可为现代云应用程序提供更高级别的一致性,超弹性,数据局部性和大规模。
像Comcast,Lush和Bose这样的正在CockroachDB上构建其云数据架构。
Cockroach Labs由致力于构建尖端系统基础架构的工程师团队创建,并获得了Benchmark,G/V,Index Ventures和Redpoint的投资。

CockroachDB分发包含核心功能和企业功能的单个二进制文件。
我们可以使用核心功能而无需任何许可证密钥。
但是,要使用企业功能,我们需要试用版或者企业许可证密钥。
在本教程中,我们将在CentOS 8服务器上与可选HAProxy负载平衡器服务器一起部署三节点CockroachDB数据库,然后四处查看它是由什么制成的。
在开始之前,让我们清除所有依赖关系和系统要求。

系统要求

适用于Linux的CockroachDB二进制文件需要glibc,libncurses和tzdata,默认情况下,几乎所有Linux发行版都提供glibc,libncurses和tzdata,但Alpine是例外。
3具有至少2GB RAM的CentOS 8服务器每个服务器上都需要允许这两个端口服务器:26257用于节点间和应用程序通信,8080用于Admin UI可选的负载平衡器服务器

在CentOS 8服务器上安装CockroachDB群集

应该注意的是,集群中的每个节点都需要具有cockroach二进制文件的副本。
要在每个节点上安装CockroachDB,请执行以下步骤。

步骤1:更新并安装基本软件包

更新服务器以获取最新的补丁程序和软件,并安装必不可少的应用程序,例如vim,wget等。

sudo dnf -y update
sudo dnf -y install vim wget

如果我们没有内部DNS来解析域名,则将以下内容添加到每个节点的"/etc/hosts"文件中。

$sudo vim /etc/hosts
172.28.182.170 cockroach-db01
172.28.182.246 cockroach-db02
172.28.187.217 cockroach-db03
172.28.190.34 loadbalancer

在继续下一步之前,请创建以下目录并在将负责管理cockroach服务的每个数据库服务器节点上创建用户cockroach。

mkdir  ~/certs
sudo mkdir /var/lib/cockroach
sudo useradd cockroach

步骤2:下载并安装CockroachDB Binary

让我们获取CockroachDB的源代码并将其安装在我们的3台服务器上。
下载适用于Linux的CockroachDB存档,并提取二进制文件:

wget -qO- https://binaries.cockroachdb.com/cockroach-v20.1.7.linux-amd64.tgz | tar  xvz

成功提取二进制文件后,将二进制文件复制到PATH中,这样就可以轻松地从任何shell执行cockroach命令:

$sudo cp -i cockroach-v20.1.7.linux-amd64/cockroach /usr/local/bin/
$cockroach version
Build Tag:    v20.1.7
Build Time:   2017/10/12 16:04:22
Distribution: CCL
Platform:     linux amd64 (x86_64-unknown-linux-gnu)  
Go Version:   go1.13.9
C Compiler:   gcc 6.3.0
Build SHA-1:  406792b58d32dc053008cc129b409252798f509c
Build Type:   release

对其他两个剩余节点重复相同的操作。

步骤3:为安全连接生成证书

在我们选择的节点上,或者甚至在完全不同的服务器上,我们将生成将由我们的集群使用的证书。
创建两个目录" certs"和" my-safe-directory"。
证书将保留CA证书以及所有节点和客户端证书及密钥。
my-safe-directory将保留CA密钥,然后在生成节点和客户端证书时引用该密钥。
这将是安全和保密的;建议不要将其上传到节点。
创建两个目录,如下所示:

mkdir {certs,my-safe-directory}

接下来,创建CA证书和密钥:

cockroach cert create-ca \
--certs-dir=certs \
--ca-key=my-safe-directory/ca.key

为第一个节点创建证书和密钥,并颁发给我们可能用来引用该节点以及负载均衡器实例的所有通用名称。
输入节点1(在我的情况下为cockroach-db01)和负载均衡器的主机名和IP地址:

cockroach cert create-node \
172.28.182.170 \
cockroach-db01  \
localhost \
127.0.0.1 \
172.28.190.34 \
loadbalancer  \
--certs-dir=certs \
--ca-key=my-safe-directory/ca.key

证书准备好后,将CA证书,节点证书和密钥上载到第一个节点:

scp certs/ca.crt certs/node.crt certs/node.key <server-username>@cockroach-db01:~/certs
ca.crt                                                                                 100% 1111   873.8KB/s   00:00    
node.crt                                                                               100% 1208     1.4MB/s   00:00    
node.key                                                                               100% 1679     1.9MB/s   00:00

我们的密钥被复制到第一个节点,现在我们还剩下三台服务器。
我们将在此用于创建证书的服务器上发出相同的命令。
我个人使用cockroach-db03来执行这些命令,但要小心在正确的位置复制其自己的证书。
在重复命令之前,请删除节点证书和密钥的本地副本,这些副本现在属于cockroach-db01.

rm certs/node.crt certs/node.key

接下来,就像上面一样,为第二个节点(cockroach-db02)创建证书和密钥,颁发给我们可能用来引用该节点以及负载均衡器实例的所有主机名,然后将证书文件复制到cockroach中-db02节点。

cockroach cert create-node \
172.28.182.246 \
cockroach-db02  \
localhost \
127.0.0.1 \
172.28.190.34 \
loadbalancer  \
--certs-dir=certs \
--ca-key=my-safe-directory/ca.key

将CA证书和节点证书和密钥复制到第二个节点(cockroach-db02),然后删除节点证书和密钥的本地副本,该副本现在属于cockroach-db02.

scp certs/ca.crt certs/node.crt certs/node.key <server-username>@cockroach-db02:~/certs
rm certs/node.crt certs/node.key

接下来,为第三个节点(cockroach-db03)创建证书和密钥。

cockroach cert create-node \
172.28.187.217 \
cockroach-db03  \
localhost \
127.0.0.1 \
172.28.190.34 \
loadbalancer  \
--certs-dir=certs \
--ca-key=my-safe-directory/ca.key

由于我使用cockroach-db03作为证书的生成器,因此将生成的证书保留在certs目录中。
所有证书生成并复制到各自的节点后,登录到每个CockroachDB我们正在使用的服务器,然后将" certs"目录移动到我们在步骤1中创建的"/var/lib/cockroach"目录。
这是Cockroach将从中读取证书的位置。
将certs目录移动到cockroach目录,如下所示CockroachDB节点,即cockroach-db01,cockroach-db02和cockroach-db03.

sudo cp -rv certs /var/lib/cockroach/

完成将" certs"目录复制到"/var/lib/cockroach"后,将Cockroach目录的所有权更改为用户cockroach:

sudo chown -R cockroach.cockroach /var/lib/cockroach/

步骤4:配置CockroachDB Systemd服务

在已启用Systemd的服务器中管理服务的最令人惊奇的方法之一就是利用其干净的启动,停止和查看其状态的方式。
因此,我们将向Systemd添加一个CockroachDB,如下所示:

sudo vim /etc/systemd/system/cockroachdb.service
[Unit]
Description=Cockroach Database cluster node
Requires=network.target
[Service]
Type=notify
WorkingDirectory=/var/lib/cockroach
ExecStart=/usr/local/bin/cockroach start --certs-dir=certs --advertise-addr=cockroach-db03 --join=cockroach-db01,cockroach-db02,cockroach-db03 --cache=.25 --max-sql-memory=.25
TimeoutStopSec=60
Restart=always
RestartSec=10
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=cockroach
User=cockroach
[Install]
WantedBy=default.target

在每个节点上重复创建systemd文件,确保我们相应地更改" –advertise-addr"以适合每个节点的名称或者IP,然后启动cockroachdb服务。

sudo systemctl start cockroachdb

然后在每个节点上检查其状态。

sudo systemctl status cockroachdb
● cockroachdb.service - Cockroach Database cluster node
   Loaded: loaded (/etc/systemd/system/cockroachdb.service; disabled; vendor preset: disabled)
   Active: active (running) since Thu 2017-10-15 22:06:51 UTC; 31s ago
 Main PID: 1699 (cockroach)
    Tasks: 17 (limit: 11068)
   Memory: 57.9M
   CGroup: /system.slice/cockroachdb.service
           └─1699 /usr/local/bin/cockroach start --certs-dir=certs --advertise-addr=cockroach-db03

在继续下一步之前,请谨慎选择允许每个节点上的防火墙上的建议端口。
我们可以使用以下命令进行操作。

sudo firewall-cmd --permanent --add-port={8080,26257}/tcp
sudo firewall-cmd --reload

步骤5:在CentOS 8上初始化CockroachDB集群

其中一个节点上,运行cockroach init命令以完成节点启动过程,并使它们作为集群连接在一起:

cockroach init --certs-dir=certs --host=<address of any node>
##For Example
cockroach init --certs-dir=certs --host=cockroach-db03
Cluster successfully initialized

步骤6:生成HAProxy配置文件

最后,我们将生成负载平衡器的配置文件。
我们将使用HAProxy作为负载均衡器,并且CockroachDB具有内置的功能,该功能可自动生成带有证书的haproxy配置文件。
在我们用来生成证书的同一台计算机上运行以下命令,首先为CockroachDB数据库中的根用户创建客户端证书和密钥(client.root.crt,client.root.key)。

cockroach cert create-client root --certs-dir=certs --ca-key=my-safe-directory/ca.key

如果希望连接到每个节点上的默认数据库,则应将两个客户端文件(client.root.crt和client.root.key)复制到我们在步骤1中创建的主目录中的certs目录中。
这些文件,如果没有CockroachDB根角色的密码,我们将无法登录。
运行cockroach gen haproxy命令时,请将–host标志设置为任何节点的地址,并使用安全标志指向CA证书以及客户端证书和密钥:

cockroach gen haproxy --certs-dir=certs --host=cockroach-db03

上面的命令将创建" haproxy.cfg"文件,其中包含我们所需的所有最低限度配置详细信息,下面已进行了共享。
我们可以看到我们所有的节点都很好地显示在文件上。

global
  maxconn 4096
defaults
    mode                tcp
    # Timeout values should be configured for your specific use.
    # See: https://cbonte.github.io/haproxy-dconv/1.8/configuration.html#4-timeout%20connect
    timeout connect     10s
    timeout client      1m
    timeout server      1m
    # TCP keep-alive on client side. Server already enables them.
    option              clitcpka
listen psql
    bind :26257
    mode tcp
    balance roundrobin
    option httpchk GET /health?ready=1
    server cockroach1 cockroach-db03:26257 check port 8080
    server cockroach2 cockroach-db02:26257 check port 8080
    server cockroach3 cockroach-db01:26257 check port 8080

查看完文件并对文件感到满意后,将haproxy.cfg文件上传到负载平衡器服务器以用于运行HAProxy负载平衡器。

scp haproxy.cfg <username>@loadbalancer:~

步骤7:在CentOS 8上安装HAProxy(可选)

登录到负载均衡器服务器(CentOS 8),然后按照以下步骤进行安装。

在SELinux中启用许可模式

通过运行以下命令,暂时(暂时)永久地允许SELinux并在重新引导时永久允许:

sudo setenforce 0
sudo sed -i 's/enforcing/permissive/g' /etc/selinux/config

在CentOS 8上安装HAProxy

安装haproxy软件包,如下所示:

sudo dnf -y install haproxy

安装HAProxy后,将在" /etc/haproxy/haproxy.cfg"中找到默认配置文件。
只需备份此文件,然后将我们上传的文件复制到服务器即可。

cd /etc/haproxy/
sudo mv haproxy.cfg haproxy.cfg.backup
sudo cp ~/haproxy.cfg /etc/haproxy/

完成配置HAProxy后,启动并启用haproxy服务。

sudo systemctl enable --now haproxy

确认haproxy服务正在运行

$systemctl status haproxy
● haproxy.service - HAProxy Load Balancer
   Loaded: loaded (/usr/lib/systemd/system/haproxy.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2017-10-15 22:30:40 UTC; 9min ago
  Process: 2838 ExecStartPre=/usr/sbin/haproxy -f $CONFIG -c -q (code=exited, status=0/SUCCESS)
 Main PID: 2840 (haproxy)
    Tasks: 2 (limit: 11070)

客户端现在可以通过侦听端口26257的负载平衡器访问数据库实例。
这时,让我们通过访问其Admin UI仪表板来查看单个节点的详细信息。
将浏览器指向任何节点的https://[域名/IP]:8080。
我们应该看到以下共享的仪表板:

我们会注意到,系统要求我们输入用户名和密码。
要生成凭据,请登录到我们用于生成证书的节点,并在下面发出命令,该命令会将我们引导到defaultdb。
我们直接登录是因为我们具有在步骤6中生成的客户机密钥和root用户证书。

cockroach sql --certs-dir certs
## Welcome to the CockroachDB SQL shell.
# All statements must be terminated by a semicolon.
# To exit, type: \q.
## Server version: CockroachDB CCL v20.1.7 (x86_64-unknown-linux-gnu, built 2017/10/12 16:04:22, go1.13.9) (same version as client)
# Cluster ID: 2b9244a4-e3b6-48d7-ba44-f0a21e0f778c
No entry for terminal type "xterm-256color";
using dumb terminal settings.
## Enter \? for a brief introduction.
#Hyman@theitroad:26257/defaultdb>

在提示符下,继续发出以下查询。
我们可以在此处使用用户名和密码。

Hyman@theitroad:26257/defaultdb> CREATE USER geeksadmin WITH PASSWORD 'SafePassword';
CREATE ROLE
Hyman@theitroad:26257/defaultdb>GRANT admin TO geeksadmin;

注意:管理员角色是默认创建的,不能删除。
属于admin角色的用户对整个集群中的所有数据库对象拥有所有特权。
完成后,请返回Admin UI,刷新并执行刚创建的凭据。

我们应该被带入。

步骤8:使用CockroachDB

正确设置群集后,我们可以测试在一个节点上创建的数据是否也分发到其他节点。
在这种情况下,所有节点一旦创建便应有权访问同一组数据。
为了节省时间,我们可以利用CockroachDB的示例数据来理解这一点。
登录到ockroach-db03,该节点是我们用来生成证书以及用于根用户的客户端证书和密钥的节点,并生成示例数据,如下所示:

cockroach gen example-data startrek | cockroach sql --certs-dir certs

上面的命令创建了一个名为startrek的示例数据库,我们现在可以启动SQL客户端并查看集群中的数据库。
确保其余节点具有我们在步骤1中创建的certs目录,其中包含各自的证书以及我们在步骤6中创建的两个客户端文件(client.root.crt和client.root.key)。
登录到cockroach-db02,并确认certs文件夹的内容:

ls certs
ca.crt  client.root.crt  client.root.key  node.crt  node.key

看上去不错!继续登录到defaultdb并检查是否还可以从中访问示例示例数据库

##On cockroach-db02
$cockroach sql --certs-dir certs
Hyman@theitroad:26257/defaultdb> SHOW DATABASES;
  database_name
----------------
  defaultdb
  postgres
  startrek
  system
(4 rows)
Time: 5.638902ms

只是为了确保可以从第三个cockroach-db01节点访问同一数据库,让我们登录到该数据库并如上所述列出数据库。
确保已将(client.root.crt和client.root.key)复制到其certs目录中。

##On cockroach-db01
$cockroach sql --certs-dir certs
> SHOW DATABASES;
  database_name
----------------
  defaultdb
  postgres
  startrek
  system
(4 rows)
Time: 5.638902ms

我们应该能够查看上面列出的startrek数据库,其中包含我们的示例数据。
下面共享了相同的屏幕截图。

如果我们希望增加节点数,则只需执行与本示例中的第二个和第三个节点相同的步骤即可。
也就是说,安装CockroachDB Binaries,然后使用Systemd文件将它们加入第一个节点。
这样,集群便可以水平扩展。
访问CockroachDB的官方,以了解有关此独特数据库的更多信息。