zhumengke

 

安装

sudo apt-get install postgresql

设置 postgres 的密码

安装 PostgreSQL 后,会自动创建 Ubuntu 的 postgres 用户和 PostgreSQL 的 postgres 用户。现在,我们要设置 postgres 这个用户的密码和 PostgreSQl 内 postgres 用户的密码。请保持这两个密码的一致性,避免未知异常。

ubuntu@ubuntu:~$ sudo passwd -d postgres  # 清除原有 postgres 用户密码
passwd: password expiry information changed.  # 密码清除成功
ubuntu@ubuntu:~$ sudo -u postgres passwd
Enter new UNIX password:   # 输入新密码
Retype new UNIX password:   # 确认新密码
passwd: password updated successfully  # 密码设置成功
ubuntu@ubuntu:~$ sudo -u postgres psql
psql (10.7 (Ubuntu 10.7-1.pgdg18.04+1))
Type "help" for help.

postgres=# ALTER USER postgres WITH PASSWORD \'yourpassword\';  # 输入你的新密码,要和前面的密码一致
ALTER ROLE
postgres=# \q  # 退出
~$

启动服务器

/usr/lib/postgresql/10/bin/pg_ctl -D /var/lib/postgresql/10/main -l logfile start
Ver   Cluster   Port   Status   Owner   Data directory           Log file
10     main    5432    down   postgres  /var/lib/postgresql/10/main   /var/log/postgresql/postgresql-10-main.log

重启服务

/etc/init.d/postgresql restart
或者
service postgresql restart

卸载

sudo apt-get purge \'postgresql-*\'
sudo apt-get 

远程访问配置

配置文件目录

/etc/postgresql/{version}/main

修改postgresql.conf文件

#listen_addresses=\'localhost’修改为listen_addresses = \'*\' 

修改pg_hba.conf文件

# TYPE  DATABASE        USER            ADDRESS                 METHOD 

# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
host    all             all             0.0.0.0/0                  md5        

其中0.0.0.0/0表示运行任意ip地址访问。

若设置为 192.168.1.0/24 则表示允许来自ip为192.168.1.0 ~ 192.168.1.255之间的访问。

设置好后重启服务即可被远程连接。

PostgreSQL 中 sequence 的用法

作者:calvinxiao     来源:简书
链接:https://www.jianshu.com/p/f494b4f96908

介绍

sequence 是 pg 自带的高效的自增id工具(也叫序列)。sequence 使用了轻量级锁的方式来做到高效自增id的,所以会比 UPDATE 行锁快。sequence 的返回数据类型默认是64位的整数,pg 10 可以自定 smallint, integer 或者是 bigint。

用法

使用 sequence

# 创建
CREATE SEQUENCE temp_seq;

# 获取下一个sequence
select nextval(\'temp_seq\'); # 1

# 设置 sequence 的开始值
select setval(\'temp_seq\', 42);

# 获取下一个sequence
select nextval(\'temp_seq\'); # 43

# 创建一个自动循环的 sequence
CREATE SEQUENCE temp_seq2 MINVALUE 18 MAXVALUE 20 CYCLE;

select nextval(\'temp_seq2\'); # 18
select nextval(\'temp_seq2\'); # 19
select nextval(\'temp_seq2\'); # 20
select nextval(\'temp_seq2\'); # 18

# 创建表的时候把类型设置为 serial 会自动创建一个 sequence

CREATE TABLE temp_seq_table (id serial);

postgres=# \d temp_seq_table
                         Table "public.temp_seq_table"
 Column |  Type   |                          Modifiers
--------+---------+-------------------------------------------------------------
 id     | integer | not null default nextval(\'temp_seq_table_id_seq\'::regclass)
 
# 自动创建了 sequence temp_seq_table_id_seq 

CACHE 参数

sequence 是可以保证自增数据不重复的,也就是说每次自增后都会持久化保存,那么为了继续提高性能,可以加上 CACHE 参数(默认为1),每个进程(连接)可以缓存一个子序列在当前进程内存里面,当子序列用完了才会去原序列取新的子序列。

这个用个例子简单说一下,创建 sequence temp_seq3 时用了 CACHE 10,A session 可以获取到的值是 1...10,B session 可以获取到的值是 11...20,那么获取顺序可能是 (A, A, B, A),返回值是 (1, 2, 11, 3),这个不是严格自增的序列,但可以保证回次返回都是唯一的,用了 CYCLE 参数的除外。

根据文档和源码( link 第80行),缓存在内存里面的最大值(cached)是每个进程都不一样的,所以如果要求严格自增的服务不能用 CACHE。

CREATE SEQUENCE temp_seq3 CACHE 10;
select nextval(\'temp_seq3\'); # 1
select nextval(\'temp_seq3\'); # 2
# \q 退出 psql 重新链接
select nextval(\'temp_seq3\'); # 11

pgbench 压测

这里写三种用 pg 做自增id的方式

  1. 直接用 UPDATE SET RETURNING
  2. 用默认值的 SEQUENCE
  3. 用 CACHE=10 的SEQUENCE

测试命令,在 MacOS 上用 docker 开一个 pg 在里面运行一下 pgbench 脚本,其中 sql.sql 的内容替换成对应的压测脚本。

pgbench -c 10 -T 10 -f sql.sql -U postgres postgres
# 准备数据库表
CREATE TABLE temp_incr_table (id integer primary key, val integer);
INSERT INTO temp_incr_table VALUES(1, 1);

# 上面例子创建的 temp_seq 和 temp_seq3 都会用于压测

UPDATE; 

BEGIN;
    UPDATE temp_incr_table SET val = val + 1 WHERE id = 1 RETURNING val;
END;

TPS: 986

CACHE 默认为1 的sequence

BEGIN;
    SELECT nextval(\'temp_seq\');
END;

TPS: 7332

CACHE 默认为10 的sequence

BEGIN;
    SELECT nextval(\'temp_seq3\');
END;

TPS: 7451

压测总结

  1. sequence 比 update 快 8 倍左右,在并发量大的时候更明显,而且从 pg 运行原理来说也是可以证明的,mvvc 里面的 update 都会写一份新的数据,有额外的写和额外的vacuum工作,而且行锁还需要把锁的上下文记录到stat表。
  2. CACHE 优化不明显,理论上是可以减少更新 buffer 的次数,后续可以在生产环境的机器上验证一下。

ref

看看微信的分布式id生成器,原理都差不多,"实际应用中每次提升的步长为10000" = "CACHE 10000"。link

以上优化已经是用在友好速搭电商系统的订单号和优惠券号生成服务中,为商家提供更快更可靠的服务。

可视化客户端pgadmin4安装

docker pull dpage/pgadmin4
docker run -p 5050:80 \
    -e "PGADMIN_DEFAULT_EMAIL=user@domain.com" \
    -e "PGADMIN_DEFAULT_PASSWORD=SuperSecret" \
    -d dpage/pgadmin4

安装psycopg2

报错You need to install postgresql-server-dev-X.Y for building a server-side extension or libpq-dev for building a client-side application?

sudo apt-get install libpq-dev python-dev
pip install psycopg2

 

 

分类:

技术点:

相关文章:

  • 2021-11-30
  • 2021-08-13
  • 2021-07-10
  • 2021-06-18
  • 2022-02-28
猜你喜欢
  • 2021-11-30
  • 2021-12-02
  • 2022-01-13
  • 2021-12-12
相关资源
相似解决方案