linux 配置redis集群

redis 安装

安装redis

$ wget http://download.redis.io/releases/redis-3.2.3.tar.gz
$ tar xzf redis-3.2.3.tar.gz
$ cd redis-3.2.3
$ make (需要安装gcc |yum install gcc)

检测是否安装成功

$ cd src/
$ redis-server ../redis.conf(启动服务)
$ redis-cli (打开客户端)
$ set key value
$ get key

部分配置文件说明(redis.conf)

配置文件说明

  • port 6379 默认端口6379
  • bind 127.0.0.1 允许链接的IP ,注释掉,可以任意远程机器链接
  • protected-mode yes 默认是yes ,设置为 no(为了支持无密码的任意机器访问)
  • pidfile /var/run/redis_6379.pid 服务启动时用到。需要和port 的值一致

持久化

RDB 方式

# RDB方式的持久化是通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的所有数据进行快照并存储在硬盘上。进行快照的条件可以由用户在配置文件中自定义,由两个参数构成:时间和改动的键的个数。当在指定的时间内被更改的键的个数大于指定的数值时就会进行快照。RDB是Redis默认采用的持久化方式,在配置文件中已经预置了3个条件:
$ save 900 1       # 900秒内有至少1个键被更改则进行快照
$ save 300 10    # 300秒内有至少10个键被更改则进行快照
$ save 60 10000    # 60秒内有至少10000个键被更改则进行快照
# 通过配置dir和dbfilename两个参数分别指定快照文件的存储路径和文件名
# Redis实现快照的过程
    Redis使用fork函数复制一份当前进程(父进程)的副本(子进程);
    父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件;
    当子进程写入完所有数据后会用该临时文件替换旧的RDB文件,至此一次快照操作完成。

AOF 方式

$ appendonly  no #默认情况下Redis没有开启AOF(append only file)方式的持久化
$ appendfilename appendonly.aof (文件名)
# 配置redis自动重写AOF文件的条件
$ auto-aof-rewrite-percentage 100  # 当目前的AOF文件大小超过上一次重写时的AOF文件大小的百分之多少时会再次进行重写,如果之前没有重写过,则以启动时的AOF文件大小为依据
$ auto-aof-rewrite-min-size 64mb   # 允许重写的最小AOF文件大小
# 配置写入AOF文件后,要求系统刷新硬盘缓存的机制
$ appendfsync always   # 每次执行写入都会执行同步,最安全也最慢
$ appendfsync everysec   # 每秒执行一次同步操作
$ appendfsync no       # 不主动进行同步操作,而是完全交由操作系统来做(即每30秒一次),最快也最不安全


# 开启AOF持久化后每执行一条会更改Redis中的数据的命令,Redis就会将该命令写入硬盘中的AOF文件,比RDB较慢,不过可以避免RDB 最后一次快照丢失的问题。具体根据业务需求配置。

Redis服务安装

$ cd utils/
$ ./install_server.sh(根据提示部署 服务)
$ service redis_6379 start(启动服务)

注:redis 的 相关shell写的还是比较基础易懂的,有兴趣深入学习shell的可以观摩一下


redis 集群配置

配置文件(redis.conf)

注册服务后,redis启动的配置文件,实际上是/etc/redis/6379.conf。具体的配置文件,可以去看一下redis服务启动脚本(/etc/init.d/redis_6379)



daemonize yes                                          # redis默认不是后台启动,这里修改成后台启动
cluster-enabled yes                                    # 允许redis支持集群模式
cluster-config-file nodes.conf                         # 节点配置文件
cluster-node-timeout 15000                             # 节点超时毫秒
appendonly yes
#port 7000                                             #如果你需要自定义端口可以用这个选项

搭建redis集群(在其中任意一个节点操作就可以了)

通过使用 Redis 集群命令行工具 redis-trib 创建集群, redis-trib 位于 Redis 源码的 src 文件夹中, 它是一个 Ruby 程序, 这个程序通过向实例发送特殊命令来完成创建新集群, 检查集群, 或者对集群进行重新分片(reshared)等工作.

$ cd src
$ ./redis-trib.rb create --replicas 1 xxx.xxx.xxx.1:6379 xxx.xxx.xxx.2:6379 xxx.xxx.xxx.3:6379 xxx.xxx.xxx.4:6379 xxx.xxx.xxx.5:6379 xxx.xxx.xxx.6:6379
# 最少6个结点,可以在同一台机器上

第一次操作会提醒你缺少ruby,等其他一些的程序

$ yum install ruby
$ yum install rubygems
#再次执行命令,还会报错,提示不能加载redis,是因为缺少redis和ruby的接口,使用gem 安装
$ gem install redis

执行成功后,可以看到nodes.conf中已经有结点的配置信息

337606b1919b6fa1993e8050dc7cf6376b7cdfc8 172.23.65.216:6380 master - 0 1472127722259 3 connected 10923-16383
a8871039bf89119782774af60294f1f7e990f384 172.23.65.216:6379 slave 337606b1919b6fa1993e8050dc7cf6376b7cdfc8 0 1472127725968 6 connected

含义

  • 节点ID
  • IP:端口
  • 标志: master, slave, myself, fail, …
  • 如果是个从节点, 这里是它的主节点的NODE ID
  • 集群最近一次向节点发送 PING 命令之后, 过去了多长时间还没接到回复。
  • 节点最近一次返回 PONG 回复的时间。
  • 节点的配置纪元(configuration epoch):详细信息请参考 Redis 集群规范 。
  • 本节点的网络连接情况:例如 connected 。
  • 节点目前包含的槽:例如 127.0.0.1:7001 目前包含号码为 5960 至 10921 的哈希槽。

测试集群

$ redis-cli -c -h xxx.xxx.xxx.1(集群中任意一个ip) -p 6379
$ CLUSTER INFO 打印集群信息

集群操作

客户端查看集群信息

CLUSTER INFO 打印集群的信息  
CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息。  
节点  
CLUSTER MEET <ip> <port> 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。  
CLUSTER FORGET <node_id> 从集群中移除 node_id 指定的节点。  
CLUSTER REPLICATE <node_id> 将当前节点设置为 node_id 指定的节点的从节点。  
CLUSTER SAVECONFIG 将节点的配置文件保存到硬盘里面。  
槽(slot)  
CLUSTER ADDSLOTS <slot> [slot ...] 将一个或多个槽(slot)指派(assign)给当前节点。  
CLUSTER DELSLOTS <slot> [slot ...] 移除一个或多个槽对当前节点的指派。  
CLUSTER FLUSHSLOTS 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。  
CLUSTER SETSLOT <slot> NODE <node_id> 将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。  
CLUSTER SETSLOT <slot> MIGRATING <node_id> 将本节点的槽 slot 迁移到 node_id 指定的节点中。  
CLUSTER SETSLOT <slot> IMPORTING <node_id> 从 node_id 指定的节点中导入槽 slot 到本节点。  
CLUSTER SETSLOT <slot> STABLE 取消对槽 slot 的导入(import)或者迁移(migrate)。  
键  
CLUSTER KEYSLOT <key> 计算键 key 应该被放置在哪个槽上。  
CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的键值对数量。  
CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 个 slot 槽中的键。 

集群操作

查看集群状态

$ redis-trib.rb check  172.23.65.204:6380 

加入空master结点

$ redis-trib.rb add-node 172.23.65.214:6386 172.23.65.204:6379  
# 第一个IP:PORT为新添加的master redis结点,第二个为集群中已经存在的结点
# 新节点没有包含任何数据, 因为它没有包含任何slot。新加入的加点是一个主节点, 当集群需要将某个从节点升级为新的主节点时, 这个新节点不会被选中

为新节点分配slot


   $ redis-trib.rb reshard 10.10.34.14:6386  
    #根据提示选择要迁移的slot数量(ps:这里选择500)  
    How many slots do you want to move (from 1 to 16384)? 500  
    #选择要接受这些slot的node-id  
    What is the receiving node ID? f51e26b5d5ff74f85341f06f28f125b7254e61bf  
    #选择slot来源:  
    #all表示从所有的master重新分配,  
    #或者数据要提取slot的master节点id,最后用done结束  
    Please enter all the source node IDs.  
      Type 'all' to use all the nodes as source nodes for the hash slots.  
      Type 'done' once you entered all the source nodes IDs.  
    Source node #1:all  
    #打印被移动的slot后,输入yes开始移动slot以及对应的数据.  
    #Do you want to proceed with the proposed reshard plan (yes/no)? yes  
    #结束  

添加新的slave节点

  • 前两步同上
  • redis-cli连接上新节点shell,输入命令:cluster replicate 对应master的node-id
$ cluster replicate 2b9ebcbd627ff0fd7a7bbcc5332fb09e72788835 
# 在线添加slave 时,需要dump整个master进程,并传递到slave,再由 slave加载rdb文件到内存,rdb传输过程中Master可能无法提供服务,整个过程消耗大量io,小心操作.

删除一个slave节点

# redis-trib del-node ip:port '<node-id>'  
$ redis-trib.rb del-node 10.10.34.14:7386 'c7ee2fca17cb79fe3c9822ced1d4f6c5e169e378'  

删除一个master节点

  • 删除master节点之前首先要使用reshard移除master的全部slot,然后再删除当前节点(目前只能把被删除
    master的slot迁移到一个节点上)

 #把10.10.34.14:6386当前master迁移到10.10.34.14:6380上  
redis-trib.rb reshard 10.10.34.14:6380  
#根据提示选择要迁移的slot数量(ps:这里选择500)  
How many slots do you want to move (from 1 to 16384)? 500(被删除master的所有slot数量)  
#选择要接受这些slot的node-id(10.10.34.14:6380)  
What is the receiving node ID? c4a31c852f81686f6ed8bcd6d1b13accdc947fd2 (ps:10.10.34.14:6380的node-id)  
Please enter all the source node IDs.  
  Type 'all' to use all the nodes as source nodes for the hash slots.  
  Type 'done' once you entered all the source nodes IDs.  
Source node #1:f51e26b5d5ff74f85341f06f28f125b7254e61bf(被删除master的node-id)  
Source node #2:done  
#打印被移动的slot后,输入yes开始移动slot以及对应的数据.  
  • 删除空master节点
redis-trib.rb del-node 10.10.34.14:6386 'f51e26b5d5ff74f85341f06f28f125b7254e61bf'  

重启集群

  • 删除生成的nodes.conf

  • 重启所有redis server

  • 重新执行上文的部署命令

redis 数据操作命令

参考资料

猜你喜欢

转载自blog.csdn.net/chen8238065/article/details/52318635