在AWS上安装Clickhouse和连接Postgresql

服务器安装过程

准备:

在AWS上选择一个服务器实例类型进行启动。我这里选择的是 x86的一台服务器.
blog-01

服务器安装过程:

官方提供的安装方法

https://clickhouse.com/#quick-start

直接选择 x86的安装方式,即可顺利安装。记得安装完成后,删掉本地临时文件。

blog-02

服务器启动

  1. 直接启动:

    1
    sudo clickhouse start

    启动的时候将会默认创建clickhouse的文件。所以第一次运行最好在创建好的clickhouse目录下进行运行。

  2. 通过service来启动,在production环境下可以使用该中方式:

    1
    service clickhouse-server start

    虽然Clickhouse在安装的时候就已经设置好了 clickhouse的service 文件。但是其中的某些配置可能并不是我们所要的。比如说用户它默认填写的就是clickhouse。而我们当前的用户大概率就不是clickhouse。所以就需要进行修改。

    1
    vi /etc/systemd/system/clickhouse-server.service

    修改之后,再通过命令进行运行。

    1
    service clickhouse-server start

    如果我们修改过用户,那在启动过程中,还会需要权限问题。因为某些文件默认创建的就是clickhouse用户的文件。所以我们通过命令启动的过程中,需要通过该命令查看对应的service为什么没有启动成功。

    1
    journalctl -u service-name.service

    然后根据日志来修改对应文件的权限问题。

    1
    chown -R root:root /etc/clickhouse-server

    服务器启动后可以查看对应的日志:

    1
    tail -f /var/log/clickhouse-server/clickhouse-server.log

服务器的配置

服务器的启动默认会加载这个文件

1
/etc/clickhouse-server/config.xml

用户的配置在这里

1
/etc/clickhouse-server/users.xml

我们需要对用户的配置做一下修改,

  1. 因为我们需要链接postgresql数据库,所以就需要打开允许使用postgresql engine的一个参数

    1
    allow_experimental_database_materialized_postgresql

    blog-03

  2. clickhouse的客户端连接,在不指定用户的情况下,我们使用的是default用户。default用户在默认的情况下拥有所有的权限,而我们也不想给客户端这么大的权限,所以我们可以默认创建一个只读的用户。放在default 账号的下面即可。

    blog-04

    配置好后重新启动服务

    1
    service clickhouse-server restart

    然后就可以客户端进行正常连接了。使用刚刚创建好的用户进行连接

    1
    clickhouse-client --user click_read --host ec2-71-131-204-150.cn-north-1.compute.amazonaws.com.cn --password

对PG数据库进行连接

创建数据库

在Aws选择postgresql数据库。这里请选择 Postgresql版本大于等于12的版本。我尝试连接过12以下的版本,能在初次连接的时候获取到数据,但是之后的数据就无法同步,很奇怪。

对数据库进行配置

  1. 在postgresql配置文件中将wal_level设置为logical,但是在aws的Postgresql的数据库中,是没有这个配置的,查阅文档后发现将 rds.logical_replication 设置为1即可。
  2. max_replication_slots的数量至少大于等于2。aws的Pg默认就是10。所以无需修改。

进行数据库连接

使用客户端连接上你的Clickhouse的服务器。

1
clickhouse-client --host clickhouse_host_url --password

因为我这里没有指定用户,所以它通过默认的default用户来进行连接。这样我也有最高权限来进行Clickhouse这边的数据库的创建。

1
2
3
CREATE DATABASE mp_stage ENGINE = MaterializedPostgreSQL('yourdatabaseurl:5432', 'database_name', 'username', 'password') SETTINGS materialized_postgresql_max_block_size = 65536,
materialized_postgresql_allow_automatic_update=1,
materialized_postgresql_tables_list = 'users, videos';

可以看到连接的时候有指定参数,这里创建数据库更多的配置信息在这里:https://clickhouse.com/docs/en/engines/database-engines/materialized-postgresql/

这里如果不指定表的名字,默认是获取数据库里所有的表并进行同步。建议还是指定一下表名字。如果之后需要添加表,可以直接通过命令添加表

一些常用的命令

删除错误数据库

1
drop database database_name;

添加需要连接的表

1
ATTACH TABLE postgres_database.new_table;

删除已经连接的表

1
DETACH TABLE postgres_database.table_to_remove;

注意事项

  1. clickhouse连接上我们的数据库之后,只能对Postgresql数据库做查询操作,它是没有修改的操作的,相当与它只连接了只读数据库。
  2. 如果被连接的PG数据库一直没有数据更新,会导致一直没有同步操作,而wal日志时候在进行同步之后才会进行清理,从而导致 wal replication一直在增大。最后填满所有的空间导致数据库无法访问,所以需要对不常更新的数据库添加监控,如果遇到这种情况。可以手动进行数据的修改,然后它自动就会进行同步和清理。

另一个极端的方式就是查询出对应的 wal replication slot,然后对过大的wal replication slot进行清理,不过这样会打断同步。

查询 wal replication slot

1
select slot_name, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(),restart_lsn)) as replicationSlotLag, active from pg_replication_slots

删除

1
select pg_drop_replication_slot('slot_name');
  • Copyrights © 2022 John Doe
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信