Redis集群部署,三主三从
一文读懂Redis的四种模式:单机、主从、哨兵、集群
参考来源:https://www.cnblogs.com/zhonglongbo/p/13128955.html
Redis主从就是常见的主从模式,从节点自动同步主节点数据,实现数据的热备份。
Redis哨兵就是在Redis主从上添加了一个监控系统(Redis Sentinel系统),实现故障转移,Redis哨兵会监控Redis主从节点运行状态,当主节点故障下线后,Redis哨兵会选择一个从节点充当新的主节点,继续提供服务。
Redis集群在Redis主从上添加了监控机制和数据分片机制(Redis中是分槽位),实现故障转移和数据水平扩展,Redis集群中组合了多个Redis主从,并且每个Redis主节点都负责存储集群中的一部分数据,当某个主节点故障下线后,Redis集群会选择该节点的一个从节点充当新的主节点,继续提供服务。
生产环境很少使用单纯的Redis主从,如果数据量比较少,可以考虑使用哨兵模式,但Redis集群的稳定性、可扩展性都优于哨兵模式,所以使用Redis集群的场景是最多的。
=== 这里以安装redis 5.0.x版本为例。
一、源码编译安装
- 获取源码包,并解压
wget -c http://download.redis.io/releases/redis-5.0.5.tar.gz tar -zxvf redis-5.0.5.tar.gz cd redis-5.0.5
解压后可以看到,在当前目录下已经有Makefile文件了,说明已经预编译好了,我们只需要make安装即可。但是需要注意,既然已经预编译过了,那么这里即可以通过修改安装路径(Makefile文件就放在当前目录下的src目录下),又可以在安装时指定安装路径。
- 编译安装
注意:安装过程中可能需要依赖库支持。
#依赖库安装
yum install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel -y
方式一:先修改Makefile配置文件安装路径,再make安装(推荐)。
# 先修改安装目录
vim src/Makefile
#再安装
make && make install
方式二:不用修改Makefile配置文件,直接安装,但是需要指定安装路径。
make PREFIX=/usr/local/redis install
- 拷贝Redis配置文件
cp redis.conf /usr/local/redis/
到这一步,redis已经安装好了。
- 启动Redis
/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf
---
二、警告信息处理
由上图可见,已经启动redis服务了。但是,启动之后redis日志可能会出现一些警告信息:
1)第一个报错是backlog参数导致的,backlog主要控制的是三次握手的时候,server端收到客户端ack确认好的队列长度,如果队列满了,客户端将收到错误提示。
vim /etc/sysctl.conf net.core.somaxconn=512
2)第二个报错是因为vm.overcommit_memory=0,0表示内核会检查有没有多的内存给进程使用,如果没有,内存的申请失败,并将错误返回给进程。可以设置为1,表示内核允许分配所有的物理内存给进程。还可以设置为2,表示所有的物理内存和swap全部给进程。
vim /etc/sysctl.conf vm.overcommit_memory=1
3)第三个报错是开启了大页内存动态分配,可以设置关闭,让redis负责内存管理。
echo never > /sys/kernel/mm/transparent_hugepage/enabled
上述修改后,执行一下sysctl -p命令,重启redis就不会提示警告信息了!!
三、设置systemd自启动
注意:上述启动方式会占用我们的shell窗口,只是临时测试,关闭shell窗口后,redis服务也会随之关闭;我们可以加上nohup命令,让它在后台运行。也可以设置systemd开机自启动模式。这里以systemd模式为例:
# 设置systemd自启动 vim /usr/lib/systemd/system/redis.service [Unit] Description=Redis Server After=network.target [Service] Type=simple ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf ExecStop=/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 shutdown PrivateTmp=true #User=www #Group=www [Install] WantedBy=multi-user.target
- 启动Redis
systemctl enable redis && systemctl start redis && systemctl status redis
==========================---=============================
四、集群环境搭建
Redis 集群的优势:
- l 自动分割数据到不同的节点上。
- l 整个集群的部分节点失败或者不可达的情况下能够继续处理命令。
要让集群正常运作至少需要三个主节点,为了实现主节点的高可用, 强烈建议使用六个节点: 其中三个为主节点, 而其余三个则是各个主节点的从节点。
---
- redis cluster部署
这里我就以6个 Redis 实例为例(若资源充裕,分别在6台机器上部署Redis即可)。
# 创建六个实例目录 cd /usr/local/redis/ mkdir 6379 6380 6381 6382 6383 6384 # 用初始化脚本,快速创建实例配置文件 /usr/local/src/redis-5.0.5/utils/install_server.sh
初始化完成后,默认会启动Redis服务。可通过netstat -nltp 或 ps -aux 查看redis进程及端口。
此时就可以通过命令来 关闭/启动/重启 6个redis实例服务了。初始化后默认启动。
/etc/init.d/redis_6379 stop/start/restart
- 开启redis集群模式
# 在每个redis实例的配置文件中,开启如下参数: vim /usr/local/redis/6379/6379.conf //依次修改6个实例6379/6380/6381/6382/6383/6384
cluster-enabled yes //开启集群功能,默认是关闭的 cluster-config-file nodes-6379.conf //集群配置文件 cluster-node-timeout 15000 //集群超时时间,默认15s appendonly yes //开启aof
6个集群实例配置完成后,需重启这6个实例服务。
/etc/init.d/redis_6379 restart /etc/init.d/redis_6380 restart /etc/init.d/redis_6381 restart ....
- 查看redis集群帮助
下述介绍为了方便,我们可以用alias取个别名。
# alias别名 alias redis-cli='/usr/local/redis/bin/redis-cli' # 查看帮助 redis-cli --cluster help
-
创建redis集群
现在已经有了六个正在运行中的 Redis 实例, 接下来就可以直接使用这些实例来创建集群, 并为每个节点编写配置文件。
如果使用的是Redis 5.x的版本,可以直接使用redis-cli命令创建新集群,检查或重新硬化现有集群等等。
对于Redis版本3或4,使用redis-trib.rb创建集群,它是一个Ruby程序。可以在Redis源代码的src目录下找到它。
#创建集群 /usr/local/redis/bin/redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 --cluster-replicas 1
说明:
--cluster-replicas 1 表示为集群中的每个主节点创建一个从节点。
其中指定了6个redis的ip:port,3个master3个slave。
以上命令回车后,当我们输入yes,redis-cli就会将这份配置应用到集群当中,让各个节点开始互相通讯。
- 查看集群信息或状态
# 可以在任意一个节点上查看状态信息 /usr/local/redis/bin/redis-cli -p 6381 cluster info # 查看集群节点 /usr/local/redis/bin/redis-cli -p 6381 cluster nodes
- 测试数据交互
redis-cli -p 6381 -c
由图可见:通过6381服务器无法将数据写入,哈希槽5798不能存放这个值,查看nodes节点可知,5798哈希槽值的范围应该在6380服务器上存放。
这是因为我们没有开启集群交互模式,通过 -c 参数开启,可以帮我们自动重定向写入。必须以集群交互模式操作。
- 检查节点运行状态
redis-cli -p 6381 --cluster check 127.0.0.1:6381
--- over---