Linux搭建redis cluster

176 阅读6分钟

1 安装redis

1.1 下载redis

cd /opt
sudo wget http://download.redis.io/releases/redis-5.0.10.tar.gz
sudo tar -xzvf redis-5.0.10.tar.gz

1.2 编译安装

sudo yum install gcc -y
cd redis-5.0.10
sudo make
sudo make install

Note:

  • 安装 gcc 报错 No more mirrors to try,执行 yum clean all
  • make 报错 zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory && make,执行 make distclean,参考 www.cnblogs.com/operationho…

1.3 验证

redis-cli -v
redis-server -v

2 配置服务

2.1 新建工作目录

sudo mkdir redis-cluster
sudo chown -R <user>:<user> redis-cluster

2.2 新建config文件

vi redis.conf
  • redis.conf
###################### General #########################

#端口
port <port>

#默认ip为127.0.0.1,需要改为其他节点机器可访问的ip,否则创建集群时无法访问对应的端口,无法创建集群
bind <ip>

#redis后台运行
daemonize yes

#pidfile文件
pidfile "/var/run/redis/redis-26379.pid"

#指定了服务端日志的级别。级别包括:
##debug(很多信息,方便开发、测试),
##verbose(许多有用的信息,但是没有debug级别信息多),
##notice(适当的日志级别,适合生产环境),
##warn(只有非常重要的信息)
loglevel notice

#指定了记录日志的文件。空字符串的话,日志会打印到标准输出设备。后台运行的redis标准输出是/dev/null。
logfile "/var/log/redis/redis-26379.log"

#数据目录,数据库的写入会在这个目录。rdb、aof文件也会写在这个目录
dir "/opt/redis-cluster"


###################### Client #########################

#设置同时连接客户端的最大数量,默认情况下这个限制设置为10000个客户,一旦达到限制,Redis将关闭所有新的连接,发送错误的最大客户数。
maxclients 10000


###################### Memory #########################

#redis配置的最大内存容量。当内存满了,需要配合maxmemory-policy策略进行处理。
#注意slave的输出缓冲区是不计算在maxmemory内的。
#所以为了防止主机内存使用完,建议设置的maxmemory需要更小一些。
maxmemory 10G

#内存容量超过maxmemory后的处理策略。
##volatile-lru:利用LRU算法移除设置过过期时间的key。
##volatile-random:随机移除设置过过期时间的key。
##volatile-ttl:移除即将过期的key,根据最近过期时间来删除(辅以TTL)
##allkeys-lru:利用LRU算法移除任何key。
##allkeys-random:随机移除任何key。
##noeviction:不移除任何key,只是返回一个写错误。
#上面的这些驱逐策略,如果redis没有合适的key驱逐,对于写命令,还是会返回错误。redis将不再接收写请求,只接收get请求。
maxmemory-policy volatile-lru

#LRU、LFU和最小TTL算法不是精确的算法,而是近似算法(为了节省内存),所以你可以对它进行调优,以达到速度或精度。
#默认的5产生足够好的结果,十分接近真实的LRU,但成本更大。3更快,但不太准确。
maxmemory-samples 5


###################### REDIS CLUSTER #####################

#开启集群
cluster-enabled yes

#集群的配置,配置文件首次启动自动生成
cluster-config-file node-26379.conf

#请求超时,默认15秒,可自行设置,ms
cluster-node-timeout 15000

#每个从节点都要检查最后与主节点断线时间,判断其是否有资格替换故障的主节点。
#如果从节点与主节点断线时间超过cluster-node-time*cluster-slave-validity-factor,则当前从节点不具备故障转移资格。
cluster-slave-validity-factor 10

#主节点需要的最小从节点数,只有达到这个数,才会将多余的从节点迁移给其它孤立的主节点使用。
cluster-migration-barrier 1

#默认情况下,Redis集群节点如果检测到至少有一个散列槽(没有可用的节点正在服务),就会停止接受查询。
#这样,如果集群部分宕机(例如,不再覆盖散列槽的范围),那么所有集群最终都将不可用。当所有的插槽再次被覆盖时,它会自动返回。
#但是,有时您希望集群的子集继续工作,继续接受仍然覆盖的关键空间部分的查询。
#为了做到这一点,只需将cluster-require-full-coverage选项设置为no。
cluster-require-full-coverage no


#################### Append Only Mode #####################

#开启AOF持久化
appendonly yes

#AOF文件名
appendfilename "appendonly_26379.aof"

#AOF同步策略
##always,每次操作记录都同步到文件中,最低效最安全
##everysec,每秒执行一次把操作记录同步到硬盘上,为默认选项
##no,不执行 fysnc 调用,让操作系统自动操作把缓存数据写到硬盘上,不可靠但最快
appendfsync everysec

#当RDB持久化出现错误后,是否依然进行继续进行工作,
##yes:不能进行工作,
##no:可以继续进行工作,
#可以通过info中的rdb_last_bgsave_status了解RDB持久化是否有错误
stop-writes-on-bgsave-error yes

#复制缓冲区大小,这是一个环形复制缓冲区,用来保存最新复制的命令。这样在slave离线的时候,不需要完全复制master的数据,如果可以执行部分同步,只需要把缓冲区的部分数据复制给slave,就能恢复正常复制状态。缓冲区的大小越大,slave离线的时间可以更长,复制缓冲区只有在有slave连接的时候才分配内存。没有slave的一段时间,内存会被释放出来,默认1m。
repl-backlog-size 10mb

#master没有slave一段时间会释放复制缓冲区的内存,repl-backlog-ttl用来设置该时间长度。单位为秒。
repl-backlog-ttl 7200


#################### RDB Snapshotting #####################

##rdb文件的名称
dbfilename "dump_26379.rdb"


####################### Slow Log ########################
#slog log是用来记录redis运行中执行比较慢的命令耗时。
#当命令的执行超过了指定时间,就记录在slow log中,slog log保存在内存中,所以没有IO操作。
#执行时间比slowlog-log-slower-than大的请求记录到slowlog里面,单位是微秒,所以1000000就是1秒。
#注意,负数时间会禁用慢查询日志,而0则会强制记录所有命令。
slowlog-log-slower-than 1000000

#慢查询日志长度。当一个新的命令被写进日志的时候,最老的那个记录会被删掉。
#这个长度没有限制。只要有足够的内存就行。你可以通过 SLOWLOG RESET 来释放内存。
slowlog-max-len 1024

####################### Auth #######################

#主节点的连接密码
#masterauth 123456

#当前节点连接密码
#requirepass 123456

2.3 创建日志目录

sudo mkdir /var/log/redis
sudo chown -R <user>:<user> /var/log/redis

2.4 启动服务

cd /opt/redis-cluster
redis-server redis.conf

3 创建集群

3.1 连接redis cluster服务

redis-cli -h <ip> -p <port> -c

3.2 添加主节点

cluster meet <ip> <port>

3.3 将当前节点设置为目标节点的从节点

cluster replicate <nodeId> 

3.4 分配slot

redis-cli -h <ip> -p <port> cluster addslots {0..5461}
redis-cli -h <ip> -p <port> cluster addslots {5462..10922}
redis-cli -h <ip> -p <port> cluster addslots {10923..16383}

Note

服务内命令 CLUSTER ADDSLOTS {0,5460} 不可用

3.5 删除节点

cluster forget <nodeId>

4 创建系统服务

4.1 创建启动、停止脚本

cd /opt/redis-cluster
vi start.sh
sudo chmod +x start.sh
vi stop.sh
sudo chmod +x stop.sh
  • start.sh
#!/bin/bash

redis-server /opt/redis-cluster/redis.conf
  • stop.sh
#!/bin/bash

pid=$(lsof -i:26379 -t)
if [ -n "$pid" ]; then kill -9 $pid; fi

4.2 创建系统配置文件

sudo vi /usr/lib/systemd/system/redis-cluster.service
  • redis-cluster.service
[Unit]
Description=redis-cluster

[Service]
Type=forking
User=<user>
ExecStart=/opt/redis-cluster/start.sh
ExecStop=/opt/redis-cluster/stop.sh

[Install]
WantedBy=multi-user.target

4.3 重新加载命令

sudo systemctl daemon-reload