一、簡介
在前面項目中,我們使用若依前后端分離整合人大金倉,在后續開發過程中,我們經常因為各種”不適配“問題,但可以感覺得到大部分問題,將人大金倉視為postgreSQL就能去解決大部分問題。據了解,Kingbase 是基于 開源數據庫 PostgreSQL 開發的,大部分功能與 PostgreSQL兼容。Kingbase 8 是基于 PostgreSQL 9.6 的。那么下面我們來分析下具體哪些不同,也方便程序猿們在開發中更高效的去解決業務場景中出現的問題
二、具體差異
2.1 進程結構基本一致
KingbaseES和PostgreSQL啟動后的后臺進程
Kingbase:
postgreSQL:
和pg(9.6版本)相比,除了kinbaseES多了一個logger process和一個bgworker:sysloglical supervisor外,其他的后臺進程完全是一模一樣的,連名字都沒變。
在更高一點的版本中,對比就會發現,幾乎完全一致。這里也不難理解為什么使用navicat中postgreSQL的連接方式能夠管理人大金倉數據庫了。
2.2 JDBC
postgresql 9.6
kingbase 8
driver_class
org.postgresql.Driver
com.kingbase8.Driver
url
jdbc:postgresql://127.0.0.1:5432/postgres
jdbc:kingbase8://127.0.0.1:54321/kingbase
jdbc 的 jar
postgresql.jdbc-9.0.jar
org.postgresql
postgresql.jdbc
9.0
kingbase8-8.2.0.jar
com.kingbase8
kingbase8-jdbc
8.2.0
hibernate 的jar
hibernate-5.0.12.jar
org.hibernate
hibernate
5.0.12
hibernate-3.6.0-dialect-1.0.jar
com.kingbase
hibernate-3.6.0-dialect
1.0
hibernate方言
org.hibernate.dialect.PostgreSQL9Dialect
org.hibernate.dialect.Kingbase8Dialect
引用資料:PostgreSQL 與 Kingbase 的差異對比 - 草色青青送馬蹄 - 博客園 (cnblogs.com)
這里127.0.0.1 表示本地的ip地址。
5432 是postgresql的默認端口;54321則是人大金倉的的默認端口。
postgres 是postgresql默認的數據庫名,kingbase是Kingbase默認的數據庫名。
從這一部分來說,發現的是url以及等等上面有明顯不同,但是在開發的過程中,將驅動改為PostgreSQL依舊能夠驅動,很是耐人尋味,我們接著往下看。
2.3 數據目錄結構和組成基本一致。
命令程序
postgresql 9.6
kingbase 8
pgbench
kbbench
postgres
kingbase
psql
ksql
pg_archivecleanup
sys_archivecleanup
pg_basebackup
sys_basebackup
pg_bulkload
sys_bulkload
pg_config
sys_config
pg_controldata
sys_controldata
pg_ctl
sys_ctl
pg_dump
sys_dump
pg_dumpall
sys_dumpall
pg_hm
sys_hm
pg_isready
sys_isready
pglogical_create_subscriber
syslogical_create_subscriber
pg_receivexlog
sys_receivexlog
pg_recvlogical
sys_recvlogical
pg_resetxlog
sys_resetxlog
pg_restore
sys_restore
pg_rewind
sys_rewind
pg_rman
sys_rman
pg_test_fsync
sys_test_fsync
pg_test_timing
sys_test_timing
pg_upgrade
sys_upgrade
pg_xlogdump
sys_xlogdump
系統表和視圖
postgresql 9.6
kingbase 8
pg_aggregate
sys_aggregate
pg_am
sys_am
pg_amop
sys_amop
pg_amproc
sys_amproc
pg_attrdef
sys_attrdef
pg_attribute
sys_attribute
pg_authid
sys_authid
pg_auth_members
sys_auth_members
pg_cast
sys_cast
pg_class
sys_class
pg_collation
sys_collation
pg_constraint
sys_constraint
pg_conversion
sys_conversion
pg_database
sys_database
pg_db_role_setting
sys_db_role_setting
pg_default_acl
sys_default_acl
pg_depend
sys_depend
pg_description
sys_description
pg_enum
sys_enum
pg_event_trigger
sys_event_trigger
pg_extension
sys_extension
pg_foreign_data_wrapper
sys_foreign_data_wrapper
pg_foreign_server
sys_foreign_server
pg_foreign_table
sys_foreign_table
pg_index
sys_index
pg_inherits
sys_inherits
pg_init_privs
sys_init_privs
pg_language
sys_language
pg_largeobject
sys_largeobject
pg_largeobject_metadata
sys_largeobject_metadata
pg_namespace
sys_namespace
pg_opclass
sys_opclass
pg_operator
sys_operator
pg_opfamily
sys_opfamily
pg_partitioned_table
sys_partitioned_table
pg_pltemplate
sys_pltemplate
pg_policy
sys_policy
pg_proc
sys_proc
pg_publication
sys_publication
pg_publication_rel
sys_publication_rel
pg_range
sys_range
pg_replication_origin
sys_replication_origin
pg_rewrite
sys_rewrite
pg_seclabel
sys_seclabel
pg_sequence
sys_sequence
pg_shdepend
sys_shdepend
pg_shdescription
sys_shdescription
pg_shseclabel
sys_shseclabel
pg_statistic
sys_statistic
pg_statistic_ext
sys_statistic_ext
pg_subscription
sys_subscription
pg_subscription_rel
sys_subscription_rel
pg_tablespace
sys_tablespace
pg_transform
sys_transform
pg_trigger
sys_trigger
pg_ts_config
sys_ts_config
pg_ts_config_map
sys_ts_config_map
pg_ts_dict
sys_ts_dict
pg_ts_parser
sys_ts_parser
pg_ts_template
sys_ts_template
pg_type
sys_type
pg_user_mapping
sys_user_mapping
System Views
sysstem Views
pg_available_extensions
sys_available_extensions
pg_available_extension_versions
sys_available_extension_versions
pg_config
sys_config
pg_cursors
sys_cursors
pg_file_settings
sys_file_settings
pg_group
sys_group
pg_hba_file_rules
sys_hba_file_rules
pg_indexes
sys_indexes
pg_locks
sys_locks
pg_matviews
sys_matviews
pg_policies
sys_policies
pg_prepared_statements
sys_prepared_statements
pg_prepared_xacts
sys_prepared_xacts
pg_publication_tables
sys_publication_tables
pg_replication_origin_status
sys_replication_origin_status
pg_replication_slots
sys_replication_slots
pg_roles
sys_roles
pg_rules
sys_rules
pg_seclabels
sys_seclabels
pg_sequences
sys_sequences
pg_settings
sys_settings
pg_shadow
sys_shadow
pg_stats
sys_stats
pg_tables
sys_tables
pg_timezone_abbrevs
sys_timezone_abbrevs
pg_timezone_names
sys_timezone_names
pg_user
sys_user
pg_user_mappings
sys_user_mappings
pg_views
sys_views
這兩張表都是能找到的,具體來源我也不太確定,kingbase只是將postgresql 的表的前綴從 pg 改成了 sys…數據目錄結構和組成基本一致。
2.4 集群方面
圖中各組件的介紹和作用:
- postgresql 官方的數據庫系統, 內置了副本機制, 復制模式支持全同步、半同步、全異步模式。同時還支持級聯復制.
- citus 它是postgresql的一個擴展, 為 postgresql 提供了分布式能力, 它和Mysql生態中的Mycat的作用類似.
- 它不入侵 Postgresql 代碼, 而是依托于 Postgresql 而不是改造 Postgresql, 因此可以使用postgresql最新版本的功能、工具和生態系統。
- 它將 Postgresql 從單個節點擴展到大型分布式數據庫集群, 可以隨意水平擴展以支持更大的數據量、更大的寫入和查詢性能。
- citus將節點分為協調器節點和工作節點, 協調器節點除了集群元數據外不存儲任何數據分片。應用程序將查詢發送到協調器節點,協調器將其發送給相關工作節點并行執行, 最后協調器匯集結果后返回給應用程序。工作節點接收協調器發送過來的指令,執行命令,存儲分片數據,并將執行結果返回給協調器等, 客戶端只需連接到協調器即可, 工作節點對于客戶端而言是透明的.
- 但它不具備高可用和自動故障切換的能力, 高可用完全依賴postgresql自身提供功能.
- patroni 它為 postgresql 提供了自動化配置和自動故障轉移能力, patroni內置對citus的集成. Patroni 接管了 Postgresql 的配置和啟停管理, 同時自動化執行數據同步. 它依賴DCS(分布式配置存儲)系統來實現配置共享和自動故障切換. 它利用DCS的分布式鎖實現只有一個Leader. 主備及數據同步則調用Postgresql內置的功能實現(流復制).
- etcd-server 它作為 Patroni 的 DCS(分布式配置存儲)系統, patroni也支持的其它的DCS: consul,zookeeper,kubernetes等.
- vip-manager 它為citus的協調器組提供了 VIP 漂移功能, 它根據 DCS 中的 leader 的鍵來決定本機是否應該獲取 VIP, 因此能很好的配合 patroni, 雖然keepalived也提供類似的功能, 但keepalived無法根據服務狀態漂移VIP, 只能根據機器決定是否漂移VIP, 這可能會導致VIP和Leader不一致的問題. 另外, patroni可以手動切換主備. keepalived無法支持, 當然還有其它一些問題不展開了.
- 該部分引用:PostgreSQL 分布式高可用集群方案 - 知乎 (zhihu.com)
kingbase集群:
KingbaseES R6 集群修改物理IP和VIP案例-CSDN博客
這里直接引用一篇文章,postgresql高可用的解決方案,然后看看kes86的集群管理,總有對的上號的,比如repmgr。
三、總結
人大金倉與PostgreSQL集群之間的差別主要體現在以下幾個方面:
首先,人大金倉的核心產品金倉交易型數據庫KingbaseES具備高兼容、高可靠、高性能、高擴展、高安全、易使用和易管理的特點。它是唯一入選國家自主創新產品目錄的數據庫產品,并在國家級、省部級實際項目中得到廣泛應用。特別地,KingbaseES提供了容錯功能體系,通過數據備份、恢復、同步復制、多數據副本等高可用技術,確保數據庫能夠7×24小時不間斷地提供服務。此外,它還提供了全新設計的集成開發環境(IDE)和集成管理平臺,以及基于并行計算、索引覆蓋等技術在內的多種性能優化手段。
而PostgreSQL作為最先進的開源數據庫,自誕生之初就帶有許多高級特性,如豐富的函數和高級擴展包等。PostgreSQL的集群模式是將多個單機數據庫以集群化的方式對外提供服務,主備之間保持數據同步。其高級特性包括主備切換、故障自動切換、負載均衡、備份恢復、慢日志、審計日志等,這些高級特性通常需要結合插件或第三方中間件如pgbouncer、pgpool來實現。
其次,從產品架構上看,Kingbase 8是基于PostgreSQL 9.6的,盡管兩者有一些相似之處,但在一些關鍵細節上存在差異。例如,在JDBC連接方面,PostgreSQL的默認端口是5432,而人大金倉的默認端口是54321。在命令程序方面,Kingbase只是將PostgreSQL的表的前綴從pg改成了sys或者kb。
最后,從市場定位和應用場景來看,國產數據庫如人大金倉的產品目前處在起步階段,盡管有一定的市場規模,但在整個大的市場份額和市場定位中,其影響力相對較弱,還沒有撼動國外產品的壟斷地位。而PostgreSQL作為開源數據庫,已經在全球范圍內得到了廣泛的應用和認可。只能說完美兼容pg…