在介绍数据库的读写分离集群软件之前,一起先简单回顾一下数据库安装与重要参数配置等等。
一、Halo数据库的安装
1. 安装依赖的软件包。
2. 创建用户和组。
3. 创建安装目录。
4. 解压软件包至安装目录,以 halo 用户。
5. 拷贝 license 文件到安装目录。
6. 配置环境变量,以 halo 用户。
7. 创建数据库进程目录,以 root 用户。
8. 调整内存与信号量参数,以 root 用户。
9. 调整资源限制参数。
10. 创建数据库并初始化。
11. 修改 halo 参数。
二、Halo数据库的目录结构


三、Halo数据库体系结构
postmaster:所有数据库进程的主进程(负责监听和 fork 子进程)。
syslogger:记录系统日志。
pgstat:收集统计信息。
pgarch:如果开启了归档,那么 postmaster 会 fork 一个归档进程。
checkpointer:负责检查点的进程。
bgwriter:负责把 shared buffer 中的脏数据写入磁盘的进程。
autovacuum launcher:负责回收垃圾数据的进程,如果开启了 autovacuum 的话,那么 postmaster 会 fork 这个进程。
autovacuum worker:负责回收垃圾数据的 worker 进程,是 launcher 进程 fork 出来的。

四、Halo数据库参数配置
1. internal:只读参数,数据库创建后无法修改。
2. postmaster:需要 Halo 重启才能修改。
3. sighup:可以在 postgresql.conf 中修改,不需要重启,需要向 postmaster 进程发送 SIGHUP 信号,然后由 postmaster 向子进程广播,所有子进程都会生效。可通过 pg_ctl reload 或 select pg_reload_conf(); 触发。
4. backend:可在 postgresql.conf 中修改,无需重启,但仅对新建连接生效,已有连接不受影响。
5. superuser:超级用户可通过 SET 命令动态修改当前会话参数;SIGHUP 仅影响新建连接。
6. user:普通用户可通过 SET 修改本连接的参数。
五、Halo数据库的重要管理命令
数据库的启停:pg_ctl start/stop/restart/reload。
数据库的初始化:pg_ctl init。
psql 的参数:-d 数据库名;-U 用户名;-h 主机名;-p 端口号;例如 psql -d lis -U db2inst1。
psql 查看数据库对象:
• \? 帮助 • \dt 查看表 • \d[S+] 表名 查看表的具体信息 • \db 查看表空间 • \dn 查看 schema • \dv 查看视图 • \du 查看用户 • \dg 查看角色 • \di 查看索引 • \dc 查看转换 • \dE 查看外部表 • \des 查看外部服务器 • \deu 查看用户映射 • \df 查看函数 • \sf 函数名 查看函数的内容 • \l[+] 查看数据库 • \do 查看操作符 • \ds 查看序列 • \dx 查看扩展 • \sv 视图名 查看视图的内容
使用 psql 执行 SQL 文件:
• 进入 psql 交互模式,\i input.sql • psql -d lis -U db2inst1 -f input.sql >output.txt 2>&1
六、数据库常用的管理函数
-- 1. 重载配置文件(等同于 pg_ctl reload)
SELECT pg_reload_conf();
-- 2. 旋转日志文件(重要)
SELECT pg_rotate_logfile();
-- 3. 终止指定后端进程
SELECT pg_terminate_backend(pid);
-- 4. 切换 WAL 日志
SELECT pg_switch_wal();
-- 5. 获取任意值的存储大小
SELECT pg_column_size(any);
-- 6. 获取数据库大小
SELECT pg_database_size('name');
-- 7. 获取索引大小
SELECT pg_indexes_size('table_name');
-- 8. 获取表大小(不含索引,含 TOAST、VM、FSM)
SELECT pg_table_size('table_name');
-- 9. 获取数据库启动时间
SELECT pg_postmaster_start_time();以上进行简单回顾,下面一起进入正式主题!
七、读写分离DLB实例介绍
读写分离的原理:Halo 读写分离原理是在主服务器上写,在从服务器上读。主服务器负责一切写操作的负载,而读的操作分摊在所有主从服务器上,通过读写分离来提升数据库的并发和负载能力。一般设置一台数据库服务器作为主服务器,主要承担数据的增、删和改的任务,配置 N 台数据库服务器为从服务器,主要承担数据的查询任务。从服务器实时复制主服务器中同步数据,以此实现数据的一致性。
读写分离实现方式:应用程序通过在连接 Halo 应用中配置主库与从库等地址,DLB 会自动将读请求发送给从库,将写请求发送给主库。此外,Halo 的 DLB 驱动还能够实现多个从库的负载均衡。

环境准备及安装:
1. 网络规划
主库:192.168.137.31 备库:192.168.137.32 备库:192.168.137.33 DLB 主机:192.168.137.34
2. 配置/安装 DLB
1)修改主备机器上 postgresql.conf 的密码校验方式
vi $PGDATA/postgresql.base.conf
password_encryption = md5# 加载参数
pg_ctl reload2)在主库 halo131 上创建用户 halo_dlb
CREATE ROLE halo_dlb SUPERUSER LOGIN PASSWORD 'halo_dlb';3)修改数据库集群机器上的配置文件 pg_hba.conf
vi $PGDATA/pg_hba.conf
# 添加
host all all 0.0.0.0/0 md54)配置 pgpool.conf
cp pgpool.conf.sample pgpool.conf
listen_addresses = '*'
port = 1922
backend_hostname0 = 'halo131'
backend_port0 = 1921
backend_weight0 = 1
backend_data_directory0 = '/data'
backend_flag0 = 'DISALLOW_TO_FAILOVER'
backend_application_name0 = 'server0'
backend_hostname1 = 'halo132'
backend_port1 = 1921
backend_weight1 = 1
backend_data_directory1 = '/data'
backend_flag1 = 'DISALLOW_TO_FAILOVER'
backend_application_name1 = 'server1'
backend_hostname2 = 'halo133'
backend_port2 = 1921
backend_weight2 = 1
backend_data_directory2 = '/data'
backend_flag2 = 'DISALLOW_TO_FAILOVER'
backend_application_name2 = 'server2'
pid_file_name = '/var/run/halo/halo.pid'
sr_check_user = 'halo_dlb'
sr_check_password = 'halo_dlb'
sr_check_database = 'haloroot'5)添加用户环境 /home/halo/.bash_profile
echo 'export PATH=/u01/app/halo/product/dlb/4.3/bin:$PATH' >> /home/halo/.bash_profile
source /home/halo/.bash_profile6)生成密钥 pass
/u01/app/halo/product/dlb/4.3/bin/pg_md5 -m -u halo_dlb halo_dlb
cat /u01/app/halo/product/dlb/4.3/etc/pool_passwd7)添加生成密钥到 pcp.conf
cp pcp.conf.sample pcp.conf
vi pcp.conf
# USERID:MD5PASSWD
halo_dlb:md546172933bfb1d5d2207389730f8d5ec08)配置 DLB 访问地址
cp pool_hba.conf.sample pool_hba.conf
vi pool_hba.conf
# 添加
host all all 0.0.0.0/0 md59)启动 DLB
# 创建软链接
ln -s pgpool dlb
# 后台启动
nohup dlb -n -d > /u01/app/halo/product/dlb/4.3/logs/dlb.log 2>&1 &
# 建议:创建启动脚本10)校验读写分离
psql -h 192.168.137.34 -p 1922 -U halo_dlb
# 输入密码后执行
SHOW pool_nodes;校验成功就可以使用读写分离功能啦!