十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
1、如果用ROSE之类的双机系统做双机冗余,涉及到的进程监视点调试极其麻烦,不是资深的原厂认证工程师根本就搞不定,对于可靠性上来说倒是绝对满足没有问题,但可维护性来说实在是件要命的事。
网站建设哪家好,找创新互联!专注于网页设计、网站建设、微信开发、小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了金华免费建站欢迎大家使用!
2、你可以考虑用VMWARE ESX做双机集群,然后把POSTGRESQL的WIN2K3虚拟机放在双机集群上,做虚拟机进程的动态漂移,这根本就不需要去针对进程监视做那一大堆的调试,当集群里一台服务器DOWN掉的时候,而且还要恰好你的应用虚拟机进程现在就跑在DOWN掉的这台上,那么在1秒内会动态漂到另一台并行的服务器上,几乎是无缝的,但在管理机的VSPHARE上可以实时看到,我认为这个方案比传统双机要好得多,而且ESX也不贵,调试比双机冗余来得简单,网上还有大堆的破解。
PostgreSQL 是一种非常复杂的对象-关系型数据库管理系统(ORDBMS), 也是目前功能最强大,特性最丰富和最复杂的自由软件数据库系统。有些特性甚至连商业数据库都不具备。这个起源于伯克利(BSD)的数据库研究计划目前已经衍生成一项国际开发项目, 并且有非常广泛的用户。
PostgreSQL 可以说是最富特色的自由数据库管理系统,甚至我们也可以说是最强大的自由软件数据库管理系统。事实上, PostgreSQL 的特性覆盖了 SQL-2/SQL-92 和 SQL-3/SQL-99,首先,它包括了可以说是目前世界上最丰富的数据类型的支持,其中有些数据类型可以说连商业数据库都不具备, 比如 IP 类型和几何类型等;其次,PostgreSQL 是全功能的自由软件数据库,很长时间以来,PostgreSQL 是唯一支持事务、子查询、多版本并行控制系统、数据完整性检查等特性的唯一的一种自由软件的数据库管理系统。直到最近才有 Inprise 的 InterBase 以及 SAP 等厂商将其原先专有软件开放为自由软件之后才打破了这个唯一。
2021年5月20日。Postgrespro是俄罗斯著名的数据库公司,旗下主要产品基于PostgreSQL。近期发布了一本新书PostgreSQL 14 Internals。postgresql 14 正式版,pg14在2021年5月20日正式发布。postgresql 14 增加了许多并行查询功能,还增加了使用FDW查询远程数据库时的并行执行功能。
优点事实上, PostgreSQL 的特性覆盖了 SQL-2/SQL-92 和 SQL-3/SQL-99,首先,它包括了可以说是目前世界上最丰富的数据类型的支持,其中有些数据类型可以说连商业数据库都不具备, 比如 IP 类型和几何类型等;其次,PostgreSQL 是全功能的自由软件数据库,很长时间以来,PostgreSQL 是唯一支持事务、子查询、多版本并行控制系统、数据完整性检查等特性的唯一的一种自由软件的数据库管理系统。直到最近才有 Inprise 的 InterBase 以及 SAP 等厂商将其原先专有软件开放为自由软件之后才打破了这个唯一。最后,PostgreSQL拥有一支非常活跃的开发队伍,而且在许多黑客的努力下,PostgreSQL 的质量日益提高。
从技术角度来讲,PostgreSQL 采用的是比较经典的 C/S (client/server)结构,也就是一个客户端对应一个服务器端守护进程的模式,这个守护进程分析客户端来的查询请求,生成规划树,进行数据检索并最终把结果格式化输出后返回给客户端。为了便于客户端的程序的编写,由数据库服务器提供了统一的客户端 C 接口。而不同的客户端接口都是源自这个 C 接口,比如 ODBC,JDBC,Python,Perl ,Tcl,C/C++,ESQL 等, 同时也要指出的是,PostgreSQL 对接口的支持也是非常丰富的,几乎支持所有类型的数据库客户端接口。这一点也可以说是 PostgreSQL 一大优点。
缺点
从 Postgres 开始,PostgreSQL 就经受了多次变化。
首先,早期的 PostgreSQL 继承了几乎所有 Ingres, Postgres, Postgres95 的问题:过于学院味,因为首先它的目的是数据库研究,因此不论在稳定性, 性能还是使用方便方面,长期以来一直没有得到重视,直到 PostgreSQL 项目开始以后,情况才越来越好,目前,PostgreSQL 已经完全可以胜任任何中上规模范围内的应用范围的业务。目前有报道的生产数据库的大小已经有 TB 级的数据量,已经逼近 32 位计算的极限。不过学院味也给 PostgreSQL 带来一个意想不到的好处:大概因为各大学的软硬件环境差异太大的缘故,它是目前支持平台最多的数据库管理系统的一种,所支持的平台多达十几种,包括不同的系统,不同的硬件体系。至今,它仍然保持着支持平台最多的数据库管理系统的称号。
其次,PostgreSQL 的确还欠缺一些比较高端的数据库管理系统需要的特性,比如数据库集群,更优良的管理工具和更加自动化的系统优化功能 等提高数据库性能的机制等。
green plum是MPP数据库的一种,是一种分布式数据库,支持SQL和MapReduce的并行处理功能,并能以较低的成本向管理最大PB量级数据的企业提供业界领先的性能;
PostgreSQL 是一个自由的对象-关系数据库服务器(数据库管理系统),它在灵活的 BSD-风格许可证下发行。
PostgreSQL可以用于C/S(客户/服务器)环境。greenplum数据库支持postgresql。
sysbench原来自带的lua数据装载脚本是使用以下方式串行装载的,速度比较慢(比单条insert快,但是比COPY慢)。
insert into table1 values (),(),()....
insert into table2 values (),(),()....
...
insert into tablen values (),(),()....
使用prepare导入数据的用法举例
./sysbench_pg --test=lua/oltp.lua --db-driver=pgsql --pgsql-host=127.0.0.1 --pgsql-port=1921 --pgsql-user=postgres --pgsql-password=postgres --pgsql-db=postgres --oltp-tables-count=64 --oltp-table-size=1000000 --num-threads=64 prepare
prepare 表示装载数据,但是它串行的。
sysbench0.5中可以在命令行中指定测试时启动的并行线程数,这个测试过程是使用run命令,而且是多线程并发的,所以我们可以使用sysbench的run命令来造数据,而不再使用其提供的prepare命令的方法来造数据。run命令会根据命令行参数--num-threads来指定并发线程数的多少。
在sysbench中自定义的lua脚本中要求实现以下几个函数:
function thread_init(thread_id): 此函数在线程创建后只被执行一次
function event(thread_id): 每执行一次就会被调用一次。
由上可以知道,本次造数据的脚本我们只需要实现thread_init()函数就可以了。
生成测试数据的脚本沿用老唐提供的代码:
#include stdio.h
#include stdlib.h
#include time.h
#include stdint.h
#include sys/time.h
uint64_t my_rand(struct random_data * r1, struct random_data * r2)
{
uint64_t rand_max = 100000000000LL;
uint64_t result;
uint32_t u1, u2;
random_r(r1, u1);
random_r(r2, u2);
result = (int64_t)u1 * (int64_t)u2;
result = result % rand_max;
return result;
}
int main(int argc, char *argv[])
{
struct timeval tpstart;
struct random_data r1, r2;
int i;
int r;
int max_value;
char rand_state1[128];
char rand_state2[128];
if (argc !=2)
{
printf("Usage: %s rownums\n", argv[0]);
return 1;
}
max_value = atoi(argv[1]);
gettimeofday(tpstart,NULL);
initstate_r(tpstart.tv_usec,rand_state1,sizeof(rand_state1),r1);
srandom_r(tpstart.tv_usec, r1);
gettimeofday(tpstart,NULL);
initstate_r(tpstart.tv_usec,rand_state2,sizeof(rand_state1),r2);
srandom_r(tpstart.tv_usec, r2);
for (i=1; imax_value+1; i++)
{
r = my_rand(r1, r2) % max_value;
printf("%d,%d,%011llu-%011llu-%011llu-%011llu-%011llu-%011llu-%011llu-%011llu-%011llu-%011llu,%011llu-%011llu-%011llu-%011llu-%011llu\n",
i,
r,
my_rand(r1, r2),
my_rand(r1, r2),
my_rand(r1, r2),
my_rand(r1, r2),
my_rand(r1, r2),
my_rand(r1, r2),
my_rand(r1, r2),
my_rand(r1, r2),
my_rand(r1, r2),
my_rand(r1, r2),
my_rand(r1, r2),
my_rand(r1, r2),
my_rand(r1, r2),
my_rand(r1, r2),
my_rand(r1, r2)
);
}
return 0;
}
编译此C语言程序的方法如下:
gcc gendata.c -o gendata
新建一个copy.lua的脚本,内容如下
调用 common.lua中的 set_vars() 继承来自 common.lua 的全局变量。
函数 copydata(table_id) : 创建表,创建管道,将管道数据传输到psql -c "copy ..."客户端的方式导入数据。
函数 create_index(table_id) : 创建索引,调整SEQUENCE next val。
注意咯, oltp_tables_count 必须是 num_threads 的倍数,在 thread_init 中, 以num_threads 为步调,以thread_id+1为起始值,设置i的值,并调用copydata(table_id)和create_index(table_id)。
$ vi lua/copy.lua
pathtest = string.match(test, "(.*/)") or ""
dofile(pathtest .. "common.lua")
function copydata(table_id)
local query
query = [[
CREATE UNLOGGED TABLE sbtest]] .. table_id .. [[ (
id SERIAL NOT NULL,
k INTEGER,
c CHAR(120) DEFAULT '' NOT NULL,
pad CHAR(60) DEFAULT '' NOT NULL,
PRIMARY KEY (id)
) ]]
db_query(query)
os.execute ('export PGPASSWORD=' .. pgsql_password)
os.execute ('rm -f sbtest' .. table_id .. '.dat')
os.execute ('mknod sbtest' .. table_id .. '.dat p')
os.execute ('./gendata ' .. oltp_table_size .. ' sbtest'..table_id ..'.dat ')
os.execute ('cat sbtest' .. table_id .. '.dat | psql -h ' .. pgsql_host .. ' -p ' .. pgsql_port .. ' -U ' .. pgsql_user .. ' -d ' .. pgsql_db .. ' -c "copy sbtest' .. table_id .. ' from stdin with csv"')
os.execute ('rm -f sbtest' .. table_id .. '.dat')
end
function create_index(table_id)
db_query("select setval('sbtest" .. table_id .. "_id_seq', " .. (oltp_table_size+1) .. ")" )
db_query("CREATE INDEX k_" .. table_id .. " on sbtest" .. table_id .. "(k)")
end
function thread_init(thread_id)
set_vars()
print("thread prepare"..thread_id)
for i=thread_id+1, oltp_tables_count, num_threads do
copydata(i)
create_index(i)
end
end
function event(thread_id)
os.exit()
end
用法,必须把psql放到路径中,因为lua中需要用到psql命令
export PATH=/home/digoal/pgsql9.5/bin:$PATH
生成数据,速度比以前快多了
./sysbench_pg --test=lua/copy.lua \
--db-driver=pgsql \
--pgsql-host=127.0.0.1 \
--pgsql-port=1921 \
--pgsql-user=postgres \
--pgsql-password=postgres \
--pgsql-db=postgres \
--oltp-tables-count=64 \
--oltp-table-size=1000000 \
--num-threads=64 \
run
清除数据, drop table
./sysbench_pg --test=lua/copy.lua \
--db-driver=pgsql \
--pgsql-host=127.0.0.1 \
--pgsql-port=1921 \
--pgsql-user=postgres \
--pgsql-password=postgres \
--pgsql-db=postgres \
--oltp-tables-count=64 \
--oltp-table-size=1000000 \
--num-threads=64 \
cleanup
lua全局变量代码:
sysbench/scripting/lua/src/lua.h:#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n)))
sysbench/scripting/lua/src/lua.h:#define lua_setglobal(L,s) lua_setfield(L, LUA_GLOBALSINDEX, (s))
sysbench/scripting/lua/src/lbaselib.c: lua_setglobal(L, "_G");
sysbench/scripting/lua/src/lbaselib.c: lua_setglobal(L, "_VERSION"); /* set global _VERSION */
sysbench/scripting/lua/src/lbaselib.c: lua_setglobal(L, "newproxy"); /* set global `newproxy' */
sysbench/scripting/script_lua.c: lua_setglobal(state, opt-name);
sysbench/scripting/script_lua.c: lua_setglobal(state, "sb_rand");
sysbench/scripting/script_lua.c: lua_setglobal(state, "sb_rand_uniq");
sysbench/scripting/script_lua.c: lua_setglobal(state, "sb_rnd");
sysbench/scripting/script_lua.c: lua_setglobal(state, "sb_rand_str");
sysbench/scripting/script_lua.c: lua_setglobal(state, "sb_rand_uniform");
sysbench/scripting/script_lua.c: lua_setglobal(state, "sb_rand_gaussian");
sysbench/scripting/script_lua.c: lua_setglobal(state, "sb_rand_special");
sysbench/scripting/script_lua.c: lua_setglobal(state, "db_connect");
sysbench/scripting/script_lua.c: lua_setglobal(state, "db_disconnect");
sysbench/scripting/script_lua.c: lua_setglobal(state, "db_query");
sysbench/scripting/script_lua.c: lua_setglobal(state, "db_bulk_insert_init");
sysbench/scripting/script_lua.c: lua_setglobal(state, "db_bulk_insert_next");
sysbench/scripting/script_lua.c: lua_setglobal(state, "db_bulk_insert_done");
sysbench/scripting/script_lua.c: lua_setglobal(state, "db_prepare");
sysbench/scripting/script_lua.c: lua_setglobal(state, "db_bind_param");
sysbench/scripting/script_lua.c: lua_setglobal(state, "db_bind_result");
sysbench/scripting/script_lua.c: lua_setglobal(state, "db_execute");
sysbench/scripting/script_lua.c: lua_setglobal(state, "db_close");
sysbench/scripting/script_lua.c: lua_setglobal(state, "db_store_results");
sysbench/scripting/script_lua.c: lua_setglobal(state, "db_free_results");
sysbench/scripting/script_lua.c: lua_setglobal(state, "DB_ERROR_NONE");
sysbench/scripting/script_lua.c: lua_setglobal(state, "DB_ERROR_DEADLOCK");
sysbench/scripting/script_lua.c: lua_setglobal(state, "DB_ERROR_FAILED");
sysbench/scripting/script_lua.c: lua_setglobal(L, "db_driver");
传入参数,可以把sysbench_pg的参数-替换成_在lua脚本中使用这些变量,例子
--pgsql-host=127.0.0.1 - 对应lua中的变量名 pgsql_host
--pgsql-port=1921 - 对应lua中的变量名 pgsql_port
--pgsql-user=postgres - 对应lua中的变量名 pgsql_user
--pgsql-password=postgres - 对应lua中的变量名 pgsql_password
--pgsql-db=postgres - 对应lua中的变量名 pgsql_db
--oltp-tables-count=64 - 对应lua中的变量名 oltp_tables_count
--oltp-table-size=1000000 - 对应lua中的变量名 oltp_table_size
--num-threads=64 - 对应lua中的变量名 num_threads