PostgreSQL的三種安裝方式和主從流複製架構部署

PostgreSQL

一種超越MYSQL的開源關係型數據庫
告知:作者在初學PostgreSQL的過程中將學習思路和操作流程記錄下來,希望對初學者有一定幫助
環境告知:
1 操作系統:Centos7.7
在這裏插入圖片描述
2 必須的依賴工具庫
① make版本3.80或以上
在這裏插入圖片描述
②GCC編譯器
③GNU Readline庫:它允許psql記住你輸入的每個命令,這樣就可以通過上下方向鍵快速輸入之前的命令,默認開啓,也可以通過編譯參數–without-readline來禁止它,建議保留默認。
④Zlib庫

yum install -y readline \
readline-devel \
openssl \
openssl-devel \
zlib \
zlib-devel

3 環境變量

#默認安裝路徑/usr/local/pgsql/
export PG_HOME=/usr/local/pgsql/
export PATH="$PG_HOME/bin:$PATH"

##########################################################
1 安裝
作者提供三種安裝方式,並親測有效
1.1 yum安裝
流程:
①下載官方yum源
https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
#路徑可能根據官方的更新而失效,進入連接,選擇你想要的版本
https://yum.postgresql.org/repopackages.php#pg10
②yum安裝

    yum clean all \
 && yum repolist \
 && yum -y install postgresql10-server

③初始化
yum安裝默認路徑

/usr/pgsql-10/bin/postgresql-10-setup initdb

④啓動

   systemctl restart postgresql-10.service \
&& systemctl enable postgresql-10.service

⑤驗證

#使用postgres用戶進入
[root@db1 ~]# su postgres
#進入PostpreSQL數據庫
bash-4.2$ psql
#退出
postgres=# \q
#返回終端
bash-4.2$ exit
#已退出
[root@db1 ~]#

在這裏插入圖片描述
⑥安裝成功,到此,yum安裝PostgreSQL完成!!!
###########################################################
1.2 源碼安裝
流程:
①獲取官方源碼包
我準備裝11.7版本(12版本還不穩定),選擇其他版本進入下面的第一個地址後退選擇目的版本即可
安裝官方教學:
https://www.postgresql.org/docs/11/install-getsource.html
源碼包:
https://www.postgresql.org/ftp/source/
11.7:連接可能隨着官方的更新而失效
https://ftp.postgresql.org/pub/source/v11.7/postgresql-11.7.tar.gz
②源碼安裝
指定安裝路徑,便於管理:/usr/local/postgresql

--prefix=/usr/local/postgresql

依賴gcc等,自行安裝(根據報錯提示安裝)

mkdir -p /usr/local/postgresql
wget https://ftp.postgresql.org/pub/source/v11.7/postgresql-11.7.tar.gz \
-O /usr/local/postgresql/postgresql-11.7.tar.gz
cd /usr/local/postgresql/
tar -xvf postgresql-11.7.tar.gz
cd postgresql-11.7
#按照默認安裝
./configure  --prefix=/?
#如果出現報錯:configure: error: readline library not found
yum -y install readline readline-devel
#再運行
./configure  --prefix=/?
make && make install
#成功
#生成/usr/local/pgsql目錄,默認路徑/usr/local/pgsql

詳細的configure配置:
https://blog.csdn.net/pg_hgdb/article/details/81946121
③初始化數據庫

cd /usr/local/pgsql/
mkdir /usr/local/pgsql/data/
chown postgres: /usr/local/pgsql/data/
sudo su postgres
#-D定義數據的存放路徑
/usr/local/pgsql/bin/initdb  -D /usr/local/pgsql/data

④啓動與開機自啓
在解壓路徑下有一個
/usr/local/postgresql/postgresql-11.7/contrib/start-scripts/linux

cp -a /usr/local/postgresql/postgresql-11.7/contrib/start-scripts/linux \
/etc/init.d/postgresql
vi /etc/init.d/postgresql
#根據實際情況修改下列兩行內容
prefix=/usr/local/pgsql          #安裝路徑
PGDATA="/usr/local/pgsql/data"   #數據庫路徑
#centos6版本的啓動方式,centos7版本的啓動方式還未研究
service  postgresql start
service  postgresql status
#關閉
service  postgresql stpo
#啓動成功,能看見PID
#使用postgres用戶連接
sudo su postgres
/usr/local/pgsql/bin/psql
#進入
#安裝成功
#查看版本
postgres=# select version();
                             version                                                 
----------------------------------------------------------------
PostgreSQL 11.7 on x86_64-pc-linux-gnu, compiled 
by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit
(1 row)

#製作軟連接
rm -rf  /usr/bin/psql
ln -s  /usr/local/pgsql/bin/psql  /usr/bin/psql
sudo su postgres
psql
#成功進入

⑤!!!缺少源碼啓動方式,後面補充
補充:

#源碼啓動
#初始化數據庫時,提示了啓動方式,注意有一個logfile
#這裏在安裝目錄增加一個文件夾log,用來記錄日誌
mkdir -p /usr/local/pgsql/logs/server.log
#啓動,並指定數據庫與日誌
pg_ctl -D /usr/local/pgsql/data/ \
-l /usr/local/pgsql/logs/server.log \
(start/stop)

⑥安裝成功,到此,源碼安裝PostgreSQL完成!!!
postgresql詳細配置,端口,開放網段
https://blog.csdn.net/Linjingke32/article/details/80393576

###########################################################
1.3 二進制安裝
①下載二進制包
pgsql有很多類型的包,對於不同linux發行版都有對應的編譯好的包,安裝很方便,另外如果對於通用的linux平臺可以編譯源碼安裝或者安裝官方編譯好的二進制包,源碼包的安裝僅僅比二進制安裝多出一個編譯步驟,其餘的都一樣,所以這裏使用安裝方式是安裝編譯好的二進制包
pgsql官網地址:https://www.postgresql.org/,進入後點擊download就來到下載頁,這裏點擊Linux下面的Other Linux選項,然後點擊下方的tar.gz archive下載二進制歸檔
  在這裏插入圖片描述
然後就來到最終的pgsql下載頁了,地址爲:https://www.enterprisedb.com/download-postgresql-binaries,如下圖下載最新版本的10.1https://sbp.enterprisedb.com/getfile.jsp?fileid=12574&_ga=2.120855624.1731532218.1589505053-724926244.1589505053
在這裏插入圖片描述

如上圖根據機器的位數下載對應的包,我這裏下載的是x86-64的包,爲:postgresql-10.1-1-linux-x64-binaries.tar.gz,下載之後準備安裝
②安裝二進制包
將下載好的二進制包上傳到你的目標路徑,我放到/root/postgresql###驗證結果表面,不能放在root下,後來我轉移到/pgsql

useradd postgres
mkdir /pgsql
cd /pgsql
tar -xvf postgresql-10.12-1-linux-x64-binaries.tar.gz
#得到pgsql文件夾
cd pgsql
#創建數據庫文件和日誌文件data logs
mkdir data logs
chown postgres:  /root/postgresql/pgsql -R
#初始化數據庫data
sudo su postgres
./bin/initdb  -D data
#初始化成功,提示啓動命令
#啓動,定義啓動日誌名稱server.log
./bin/pg_ctl  -D data -l logs/server.log  start
#查看幫助
./bin/pg_ctl  --help
#啓動成功
#連接postgresql
./bin/psql
#建議設置軟連接或者別名
#軟連接設置了很多次都沒有成功,幾個bin sbin都試了
alias psql='/pgsql/pgsql/bin/psql'
echo 'alias psql="/pgsql/pgsql/bin/psql"' >> /etc/bashrc

*③安裝成功,到此,二進制安裝PostgreSQL完成!!!
安裝部分結束。
###########################################################

2 PostgreSQL基本操作
2.1 添加用戶和新數據庫
初次安裝後,默認生成一個名爲postgres的數據庫和一個名爲postgres的數據庫用戶。這裏需要注意的是,同時還生成了一個名爲postgres的Linux系統用戶。
下面,我們使用postgres用戶,來生成其他用戶和新數據庫。好幾種方法可以達到這個目的,這裏介紹兩種。

2.1.1 使用PostgreSQL控制檯

#首先,新建一個Linux新用戶,可以取你想要的名字,這裏爲dbuser。

sudo adduser dbuser

#然後,切換到postgres用戶。

sudo su - postgres

#下一步,使用psql命令登錄PostgreSQL控制檯。

psql

#這時相當於系統用戶postgres以同名數據庫用戶的身份,登錄數據庫,這是不用輸入密碼的。
#如果一切正常,系統提示符會變爲"postgres=#",表示這時已經進入了數據庫控制檯。以下的命令都在控制檯內完成。

#第一件事是使用\password命令,爲postgres用戶設置一個密碼。

\password postgres

#第二件事是創建數據庫用戶dbuser(剛纔創建的是Linux系統用戶),並設置密碼。

CREATE USER dbuser WITH PASSWORD 'password';

#第三件事是創建用戶數據庫,這裏爲exampledb,並指定所有者爲dbuser。

CREATE DATABASE exampledb OWNER dbuser;

#第四件事是將exampledb數據庫的所有權限都賦予dbuser,否則dbuser只能登錄控制檯,沒有任何數據庫操作權限。

GRANT ALL PRIVILEGES ON DATABASE exampledb to dbuser;

#最後,使用\q命令退出控制檯(也可以直接按ctrl+D)。

\q

2.1.2 使用shell命令行

#添加新用戶和新數據庫,除了在PostgreSQL控制檯內,還可以在shell命令行下完成。
#這是因爲PostgreSQL提供了命令行程序createuser和createdb。還是以新建用戶dbuser和數據庫exampledb爲例。

#源碼和二進制安裝方式則需要指定./bin/createuser ./bin/createdb 命令
#也可以製作軟連接和設置別名Alias實現

#首先,創建數據庫用戶dbuser,並指定其爲超級用戶。

sudo -u postgres createuser --superuser dbuser

sudo -u postgres createuser -s dbuser -P #交互式設置新用戶密碼

#接着,在shell命令行下,創建數據庫exampledb,並指定所有者爲dbuser。

sudo -u postgres createdb -O dbuser exampledb

##########################################################
2.2 登錄數據庫

#修改配置文件,開放所有IP
vi postgresql.conf
vi pg_hba.conf 
#添加新用戶和新數據庫以後,就要以新用戶的名義登錄數據庫,這時使用的是psql命令。

psql -U dbuser -d exampledb -h 127.0.0.1 -p 5432 -W

#上面命令的參數含義如下:
#-U指定用戶,-d指定數據庫,-h指定服務器,-p指定端口,-W指定密碼。

#輸入上面命令以後,系統會提示輸入dbuser用戶的密碼。
#輸入正確,就可以登錄控制檯了。

#psql命令存在簡寫形式。
#如果當前Linux系統用戶,同時也是PostgreSQL用戶,則可以省略用戶名(-U參數的部分)。
#舉例來說,我的Linux系統用戶名爲ruanyf,且PostgreSQL數據庫存在同名用戶
#則我以ruanyf身份登錄Linux系統後,可以直接使用下面的命令登錄數據庫,且不需要密碼。

psql exampledb

#此時,如果PostgreSQL內部還存在與當前系統用戶同名的數據庫,則連數據庫名都可以省略。
#比如,假定存在一個叫做ruanyf的數據庫,則直接鍵入psql就可以登錄該數據庫。

psql

#另外,如果要恢復外部數據,可以使用下面的命令。

psql exampledb < exampledb.sql

###########################################################
2.3 控制檯命令集

#除了前面已經用到的\password命令(設置密碼)和\q命令(退出)以外,控制檯還提供一系列其他命令。

\h:查看SQL命令的解釋,比如\h select。 
\?:查看psql命令列表。 
\l:列出所有數據庫。 
\c [database_name]:連接其他數據庫。 
\d:列出當前數據庫的所有表格。 
\d [table_name]:列出某一張表格的結構。 
\du:列出所有用戶。 
\e:打開文本編輯器。 
\conninfo:列出當前數據庫和連接的信息。

##########################################################
2.4 數據庫SQL

#基本的數據庫操作,就是使用一般的SQL語言。

# 創建新表 

CREATE TABLE user_tbl(name VARCHAR(20), signup_date DATE); 

# 插入數據 

INSERT INTO user_tbl(name, signup_date) VALUES('張三', '2013-12-22'); 

 # 選擇記錄 

SELECT * FROM user_tbl; 

# 更新數據 

UPDATE user_tbl set name = '李四' WHERE name = '張三'; 

# 刪除記錄 

DELETE FROM user_tbl WHERE name = '李四' ; 

# 添加欄位 

ALTER TABLE user_tbl ADD email VARCHAR(40); 

# 更新結構 

ALTER TABLE user_tbl ALTER COLUMN signup_date SET NOT NULL; 

# 更名欄位 

ALTER TABLE user_tbl RENAME COLUMN signup_date TO signup; 

# 刪除欄位 

ALTER TABLE user_tbl DROP COLUMN email; 

# 表格更名 

ALTER TABLE user_tbl RENAME TO backup_tbl; 

# 刪除表格 

DROP TABLE IF EXISTS backup_tbl;

到此,PostgreSQL的安裝和基本操作部分已完成,下面對架構進行優化。
##########################################################

3 PostgreSQL主從結構
數據庫版本必須一致
https://www.jianshu.com/p/2d07339774c0
主服務器:

#先創建一個新目錄用來存放歸檔文件
mkdir /opt/pgsql/pg_archive
#創建一個數據庫用戶進行主從同步。創建用戶replica,並賦予登錄和複製的權限
postgres# CREATE ROLE replica login replication encrypted password 'replica'
#修改pg_hba.conf,允許replica用戶來同步
#允許94連接到主服務器
host all          all       192.168.200.90/32     trust  
#允許94使用replica用戶來複制 
host replication  replica   192.168.200.90/32      md5   
#這樣,就設置了replica這個用戶可以從主服務器進行流複製請求
#注:
#第二個字段必須要填replication
#修改postgresql.conf
listen_addresses = '*'   # 監聽所有IP
archive_mode = on  # 允許歸檔
archive_command = 'cp %p /opt/pgsql/pg_archive/%f'  # 用該命令來歸檔logfile segment
wal_level = hot_standby 
max_wal_senders = 32 #這個設置了可以最多有幾個流複製連接,差不多有幾個從,就設置幾個wal_keep_segments = 256 # 設置流複製保留的最多的xlog數目
wal_sender_timeout = 60s #設置流複製主機發送數據的超時時間
max_connections = 100 #這個設置要注意下,從庫的max_connections必須要大於主庫的
#配置完兩個文件後重啓服務器
#測試從服務器能否連接主服務器數據庫
#在從服務器上運行如下命令:
psql -h 192.168.200.113 -U postgres
#看看是否能進入數據庫。若可以,則正常

從服務器:

#從主節點拷貝數據到從節點
su - postgres
rm -rf /opt/pgsql/data/*   #先將data目錄下的數據都清空
pg_basebackup -h 192.168.200.113 -U replica -D /opt/pgsql/data -X stream -P  # 從93拷貝數據到94(基礎備份)
#./bin/pg_basebackup -h 192.168.200.91 -U replication -D data/  -F p  -P  -W
mkdir /opt/pgsql/pg_archive
#配置recovery.conf
#複製/usr/pgsql-9.4/share/recovery.conf.sample 到 /opt/pgsql/data/recovery.conf
#recovery.conf
standby_mode = on    # 說明該節點是從服務器
primary_conninfo = 'host=192.168.20.93 port=5432 user=replica password=replica'  # 主服務器的信息以及連接的用戶
recovery_target_timeline = 'latest'
#配置postgresql.conf
wal_level = hot_standby
max_connections = 1000 # 一般查多於寫的應用從庫的最大連接數要比較大
hot_standby = on # 說明這臺機器不僅僅是用於數據歸檔,也用於數據查詢
max_standby_streaming_delay = 30s # 數據流備份的最大延遲時間
wal_receiver_status_interval = 10s # 多久向主報告一次從的狀態,當然從每次數據複製都會向主報告狀態,這裏只是設置最長的間隔時間
hot_standby_feedback = on # 如果有錯誤的數據複製,是否向主進行反饋

#配置完後重啓從服務器

驗證部署:

#在主節點上執行:
select client_addr,sync_state from pg_stat_replication;
#結果如下:
postgres=# select client_addr,sync_state from pg_stat_replication;
  client_addr 	 | sync_state
-----------------+------------
 192.168.200.90  | async
(1 行記錄)
#說明90是從服務器,在接收流,而且是異步流複製。
#進程查看
ps aux | grep postgres 

親測有效:
主服務器
在這裏插入圖片描述
從服務器
在這裏插入圖片描述
注意:這裏有坑,官方二進制包的動態庫不夠,會失敗
建議使用yum安裝,源碼安裝未測試

拓展:

#備註:歸檔標識文件archive_active 需要手工創建。
archive_command = '/bin/date'  # (change requires restart)
#archive_command='cp %p /archive/pg93/%f'

archive_command = 'test ! -f /pgsql/pgsql/archive/10/archive_active  ||  cp %p /pgsql/pgsql/archive/10/%f'

archive_command = 'if [ -f "/archive/pg93/archive_active" ]; then cp %p /archive/pg93/%f; fi'

archive_command =  'DIR=/pgarch/arch/`date +%F`; sudo test ! -d $DIR && sudo mkdir $DIR; sudo test ! -f $DIR/%f && sudo cp %p $DIR/%f'
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章