名词定义:
主节点
从节点
哨兵
集群
部署框架图:
缓存物理架构:
哨兵集群物理架构
五台物理机,ip假定为158.222.14.21,158.222.14.22,158.222.14.23,158.222.14.24,158.222.14.25
每台物理机上各部署一个哨兵,占用端口26379
|
五台物理机,ip假定为158.222.14.21,158.222.14.22,158.222.14.23,158.222.14.24,158.222.14.25
每台物理机上部署一个master(主节点):端口6301,该主节点的配置两个slave(从节点),从节点分布在另外两台物理机上。图3.
绿色为哨兵(sentinel),
masterdap1为一组一主两从,主节点masterdap1部署在21物理机上,占用6301端口,其两个从节点一个部署在22物理机上,占用6302端口;一个部署在23物理机上,占用6303端口。
masterdap2为一组一主两从,主节点masterdap2部署在22物理机上,占用6301端口,其两个从节点一个部署在23物理机上,占用6302端口;一个部署在24物理机上,占用6303端口。
masterdap3为一组一主两从,主节点masterdap3部署在23物理机上,占用6301端口,其两个从节点一个部署在24物理机上,占用6302端口;一个部署在25物理机上,占用6303端口。
masterMFS为一组一主两从,主节点masterMFS部署在24物理机上,占用6301端口,其两个从节点一个部署在25物理机上,占用6302端口;一个部署在21物理机上,占用6303端口。
masterRPS为一组一主两从,主节点masterRPS部署在25物理机上,占用6301端口,其两个从节点一个部署在21物理机上,占用6302端口;一个部署在22物理机上,占用6303端口。
Redis版本:
Redis 版本:3.0.7
编译:
(1)解压
$tar -zxvf redis-3.2.9.tar.gz |
(2)进入路径 redis-3.2.9
执行make命令编译
$make |
(3)编译成功后src路径下会有如下文件
文件说明:
编号 |
文件 |
说明 |
备注 |
1 |
mkreleasehdr.sh |
redis自带的版本管理工具,非redis源码编译产生 |
|
2 |
redis-benchmark |
性能测试工具 |
|
3 |
redis-check-aof |
aof文件检测修复工具 |
|
4 |
redis-check-rdb |
rdb文件检查修复工具 |
|
5 |
redis-cli |
redis客户端 |
|
6 |
redis-sentinel |
哨兵server |
|
7 |
redis-server |
redis服务端 |
|
8 |
redis-trib.rb |
ruby语言编写,非redis源码编译产生,该脚本用来配置cluster,运行该脚本需要ruby环境和ruby的redis依赖 |
配置:
注意:对于redis的内存使用策略,可通过先设置系统级别的内存使用策略:查看系统文件:
/proc/sys/vm/overcommit_memmory 可设值:0,1,2 建议设为1
Sentinel 部署:
Sentinel部署安装
环境用户:
用root用户登陆,创建用户redis,密码redis。创建成功后退出root,用redis/redis登陆
登陆158.222.14.21 (用户/密码:redis/redis), 注:sentinel部署以21服务器为例说明,22,23,24,25服务器按照此部署步骤部署。
下载地址http://download.redis.io/releases/redis-stable,上传redis压缩包至服务器并解压至redis用户根目录,切换至redis目录执行make命令编译。在src目录下会生成对应的可执行文件。(此处也可直接使用安装包中的已编译过的redis文件)
在用户根目录下新建目录:$HOME/redis_sentinel_26379 把如下文件复制进来
|
以redis用户在$HOME/redis_sentinel_26379路径下创建run路径,进入run路径,创建data路径,创建logs路径,data路径与logs路径平级。
复制sentinel.conf文件为sentinel_26379.conf ,此两个文件处于同一路径下,并做如下修改:
1、端口:port 26379
2、增加redis 守护进程启动
daemonize yes
3、增加log路径并指定sentinel日志文件:
logfile /home/redis/redis_sentinel_26379/run/logs/sentinel_26379.log
dir "/home/redis /redis_sentinel_26379/run/tmp"
4、哨兵监听主节点配置:
修改:sentinel monitor mymaster 127.0.0.1 6379 2 为
sentinel monitor masterdap1 158.222.14.21 6301 3
sentinel monitor masterdap2 158.222.14.22 6301 3
sentinel monitor masterdap3 158.222.14.23 6301 3
sentinel monitor masterMFS 158.222.14.24 6301 3
sentinel monitor masterRPS 158.222.14.25 6301 3
说明:
有几个主节点就配置几行,mymaster 为主节点的名字,每个主节点的名字保证唯一性,此处使用master+系统标识+流水号作为主节点name。
每行最后的数字,不能大于哨兵的数量,不能小于哨兵数量的一半。
5、心跳配置:
修改:sentinel parallel-syncs mymaster 1 为
sentinel down-after-milliseconds masterdap1 30000
sentinel down-after-milliseconds masterdap2 30000
sentinel down-after-milliseconds masterdap3 30000
sentinel down-after-milliseconds masterMFS 30000
sentinel down-after-milliseconds masterRPS 30000
说明:
a、sentinel认为服务器已经断线所需的毫秒数。
b、与哨兵监听主节点的配置一致, 有几个主节点配置几行,主节点的名字要一 一对应。
6、failover配置:
修改:sentinel parallel-syncs mymaster 1 为
sentinel parallel-syncs masterdap1 1
sentinel parallel-syncs masterdap2 1
sentinel parallel-syncs masterdap3 1
sentinel parallel-syncs masterMFS 1
sentinel parallel-syncs masterRPS 1
说明:
a、在故障转移时,最多可以有多少个从节点同时对新的主节点进行同步,这个数字越小,完成故障转移所需的时间就越长。
b、与哨兵监听主节点的配置一致, 有几个主节点配置几行,主节点的名字要一一对应。
7、failover-timeout 配置:
修改:sentinel failover-timeout mymaster 180000 为
sentinel failover-timeout masterdap1 900000
sentinel failover-timeout masterdap2 900000
sentinel failover-timeout masterdap3 900000
sentinel failover-timeout masterMFS 900000
sentinel failover-timeout masterRPS 900000
说明:
a:如果在指定的时间内未能完成failover故障转移,则任务故障转移失败。
b:与哨兵监听主节点的配置一致, 有几个主节点配置几行,主节点的名字要一一对应。
其它的默认
Redis主从部署安装:
主节点masterdap1的主从配置(masterdap2,masterdap3,masterRPS,masterMFS
的主从配置皆按照此步骤部署):
role |
host |
port |
主节点masterdap1 |
158.222.14.21 |
6301 |
从节点slave1 |
158.222.14.22 |
6302 |
从节点slave2 |
158.222.14.23 |
6303 |
主节点masterdap2 |
158.222.14.22 |
6301 |
从节点slave1 |
158.222.14.23 |
6302 |
从节点slave2 |
158.222.14.24 |
6303 |
主节点masterdap3 |
158.222.14.23 |
6301 |
从节点slave1 |
158.222.14.24 |
6302 |
从节点slave2 |
158.222.14.25 |
6303 |
主节点masterRPS |
158.222.14.24 |
6301 |
从节点slave1 |
158.222.14.25 |
6302 |
从节点slave2 |
158.222.14.21 |
6303 |
主节点masterMFS |
158.222.14.25 |
6301 |
从节点slave1 |
158.222.14.21 |
6302 |
从节点slave2 |
158.222.14.22 |
6303 |
部署主节点masterdap1:
登陆158.222.14.21(用户/密码:redis/redis)
在用户根目录下新建目录:$HOME/redis_6301/ , 把如下文件复制进来
|
以redis用户在$HOME/ redis_6301路径下创建run路径,进入run路径,创建data路径,创建logs路径 , data路径与logs路径平级。
复制redis.conf为redis_6301.conf,此两个文件处于同一路径下
编辑redis_6301.conf
如下为修改后的值在实际中可找到对应的前节点修改后面的值:
1、修改: pidfile /var/run/redis.pid 为
pidfile /var/run/redis_6301.pid
2、修改: port 6379 为
port 6301
3、修改: logfile "" 为
logfile home/redis/redis_6301/run/logs/redis_6301.log
4、修改: #save ""
save 900 1
save 300 10
save 60 10000
为
save ""
#save 900 1
#save 300 10
#save 60 10000
说明:此参数为redis的SNAPSHOT持久化策略
5、修改:# maxmemory
说明:此参数为redis最大内存大小,视redis使用场景和宿主机大小而定
6、修改:# maxclients 10000 为 maxclients 10000
7、修改:# maxmemory-policy noeviction 为maxmemory-policy allkeys-lru
说明:缓存数据淘汰策略
8、修该:# maxmemory-samples 5 为 maxmemory-samples 5
9、修改:dbfilename dump.rdb 为 dbfilename dump_6301.rdb
10、修改:dir./ 为 dir /home/redis/redis_6301/run/data
11、修改:appendfilename "appendonly.aof" 为
appendfilename "appendonly_6301.aof"
12、修改:timeout 0 为 timeout=180
说明:该参数为连接的超时时间,当超过该时间(单位秒)连接未有操作,该连接被关闭。
不操作redis的短连接应该被关闭。
主节点masterdap1部署完成。
部署主节点masterdap1的两个从节点
Slave1 |
158.222.14.22 |
6302 |
Slave2 |
158.222.14.23 |
6303 |
配置主节点masterdap1的从节点slave1。以redis用户登陆158.222.14.22物理机,在用户根目录下新建目录:$HOME/redis_6302/,把如下文件复制进来
|
在路径 $HOME/redis_6302/ 下创建run路径,进入run路径,创建data路径,创建logs路径 , data路径与logs路径平级。
复制redis.conf为redis_6302.conf,此两个文件处于同一路径下
编辑redis_6302.conf文件:
修改:pidfile /var/run/redis.pid 为 pidfile /var/run/redis_6302.pid
修改:port 6379 为port 6302
修改:logfile "" 为
logfile "/home/redis/redis_6302/run/logs/redis_6302.log"
修改:
#save ""
save 900 1
save 300 10
save 60 10000
为
save ""
#save 900 1
#save 300 10
#save 60 10000
说明:redis的SNAPSHOT持久化策略,此处配置为关闭SNAPSHOT持久化策略,若要求redis数据高可用,则该参数默认即可。
修改:dbfilename dump.rdb 为 dbfilename dump_6302.rdb
修改:dir ./ 为dir "/home/redis/redis_6302/run/data"
修改:# slaveof
说明:根据此配置确定主从关系,主节点无须配置该参数,从节点必须配置该参数
修改:# maxclients 10000 为 maxclients 10000
修改:# maxmemory
说明:此参数为redis最大内存大小,视redis使用场景和宿主机大小而定
修改:# maxmemory-policy noeviction 为 maxmemory-policy allkeys-lru
说明:数据淘汰策略
修改:# maxmemory-samples 5 为 maxmemory-samples 5
修改:appendonly no 为appendonly yes
说明:redis的 appendonly持久化策略 ,此处启用appendonly策略
修改:#appendfsync everysec 为appendfsync everysec
说明:redis的appendonly持久化策略参数,每秒一次
修改:appendfilename "appendonly.aof" 为appendfilename "appendonly_6302.aof"
说明:appendonly持久化策略的持久化数据文件
主节点masterdap1的从节点Slave1配置完成
配置主节点masterdap1的从节点slave2,参照slave1部署。
Redis启动/停止:
启动顺序:哨兵集群 ---- > 所有主节点 --–> 所有从节点
停止顺序:所有从节点 ----> 所有主节点 --–> 哨兵集群
1、启动哨兵集群
哨兵启动有两种方式,一种是非守护进程启动方式,该方式为默认方式。一种是守护进程启动方式。
(1)、非守护进程启动:
进入$HOME/redis/redis_sentinel_26379路径,启动命令如下:
./redis-sentinel sentinel_26379.conf
如图:
出现如下结果即说明哨兵启动成功:
(2)、守护进程启动
守护启动有两种方式,第一种为在启动时以指定参数的方式:
以nohub的方式启动并指定日志路径,
nohup ./redis-sentinel sentinel_26379.conf >> /home/redis/redis_sentinel_26379/run/logs/sentinel_26379.log 2>&1 & |
以守护进程启动的第二中方式为在哨兵配置文件redis_sentinel_26379中增加如下配置:
daemonize yes logfile "/home/redis/redis_sentinel_26379/run/logs/sentinel_26379.log"
|
然后以命令 ./redis-sentinel sentinel_26379.conf 即可启动,在日志文件中可以看到启动结果。
2、启动主节点
主节点和哨兵启动方式类似,仅命令不同。
以非守护进程方式启动:
启动成功后会看到如下日志:
守护进程启动
守护进程启动有两种方式
守护启动有两种方式,第一种为在启动时以指定参数的方式:
以nohub的方式启动并指定日志路径,
nohup ./redis-server redis_6301.conf >> /home/redis/redis_6301/run/logs/redis_6301.log 2>&1 & |
以守护进程启动的第二中方式为在哨兵配置文件redis_sentinel_26379中增加如下配置:
daemonize yes logfile "/home/redis/redis_6301/run/logs/redis_6301.log"
|
以命令 ./redis-server redis_6301.conf 即可启动,在日志文件中可以看到启动结果
3、启动从节点
同主节点
验证启动结果
启动完成后,进入一个哨兵客户端,因为一台机器上部署多个节点,所以进入客户端时必须指定端口:
在客户端输入命令:info 或info sentinel 便可看到该哨兵所监控所有主节点信息:
如上图,有5个主节点,主节点名称,状态,ip,端口,从节点数量,监控的哨兵数量等。
日志查看:
Redis配置文件中指定日志路径和日志级别,见配置文件中logfile配置项
权限管理:
1、初始化时配置权限:
(1)主节点和从节点配置:
requirepass password
此配置为连接redis 时的权限密码
masterauth password
此配置为从节点连接主节点时的权限密码,password 为主节点的requirepass
(2)哨兵配置:
sentinel auth-pass masterName master_passwd
masterName 为哨兵监控主节点的名字,master_passwd 为主节点的requirepass
(3)启动顺序:所有主节点 - 所有从节点 - 哨兵
2、运行中配置权限
(1)运行中的redis集群设置权限,主节点必须最后设置密码,哨兵和从节点无顺序要求。如果先设置主节点密码,那么从节点同步数据时会因主节点有权限导致连接不上主节点。哨兵向主节点发送心跳请求时也会因主节点有权限导致无法获得心跳响应,哨兵会认为主节点主观-客观下线进而进行主从切换。
(2)配置方式,连接redis客户端,以config命令设置密码
设置密码(主节点、从节点):
查看密码(主节点、从节点):
主、从节点设置连接主节点权限密码:
主、从节点查看连接主节点权限密码:
注:主节点也要设置 masterauth,如果不设置,主从切换后新从节点(切换前主节点)会连不上新主节点(切换前的某个从节点)
常见问题及解决方法:
1、持久化
Master最好不要做任何持久化配置,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化。
如果数据比较关键,某个slave开启AOF备份数据,策略为每秒同步一次
为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内。
尽量避免在压力较大的主库上增加从库
(后续补充)
2、启动警告:WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
临时解决办法(系统重启后失效)
解决办法:echo 511 > /proc/sys/net/core/somaxconn
永久解决办法:
将其写入、/etc/rc.local文件中
3、启动警告:WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
此问题需设置redis缓存使用策略,/proc/sys/vm/overcommit_memory
可设置的值:0,1,2,建议设置为1
临时解决方法:
A: echo 1 > /proc/sys/vm/overcommit_memory
B: echo “overcommit_memory=1” >> /etc/sysctl.conf
永久解决办法:
将其写入 /etc/sysctl.conf文件中
4、启动警告:WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
临时解决办法:echo never >/sys/kernel/mm/transparent_hugepage/enabled
永久解决办法:将其写入/etc/rc.local文件中