[toc] 系统为 Redhat 7.4 数据库为 Redis 4.0.14 上节说了安装redis 5版本的集群 由于redis 3 和4的集群部署和5不一样,所以单独一篇文章 文章采用4的版本,理论上3也同样适用 如果安装3版本的集群,ruby的redis模块可能需要安装redis-3.0.7.gem ### 1. redis集群规划 | 节点编号| IP地址|端口| 节点类型|配置文件| | --------- | --------- |--------- |--------- |--------- |--------- | |1| 172.18.95.83 |6379|主|/home/redis/cluster/6379/redis_6379.conf| |2| 172.18.95.84 |6379| 主|/home/redis/cluster/6379/redis_6379.conf| |3| 172.18.95.85 |6379| 主|/home/redis/cluster/6379/redis_6379.conf| |4| 172.18.95.83 |6380|从|/home/redis/cluster/6380/redis_6380.conf| |5| 172.18.95.84 |6380| 从|/home/redis/cluster/6380/redis_6380.conf| |6| 172.18.95.85 |6380| 从|/home/redis/cluster/6380/redis_6380.conf| |7| 172.18.95.83 |6381|从|/home/redis/cluster/6381/redis_6381.conf| |8| 172.18.95.84 |6381| 从|/home/redis/cluster/6381/redis_6381.conf| |9| 172.18.95.85 |6381| 从|/home/redis/cluster/6381/redis_6381.conf| ### 2 安装redis软件 我们首先需要在三台服务器上安装redis以及ruby相关的包 所有安装包也可使用下面链接下载 链接:https://pan.baidu.com/s/1hoDE8WyVyjkc5uXn4uuqtQ 提取码:jce0 #### 2.1 系统参数调整 在下载安装前需要对系统参数进行调优 [http://www.zhaibibei.cn/redis/config/](http://www.zhaibibei.cn/redis/config/) #### 2.2 Redis 4.0.14 下载 当前最新的版本为 6.0.5 这次我们使用4.0.14 [http://download.redis.io/releases/redis-4.0.14.tar.gz](http://download.redis.io/releases/redis-4.0.14.tar.gz) #### 2.3 安装redis ``` yum -y install gcc cd /tmp tar zxvf redis-4.0.14.tar.gz -C /usr/local/ cd /usr/local mv redis-4.0.14/ redis cd redis/ make make install ``` #### 2.4 新建redis用户 ``` useradd redis echo "redis" |passwd redis --stdin ``` 然后配置环境变量 ``` vim /home/redis/.bash_profile PATH=$PATH:$HOME/.local/bin:$HOME/bin:/usr/local/redis/src export PATH ``` #### 2.5.新建目录 **三台机器** ``` su - redis mkdir -p /home/redis/cluster/6379 mkdir -p /home/redis/cluster/6380 mkdir -p /home/redis/cluster/6381 ``` ### 3. 安装ruby包 这里可以只安装在一台服务器上,但是推荐都安装 防止服务器宕机后其他服务器需要再安装 #### 3.1 下载ruby包 这里还需要下载ruby相关的安装包 **ruby安装包** ``` https://www.ruby-lang.org/en/downloads/ https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.1.tar.gz ``` **redis-gem包** ``` https://rubygems.org/gems/redis/versions https://rubygems.org/gems/redis/versions/4.2.1 ``` #### 3.2 编译安装ruby ``` mkdir -p /usr/share/ruby cd /tmp tar zxvf ruby-2.7.1.tar.gz cd ruby-2.7.1/ ./configure --prefix=/usr/share/ruby make make install cd ext/zlib/ /usr/share/ruby/bin/ruby ./extconf.rb make make install ``` 验证是否安装成功 ``` /usr/share/ruby/bin/ruby --version ``` #### 3.3 安装redis的gem包 ``` /usr/share/ruby/bin/gem install -l /tmp/redis-4.2.1.gem ``` #### 3.4 修改redis的ruby脚本 redis安装后在src下面有redis-trib.rb脚本,需要修改首行的内容 将#!/usr/bin/env ruby 修改为 #!/usr/share/ruby/bin/ruby ``` cp /usr/local/redis/src/redis-trib.rb /usr/local/redis/src/redis-trib.rb.bak vim /usr/local/redis/src/redis-trib.rb ``` 若redis配置了密码还需要修改一个文件 ``` vi /usr/share/ruby/lib/ruby/gems/2.7.0/gems/redis-4.2.1/lib/redis/client.rb ``` 将password设为"123456" [image:944 size:orig] ### 4.集群配置文件 接下来我们分别在/home/redis/cluster目录下建立哨兵配置文件(共9个) 这里以节点1为例,其他节点参考 其实只是比单机的配置文件多了一些集群相关的配置 **节点1** ``` $ cat /home/redis/cluster/6379/redis_6379.conf daemonize yes bind 172.18.95.83 port 6379 tcp-backlog 1024 timeout 300 tcp-keepalive 300 databases 16 requirepass 123456 masterauth 123456 cluster-enabled yes cluster-node-timeout 15000 cluster-config-file nodes-6379.conf pidfile "/home/redis/cluster/6379/redis_6379.pid" loglevel notice logfile "/home/redis/cluster/6379/redis_6379.log" dir "/home/redis/cluster/6379" dbfilename "dump.rdb" stop-writes-on-bgsave-error no rdbcompression yes rdbchecksum yes appendonly yes appendfilename "appendonly.aof" appendfsync everysec aof-load-truncated yes no-appendfsync-on-rewrite no aof-rewrite-incremental-fsync yes auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 32mb maxclients 65503 maxmemory 1gb maxmemory-policy allkeys-lru # replication slave-serve-stale-data yes slave-read-only yes repl-disable-tcp-nodelay no repl-backlog-size 32mb # slow log slowlog-log-slower-than 10000 slowlog-max-len 1024 hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-entries 512 list-max-ziplist-value 64 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 512mb 512mb 60 client-output-buffer-limit pubsub 64mb 16mb 60 protected-mode yes # security rename-command FLUSHALL "" rename-command FLUSHDB "" rename-command KEYS "" ``` 上面参数我们需要根据实际情况修改一些参数 - bind 172.18.95.84 127.0.0.1 监听地址,第一个使用本机IP地址 - port 6379 监听端口 - maxmemory redis允许使用的最大内存,根据服务器配置和业务需求决定 - requirepass 123456 redis密码,可以注释掉表示不设置 - masterauth 123456 连接master时用的密码,如master未设置可注释掉 - 还需要根据实际修改配置文件和日志文件的路径和名称 ### 5.启动redis 接下来我们启动所有9个redis节点 **启动redis** ``` su - redis 172.18.95.83 /usr/local/bin/redis-server /home/redis/cluster/6379/redis_6379.conf /usr/local/bin/redis-server /home/redis/cluster/6380/redis_6380.conf /usr/local/bin/redis-server /home/redis/cluster/6381/redis_6381.conf 172.18.95.84 /usr/local/bin/redis-server /home/redis/cluster/6379/redis_6379.conf /usr/local/bin/redis-server /home/redis/cluster/6380/redis_6380.conf /usr/local/bin/redis-server /home/redis/cluster/6381/redis_6381.conf 172.18.95.85 /usr/local/bin/redis-server /home/redis/cluster/6379/redis_6379.conf /usr/local/bin/redis-server /home/redis/cluster/6380/redis_6380.conf /usr/local/bin/redis-server /home/redis/cluster/6381/redis_6381.conf ``` 这时我们查看集群状态发现是fail的,而且没有其他节点的信息 [image:945 size:orig] 集群文件也只有一个节点的信息 ``` [redis@SYTEST1 6379]$ more nodes-6379.conf 9a74ab968c706a36d7a44427a45e4c151a8bfa63 :0@0 myself,master - 0 0 0 connected vars currentEpoch 0 lastVoteEpoch 0 ``` 同时集群也是不能写入的 ``` 172.18.95.83:6379> set hello world (error) CLUSTERDOWN Hash slot not served 172.18.95.83:6379> ``` ### 6. 搭建集群 接下来我们来搭建集群 除了手动搭建,我们这里使用命令来自动化安装 到了5的版本,该功能已经集成到redis-cli命令中 但是redis 3和4的版本需要使用ruby脚本来完成自动化安装, 我们输入如下命令完成搭建 这里我们将6379的端口写在最前面 **安装有ruby的一个节点** ``` /usr/local/redis/src/redis-trib.rb create --replicas 2 172.18.95.83:6379 172.18.95.84:6379 172.18.95.85:6379 172.18.95.83:6380 172.18.95.84:6380 172.18.95.85:6380 172.18.95.83:6381 172.18.95.84:6381 172.18.95.85:6381 ``` [image:946 size:orig] 这里填入yes 可以看到该命令已经将从节点分配在不同节点上了,并且6379端口为主节点 最后完成了搭建并打印结果 [image:947 size:orig] 对于集群我们只要保证主节点不在同一服务器并且主从节点不在同一个服务器就可以了,如果需要固定的主从关系,请使用后面的命令来改变关系 ### 7.连接redis集群 我们使用如下命令来连接集群,可选择任一节点 ``` [redis@SYTEST1 6379]$ redis-cli -h 172.18.95.83 -p 6379 -a 123456 -c ``` 这里必须加入-c参数,否则如果操作的key的slot值不在该节点会导致命令执行失败 ### 8.查询集群信息 **查询节点信息** ``` cluster nodes ``` [image:948 size:orig] **查询slot信息** 该命令可以更直观的查看集群的架构 ``` cluster slots ``` [image:949 size:orig] **查询集群状态** ``` cluster info ``` [image:950 size:orig] **手动failover** 有时集群宕机重启后可能会导致主备节点在同一台机器上,这时需要手动指定一个从节点成为主节点 ``` 从节点#172.18.95.83:6380> cluster failover ``` **重新指定主库** 我们同样可以手动指定从节点同步哪个主节点 后面跟的是主节点的node id ``` 从节点># 172.18.95.85:6380> cluster replicate 2fb4d5cf998a562e1391c082eb34a1476c8f620f ```