前几篇文章介绍主要侧重于宏观层面介绍昆仑分布式数据库系统,介绍了它的高可用性,高可扩展性,分布式事务处理和分布式查询处理,以及自动DDL功能。本文进一步专门面向DBA/运维人员和应用软件程序员,来具体介绍一下昆仑分布式数据库到底是一个什么样的分布式关系数据库管理系统。
昆仑数据库的SQL标准兼容性
对于应用系统开发人员来说,昆仑分布式数据库不是postgresql,也不是mysql,而是一个支持标准sql语言的分布式关系数据库。基于昆仑分布式数据库开发应用软件和网站非常简单,并不需要多少PostgreSQL或者MySQL特定的知识,只要使用标准的SQL语句即可。应用软件中使用的sql语句几乎全是做数据的增删改查的,也就是insert/delete/update/select语句,这些语句包括它们操作的数据的数据类型,以及它们使用的运算符和SQL函数,在昆仑数据库以及所有其他主流RDBMS中都有非常好的SQL标准兼容性,这样就极大地增强了应用软件的SQL标准兼容性,降低了切换RDBMS的代价。
当前主流的RDBMS都有很好的SQL标准兼容性,这些标准SQL是绝大多数应用软件访问数据库时使用的语法。所以,如果你的应用软件或者网站原本是使用PostgreSQL,SQL server, oracle server或者mysql的,那么你只需要极少的修改或完全不需要修改sql语句,即可使用和读写访问昆仑数据库。
只有当你希望写存储过程时才需要postgresql的plsql知识。另外由于完全基于标准SQL语句,所以各种ORM工具比如hibernate 也能够与昆仑分布式数据库协同工作,这些ORM工具生成的代码和模块也不需要修改就可以访问昆仑数据库。
使用昆仑数据库不需要PostgreSQL或者其他特定的RDBMS的知识
虽然昆仑分布式数据库的计算节点基于PostgreSQL修改而来,并且截止昆仑-0.6版本,昆仑数据库只支持postgresql 客户端协议,但是应用程序开发者并不需要多少postgresql特定知识。PostgreSQL非常好地兼容标准SQL,因此所有标准的SQL语法,昆仑数据库都已经支持,这些标准SQL是绝大多数应用软件访问数据库时使用的语法,无论他连接的是哪一种RDBMS。
虽然PostgreSQL也有不少私有扩展,但是这些扩展大多已经在昆仑分布式数据库中被禁用。所以总的来说,只有程序员需要写PL/SQL 存储过程时候,才需要postgresql的特定知识。
另外对于习惯使用postgresql的开发者来说,postgresql的私有功能扩展,除了被禁用的部分,都是良好支持的;而且postgresql特有的函数和运算符,在昆仑数据库中都是完全支持的。这样你的应用软件就可以完全不需要修改就可以从使用postgresql改变为使用昆仑数据库。
mysql兼容性
当前昆仑0.6版本还不支持mysql连接协议,未来会支持,以便各种语言编写的使用mysql客户端协议的应用程序可以直接连接到昆仑数据库来工作。从应用软件开发者角度来看,mysql兼容性主要包括语法兼容和功能兼容。由于mysql本来就非常好的兼容sql标准,所以语法相同的语句,在昆仑数据库和mysql中一定会产生相同的效果,返回等价的结果。也就是说,只要语法兼容就意味着功能兼容。语法兼容方面,昆仑数据库与mysql和postgresql一样都非常兼容标准SQL语法,并且在昆仑系统内部已经做了postgresql与mysql之间的数据类型转换和映射,所以剩余的兼容性问题就是DML语句的语法扩展,以及系统函数和运算符导致的。
insert 语法:支持部分mysql 私有扩展语法
支持on conflict do update 子句并且保持mysql的语法(其语法与postgresql略有不同)
支持insert ignore 来忽略unique key/primary key冲突,不忽略其他错误
例如:insert ignore into t1 values(1,2);
支持replace语句来覆盖重复行
例如:
replace into t1 set a=1,b=2;
replace t1 values(1,2);
支持insert语句的set语法:
例如:insert into t1 set a=1,b=2;
支持insert into… select from
禁止insert和replace的其他修饰关键字,即 delayed, low_priority, high_priority等全部不支持。
不可以指定分区,也就是不支持 insert into t2 partition(p0,p1) values(1,2),(3,4);
update & delete: 禁止所有mysql私有扩展
-
do not allow updating/deleting rows of multiple tables in one stmt
-
do not support ‘order by’ clause and ‘limit’ clause of update/delete stmt
-
no modifiers allowed, such as IGNORE , delayed, low_priority, high_priority,quick
-
do not allow specifying partitions
-
common table expression should be in postgresql’s syntax
select:禁止所有mysql私有扩展
- 不支持mysql 私有的modifiers,包括[HIGH_PRIORITY]
[STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] [SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
-
不支持with rollup 子句,因为pg的olap功能比这要强大很多,不需要这个with rollup子句
-
不支持指定分区查询
-
不支持[INTO OUTFILE ‘file_name’
[CHARACTER SET charset_name] export_options | INTO DUMP-FILE 'file_name' | INTO var_name [, var_name]]
- 不支持加锁子句
[FOR {UPDATE | SHARE} [OF tbl_name [, tbl_name] ...] [NOWAIT | SKIP LOCKED] | LOCK IN SHARE MODE]]
- CTE should be in postgresql’s syntax, window definition and usage are also in postgresql’s syntax
系统函数的兼容性
mysql的系统函数中除了GIS和 json 函数,其余绝大多数都是标准的SQL函数。所有SQL标准函数都是昆仑数据库支持的,剩余少数mysql特有的非gis和json函数会根据用户需要来支持,而且用户也可以从PostgreSQL中找到替代函数;
postgres=# select distinct t1.*from mysql_funcs t1, pg_proc t2 where lower(t1.fname)=t2.proname;
fname
------------------
ABS
ACOS
ASIN
ATAN
ATAN2
BIT_LENGTH
CEIL
CEILING
CHARACTER_LENGTH
CHAR_LENGTH
CONCAT
CONCAT_WS
COS
COT
DEGREES
EXP
FLOOR
JSON_OBJECT
LENGTH
LN
LOG
LOWER
LPAD
LTRIM
MD5
OCTET_LENGTH
PI
POW
POWER
RADIANS
REGEXP_REPLACE
REVERSE
ROUND
RPAD
RTRIM
SIGN
SIN
SQRT
TAN
UPPER
VERSION
(41 rows)
另外,mysql的所有window函数,在postgresql和昆仑系统中都是支持的,但是没有列在上面的列表中,在此处列出:
ROW_NUMBER RANK DENSE_RANK CUME_DIST PERCENT_RANK NTILE LEAD LAG FIRST_VALUE LAST_VALUE NTH_VALUE
昆仑数据库不支持的mysql函数如下。可以看到大多数是gis和json函数,其余的函数,也可以在昆仑数据库中找到相同功能的函数,只是函数名称不同。
postgres=# select *from mysql_funcs t1 where lower(t1.fname) not in (select distinct proname from pg_proc);
fname
-----------------------------------
ADDTIME
AES_DECRYPT
AES_ENCRYPT
ANY_VALUE
BENCHMARK
BIN
BIN_TO_UUID
BIT_COUNT
COERCIBILITY
COMPRESS
CONNECTION_ID
CONV
CONVERT_TZ
CRC32
CURRENT_ROLE
DATEDIFF
DATE_FORMAT
DAYNAME
DAYOFMONTH
DAYOFWEEK
DAYOFYEAR
ELT
EXPORT_SET
EXTRACTVALUE
FIELD
FIND_IN_SET
FOUND_ROWS
FROM_BASE64
FROM_DAYS
FROM_UNIXTIME
GET_LOCK
GREATEST
GTID_SUBSET
GTID_SUBTRACT
HEX
IFNULL
INET6_ATON
INET6_NTOA
INET_ATON
INET_NTOA
INSTR
IS_FREE_LOCK
IS_IPV4
IS_IPV4_COMPAT
IS_IPV4_MAPPED
IS_IPV6
ISNULL
IS_USED_LOCK
IS_UUID
JSON_ARRAY
JSON_ARRAY_APPEND
JSON_ARRAY_INSERT
JSON_CONTAINS
JSON_CONTAINS_PATH
JSON_DEPTH
JSON_EXTRACT
JSON_INSERT
JSON_KEYS
JSON_LENGTH
JSON_MERGE
JSON_MERGE_PATCH
JSON_MERGE_PRESERVE
JSON_PRETTY
JSON_QUOTE
JSON_REMOVE
JSON_REPLACE
JSON_SEARCH
JSON_SET
JSON_STORAGE_FREE
JSON_STORAGE_SIZE
JSON_TYPE
JSON_UNQUOTE
JSON_VALID
LAST_DAY
LAST_INSERT_ID
LCASE
LEAST
LOAD_FILE
LOCATE
LOG10
LOG2
MAKEDATE
MAKE_SET
MAKETIME
MASTER_POS_WAIT
MBRCONTAINS
MBRCOVEREDBY
MBRCOVERS
MBRDISJOINT
MBREQUALS
MBRINTERSECTS
MBROVERLAPS
MBRTOUCHES
MBRWITHIN
MONTHNAME
NAME_CONST
NULLIF
OCT
ORD
PERIOD_ADD
PERIOD_DIFF
QUOTE
RAND
RANDOM_BYTES
REGEXP_INSTR
REGEXP_LIKE
REGEXP_SUBSTR
RELEASE_ALL_LOCKS
RELEASE_LOCK
ROLES_GRAPHML
ROTATE_SYSTEM_KEY
SEC_TO_TIME
SHA
SHA1
SHA2
SLEEP
SOUNDEX
SPACE
ST_AREA
ST_ASBINARY
ST_ASGEOJSON
ST_ASTEXT
ST_ASWKB
ST_ASWKT
STATEMENT_DIGEST
STATEMENT_DIGEST_TEXT
ST_BUFFER
ST_BUFFER_STRATEGY
ST_CENTROID
ST_CONTAINS
ST_CONVEXHULL
ST_CROSSES
ST_DIFFERENCE
ST_DIMENSION
ST_DISJOINT
ST_DISTANCE
ST_DISTANCE_SPHERE
ST_ENDPOINT
ST_ENVELOPE
ST_EQUALS
ST_EXTERIORRING
ST_GEOHASH
ST_GEOMCOLLFROMTEXT
ST_GEOMCOLLFROMTXT
ST_GEOMCOLLFROMWKB
ST_GEOMETRYCOLLECTIONFROMTEXT
ST_GEOMETRYCOLLECTIONFROMWKB
ST_GEOMETRYFROMTEXT
ST_GEOMETRYFROMWKB
ST_GEOMETRYN
ST_GEOMETRYTYPE
ST_GEOMFROMGEOJSON
ST_GEOMFROMTEXT
ST_GEOMFROMWKB
ST_INTERIORRINGN
ST_INTERSECTION
ST_INTERSECTS
ST_ISCLOSED
ST_ISEMPTY
ST_ISSIMPLE
ST_ISVALID
ST_LATFROMGEOHASH
ST_LATITUDE
ST_LENGTH
ST_LINEFROMTEXT
ST_LINEFROMWKB
ST_LINESTRINGFROMTEXT
ST_LINESTRINGFROMWKB
ST_LONGFROMGEOHASH
ST_LONGITUDE
ST_MAKEENVELOPE
ST_MLINEFROMTEXT
ST_MLINEFROMWKB
ST_MPOINTFROMTEXT
ST_MPOINTFROMWKB
ST_MPOLYFROMTEXT
ST_MPOLYFROMWKB
ST_MULTILINESTRINGFROMTEXT
ST_MULTILINESTRINGFROMWKB
ST_MULTIPOINTFROMTEXT
ST_MULTIPOINTFROMWKB
ST_MULTIPOLYGONFROMTEXT
ST_MULTIPOLYGONFROMWKB
ST_NUMGEOMETRIES
ST_NUMINTERIORRING
ST_NUMINTERIORRINGS
ST_NUMPOINTS
ST_OVERLAPS
ST_POINTFROMGEOHASH
ST_POINTFROMTEXT
ST_POINTFROMWKB
ST_POINTN
ST_POLYFROMTEXT
ST_POLYFROMWKB
ST_POLYGONFROMTEXT
ST_POLYGONFROMWKB
STRCMP
STR_TO_DATE
ST_SIMPLIFY
ST_SRID
ST_STARTPOINT
ST_SWAPXY
ST_SYMDIFFERENCE
ST_TOUCHES
ST_TRANSFORM
ST_UNION
ST_VALIDATE
ST_WITHIN
ST_X
ST_Y
SUBSTRING_INDEX
SUBTIME
TIMEDIFF
TIME_FORMAT
TIME_TO_SEC
TO_BASE64
TO_DAYS
TO_SECONDS
UCASE
UNCOMPRESS
UNCOMPRESSED_LENGTH
UNHEX
UNIX_TIMESTAMP
UPDATEXML
UUID
UUID_SHORT
UUID_TO_BIN
VALIDATE_PASSWORD_STRENGTH
WAIT_FOR_EXECUTED_GTID_SET
WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS
WEEKDAY
WEEKOFYEAR
YEARWEEK
(233 rows)
运算符的兼容性
mysql的SQL标准的运算符在昆仑数据库中都已经完全支持;剩余少数mysql私有扩展的运算符会在未来支持,具体包括(相信大多数人甚至不知道mysql还有这些运算符):
- 逻辑运算符 &&,||, !,XOR
- 比较运算符 <=> , A<=>B 意思是 A IS NOT DISTINCT FROM B
- 位运算符 ^ , 即bitwise XOR
- 算数运算符 DIV 和 MOD
- 赋值运算符 := 大家通常很少用这个而是使用 =
最后,还需要解析mysql特有的comment(注释)并直接忽略它们,这样用户通过mysqldump 做的备份就可以直接导入到昆仑数据库。同时,设置全局和session用户变量的语句将会支持,由于postgresql的设置变量的语句语法与mysql的相同,所以需要设法正确区分开来。
另外,有些mysql特有功能的语法,比如replication相关的语法,show命令等是不支持的,所以DBA需要连接昆仑数据库的存储节点来做mysql数据库节点的日常运维管理工作。这类功能几乎都是应用软件开发者完全不需要直接操作的功能。
其他RDBMS的兼容性
如果用户原来使用SQL server或者oracle server等其他关系数据库,那么用户可以通过jdbc和odbc协议连接昆仑数据库系统,然后使用标准的sql语法来操作和访问昆仑数据库。这样,用户使用的sql server和oracle server的所有SQL标准功能都可以正常工作。对于sql server和oracle server的私有扩展功能,则需要用户修改应用程序的sql语句,改为使用标准的sql功能,或者昆仑数据库支持的postgresql 功能扩展。
DBA和运维的日常运维工作
对于DBA和运维人员来说,昆仑数据库的计算节点只需要非常少量的维护工作,主要包括:
- 创建和删除计算节点实例
- 手动和自动启停计算节点实例
- 定期调用自带工具备份数据
- 使用备份数据创建计算节点实例
- 节点运行日志文件的收集归档以备分析
这些操作都可以完全脚本自动化完成。
并且由于昆仑数据库的“自动DDL”功能,DBA并不需要繁重的工作来维护计算节点和存储节点的元数据的映射,数据类型转换,以及元数据做所有节点上的统一和一致 — 这些重复劳动已经由昆仑数据库系统自动完成了。
另外,DBA对于存储节点的日常维护,完全等同与维护通用的mysql节点和复制集群,工作内容和方法完全相同。
推荐阅读
KunlunBase架构介绍
KunlunBase技术优势介绍
KunlunBase技术特点介绍
KunlunBase集群基本概念介绍
END
昆仑数据库是一个HTAP NewSQL分布式数据库管理系统,可以满足用户对海量关系数据的存储管理和利用的全方位需求。
应用开发者和DBA的使用昆仑数据库的体验与单机MySQL和单机PostgreSQL几乎完全相同,因为首先昆仑数据库支持PostgreSQL和MySQL双协议,支持标准SQL:2011的 DML 语法和功能以及PostgreSQL和MySQL对标准 SQL的扩展。同时,昆仑数据库集群支持水平弹性扩容,数据自动拆分,分布式事务处理和分布式查询处理,健壮的容错容灾能力,完善直观的监测分析告警能力,集群数据备份和恢复等 常用的DBA 数据管理和操作。所有这些功能无需任何应用系统侧的编码工作,也无需DBA人工介入,不停服不影响业务正常运行。
昆仑数据库具备全面的OLAP 数据分析能力,通过了TPC-H和TPC-DS标准测试集,可以实时分析最新的业务数据,帮助用户发掘出数据的价值。昆仑数据库支持公有云和私有云环境的部署,可以与docker,k8s等云基础设施无缝协作,可以轻松搭建云数据库服务。
请访问 http://www.kunlunbase.com/ 获取更多信息并且下载昆仑数据库软件、文档和资料。
KunlunBase项目已开源
【GitHub:】
https://github.com/zettadb
【Gitee:】
https://gitee.com/zettadb




