redis CentOS6.5安装及集群部署

时间:2023-01-22 21:42:05

.下载redis source包

链接:https://pan.baidu.com/s/122ZCjNvjl9Jx6M2YsLrncw 密码:92ze

2.解压

tar -xzf redis-3.2.9.tar.gz

3.安装,如果系统没有安装gcc就先安装下 yun install gcc

$cd redis-3.2.9

// 编译

$make

// 安装到/usr/local/redis

$make PREFIX=/usr/local/redis install

4.创建pid,日志,数据dump目录

$mkdir /var/redis/run

$mkdir /var/redis/log

$mkdir /var/redis/data

5.将redis.conf cp到/usr/local/redis目录下,修改redis配置文件,使用端口号命名文件,为集群准备

$cp redis-3.2.9/redis.conf  /usr/local/redis/redis_6379.conf

$vi /usr/local/redis/redis_6379.conf

修改daemonize,pidfile,logfile,dir为上述创建路径下

redis CentOS6.5安装及集群部署

redis CentOS6.5安装及集群部署

redis CentOS6.5安装及集群部署

redis CentOS6.5安装及集群部署

设置服务形式启动:

6.拷贝启动脚本到/etc/init.d

$cp redis-3.2.9/utils/redis_init_script  /etc/init.d/redis_6379

7.修改脚本文件,指定程序安装路径以及pid路径和配置文件路径

redis CentOS6.5安装及集群部署

至此,已经可以通过服务启动redis了。service redis_6379 start/stop

扩展:service 是一个script  他可以分析你后面下达的参数,然后根据你的参数在到/etc/init.d 下去取得正确的服务来 stop  start  restar

8.设置开机自启

$chkconfig redis_6379 on

如果报错:service redisd does not support chkconfig就vi修改脚本文件,设置开机自启的执行顺序

注意,最前面是有井号的。注释的意思是,redis服务必须在运行级2,3,4,5下被启动或关闭,启动的优先级是90,关闭的优先级是10。

redis CentOS6.5安装及集群部署

---------------------------------------------我是分割线,redis单机安装部署已完成------------------------------------------------------

---------------------------------------------我是分割线,下面讲述集群部署-----------------------------------------------------------

一.安装集群环境ruby

1.下载ruby

链接:https://pan.baidu.com/s/1Qar_7BvoWxmv6PloIc-Y9w 密码:e74y

2.解压

$tar -xzf ruby-2.3.1.tar.gz

3.configure 设置安装路径,此时会自动根据平台生成Makefile

$cd  ruby-2.3.1

$./configure --prefix=/usr/local/ruby

$make

$make install

4.安装完成设置环境变量,设置完后重启

$ vi /etc/profile

redis CentOS6.5安装及集群部署

$reboot

5.查看版本

$ruby -v

6.安装ruby的redis依赖包安装成功

$gem install redis

7.创建目录

$mkdir /usr/local/redis-cluster

8.拷贝/usr/local/redis/bin 目录到/usr/local/redis-cluster下并重命名为redis01,依次复制共6个节点,端口为7001-7006

cp /usr/local/redis/bin /usr/local/redis-cluster/redis01

redis CentOS6.5安装及集群部署

修改redis配置文件,将log,data,pid,port中的端口号修改为对应节点端口号,开启集群模式

redis CentOS6.5安装及集群部署

9.把创建集群的ruby脚本拷贝到/usr/local/redis-cluster目录下

$cp /data/ftp/pub/redis-3.2.9/src/redis-trib.rb  /usr/local/redis-cluster

10.创建启动所有节点脚本

$vi startallnode.sh

redis CentOS6.5安装及集群部署

$chmod +x startallnode.sh

11.创建关闭所有节点脚本

$vi shutdownallnode.sh

redis CentOS6.5安装及集群部署

chmod +x shutdownallnode.sh

12.执行启动所有节点脚本

$./startallnode.sh

redis CentOS6.5安装及集群部署

13.创建集群

说明:

redis集群至少需要3个主节点,每个主节点有一个从节点总共6个节点

replicas指定为1表示每个主节点有一个从节点

$./redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006

[root@jiuCentOS redis-cluster]# ./redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes... //成功连接上6个节点
Using 3 masters: // 7001-7003作为主节点
127.0.0.1:7001
127.0.0.1:7002
127.0.0.1:7003
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001 // 7004-7006作为从节点
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
Adding replica 127.0.0.1:7006 to 127.0.0.1:7003
M: a13041b1ee33cc2ec8cd6abd0c32e1f17fc1854e 127.0.0.1:7001      // 分配0-5460槽给7001
slots:0-5460 (5461 slots) master
M: 9ec7b173beaa62b0bdb9030a5b549c25a0407482 127.0.0.1:7002   // 分配5461-10922槽给7002
slots:5461-10922 (5462 slots) master
M: 6aa8a57322a622cb3f50d7edd4239479fe81348f 127.0.0.1:7003   // 分配10923-16383槽给7003
slots:10923-16383 (5461 slots) master
S: dea50c6dd0df0c97094bd45ba40b64ee8e52928d 127.0.0.1:7004
replicates a13041b1ee33cc2ec8cd6abd0c32e1f17fc1854e
S: 790abedb428c9bd4baa2034c5fc7ead458741fb9 127.0.0.1:7005
replicates 9ec7b173beaa62b0bdb9030a5b549c25a0407482
S: fc871f3dd051aa02aae7078eb6eaaa9c8df8d9b7 127.0.0.1:7006
replicates 6aa8a57322a622cb3f50d7edd4239479fe81348f
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join....
>>> Performing Cluster Check (using node 127.0.0.1:7001)
M: a13041b1ee33cc2ec8cd6abd0c32e1f17fc1854e 127.0.0.1:7001
slots:0-5460 (5461 slots) master
1 additional replica(s)
S: fc871f3dd051aa02aae7078eb6eaaa9c8df8d9b7 127.0.0.1:7006
slots: (0 slots) slave
replicates 6aa8a57322a622cb3f50d7edd4239479fe81348f
M: 6aa8a57322a622cb3f50d7edd4239479fe81348f 127.0.0.1:7003
slots:10923-16383 (5461 slots) master
1 additional replica(s)
S: 790abedb428c9bd4baa2034c5fc7ead458741fb9 127.0.0.1:7005
slots: (0 slots) slave
replicates 9ec7b173beaa62b0bdb9030a5b549c25a0407482
M: 9ec7b173beaa62b0bdb9030a5b549c25a0407482 127.0.0.1:7002
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: dea50c6dd0df0c97094bd45ba40b64ee8e52928d 127.0.0.1:7004
slots: (0 slots) slave
replicates a13041b1ee33cc2ec8cd6abd0c32e1f17fc1854e
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

如果报:

/usr/bin/env ruby: No such file or directory

说明ruby环境变量没有配置正确

--------------------

扩展:

#!/usr/bin/ruby是告诉操作系统执行这个脚本的时候,调用/usr/bin下的ruby解释器;
#!/usr/bin/env ruby这种用法是为了防止操作系统用户没有将ruby装在默认的/usr/bin路径里。当系统看到这一行的时候,首先会到env设置里查找ruby的安装路径,再调用对应路径下的解释器程序完成操作。

#!/usr/bin/env ruby会去环境设置寻找ruby目录

---------------------

测试集群,-h是指定ip -p指定端口 -c代表要连接集群

redis CentOS6.5安装及集群部署

redis CentOS6.5安装及集群部署

集群操作命令参照官方文档:

# ./redis-cli -h 127.0.0.1 -p 7001进入命令行后即可敲入如下链接中的命令

https://redis.io/commands/cluster-info 

哨兵模式(20190222补充:使用redis cluster能够实现监控、自动切换以及水平扩展功能,redis实例管理推荐用搜狐推出的cachecloud,可以私有化部署)

哨兵模式主要是监测master节点,当master节点挂掉时,能够自动在其slave中选举产生一个节点作为master接替上来。

需要注意的是,在master节点挂掉后,clinet需要重新连接集群,所以,client需要处理这部分,具体内容后续补充。

1.拷贝redis解压目录下的sentinel.conf到redis-cluster目录下

$cp /data/ftp/pub/redis-3.2.9/sentinel.conf /usr/local/redis-cluster/sentinel.conf

2.修改配置并启动,

mymaster是名称
port 26379  //哨兵端口号保持不变,可以修改,但是我没有修改
dir /root/application/program/redis/sentinel/ //哨兵程序的日志路径
sentinel monitor mymaster 192.168.127.129 7001 1 // 监控一个master节点
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 60000
启动:redis-sentinel
1. redis-server ../sentinel.conf --sentinel & //(&有这可以Ctrl +C退到命令行,没有这个就直接退出哨兵进程)
2. 对于 redis-sentinel 程序, 你可以用以下命令来启动 Sentinel 系统
redis-sentinel ../sentinel.conf & 关闭:redis-sentinel
1. pkill redis-server //这个会关掉Redis服务器和Sentinel(哨兵)进程
2. kill 进程号 //可以关掉指定进程号的进程

Sentinel(哨兵)配置文件简介
         

在Redis的源码中包含了一个名为 sentinel.conf 的文件, 这个文件就是带有注释的Sentinel(哨兵)的配置文件的示例。

如果想要运行一个“哨兵”程序,以下配置项是最少配置:

sentinel monitor mymaster 127.0.0.1 6379 1

sentinel down-after-milliseconds mymaster 60000

sentinel failover-timeout mymaster 180000

sentinel parallel-syncs mymaster 1

第一行配置表示 Sentinel(哨兵)进程去监视一个名为 mymaster 的主服务器,这个主服务器的 IP 地址为 127.0.0.1 , 端口号为 6379,而将这个主服务器判断为失效至少需要 1 个 Sentinel(哨兵)进程的同意。如果在架构系统中已经配置类多个Sentinel(哨兵)进程,在同意“Master主服务器”下线的 Sentinel(哨兵)进程的数量不达标的情况下,Sentinel(哨兵)进程就不会执行自动故障迁移。在设置多Sentinel(哨兵)进程的情况下,无论设置多少个 Sentinel(哨兵)进程同意才能判断一个服务器失效,一个 Sentinel 都需要获得架构系统中多数 Sentinel(哨兵)进程的支持, 才能发起一次自动故障迁移,并预留一个给定的配置纪元 (configuration Epoch ,一个配置纪元就是一个新主服务器配置的版本号)。如果您只配置了一个Sentinel(哨兵)进程来做监控,那一个Sentinel(哨兵)进程也可以决定“Master主服务器”是否下线。

其他选项的基本格式如下:sentinel <选项的名字> <主服务器的名字> <选项的值>

配置选项的解释如下:

1、down-after-milliseconds : Sentinel(哨兵)进程判断服务器已经掉线所需的毫秒数。

如果被监控的服务器在给定的毫秒数之内,并没有返回 Sentinel(哨兵)进程发送的 PING 命令的回复,或者返回一个错误,那么 Sentinel(哨兵)进程将这个服务器标记为主观下线(subjectively down,简称 SDOWN )。如果在架构系统中配置了多个Sentinel(哨兵)进程的情况下,只有一个Sentinel(哨兵)进程将服务器标记为主观下线并不一定会引起服务器的自动故障迁移,只有在足够数量的 Sentinel(哨兵)进程都将一个服务器标记为主观下线之后,服务器才会被标记为客观下线(objectively down, 简称 ODOWN ),这时才回执行自动故障迁移。另外一种情况是,在架构系统中只配置了一个Sentinel(哨兵)进程的话,那这Sentinel(哨兵)进程也可以决定被监控的服务器的是否“下线”。

将服务器标记为客观下线所需的 Sentinel(哨兵)进程数量由对主服务器的配置决定。

2、parallel-syncs :在执行故障转移时,最多可以有多少个从服务器同时对新的主服务器进行同步,这个数字越小,完成故障转移所需的时间就越长,实际上就是说最多允许几个slave同时从新master同步数据,数值越小的话当然就完成迁移总耗时比较长啦。

如果“Slave从服务器”被设置为允许使用过期数据集(参见对 redis.conf 文件中对 slave-serve-stale-data 选项的说明),那么你可能不希望所有“Slave从服务器”都在同一时间向新的“Master主服务器”发送同步请求, 因为尽管复制过程的绝大部分步骤都不会阻塞“Slave从服务器”,但“Slave从服务器”在载入“Master主服务器”发来的 RDB 文件时, 仍然会造成“Slave从服务器”在一段时间内不能处理命令请求,如果全部“Slave从服务器”一起对新的“Master主服务器”进行同步, 那么就可能会造成所有“Slave从服务器”在短时间内全部不可用的情况出现。

你可以通过将这个值设为 1 来保证每次只有一个Slave从服务器处于不能处理命令请求的状态。

3、failover-timeout:实现主从切换,完成故障转移的所需要的最大时间值。若Sentinel(哨兵)进程在该配置值内未能完成故障转移的操作(即故障时master/slave自动切换),则认为本次故障转移操作失败。

4、notification-script: 指定Sentinel(哨兵)进程检测到Master-Name所指定的“Master主服务器”的实例异常的时候,所要调用的报警脚本。该配置项可选,但线上系统建议配置。

FAQ:

一、./redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006执行时如果报如下错误:

Node 127.0.0.1:7001 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0

或者

/usr/local/ruby/lib/ruby/gems/2.3.0/gems/redis-4.0.1/lib/redis/client.rb:119:in `call': ERR Slot 4757 is already busy (Redis::CommandError)

用redis-cli登录到每个节点执行flushall和cluster reset,然后再次执行上面建立集群的命令即可

如果还是不行,删除redis.conf配置的cluster-config-file "nodes-7001.conf"对应的所有文件

二、如果节点redis-server启动失败,查看配置的日志路径下的日志即可。