Zookeeper介绍

一、ZooKeeper的背景

1.1 认识ZooKeeper

ZooKeeper—译名为“动物园管理员”。动物园里当然有好多的动物,游客可以根据动物园提供的向导图到不同的场馆观赏各种类型的动物,而不是像走在原始丛林里,心惊胆颤的被动 物所观赏。为了让各种不同的动物呆在它们应该呆的地方,而不是相互串门,或是相互厮杀,就需要动物园管理员按照动物的各种习性加以分类和管理,这样我们才能更加放心安全的观赏动物。

回到企业级应用系统中,随着信息化水平的不断提高,企业级系统变得越来越庞大臃肿,性能急剧下降,客户抱怨频频。拆分系统是目前我们可选择的解决系统可伸缩性和性能问题的唯一行之有效的方法。但是拆分系统同时也带来了系统的复杂性——各子系统不是孤立存在的,它们彼此之间需要协作和交互,这就是我们常说的分布式系统0。各个子系统就好比动物园里的动物,为了使各个子系统能正常为用户提供统一的服务,必须需要一种机制来进行协调——这就是ZooKeeper(动物园管理员)。

 

1.2 为什么使用ZooKeeper

我们知道要写一个分布式应用是非常困难的,主要原因就是局部故障。一个消息通过网络在两个节点之间传递时,网络如果发生故障,发送方并不知道接收方是否接收到了这个消息。他可能在网络故障迁就收到了此消息,也坑没有收到,又或者可能接收方的进程死了。发送方了解情况的唯一方法就是再次连接发送方,并向他进行询问。这就是局部故障:根本不知道操作是否失败。因此,大部分分布式应用需要一个主控、协调控制器来管理物理分布的子进程。目前,大部分应用需要开发私有的协调程序,缺乏一个通用的机制。协调程序的反复编写浪费,且难以形成通用、伸缩性好的协调器。协调服务非常容易出错,并很难从故障中恢复。例如:协调服务很容易处于竞态1甚至死锁2。Zookeeper的设计目的,是为了减轻分布式应用程序所承担的协调任务。

Zookeeper并不能阻止局部故障的发生,因为它们的本质是分布式系统。他当然也不会隐藏局部故障。ZooKeeper的目的就是提供一些工具集,用来建立安全处理局部故障的分布式应用。

ZooKeeper是一个分布式小文件系统,并且被设计为高可用性。通过选举算法和集群复制可以避免单点故障3,由于是文件系统,所以即使所有的ZooKeeper节点全部挂掉,数据也不会丢失,重启服务器之后,数据即可恢复。另外ZooKeeper的节点更新是原子的,也就是说更新不是成功就是失败。通过版本号,ZooKeeper实现了更新的乐观锁4,当版本号不相符时,则表示待更新的节点已经被其他客户端提前更新了,而当前的整个更新操作将全部失败。当然所有的一切ZooKeeper已经为开发者提供了保障,我们需要做的只是调用API。与此同时,随着分布式应用的的不断深入,需要对集群管理逐步透明化监控集群和作业状态,可以充分利ZK的独有特性。

 

1.3 ZooKeeper的应用 

ZooKeeper本质上是一个分布式的小文件存储系统。原本是Apache Hadoop的一个组件,现在被拆分为一个Hadoop的独立子项目,在HBase(Hadoop的另外一个被拆分出来的子项目,用于分布式环境下的超大数据量的DBMS)中也用到了ZooKeeper集群。 

Hadoop,使用Zookeeper的事件处理确保整个集群只有一个NameNode,存储配置信息等.
HBase,使用Zookeeper的事件处理确保整个集群只有一个HMaster,察觉HRegionServer联机和宕(dàng)机,存储访问控制列表等。

有人会怀疑ZooKeeper的执行能力,在ZooKeeper诞生的地方——Yahoo!他被用作雅虎消息代理的协调和故障恢复服务。雅虎消息代理是一个高度可扩展的发布-订阅系统,他管理着成千上万台联及程序和信息控制系统。它的吞吐量标准已经达到大约每秒10000基于写操作的工作量。对于读操作的工作量来说,它的吞吐量标准还要高几倍。 Continue reading “Zookeeper介绍”

MySQL 超时时间timeout介绍

1、timeout变量

打开mysql,用show variables like ‘%timeout%’命令查看。

  Continue reading “MySQL 超时时间timeout介绍”

PHP-Redis 中文文档

Redis中文手册文档请参考:http://redisdoc.com/ ,Redis官方命令请参考:https://redis.io/commands

基本操作

Redis::__construct构造函数
$redis = new Redis();

connect, open链接redis服务
参数
host: string,服务地址
port: int,端口号
timeout: float,链接时长 (可选, 默认为 0 ,不限链接时间)
注: 在redis.conf中也有时间,默认为300

pconnect, popen不会主动关闭的链接
参考上面

setOption设置redis模式

getOption 查看redis设置的模式

ping 查看连接状态

get 得到某个key的值(string值)
如果该key不存在,return false

set 写入key 和 value(string值)
如果写入成功,return ture

setex 带生存时间的写入值
$redis->setex(‘key’, 3600, ‘value’); // sets key → value, with 1h TTL.

setnx 判断是否重复的,写入值
$redis->setnx(‘key’, ‘value’);
$redis->setnx(‘key’, ‘value’);

delete 删除指定key的值
返回已经删除key的个数(长整数)
$redis->delete(‘key1’, ‘key2’);
$redis->delete(array(‘key3’, ‘key4’, ‘key5’));
Continue reading “PHP-Redis 中文文档”

移动 MySQL datadir 的一个小技巧

一般来说,移动 MySQL 资料库只要修改 /etc/mysql/my.cnf 裡面的 datadir 即可…

把原本的注解掉:

 并且填上新的路径

 # 假设这是新路径

然后复制资料库资料

可是当我下指令

的时候,却发现错误,我也找不出问题在哪(权限对了,路径也对了,档案也都在)。后来才发现原来 Ubuntu 还有另一个地方的设定必须要修改,就是 apparmor :先修改 /etc/apparmor.d/usr.sbin.mysqld 这个设定档,找出裡面原本指向 /var/lib/mysql 的目录,全部改为新目录。

注意 datadir= /data/mysql 所指向的目录权限应为mysql可访问的权限,一般情况下mysql数据库目录所属用户和组为mysql和mysql;将新目录设置为如下:

然后重启动就可以了!

Ubuntu下安装支持Oracle的PHP扩展

Install Oracle Instant Client

Download Oracle Instant Client packages

First, select right client for your OS here(http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html),
Instant Client for Linux x86-64(http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html) in my case for my 64-bit Ubuntu 14.04.
Then Accept License Agreement and download basic & devel rpm packages for your Oracle version.
Our Oracle DB version is 11g r2, so I need to download:

oracle-instantclient11.2-basic-11.2.0.1.0-1.x86_64.rpm
oracle-instantclient11.2-devel-11.2.0.1.0-1.x86_64.rpm

Install the instant client

Convert .rpm to Debian software package (.deb) using alien:

sudo apt-get install alien
sudo alien -d oracle-instantclient11.2-basic-11.2.0.1.0-1.x86_64.rpm
sudo alien -d oracle-instantclient11.2-devel-11.2.0.1.0-1.x86_64.rpm

This will output oracle-instantclient11.2-basic-11.2.0.1.0-2.x86_64.deb & oracle-instantclient11.2-devel-11.2.0.1.0-2.x86_64.deb which can be installed via Ubuntu’s dpkg command:

sudo dpkg -i oracle-instantclient11.2-basic_11.2.0.1.0-2_amd64.deb
sudo dpkg -i oracle-instantclient11.2-devel_11.2.0.1.0-2_amd64.deb

After successful installation, client library with be installed in /usr/share/oracle/11.2/client64, and developer header files with be in /usr/include/oracle/11.2/client64.

Continue reading “Ubuntu下安装支持Oracle的PHP扩展”

MySQL添加用户与授权

一、创建用户

命令: CREATE USER ‘username’@’host’ IDENTIFIED BY ‘password’;

说明:username – 你将创建的用户名, host – 指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost, 如果想让该用户可以从任意远程主机登陆,可以使用通配符%. password – 该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器.

例子:

Continue reading “MySQL添加用户与授权”

HIVE中join、semi join、outer join举例详解

举例子:

Continue reading “HIVE中join、semi join、outer join举例详解”

POSTGRESQL 无法创建数据库 出现类似createdb: could not connect to database postgres: FATAL: role “XXXX” does not exist

I figured I’d share getting setup on my Ubuntu machine.

Installing

Creating User

Continue reading “POSTGRESQL 无法创建数据库 出现类似createdb: could not connect to database postgres: FATAL: role “XXXX” does not exist”

SQLite资料

Sqlite是一种嵌入式/内存轻型数据库,它跨平台,快速,小巧,高效。如果你想选择小型数据库,我相信sqlite将是最佳的选择。它要比access数据库强大很多很多。当然如果你想说MSSQL或者MySQL要比SQLite高效的多。这一点我解释如下:

首先:sqlite定位是小型数据库(轻型),处理大数据自然有局限性。定位标准不同。

其次:sqlite在处理小型数据并不逊色于大型数据库,而且他体积更小。

由于这方面的资料比较多,我以链接的形式来介绍。

 

入门:

什么是SQLitehttp://baike.baidu.com/view/19310.htm

Sqlite官网:http://www.sqlite.org/

Sqlite中文社区:http://www.sqlite.com.cn/

最希望大家去的sqlite官网,里面写的很详细,虽然是英文。

 

Sqlite局限:

Sqlite局限性:http://apps.hi.baidu.com/share/detail/17043674

Sqlite不支持的操作:http://apps.hi.baidu.com/share/detail/17095537

 

Sqlite封装:

CppSqlitehttp://www.codeproject.com/KB/database/CppSQLite.aspx 

该类是最方便的类之一,可惜不支持加密和中文路径,后来有人做了改进

支持中文路径:http://hi.baidu.com/wangguang246/blog/item/4a521f96f5b2006355fb96bf.html

 

关于加密:

wxSqlite3http://wxcode.sourceforge.net/components/wxsqlite3/ 

这个库更新的很快,完全和sqlite3的发布同步,同时支持强大的加密功能,但是这个类使用关于麻烦,后来有人仅仅获取里面的加密功能和CppSqlite结合使用。

加密的另一种方案:http://news.2ky.cn/149/4101.htm 

 

如何编加密版本的sqlite

如何使用VC6编译sqlite3源码生成动态链接库

http://blog.csdn.net/littletigerat/archive/2010/04/19/5502491.aspx

如何对sqlite3数据库进行加密

http://blog.csdn.net/littletigerat/archive/2010/04/20/5502690.aspx

如果编译加密版本的sqlite请认真看上面两篇博客,我亲自测试,但是有些错误,后来做了一些说明:

上面的教程中有许些错误(测试版本3.73

1vc6编译sqlite源码的时候操作的时候,会提示提示出现找不到:“sqlite3rtree.h”头文件

解决方法:这个地方改成rtree.h

2:编译加密时候复制 到pagec的时候,同时要把复制的文件中的#include sqlite3.c”去掉

3:引用的时候要把sqlite3.h中的#ifdef SQLITE_HAS_CODEC以及对应的#endif去掉

 

 

Sqlite数据库查看工具

1:官网自带的工具,黑色的doc,不好用~

2Navicat for SQLite

http://www.sz1001.net/soft/43670.htm 

MySQL的mysqldump工具的基本用法

导出要用到MySQL的mysqldump工具,基本用法是:   

shell> mysqldump [OPTIONS] database [tables]  

如果你不给定任何表,整个数据库将被导出。   

通过执行mysqldump –help,你能得到你mysqldump的版本支持的选项表。  

注意,如果你运行mysqldump没有–quick或–opt选项,mysqldump将在导出结果前装载整个结果集到内存中,如果你正在导出一个大的数据库,这将可能是一个问题。  

mysqldump支持下列选项:   

–add-locks   
在每个表导出之前增加LOCK TABLES并且之后UNLOCK TABLE。(为了使得更快地插入到MySQL)。   
–add-drop-table   
在每个create语句之前增加一个drop table。   
–allow-keywords   
允许创建是关键词的列名字。这由表名前缀于每个列名做到。   
-c, –complete-insert   
使用完整的insert语句(用列名字)。   
-C, –compress   
如果客户和服务器均支持压缩,压缩两者间所有的信息。   
–delayed   
用INSERT DELAYED命令插入行。   
-e, –extended-insert   
使用全新多行INSERT语法。(给出更紧缩并且更快的插入语句)   
-#, –debug[=option_string]   
跟踪程序的使用(为了调试)。   

–help  

显示一条帮助消息并且退出。   
–fields-terminated-by=…   
   
–fields-enclosed-by=…   
   
–fields-optionally-enclosed-by=…   
   
–fields-escaped-by=…   
   
–fields-terminated-by=…   


这些选择与-T选择一起使用,并且有相应的LOAD DATA INFILE子句相同的含义。   
LOAD DATA INFILE语法。   
-F, –flush-logs   
在开始导出前,洗掉在MySQL服务器中的日志文件。   
-f, –force,   
即使我们在一个表导出期间得到一个SQL错误,继续。   
-h, –host=..   
从命名的主机上的MySQL服务器导出数据。缺省主机是localhost。   
-l, –lock-tables.   
为开始导出锁定所有表。   
-t, –no-create-info   
不写入表创建信息(CREATE TABLE语句)   
-d, –no-data   
不写入表的任何行信息。如果你只想得到一个表的结构的导出,这是很有用的!   
–opt   
同–quick –add-drop-table –add-locks –extended-insert –lock-tables。   
应该给你为读入一个MySQL服务器的尽可能最快的导出。   
-pyour_pass, –password[=your_pass]   
与服务器连接时使用的口令。如果你不指定“=your_pass”部分,mysqldump需要来自终端的口令。   
-P port_num, –port=port_num   
与一台主机连接时使用的TCP/IP端口号。(这用于连接到localhost以外的主机,因为它使用 Unix套接字。)   
-q, –quick   
不缓冲查询,直接导出至stdout;使用mysql_use_result()做它。   
-S /path/to/socket, –socket=/path/to/socket   
与localhost连接时(它是缺省主机)使用的套接字文件。   
-T, –tab=path-to-some-directory   
对于每个给定的表,创建一个table_name.sql文件,它包含SQL CREATE 命令,和一个table_name.txt文件,它包含数据。 注意:这只有在mysqldump运行在mysqld守护进程运行的同一台机器上的时候才工作。.txt文件的格式根据–fields-xxx和–lines–xxx选项来定。   
-u user_name, –user=user_name   
与服务器连接时,MySQL使用的用户名。缺省值是你的Unix登录名。   
-O var=option, –set-variable var=option设置一个变量的值。可能的变量被列在下面。   
-v, –verbose   
冗长模式。打印出程序所做的更多的信息。   
-V, –version   
打印版本信息并且退出。   
-w, –where=\’where-condition\’   
只导出被选择了的记录;注意引号是强制的!   
“–where=user=\’jimf\'” “-wuserid>1” “-wuserid<1” 

最常见的mysqldump使用可能制作整个数据库的一个备份:  
mysqldump –opt database > backup-file.sql   
但是它对用来自于一个数据库的信息充实另外一个MySQL数据库也是有用的:   
mysqldump –opt database | mysql –host=remote-host -C database   
由于mysqldump导出的是完整的SQL语句,所以用mysql客户程序很容易就能把数据导入了:   
shell> mysqladmin create target_db_name   
shell> mysql target_db_name < backup-file.sql  
就是  
shell> mysql 库名 < 文件名 

================================

几个常用用例:

1.导出整个数据库
 mysqldump -u 用户名 -p 数据库名 > 导出的文件名    
 mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql
2.导出一个表
 mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名
 mysqldump -u wcnc -p smgp_apps_wcnc users> wcnc_users.sql
3.导出一个数据库结构
  mysqldump -u wcnc -p -d –add-drop-table smgp_apps_wcnc >d:\wcnc_db.sql
 -d 没有数据 –add-drop-table 在每个create语句之前增加一个drop table 
4.导入数据库
  常用source 命令
  进入mysql数据库控制台,
  如mysql -u root -p 
  
  mysql>use 数据库
  然后使用source命令,后面参数为脚本文件(如这里用到的.sql)
  mysql>source d:\wcnc_db.sql