NoSQL 数据库的分布式算法

Distributed Algorithms in NoSQL Databases 

 

Scalability is one of the main drivers of the NoSQL movement. As such, it encompasses distributed system coordination, failover, resource management and many other capabilities. It sounds like a big umbrella, and it is. Although it can hardly be said that NoSQL movement brought fundamentally new techniques into distributed data processing, it triggered an avalanche of practical studies and real-life trials of different combinations of protocols and algorithms. These developments gradually highlight a system of relevant database building blocks with proven practical efficiency. In this article I’m trying to provide more or less systematic description of techniques related to distributed operations in NoSQL databases.

In the rest of this article we study a number of distributed activities like replication of failure detection that could happen in a database. These activities, highlighted in bold below, are grouped into three major sections:

  • Data Consistency. Historically, NoSQL paid a lot of attention to tradeoffs between consistency, fault-tolerance and performance to serve geographically distributed systems, low-latency or highly available applications. Fundamentally, these tradeoffs spin around data consistency, so this section is devoted?data replication?and?data repair.
  • Data Placement. A database should accommodate itself to different data distributions, cluster topologies and hardware configurations. In this section we discuss how todistribute or rebalance data?in such a way that failures are handled rapidly, persistence guarantees are maintained, queries are efficient, and system resource like RAM or disk space are used evenly throughout the cluster.
  • System Coordination. Coordination techniques like?leader election?are used in many databases to implements fault-tolerance and strong data consistency. However, even decentralized databases typically track their global state,?detect failures and topology changes. This section describes several important techniques that are used to keep the system in a coherent state.

继续阅读“NoSQL 数据库的分布式算法”

读书

读书的好处与不读书的区别,一句话就能表达:

一日不读书,无人看得出;一周不读书,开始会爆粗;一月不读书,智商输给猪。

最近看书时间少了,发现要认真坐下来看书的时间真是太少了,都是一些很碎片的时间。所以现在和以前反过来了,以前总是喜欢看纸质的书,觉得电子书看不下去。现在,要认认真真坐那看书,是真心坐不住。发现这个看书少这个事情以后,心急了,纸质书花钱太多,有些书国内还买不到,手机看又屏幕太小,于是赶紧给自己买了个iPad,把自己的碎片时间给利用了起来。

最近又读了好些书,最终觉得还是电子书好,里面可以放好多书,一本看不下,不用起来就可以换另外一本,可以任意注释,重新打开会从上次看的那一页开始,对于一些不认识的单词,按住就能有解释。

前几天试图看纸质书,反而不习惯了,看纸质书的习惯的力量没有想象中那么大,科技确实在改变着生活,改变着买一个人。

看书,是走进另外一个人的思想,与智者进行心灵的交流,真是一种很享受的感觉。所以读书,选择书很重要,话说如果当初老毛不是选择看二十四史之类的所谓帝王治国之道,而是看些国外的民主政治学等等文章,说不定中国又会走向另外的道路。

 

信息孤岛

“信息孤岛” (The information isolated island ),听着挺专业的一个词,前些天我就遇上了这个场景。查资料的时候无意中发现一个产品,对我们部门的一个同类产品有借鉴的意义,略微看了一下便发了邮件分享给大家。邮件发完后几分钟以后就有人回了邮件

晕,这个就是我们现在用的啊,XX的产品。。。。。。。

自家产品不认识,是有些尴尬。这是个饭后的谈资但更是所谓信息孤岛的一个典型案例。每个人的知识和能力是有限的,每个个体都是一个“知识孤岛”,通过团队沟通,交流,团队间可能会组成一个“知识群岛”,如果有更好的知识协助和知识管理的方法,则有可能形成一个“知识大陆”。

目前知识管理系统 KMS (knowledge management system)有很多,我从一年前开始就不断试用了业界的各种KMS软件尝试找到一款适合的KMS软件。但是很多像sharepoint之类的KMS注重的是管理,而我觉得KMS的精髓在于知识的分享。分享知识的奇妙之处正在于,越分享,知识越是增值。

 

我理想中的KMS软件有以下特点:

  1. KMS必须是每个人都可以维护,更新,发布的。才能确保KMS的生命力。对于文中的错误,任何能都能直接修改,并保存。通过保存多版本来保证不被恶意修改。类似百度百科,互动百科,wikipedia。
  2. 便于编辑,最好是所见即所得的编辑方式,不需要如wikipedia一样掌握新的语法。类似博客。
  3. 在编辑时能直接粘贴Word等还保持原始格式。类似织梦CMS。
  4. 上传的pdf,ppt,word,excel等附件能在web直接展示,而不需要下载附件打开后才能看到。类似slideshare。
  5. 必须提供全文检索功能 。类似google
  6. 提供良好的上传下载功能。类似dropbox,百度云等等。
  7. 要有积分,等级制度,让分享多的人有成就感。

理想要求太多,结果是一直没有找到一个能满足所有要求的软件来进行知识管理和分享。但是根据我的经验来讲,缺少其中任何一个功能,都无法进行有效的知识分享。

写到这,想想我是不是应该开发这个理想的产品。因为市场上没有这样的产品,而大家又有这样的强烈需求。而开发的时候自己的需求才是最好的需求,不需要访谈任何人,不需要到处征求意见,能让自己,让团队爱不释手的产品就是一个真正吸引人的产品。

 

 

 

杂谈:未来的路

人的一生很短暂,算算只有短短几万天,所以人最宝贵的财富是时间,相同的时间里如何才能达到功用最大化(maximization of utility) ,那选择走什么样的路,做什么样的事,就必须细心考量了。

功用最大化做到了么,其实想想就知道,没有!不管是我,或者是我身边很多的同事。其实我们都可以做的更好,好很多。我很身边有很多很优秀的人一样,埋在琐事中一天一天浪费着时间和才华,现在回头想想觉得很可惜。勤奋,认真,用心的做事情很重要,但是就像现代管理学之父彼得·德鲁克(Peter Drucker)曾在他的著作《论管理》(On the Profession ofManagement)中说:

没什么比高效地做一件根本不该做的事更加徒劳的了。

所以更重要的是选择做正确的事情。只有正确的事才能让你做到功用最大化。

那我们是要马上辞职,换个平台?对员工辞职,马云说的挺到位

员工的离职原因林林总总,只有两点最真实:1、钱,没给到位;2、心,委屈了。这些归根到底就一条:干得不爽。员工临走还费尽心思找靠谱的理由,就是为给你留面子,不想说穿你的管理有多烂、他对你已失望透顶。 仔细想想,真是人性本善。作为管理者,定要乐于反省。

按照马斯洛需求层次理论,人的需求分为五种,像阶梯一样从低到高,按层次逐级递升,分别为:生理上的需求,安全上的需求,情感和归属的需求,尊重的需求,自我实现的需求。

画大饼可以,满足了员工自我实现的需求。但是生活中终究是现实的,没有底层的支撑,那终究不会长久。所以大家崇拜的好公司很重要的特点,就是满足了马云说的亮点,钱给够了,心不委屈了。一项委屈了,那还能撑一撑。两个都委屈了,那就只能走人了。

那未来走什么样的路?我们都说失败是成功之母,或者说learn to fail。但是从失败中学习我们只是知道某一条路会失败,但是仍然没有找到正确的路。所以更应该学习的是成功,向最成功的行业的顶尖学习。现在所作的这种软件实施,外包行业,我不知道在全国,或者世界范围内哪家是最成功的。可以做到如同文思海辉那般好几万人。但是这种几万人的公司又如何?拿着可怜的利润,微薄的薪资福利。其实这种软件实施,外包的行业大家都过得很辛苦,所以你说实施行业要留人,涨薪涨不起,那就只能靠画大饼了。都说老大们爱画饼,我真的很理解。

所以我曾经想我不再做实施了,做实施的出路在哪里,还真没看到,老大们过着的生活也不是我想要的。

所以就像刚才说的那样,要向成功者学习。反观现在成功的公司在做什么,都是在做产品,微软不是在为每个人定制软件,谷歌也不是在做提数。做产品意味着可持续,可复制的成功。发达的互联网环境和日渐完善的网上支付体系,意味着不再需要向传统产品一样耗费大量资源进行渠道部署,甚至不再需要传统渠道。的出现。

想改行去做产品,而不是实施行业这种拼人力的苦B现状。退一万步讲,即便还做不了产品,想想这么累,经济压力有那么大,那还真不如去外企,至少人家钱也给的比较足,出差还住着四五星的宾馆,两周还能回家一趟,家庭矛盾也不会这么大。

说了半天,其实就是一句话!只有心里有梦,就一定会成功!

使用ORACLE GATEWAY 与Greenplum HAWQ 1.0 互通

现场环境:Oracle 11g 64bit linux edition

Greenplum Pivotal HD HAWQ 1.0

操作系统 RHEL 6.3 x86_64

为了实现在Oracle中直接访问HAWQ中的数据,需要首先安装Oracle Gateway 11g x86_64 linux edition

 

需要安装的软件:Oracle Gateway 11g x86_64 linux edition

DATADIRECT_CONNECT64_ODBC_7.0.1for Greenplum (必须是7版本的,6的不行,rhel6带的unixodbc也不行)

 

( 后记,Oracle 11g database server 中貌似也带了hs的功能,直接使用database server 当gateway应也可,不用再单独安装gateway)

安装路径: Oracle Gateway:/home/oracle/product/11.2.0/tg_1

Datadirect ODBC :/home/oracle/ddodbc

Oracle database :/home/oracle/app/oracle/product/11.2.0/dbhome_1

 

配置:

修改/home/oracle/product/11.2.0/tg_1/hs/admin/initdg4odbc.ora

# This is a sample agent init file that contains the HS parameters that are
# needed for the Database Gateway for ODBC
#
# HS init parameters
#
HS_FDS_CONNECT_INFO = Greenplum
#HS_FDS_TRACE_LEVEL = 0
HS_FDS_TRACE_LEVEL= ODBC
HS_FDS_TRACE_FILE_NAME = /home/oracle/odbc_trace.log
HS_FDS_SHAREABLE_NAME = /usr/lib64/libodbc.so
HS_FDS_SUPPORT_STATISTICS = FALSE
#HS_LANGUAGE=AMERICAN_AMERICA.WE8ISO8859P1
HS_LANGUAGE = AMERICAN_AMERICA.UTF8
HS_FDS_TIMESTAMP_MAPPING = “TIMESTAMP(6)”
HS_FDS_FETCH_ROWS=1
#HS_FDS_SQLLEN_INTERPRETATION=32
HS_KEEP_REMOTE_COLUMN_SIZE=LOCAL
HS_NLS_NCHAR = UCS2
#
# ODBC specific environment variables
#
set ODBCINI=/etc/odbc.ini
set ODBCINST=/etc/odbcinst.ini

修改/home/oracle/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora

备注,此处直接使用database的listener。未使用gateway的listener ,在文件后追加:

SID_LIST_LISTENER =
        (SID_LIST =
                (SID_DESC =
                        (SID_NAME = dg4odbc)
                        (ORACLE_HOME =/home/oracle/product/11.2.0/tg_1 )
                        (ENV=”LD_LIBRARY_PATH=/usr/local/lib:/home/oracle/product/11.2.0/tg_1/lib:/home/oracle/ddodbc/lib”)
                        (PROGRAM = dg4odbc)
                )
        )
)
修改/home/oracle/app/oracle/product/11.2.0/dbhome_1/network/admin/tnsnames.ora
增加:
dg4odbc  =
  (DESCRIPTION=
    (ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))
    (CONNECT_DATA=(SID=dg4odbc))
    (HS=OK)
  )
修改/etc/odbc.ini
[[email protected] admin]$ cat /etc/odbc.ini
[ODBC Data Sources]
Greenplum=Greenplum
[ODBC Data Sources]
Greenplum Wire Protocol=DataDirect 7.0 Greenplum Wire Protocol
[ODBC]
IANAAppCodePage=4
InstallDir=/home/oracle/ddodbc
Trace=0
TraceFile=odbctrace.out
TraceDll=/home/oracle/ddodbc/lib/ddtrc26.so
[Greenplum]
Driver=/home/oracle/ddodbc/lib/ddgplm26.so
Description=DataDirect 7.0 Greenplum Wire Protocol
AlternateServers=
ApplicationUsingThreads=1
ConnectionReset=0
ConnectionRetryCount=0
ConnectionRetryDelay=3
Database=haier
DefaultLongDataBuffLen=2048
EnableDescribeParam=0
EnableKeysetCursors=0
EncryptionMethod=0
ExtendedColumnMetadata=0
FailoverGranularity=0
FailoverMode=0
FailoverPreconnect=0
FetchTSWTZasTimestamp=0
FetchTWFSasTime=0
HostName=server3
InitializationString=
KeyPassword=
KeysetCursorOptions=0
KeyStore=
KeyStorePassword=
LoadBalanceTimeout=0
LoadBalancing=0
LoginTimeout=15
LogonID=
MaxPoolSize=100
MinPoolSize=0
Password=
Pooling=0
PortNumber=54321
QueryTimeout=0
ReportCodepageConversionErrors=0
TransactionErrorBehavior=1
XMLDescribeType=-10
Charset=utf8
[ODBC]
TraceFile=/tmp/sql.log
Trace=1

 

 

修改/etc/odbcinst.ini

[ODBC Drivers]
DataDirect 7.0 Greenplum Wire Protocol=Installed
[ODBC Translators]
OEM to ANSI=Installed
[Administrator]
HelpRootDirectory=/home/oracle/ddodbc/adminhelp
[ODBC]
#This section must contain values for DSN-less connections
#if no odbc.ini file exists. If an odbc.ini file exists,
#the values from that [ODBC] section are used.
[DataDirect 7.0 Greenplum Wire Protocol]
Driver=/home/oracle/ddodbc/lib/ddgplm26.so
Setup=/home/oracle/ddodbc/lib/ddgplm26.so
APILevel=0
ConnectFunctions=YYY
DriverODBCVer=3.52
FileUsage=0
HelpRootDirectory=/home/oracle/ddodbc/help
SQLLevel=0

 

重启listener

lsnrctl status 中应有一下内容:

Listening Endpoints Summary…
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=server3)(PORT=1521)))
Services Summary…
Service “dg4odbc” has 1 instance(s).
  Instance “dg4odbc”, status UNKNOWN, has 1 handler(s) for this service…
而后在数据库中创建dblink,注意用户名和密码需要使用双引号

create database link DBLINK
connect to “gpadmin” identified by “gpadmin”
using ‘dg4odbc’;

执行sql语句即可返回成功(注意HAWQ中的表名和字段名需要使用双引号,用小写表示):

select count(*) from “poc1″@dblink;