SequoiaDB做爲分佈式數據庫,從設計之初就已經支持SQL訪問。目前,SequoiaDB自研的SQL訪問組件SequoiaSQL做爲企業版的功能之一已經提供給上百家企業用戶使用,而且已經實現分佈式架構下的SQL 2003支持。node
對於SequoiaDB社區版用戶,咱們能夠經過SequoiaDB對接PostgreSQL 實現社區版的分佈式SQL訪問。這一應用方式基本也能夠知足大部分的社區版需求。sql
本文就主要探討如何使用PostgreSQL引擎對接SequoiaDB社區版實現HA高可用架構。數據庫
在一臺機上分別安裝centos 6.五、SequoiaDB 2.六、postgresql 9.3.4 、pgpool II 3.6.2,其中SequoiaDB爲默認安裝,PostgreSQL數據庫則手動安裝,安裝在不一樣的目錄中,使用不一樣的端口號。pgpool II 3.6.2則單獨手動安裝一個,並設好免密認證。centos
注:須要先配好PostgreSQL數據庫之間免密登陸及關閉防火牆。安全
Step1架構
./configure --without-readline --without-zlib --prefix=/opt/postgresql/data02/pgpool/master 注:--prefix=path,是指PostgreSQL的二進制程序和文檔將被安裝到這個目錄。默認值爲 /usr/local
Step2:編譯app
make
Step3:安裝負載均衡
make install
Step4:修改文件權限ssh
chown -R sdbadmin:sdbadmin_group /opt/postgresql/data02/pgpool/master
當安裝完成後,可經過echo $? 命令驗證,若是爲0則表示安裝成功,非0表示失敗。安裝成功如圖1所示:異步
先配置主庫,再配置備庫。
Step1:初始化數據庫
mkdir /opt/postgresql/data02/pgpool/master /pg_data /opt/postgresql/data02/pgpool/master /bin/initdb -D pg_data/
初始化成功則如圖2所示:
Step2:修改 postgresql.conf配置文件
listen_addresses = '*' port = 7654 wal_level = hot_standby #這個是設置主爲wal的主機 archive_mode = on #開啓日誌歸檔 archive_command = 'cp %p /opt/postgresql/data02/pgpool/master/pg_data/backup/%f' #WAL歸檔路徑。 max_wal_senders = 1 #這個設置了能夠最多有幾個流複製鏈接,差很少有幾個從,就設置幾個 wal_keep_segments = 250 #設置log file 的段大小 wal_sender_timeout = 60s #設置流複製主機發送數據的超時時間 max_connections = 100 # 這個設置要注意下,從庫的max_connections必需要大於主庫的。
在搭建流複製環境時,並沒必要須設置 archive_mode 參數爲 on ,不少資料在介紹搭建流複製環境時設置這個參數爲 on ,多是出於開啓 WAL 歸檔更安全的緣由,由於在主庫宕機而且較長時間不能恢復時,從庫依然能夠讀取歸檔目錄的 WAL,從而保證不丟數據; 另外一方面,若是主庫設置了較大的 wal_keep_segments ,也能夠不用開啓archive_mode,由於主庫保留了足夠的 WAL,從而大大下降了因從庫所須要的 WAL 被主庫覆蓋而須要從歸檔去取 WAL 的狀況。因此從這方面說,archive_mode 參數的設置與搭建流複製並無直接關係。提示:對於比較繁忙的庫,在搭建流複製從庫時,建議主庫設置較大的 wal_keep_segments 參數。
其實能夠在同一個postgresql.conf中把全部主從屬性配置都配好,postgresql數據庫可以自動識別哪些是主庫參數,哪些是從庫參數,但注意,有些參數在主庫中不能配置,不然出錯,好比不能再主庫中開啓熱備模式(hot_standby = on)。配置完成後咱們能夠拷貝該庫都另外一個目錄,當成備庫。
注:當日志報「xxxxxxxxxxxxxxxxxxx WAL已經被移異常」時,有多是 WAL被覆蓋引發的或者DBA不當心把主庫或從庫的某個日誌文件刪了(若是開啓了歸檔,則包含歸檔文件),即主庫有而備庫沒有,或者備庫有而主庫沒有都會引發該異常。解決方法:若是是主備日誌文件異常(某個庫缺個日誌文件),則根據日誌的異常把報錯日誌考到 另外一個沒有的庫,在重啓,若是是WAL日誌被覆蓋,則把主庫整個pg_data數據路徑下的pg_xlog日誌文件拷到備庫,若是是在開啓歸檔模式下出現的異常,須要把歸檔文件都從新覆蓋備庫的,再重啓,都不能解決,那就暴力的把整個pg_data目錄拷貝到備庫,在重啓就能夠了。
Step3:修改pg_hba.conf配置文件
# IPv4 local connections: host all all 127.0.0.1/32 trust host replication all 0.0.0.0/0 trust
Step4:啓動服務,建立用戶
/opt/postgresql/data02/pgpool/master/bin/pg_ctl -D /opt/postgresql/data02/pgpool/master/pg_data/ -l /opt/postgresql/data02/pgpool/master/log/pg.log start; #啓動服務 /opt/postgresql/data02/pgpool/master/bin/createuser -P -d -a -c 5 --replication -e sequoiadb -p 7654 Enter password for new role: Enter it again: CREATE ROLE sequoiadb PASSWORD 'md570b40d6703c0a012afc8356f4511c197' SUPERUSER CREATEDB CREATEROLE INHERIT LOGIN REPLICATION CONNECTION LIMIT 5;
建立用戶可根據本身需求賦予權限。
Step1:拷貝主庫爲從庫
cp -r /opt/postgresql/data02/pgpool/master /opt/postgresql/data02/pgpool/slave
Step2:修改從庫 postgresql.conf配置文件
listen_addresses = '*' port = 4567 max_connections = 1000 # 通常查多於寫的應用從庫的最大鏈接數要比較大 hot_standby = on #說明這臺機器不只僅是用於數據歸檔,也用於數據查詢 max_standby_streaming_delay = 30s # 數據流備份的最大延遲時間 wal_receiver_status_interval = 1s # 多久向主報告一次從的狀態,固然從每次數據複製都會向主報告狀態,這裏只是設置最長的間隔時間 hot_standby_feedback = on # 若是有錯誤的數據複製,是否向主進行反饋
因爲主備模式,主庫可進行任何增刪改查等操做,而從庫只能提供查詢操做,這是爲了數據的一致性,所以,一般狀況下會把查詢都向從庫進行,以減輕主庫的壓力。
Step2: 修改recovery.conf配置文件
把/share/recovery.conf.sample文件拷貝到數據庫目錄中,在複製模板。
cp /opt/postgresql/data02/pgpool/slave/share/recovery.conf.sample /opt/postgresql/data02/pgpool/slave/pg_data/ cp recovery.conf.sample recovery.conf standby_mode = on # 這個說明這臺機器爲從庫 primary_conninfo = 'host=centos01 user=sequoiadb password= 123456 port=7654 keepalives_idle=60' # 這個說明這臺機器對應主庫的信息
其中,primary_conninfo配置能夠與不須要用戶名及密碼,這是因爲在pg_hba.conf中的信任關係爲trust,因此能夠不用填寫。
Step1:從 SequoiaDB 的安裝包中,拷貝 PostgreSQL 的擴展文件
su – sdbadmin cd /opt/postgresql/data02/pgpool/master cp /opt/sequoiadb/postgresql/sdb_fdw.so_2.8.1_27726 lib/ cp /opt/sequoiadb/postgresql/sdb_fdw.control share/extension/ cp /opt/sequoiadb/postgresql/sdb_fdw--1.0.sql share/extension/ cd lib/ ln -s sdb_fdw.so_2.8.1_27726 sdb_fdw.so
添加完軟鏈接完成後,可查看文件(ls –trl )驗證,如圖3展現,則表示成功。
Step2:登陸主庫,建立鏈接
/opt/postgresql/data02/pgpool/master/bin/psql –U sequoiadb –d postgres –p 7654 create extension sdb_fdw; create server sdb_server foreign data wrapper sdb_fdw options(address 'centos01', service '11810');
Step3:測試鏈接
create foreign table foo (name text, age int) server sdb_server options ( collectionspace 'foo', collection 'bar', decimal 'on' ) ; select * from test limit 1;
測試結果如圖4:
Step1:啓動備庫
/opt/postgresql/data02/pgpool/slave/bin/pg_ctl -D /opt/postgresql/data02/pgpool/slave/pg_data/ -l /opt/postgresql/data02/pgpool/slave/log/pg.log start
查看日誌如圖5表示啓動成功,進入主備模式。
Step2:登陸主庫,進行異步複製
select pg_start_backup('hot_backup'); select pg_is_in_backup();#查看是否在備份中backup。返回"t"表示true。「f」表示false。 select pg_stop_backup();
其中,select pg_start_backup('hot_backup');語句裏的hot_backup參數不是固定的,這裏的 hot_backup 是任意DBA想使用的此次備份操做的惟一標識,DBA也能夠指定備份文件存放全路徑,如:select pg_start_backup('/opt/backup/backup_20170413');這是推薦使用的方式;select pg_stop_backup(),Postgresql將會生成一個文件,如「000000010000000000000000.003911E0.backup」,這是一個備份的歷史文件。pg_stop_backup()將保留本次生成的備份歷史文件,而後把上次執行本方式備份產生的備份歷史文件清理掉,而後發信號告知歸檔進程(pg_stop_backup -> CleanupBackupHistory -> XLogArchiveCheckDone -> XLogArchiveNotify -> SendPostmasterSignal),能夠歸檔了。
操做結果如圖6所示:
Step3:登陸備庫,進行查看
../bin/psql –U sequoiadb –d postgres –p 4567 select * from test limit 1;
測試結果如圖7所示,表示成功。
./configure --prefix=/opt/postgresql/data02/pgpool-II-3.6.2 --with-pgsql=/opt/postgresql/data02/pgpool/master make make install #須要root權限。
在編譯安裝過程當中,若是出現libtool異常,從新編譯安裝時加上參數 --disable-libtool-lock,如:./configure -–prefix --with-pgsql=pg_path --disable-libtool-lock,特別注意的是,當不指定—prefix時,會默認安裝在/usr/local/目錄下,且不管是否把安裝目錄拷貝出來,每次執行都會到/usr/local/默認目錄下讀取配置信息,因此建議指定安裝路徑(--prefix)。若是安裝成功,則會如圖8所示:
安裝pgpool_regclass, pgpool_recovery 函數庫時,進入目錄src/sql下,但沒法直接使用make編譯,會報找不到pg_config文件,所以,須要找到pg_config配置文件,該文件存在於postgresql安裝目錄中,如上面安時指定的—with-pgsql參數路徑中尋找,並把其全路徑替換掉Makefile文件中的變量PG_CONFIG =pg_config參數值,才能安裝。當在src/sql目錄下把Makefile參數改了,仍是沒可以編譯安裝時,則須要依次登陸其庫目錄src/sql/pgpool_regclass和src/sql/pgpool_recovery,在分別替換掉Makefile文件中的變量PG_CONFIG =pg_config參數值,就可以安裝 了。具體部署以下:
find /opt/postgresql/data02/pgpool/master -name 「pg_config」; cd /opt/postgresql/data02/pgpool/pgpool-II-3.6.2/src/sql/pgpool-regclass; vi Makefile PG_CONFIG ?= /opt/postgresql/data02/pgpool/master/bin/pg_config :wq make make install
詳情操做可如圖9和圖10 所示:
安裝pgpool_regclass函數庫成功後,會在postgresql中的 /share/extension/目錄下會有三個文件,分別爲pgpool_regclass.control、pgpool_regclass--1.0.sql和pgpool-regclass.sql,而安裝成功pgpool_recovery函數庫,則在postgresql 中的 /share/extension/目錄下也有三個文件,分別爲:pgpool_recovery.control、pgpool-recovery.sql和pgpool_recovery--1.1.sql。
pgpool_regclass與pgpool_recovery函數庫安裝成功則如圖11:
listen_addresses = '*' port = 9999 socket_dir = '/tmp' pcp_listen_addresses = '*' pcp_port = 9898 pcp_socket_dir = '/tmp' backend_hostname0 = 'centos01' #配置數據節點,能夠是主機名或IP地址 backend_port0 = 7654 backend_weight0 = 1 #負載均衡中的權重值 backend_data_directory0 = '/opt/postgresql/data02/pgpool/master/pg_data' #指定節點0數據路徑 backend_flag0 = 'ALLOW_TO_FAILOVER' #容許自動切換 backend_hostname1 = 'centos01' backend_port1 = 4567 backend_weight1 = 1 backend_data_directory1 = '/opt/postgresql/data02/pgpool/slave/pg_data' backend_flag1 = 'ALLOW_TO_FAILOVER' enable_pool_hba = on #開啓pool_hba驗證 pool_passwd = 'pool_passwd' #驗證文件(pool_passwd格式爲,客戶端鏈接到pgpool的帳戶名 root:md5生成的密碼) authentication_timeout = 60 #驗證超時時間。 pid_file_name = '/opt/postgresql/data02/pgpool/pgpool-II-3.6.2/info/run/pgpool.pid' logdir = '/opt/postgresql/data02/pgpool/pgpool-II-3.6.2/info/status' load_balance_mode = on #開啓負載模式 master_slave_mode = on #開啓主備模式 master_slave_sub_mode = 'stream' #開啓流模式 sr_check_period = 10 #流式複製檢查週期默認爲禁用(0) sr_check_user = 'sequoiadb' #流複製模式檢測用戶 sr_check_password = '123456' #檢測用戶密碼 sr_check_database = 'postgres' #檢測用戶下的數據庫 health_check_period = 10 #每10s檢測數據庫節點狀態 health_check_timeout = 20 #20s無反應測超時,即檢測兩次無反應就超時,禁用爲0。 health_check_user = 'sequoiadb' #檢測某用戶數據庫節點狀態 health_check_password = '123456' //被檢測用戶密碼 health_check_max_retries = 0 health_check_retry_delay = 1 connect_timeout = 10000 failover_command = '/opt/postgresql/data02/pgpool/pgpool-II-3.6.2/fail.sh %H' memqcache_oiddir = '/opt/postgresql/data02/pgpool/pgpool-II-3.6.2/info/oiddir'
其中健康檢測狀態有四種,即status 由數字 [0 - 3]來表示。0 - 該狀態僅僅用於初始化,PCP從不顯示它。1 - 節點已啓動,尚未鏈接。2 - 節點已啓動,鏈接被緩衝。3 - 節點已關閉,。在節點關閉或者爲0的時候能夠用pgpool的pcp_attach_node命令來動態增長節點,包括之後動態擴充節點也能夠。
在配置過程當中,須要注意的時,在3.3.4版本的pgpool II中,若是你配置pid_file_name. logdir等默認路徑爲/tmp變量參數,則在登陸pgpool時有可能應環境而沒法等路pgpool,這是因爲postgresql沒法找到pgpool的 .s.PGSQL.8989和.s.PGSQL.6868文件,由於postgresql是在/tmp/目錄下尋找的,即便你修改postgresql的unix_socket_directories參數值和pgpool上指定的路徑相同,仍是會出現異常,所以建議用默認值。
cp pcp.conf.sample pcp.conf ../bin/pg_md5 -u pgpool -p password: e10adc3949ba59abbe56e057f20f883e
操做詳情如圖12所示:
cp pool_hba.conf.sample pool_hba.conf vi pool_hba.conf # IPv4 local connections: host all all 127.0.0.1/32 trust host sequoiadb postgres 0.0.0.0/0 trust
這裏特別注意,不能用md5效驗,由於md5不支持複製流模式、主備模式以及並行查詢模式。
Pool_passwd配置哪些用戶能夠經過pgpool登錄數據庫,格式user:md5
vi pool_passwd sequoiadb:md570b40d6703c0a012afc8356f4511c197
# Failover command for streaming replication. # This script assumes that DB node 0 is primary, and 1 is standby. # # If standby goes down, do nothing. If primary goes down, create a # trigger file so that standby takes over primary node. # # Arguments: $1: failed node id. $2: new master hostname. $3: path to # trigger file. new_master=$1 echo "new_master info =============== ${new_master}"; trigger_command="/opt/postgresql/data02/pgpool/slave/bin/pg_ctl -D /opt/postgresql/data02/pgpool/slave/pg_data –l /opt/postgresql/data02/pgpool/slave/log/pg.log start" # Do nothing if standby goes down. if [ $failed_node = 1 ]; then exit 0; fi # Create the trigger file. /usr/bin/ssh -T $new_master $trigger_command exit 0;
../bin/pgpool –n –d > ../log/pgpool.log 2>&1 & #-n表示取消後臺模式,-d 表示打印調試信息。 bin/psql -U sequoiadb -d postgres -p 9999 #經過postgresql工具psql登陸pgpool postgres=# show pool_nodes; node_id | hostname | port | status | lb_weight | role | select_cnt | load_balance_node | replication_delay ---------+----------+------+--------+-----------+---------+------------+-------------------+------------------- 0 | centos01 | 7654 | up | 0.500000 | primary | 2 | true | 0 1 | centos01 | 4567 | up | 0.500000 | standby | 0 | false | 0 (2 rows) postgres=#
當手動關閉主庫,等一下子在重啓主庫,缺發現沒有了主庫,具體以下圖13與所示:
目前尚未找到緣由,實如今線恢復功能,即主節點掛後自動選主,且在主庫關閉在重啓過程當中,有可能會出現原主庫節點直接down掉,即status狀態值爲down,pgpool一致報沒法找到主節點的異常,具體如圖14所示:
可經過pgpool自帶的工具pcp_attach_node進行處理,處理命令爲:bin/pcp_attach_node -U pgpool -h centos01 -p 9898 -n 0 –d –W,具體則如圖15:
該命令自己是能夠把原主節點拉起並使其成爲主節點的,執行後結果如圖16所示:
使用PostgreSQL+SequoiaDB實現HA高可用架構,能夠說爲社區用戶提供了一個更爲簡單的技術選擇,使得SequoiaDB除了原生API以外,爲社區開發者提供了SQL的接口。
固然,若是有更爲複雜的需求或者更爲龐大的業務數據須要管理,咱們仍是會推薦購買企業版的SequoiaDB,包括其中的SequoiaSQL分佈式SQL引擎。