Redis集群水平扩展(一)

Redis分布式方案一般有两种

1、客户端分区,优点是分区逻辑可控,缺点是需要客户端处理数据路由、高可用、故障转移等。

2、代理方案,优点是简化客户端逻辑和升级,缺点是加重架构复杂性和性能损耗。

Redis Cluster是官方提供的分布式解决方案,从3.0版本正式推出,和以上两种方案都不太一样,采用了虚拟槽分区,分区方式采用了hash分区,它并没有使用一致性hash(增减节点会导致部分数据无法命中,当使用少量节点时节点变化会导致影响数据映射),而是使用改进的一致性hash-虚拟槽方式分区。Redis Cluster使用了 16384 个虚拟槽,槽被分配给节点管理。

Continue reading "Redis集群水平扩展(一)"

Redis数据迁移

一、AOF方式

需求: 一个没有数据的redis。

清空redis数据方法

Continue reading "Redis数据迁移"

etcd: 从应用场景到实现原理的全方位解读

随着CoreOS和Kubernetes等项目在开源社区日益火热,它们项目中都用到的etcd组件作为一个高可用强一致性的服务发现存储仓库,渐渐为开发人员所关注。在云计算时代,如何让服务快速透明地接入到计算集群中,如何让共享配置信息快速被集群中的所有机器发现,更为重要的是,如何构建这样一套高可用、安全、易于部署以及响应快速的服务集群,已经成为了迫切需要解决的问题。etcd为解决这类问题带来了福音,本文将从etcd的应用场景开始,深入解读etcd的实现方式,以供开发者们更为充分地享用etcd所带来的便利。 Continue reading "etcd: 从应用场景到实现原理的全方位解读"

LevelDB架构与原理

一、LevelDB入门

LevelDB是Google开源的持久化KV单机数据库,具有很高的随机写,顺序读/写性能,但是随机读的性能很一般,也就是说,LevelDB很适合应用在查询较少,而写很多的场景。LevelDB应用了LSM (Log Structured Merge) 策略,lsm_tree对索引变更进行延迟及批量处理,并通过一种类似于归并排序的方式高效地将更新迁移到磁盘,降低索引插入开销,关于LSM,本文在后面也会简单提及。

 

根据Leveldb官方网站的描述,LevelDB的特点和限制如下:

特点:
1、key和value都是任意长度的字节数组;
2、entry(即一条K-V记录)默认是按照key的字典顺序存储的,当然开发者也可以重载这个排序函数;
3、提供的基本操作接口:Put()、Delete()、Get()、Batch();
4、支持批量操作以原子操作进行;
5、可以创建数据全景的snapshot(快照),并允许在快照中查找数据;
6、可以通过前向(或后向)迭代器遍历数据(迭代器会隐含的创建一个snapshot);
7、自动使用Snappy压缩数据;
8、可移植性;

限制:
1、非关系型数据模型(NoSQL),不支持sql语句,也不支持索引;
2、一次只允许一个进程访问一个特定的数据库;
3、没有内置的C/S架构,但开发者可以使用LevelDB库自己封装一个server;

Continue reading "LevelDB架构与原理"

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 中文文档"

MongoDB 核心将支持全文搜索功能 (2.3.2)

来自 MongoDB 官方 JIRA 的一个新特性报告称 MongoDB 将在 2.3.2 版本中增加全文搜索功能。该功能还是体验到阶段,使用方法包括:

db.adminCommand( { setParameter : "*", textSearchEnabled : true } );

或者是:

./mongod --setParameter textSearchEnabled=true

特性:

  • parsing + stemming for latin languages
  • multi-word scoring
  • phrase matching
  • word negation
  • weights per field
  • additional suffix index fields for coverings
  • additional prefix index fields for partitioning
  • specify language per document

简单使用示例:

> db.foo.insert( { _id: 1 , desc: "the dog is running" } )
> db.foo.insert( { _id: 2 , desc: "the cat is walking" } )
> db.foo.ensureIndex( { "desc": "text" } )
> db.foo.runCommand( "text", { search : "walk" } )
{
     "queryDebugString" : "walk||||||",
     "language" : "english",
     "results" : [
         {
             "score" : 0.75,
             "obj" : {
                 "_id" : 2,
                 "desc" : "the cat is walking"
             }
         }
     ],
     "stats" : {
         "nscanned" : 1,
         "nscannedObjects" : 0,
         "n" : 1,
         "timeMicros" : 330
     },
     "ok" : 1
}

MongoDB 的详细介绍:请点这里
MongoDB 的下载地址:请点这里

Ubuntu12.04下关闭MongoDB的开机启动

网上什么用sysv-rc-conf配置,什么改S开头为K开头什么的方法通通的不管用,因为10.04开始把MongoDB的启动连接到了/lib/init/upstart-job,而后者是调用了/etc/init/mongodb.conf文件里面关于开机的定义,这是新的框架,所以以前的方法通 通不管用了,你用sysv-rc-conf的时候甚至发现mongodb根本禁止在任何runrevel上启动的,而实际情况是,它每次都很淡定地自动启动了。

 
查看/etc/init/mongodb.conf内容
  1. # Ubuntu upstart file at /etc/init/mongodb.conf  
  2.   
  3. limit nofile 20000 20000  
  4.   
  5. kill timeout 300 # wait 300s between SIGTERM and SIGKILL.  
  6.   
  7. pre-start script  
  8.     mkdir -p /var/lib/mongodb/  
  9.     mkdir -p /var/log/mongodb/  
  10. end script  
  11.   
  12. start on runlevel [2345]  
  13. stop on runlevel [06]  
  14.   
  15. #script  
  16.   ENABLE_MONGODB="yes"  
  17.   if [ -f /etc/default/mongodb ]; then . /etc/default/mongodb; fi  
  18.   if [ "x$ENABLE_MONGODB" = "xyes" ]; then exec start-stop-daemon --start --quiet --chuid mongodb --exec  /usr/bin/mongod -- --config /etc/mongodb.conf; fi  
  19. #end script 

 

修改为
 
  1. # Ubuntu upstart file at /etc/init/mongodb.conf  
  2.   
  3. #limit nofile 20000 20000  
  4.   
  5. #kill timeout 300 # wait 300s between SIGTERM and SIGKILL.  
  6.   
  7. #pre-start script  
  8. #    mkdir -p /var/lib/mongodb/  
  9. #    mkdir -p /var/log/mongodb/  
  10. #end script  
  11.   
  12. #start on runlevel [2345]  
  13. #stop on runlevel [06]  
  14.   
  15. #script  
  16. #  ENABLE_MONGODB="yes"  
  17. #  if [ -f /etc/default/mongodb ]; then . /etc/default/mongodb; fi  
  18. #  if [ "x$ENABLE_MONGODB" = "xyes" ]; then exec start-stop-daemon --start --quiet --chuid mongodb --exec  /usr/bin/mongod -- --config /etc/mongodb.conf; fi  
  19. #end script 

 

ubuntu上最新版本mongodb的安装

ubuntu上安装mongodb本可以直接通过sudo apt-get install mongodb 进行安装,只是ubuntu的源上版本比实际mongodb的版本低很多,所以有必要从mongodb的10gen获取最新版本进行安装,安装过程主要需 要将10gen的路径添加到apt-get source list中及key的获取。安装步骤如下:

1、 编辑/etc/apt/sources.list,添加如下内容:

deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen

2、生成GPG key.运行如下命令:

1
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10

3、运行apt-get update,更新源,然后即可安装最新版本的mongodb.

1
2
sudo apt-get update
sudo apt-get install mongodb-10gen

4、安装完毕后,输入mongo即可查看是否服务正常启动了。