Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)list(链表)set(集合)zset(sorted set --有序集合)hash(哈希类型)。这些数据类型都支持push/popadd/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。


Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了JavaC/C++C#PHPJavaScriptPerlObject-CPythonRubyErlang等客户端,使用很方便。


Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
redis的官网地址,非常好记,是redis.io。(特意查了一下,域名后缀io属于国家域名,是british Indian Ocean territory,即英属印度洋领地)

目前,Vmware在资助着redis项目的开发和维护。


优点:
   1、简单,真的很简单,却相当的灵活。
   2、数据结构丰富  
   3、高速读写

缺点:
    1、持久化,需要尽量避免或者设计机制保障。
    2redis存储成本高(纯使用内存,能不高么),所以别把它当海量数据库来用。

Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)list(链表)set(集合)zset(sorted set --有序集合)hash(哈希类型)。这些数据类型都支持push/popadd/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。


Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了JavaC/C++C#PHPJavaScriptPerlObject-CPythonRubyErlang等客户端,使用很方便。


Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
redis的官网地址,非常好记,是redis.io。(特意查了一下,域名后缀io属于国家域名,是british Indian Ocean territory,即英属印度洋领地)

目前,Vmware在资助着redis项目的开发和维护。


优点:
   1、简单,真的很简单,却相当的灵活。
   2、数据结构丰富  
   3、高速读写

缺点:
    1、持久化,需要尽量避免或者设计机制保障。
    2redis存储成本高(纯使用内存,能不高么),所以别把它当海量数据库来用。

一、NoSQL&Redis介绍
       NoSQLNot Only SQL,是非关系型的数据库。传统的关系数据库不能满足超大规模和高并发的应用。
       是以Key-Value的形式存储,(例如JSON,XML),不一定遵循传统数据库的一些基本要求,比如SQL标准、ACID属性(Atomicity/ Consistency/Isolation/Durability)、表结构等。主要有以下的特点:非关系型的、分步式的、开源的、水平可扩展的(指能够连接多个软硬件的特性)。
       NoSQL适用场景:
              1)、High performance - 对数据高并发读写
              2)、Huge storage - 对海量数据的高效率存储和访问
              3)、High scalability && HighAvailability - 对数据的高可扩展性和高可用性
       开源的NoSQL数据库:Redis, MongoDB, Cassandra…...
       Redis的介绍
       Redis是一个Key-Value存储系统。它支持存储的value类型有:string(字符串),list(链表), set(无序集合), zset(sorted set有序集合)hash,也可以把redis看成一个数据结构服务器。这些数据类型都支持pust/popadd/remove及取交集、并集和差集运算,Redis支持各种不同方式的排序。数据都是缓存在内存中的,它也可以周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并实现了master-slave(主从)同步。
       Redis提供的API语言包括CC++C#JavaJavaScriptLuaObjective-CPerlPHPPythonRubyGoTcl等。
       使用Redis:新浪微博,200+ Server400 port4G data.
       使用方式:与memcache相同
              1. 应用程序直接访问Redis数据库;
              2. 应用程序直接访问Redis,只有当访问Redis失败时才访问MySQL
       应用场合:
              1. 取最新N个数据的操作
              2. 排行榜应用
              3. 需要精确设定过期时间的应用
              4. 计数器应用
              5. Uniq操作,获取某段时间所有数据排重值
              6. 实时系统,反垃圾系统
              7. Pub/Sub构建实时消息系统
              8. 构建队列系统
              9. 缓存
              10. 存储微博关注关系
       Redis有库无表无字段无行列。MongoDB有库有集合(对应于Mysql中的表)


二、Redis的安装
       官网:http://redis.io
      

步骤一:
              下载安装包:
             

wget http://redis.googlecode.com/files/redis-2.4.17.tar.gz

      步骤二:
              编译源代码:        

tarzxvf redis-2.4.17.tar.gz
cd  redis-2.4.17
make
cd src
make install

              注:make完成后,有产生可执行文件
                     redis-serverredis服务器的启动程序
                     redis-cliredis命令行工具,也可为客户端
                     redis-benchmarkredis性能测试工具(读写)
                     redis-statredis状态检测工具(状态参数延迟)

       步骤三:(非必须)
              移动文件,便于管理

mkdir –p /usr/local/redis/bin
mkdir –p /usr/local/redis/etc
mv redis-2.4.17/redis.conf/usr/local/redis/etc
mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cliredis-server /usr/lcoal/redis/bin

       步骤四:
              启动redis服务

/usr/local/redis/bin/redis-server(
有警告,没有加载配置文件
)
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

              Redis服务端的默认连接端口是6379
              Redis默认不是后台运行

       步骤五:
              客户端连接

/usr/local/redis/bin/redis-cli
或者其他客户端:如
phpredis
[php] view plain copy
print?
    $redis = new Redis();  
    $redis->connect(“127.0.0.1”, 6379);


       步骤六:
              停止Redis
  

/usr/local/redis/bin/redis-clishutdown
or
pkill redis-server


三、Redis的配置
              daemonize 如果需要在后台运行,把该项改为yes
              pidfile 配置多个pid的地址,默认在/var/run/redis.pid
              bind 绑定ip,设置后只接受自该ip的请求
              port 监听端口,默认为6379
              timeout 设置客户端连接时的超时时间,单位为秒
              loglevel 分为4级,debugverbosenoticewarning
              logfile 配置log文件地址
              databases 设置数据库的个数,默认使用的数据库为0
              save 设置redis进行数据库镜像的频率,保存快照的频率,第一个*表示多长时间,       第三个*表示执行多少次写操作。在一定时间内执行一定数量的写操作时,自动保存快照。可设置多个条件。
              rdbcompression 在进行镜像备份时,是否进行压缩
              Dbfilename 镜像备份文件的文件名
              Dir 数据库镜像备份的文件放置路径
              Slaveof 设置数据库为其他数据库的从数据库
              Masterauth 主数据库连接需要的密码验证
              Requirepass 设置登录时需要使用的密码
              Maxclients 限制同时连接的客户数量
              Maxmemory 设置redis能够使用的最大内存
              Appendonly 开启append only模式
              appendfsync 设置对appendonly.aof文件同步的频率
              vm-enabled 是否虚拟内存的支持
              vm-swap-file 设置虚拟内存的交换文件路径
              vm-max-memory 设置redis使用的最大物理内存大小
              vm-page-size 设置虚拟内存的页大小
              vm-pages 设置交换文件的总page数量
              vm-max-threads 设置VMIO同时使用的线程数量
              glueoutputbuf 把小的输出缓存存放在一起
              hash-max-zipmap-entries 设置hash的临界值
              activerehashing 重新hash

一、Redis 主从复制

 

因为目前版本没有mysql 主从那样的增量备份,对网路稳定性要求很高,如果频繁TCP连接断开会对服务器和网络带来很大负担。

就目前生产环境主从机器部署同一个机架下,几个月都不会又一次连接断开重连的情况的。

 

二、通过keepalived实现的高可用方案

 参考官方文档:http://keepalived.org/pdf/sery-lvs-cluster.pdf

Keepalived 是一个用c写的路由选择软件,配合IPVS负载均衡实用,通过VRRP 协议提供高可用。目前最新版本1.2.7.Keepalived 机器之间实用VRRP路由协议切换VIP,切换速度秒级,且不存在脑裂问题。可以实现

可以实现一主多备,主挂后备自动选举,漂移VIP,切换速度秒级;切换时可通过运行指定脚本更改业务服务状态。

如两台主机AB,可以实现如下切换:

1A B 依次启动,A作为主、B为从

2 .A 挂掉,B接管业务,作为主

3.A 起来,作为从SLAVEOF B

4.B 挂掉,A 切回主

将一台全部作为主,即可实现主从,可做读写分离;也可以通过多个VIP,在一台机器上多个实例中一半主、一半从,实现互备份,两机同时负责部分业务,一台宕机后业务都集中在一台上

安装配置都比较简单:

  需要依赖包:openssl-develubuntu 中为 libssl-dev),popt-devel ubuntu中为libpopt-dev)。

  配置文件默认路径:/etc/keepalived/keepalived.conf 也可以手动指定路径,不过要注意的是手动指定需要使用绝对路径。主要要确保配置文件的正确性,keepalived 不会检查配置是否符合规则。

  使用keepalived -D 运行,即可启动3个守护进程:一个父进程,一个check健康检查,一个Vrrp-D将日志写入/var/log/message,可以通过日志查看切换状况。

注意问题:

1. VRRP 协议是组播协议,需要保证主、备、VIP 都在同一个VLAN

2. 不同的VIP 需要与不同的VRID 对应,一个VLAN VRID 不能和其他组冲突

3. keepalived 有两个角色:Master(一个)Backup(多个),如果设置一个为Master,但Master挂了后再起来,必然再次业务又一次切换,这对于有 状态服务是不可接受的。解决方案就是两台机器都设置为Backup,而且优先级高的Backup设置为nopreemt 不抢占。

 

切换流程:

1. Master挂了后,VIP漂移到SlaveSlave keepalived 通知redis 执行:slaveof noone ,开始提供业务

2. Master起来后,VIP 地址不变,Masterkeepalived 通知redis 执行slaveofslave IP host ,开始作为从同步数据

3. 依次类推

主从同时Down机情况:

1. 非计划性,不做考虑,一般也不会存在这种问题

2. 、计划性重启,重启之前通过运维手段SAVEDUMP 主库数据;需要注意顺序:

1. 关闭其中一台机器上所有redis,是得master全部切到另外一台机器(多实例部署,单机上既有主又有从的情况);并关闭机器

2. 依次dump主上redis服务

3. 关闭主

4. 启动主,并等待数据load完毕

5. 启动从删除DUMP 文件(避免重启加载慢)

 

三、使用Twemproxy 实现集群方案

一个由twitter开源的c版本proxy,同时支持memcachedredis,目前最新版本为:0.2.4,持续开发中;https://github.com/twitter/twemproxy .twitter用它主要减少前端与缓存服务间网络连接数。

特点:快、轻量级、减少后端Cache Server连接数、易配置、支持ketamamodularandom、常用hash 分片算法。

 

这里使用keepalived实现高可用主备方案,解决proxy单点问题;

优点:

1. 对于客户端而言,redis集群是透明的,客户端简单,遍于动态扩容

2. Proxy为单点、处理一致性hash时,集群节点可用性检测不存在脑裂问题

3. 高性能,CPU密集型,而redis节点集群多CPU资源冗余,可部署在redis节点集群上,不需要额外设备