PostgreSQL standby in 64bit to 32bit or reverse enviroment

64和32位系统上安装的PostgreSQL能不能做流复制搭建standby.

今天问同事借了一台32位的机器测试一下.

测试环境 : 

CentOS 5.x 32bit 和64bit 各一台.

PostgreSQL 9.1.4源码

32bit 作为primary

64bit 作为standby

结果是可行的, 只是需要在64bit上使用32bit的pgsql程序.

而反过来则不行(64bit primary , 32bit standby).

说白了, 程序要兼容. 在这种环境中建standby, 程序必须都是32bit的. 因为OS 64bit可以跑32bit的程序, 而OS 32bit 不能跑64bit的程序.

1. 配置OS

yum install -y lrzsz
yum install -y sysstat
yum install -y e4fsprogs
yum install -y ntp
yum install -y readline-devel
yum install -y zlib
yum install -y zlib-devel
yum install -y openssl
yum install -y openssl-devel
yum install -y pam-devel
yum install -y libxml2-devel
yum install -y libxslt-devel

/usr/sbin/ntpdate asia.pool.ntp.org && /sbin/hwclock --systohc

-- 临时关闭防火墙, 生产中则配置一下, 开放互访监听端口
service iptables stop

vi /etc/sysctl.conf
kernel.shmmni = 4096
kernel.sem = 50100 64128000 50100 1280
fs.file-max = 7672460
net.ipv4.ip_local_port_range = 9000 65000
net.core.rmem_default = 1048576
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_max_syn_backlog = 4096
net.core.netdev_max_backlog = 10000
vm.overcommit_memory = 0
net.ipv4.ip_conntrack_max = 655360
fs.aio-max-nr = 1048576
net.ipv4.tcp_timestamps = 0

sysctl -p

vi /etc/security/limits.conf
* soft    nofile  131072
* hard    nofile  131072
* soft    nproc   131072
* hard    nproc   131072
* soft    core    unlimited
* hard    core    unlimited
* soft    memlock 50000000
* hard    memlock 50000000

vi /etc/sysconfig/selinux
SELINUX=disabled

cd /data03/soft_bak
tar -jxvf flex-2.5.35.tar.bz2
cd flex-2.5.35
./configure && make && make install

32位机器上

useradd platform32
vi /home/platform32/.bash_profile
export PGPORT=1616
export PGDATA=/home/platform32/pg_root
export LANG=en_US.utf8
export PGHOME=/home/platform32/pgsql
export LD_LIBRARY_PATH=$PGHOME/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib
export DATE=`date +"%Y%m%d%H%M"`
export PATH=$PGHOME/bin:$PATH:.
export MANPATH=$PGHOME/share/man:$MANPATH
alias rm='rm -i'
alias ll='ls -lh'

64位机器上

useradd platform64
vi /home/platform64/.bash_profile
export PGPORT=1616
export PGDATA=/home/platform64/pg_root
export LANG=en_US.utf8
export PGHOME=/home/platform64/pgsql
export LD_LIBRARY_PATH=$PGHOME/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib
export DATE=`date +"%Y%m%d%H%M"`
export PATH=$PGHOME/bin:$PATH:.
export MANPATH=$PGHOME/share/man:$MANPATH
alias rm='rm -i'
alias ll='ls -lh'

2. 编译安装PostgreSQL 9.1.4

64位机器
./configure --prefix=/home/platform64/pgsql --with-pgport=1616 --with-perl --with-openssl --with-pam --without-ldap --with-libxml --with-libxslt --enable-thread-safety --with-wal-blocksize=16 && gmake world
sudo gmake install-world

32位机器
./configure --prefix=/home/platform32/pgsql --with-pgport=1616 --with-perl --with-openssl --with-pam --without-ldap --with-libxml --with-libxslt --enable-thread-safety --with-wal-blocksize=16 && gmake world
sudo gmake install-world

3. 在32bit 机器上初始化数据库

initdb -D $PGDATA -E UTF8 --locale=C -U postgres -W
vi pg_hba.conf
host    replication     replica        192.168.101.35/32                 md5
host all all 0.0.0.0/0 md5

vi postgresql.conf
listen_addresses = '0.0.0.0'
port = 1616
max_connections = 100
shared_buffers = 1024MB
maintenance_work_mem = 512MB
max_stack_depth = 8MB
wal_level = hot_standby
checkpoint_segments = 32
max_wal_senders = 32
wal_sender_delay = 10ms
wal_keep_segments = 64
hot_standby = on

pg_ctl start
psql -h 127.0.0.1 postgres postgres
create role replica nosuperuser nocreatedb nocreaterole noinherit login replication connection limit 32 encrypted password 'REPLICA';

vi /home/platform32/.pgpass
192.168.101.66:1616:replication:replica:REPLICA
192.168.101.35:1616:replication:replica:REPLICA
chmod 400 /home/platform32/.pgpass

4. 配置standby

vi /home/platform64/.pgpass
192.168.101.66:1616:replication:replica:REPLICA
192.168.101.35:1616:replication:replica:REPLICA
chmod 400 /home/platform64/.pgpass

vi $PGDATA/recovery.conf
recovery_target_timeline = 'latest'
standby_mode = on
primary_conninfo = 'host=192.168.101.66 port=1616 user=replica keepalives_idle=60'
trigger_file = '/home/platform64/pg_root/.1616.PG.trigger'

5. 初始化standby

pg_basebackup -D $PGDATA -F p -x -l base -P -v -h 192.168.101.66 -p 1616 -U replica

6. 启动standby

pg_ctl start
报错
FATAL:  incorrect checksum in control file

7. 修改pg_controlfile的checksum源码, 不check.

vi src/backend/access/transam/xlog.c
注释checksum部分
        /* if (!EQ_CRC32(crc, ControlFile->crc))
                ereport(FATAL,
                                (errmsg("incorrect checksum in control file")));
        */

8. 重新编译standby端的pgsql

9. 重新启动standby, 报另一个错误

FATAL:  database files are incompatible with server
DETAIL:  The database cluster was initialized with MAXALIGN 1093850759, but the server was compiled with MAXALIGN 8.
HINT:  It looks like you need to initdb.

在控制文件差别 : 

32 位机器的控制文件信息 :
Maximum data alignment:               4
Maximum size of a TOAST chunk:        2000

64 位机器(initdb 后)的控制文件信息 :
Maximum data alignment:               8
Maximum size of a TOAST chunk:        1996
在src/backend/access/transam/xlog.c这里面有很多的check, 不一一列出.
要在64 bit的机器上使用到底应该怎么办呢?
其实和程序有关系, 只要把32bit 上编译的pgsql程序拷贝过来就可以了

10. 在64bit的机器上使用32bit的pgsql做standby .
scp -r root@32bit:/home/platform32/pgsql /home/platform64/
pg_ctl start

在primary上插入测试数据 :

[platform32@192_168_101_66 pg_root]$ psql postgres postgres -h 127.0.0.1 psql (9.1.4) Type "help" for help.  postgres=# \dt         List of relations  Schema | Name | Type  |  Owner    --------+------+-------+----------  public | t    | table | postgres (1 row)  postgres=# create table test (id int); CREATE TABLE postgres=# insert into test select generate_series (1,10000); INSERT 0 10000

在standby上验证 :

[platform64@db-192-168-101-35 ~]$ psql -h 127.0.0.1 postgres postgres
psql (9.1.4)
Type "help" for help.

postgres=# select count(*) from test;
 count
-------
 10000
(1 row)

11. 那么反过来行不行呢? 在32bit的机器上允许64bit的程序?

显然是不行的

[platform32@192_168_101_66 ~]$ pg_ctl --help -bash: /home/platform32/pgsql/bin/pg_ctl: cannot execute binary file
[platform32@192_168_101_66 ~]$ postgres --help -bash: /home/platform32/pgsql/bin/postgres: cannot execute binary file
时间: 2024-09-21 22:45:46

PostgreSQL standby in 64bit to 32bit or reverse enviroment的相关文章

windows 7 64bit转32bit的硬盘安装解决方案

之前通过硬盘安装方法更新了版本,从win7 X64 7100更新到7600,安装过程很顺利,就因为这样一个问题,Win7 X64 装不了远程服务器管理工具(RSAT),从微软官网下载了一个200多M,装好后,就是没发现有被安装上,一直找不到答案,平时维护服务器相对较多,最后放弃转到X86,当我通过硬盘安装方法修复出现一个问题,提示:"the subsystem needed to support the image type is not present"错误,即子系统不支持目前镜像.

PostgreSQL standby recover的源码分析 (walreceiver唤醒时机? 为什么standby crash后walreceiver不会立即被唤醒?)

标签 PostgreSQL , 流复制 , stream replication , wal receiver , 唤醒时机 , 状态机 背景 前段时间有位网友提的问题, 当PostgreSQL数据库的standby节点crash后再启动,发现standby节点的wal receiver进程很久才启动并开始从主节点接收WAL. 这段时间是在等待standby节点恢复pg_xlog目录中已有的xlog日志. 这是为什么呢? 数据库crash后从哪个WAL位置开始恢复 PostgreSQL在cras

PostgreSQL standby replication error : invalid record length at %u

一位QQ上的网友问我的一个问题,我觉得比较有意思. 记录如下 :  Question :  我在启动POSTGRES的STANDBY数据库时,报 -------------------------- LOG:  database system was shut down in recovery at 2011-12-30 23:20:25 CST LOG:  entering standby mode LOG:  restored log file "0000000100000002000000

Linux Kernel sys_call_table、Kernel Symbols Export Table Generation Principle、Difference Between System Calls Entrance In 32bit、64bit Linux【转】

转自:http://www.cnblogs.com/LittleHann/p/4127096.html 目录 1. sys_call_table:系统调用表 2. 内核符号导出表:Kernel-Symbol-Table 3. Linux 32bit.64bit环境下系统调用入口的异同 4. Linux 32bit.64bit环境下sys_call_table replace hook   1. sys_call_table:系统调用表 0x1: sys_call_table简介 sys_call

PostgreSQL 类ORACLE RAC 的产品 DEMO实现

亚马逊推出的Aurora数据库引擎,支持一份存储,一主多读的架构.这个架构和Oracle RAC类似,也是共享存储,但是只有一个实例可以执行写操作,其他实例只能执行读操作.相比传统的基于复制的一主多读,节约了存储的成本,网络带宽的成本. 我们可以使用PostgreSQL的hot standby模式来模拟这种共享存储一主多读的架构,但是需要注意几点,hot standby也会对数据库有写的动作,例如recovery时,会修改控制文件,数据文件等等,这些操作是多余的.另外很多状态是存储在内存中的,所

数据库内核月报 - 2015 / 10-PgSQL · 特性分析 · PostgreSQL Aurora方案与DEMO

前言 亚马逊推出的Aurora数据库引擎,支持一份存储,一主多读的架构.这个架构和Oracle RAC类似,也是共享存储,但是只有一个实例可以执行写操作,其他实例只能执行读操作.相比传统的基于复制的一主多读,节约了存储和网络带宽的成本. 我们可以使用PostgreSQL的hot standby模式来模拟这种共享存储一主多读的架构,但是需要注意几点,hot standby也会对数据库有写的动作,例如recovery时,会修改控制文件,数据文件等等,这些操作是多余的.另外很多状态是存储在内存中的,所

PostgreSQL 最佳实践 - 块级增量备份(ZFS篇)多zfs卷场景一致性备份

背景 当我们使用了多个ZFS卷或者文件系统时,如果一个实例的多个部分,如表空间,放在了不同的zfs上,再使用基于ZFS快照的备份时,可能出现多个文件系统不一致的情况. 例如控制文件是新的,但是数据是旧的. 保物理备份的一致性检查 基于文件的物理备份,为了保证备份的一致性,在备份开始时,需要做一个检查点,同时打开FULL PAGE WRTIE,同时还会生成backup_label文件记录备份开始时的WAL文件,检查点位置等信息. backup_label文件内容示例 START WAL LOCAT

数据库案例集锦 - 开发者的《如来神掌》

背景 「剑魔独孤求败,纵横江湖三十馀载,杀尽仇寇,败尽英雄,天下更无抗手,无可柰何,惟隐居深谷,以雕为友.呜呼,生平求一敌手而不可得,诚寂寥难堪也.」 剑冢中,埋的是剑魔独孤求败毕生几个阶段中用过的几柄剑: 利剑无意:第一柄是青光闪闪的利剑,凌厉刚猛,无坚不摧,弱冠前以之与河朔群雄争锋. 软剑无常:第二柄是紫薇软剑,三十岁前所用,误伤义士不祥,悔恨不已,乃弃之深谷. 重剑无锋:第三柄是玄铁重剑,重剑无锋,大巧不工,四十岁之前恃之横行天下. 木剑无俦:第四柄是已腐朽的木剑. 无剑无招:四十岁后,不

win8系统怎么样?各版本区别

2012年8月2日,微软宣布Windows 8开发完成,正式发布RTM版本. 小编最近装上用了一下还不错,刚上手的时候不习惯,用时间长了,用回7反而觉的7不够方便.不过那些app应用刚起步,很多做出来的软件并不兼容,稳定性差.若是笔记本装8,驱动是一个大问题,虽然相应的硬件厂商陆续针对8的每个版本研发对应的硬件驱动,但各大笔记本厂商因8还没出正式版为由,没有提供驱动下载,一些特色功能不能使用. 像win7一样win8也有多个版本供我们选择,那么,我们该安装那个版本呢?在做出选择前我们应该先了解各