最近工做中须要用到redis哨兵集群,笔者本身搭建了3遍,直接开始node
系统 | 版本 |
---|---|
操做系统 | CentOS 7.4 |
Redis | 5.0.8 |
redis | IP | 主从 |
---|---|---|
redis-1 | 1.1.1.1 | 主 |
redis-2 | 1.1.1.2 | 从 |
redis-3 | 1.1.1.3 | 从 |
喜欢什么方式(ftp、wget...),本身选,你总会获得源码包。c++
cp redis-5.0.8.tar.gz /usr/local/redis-5.0.8.tar.gz cd /usr/local tar -zxvf redis-5.0.8.tar.gz cd redis-5.0.8
yum install -y gcc g++ gcc-c++ make make
这里说明一下,有些设备make仍是会报错
1,刷新下你的软件 CentOS:yum update
2,给make增长参数:make MALLOC=libcredis
mkdir /etc/redis cd /etc/redis vi 6379.conf
cp /usr/local/redis-5.0.8/utils/redis_init_script /etc/init.d/redisd vi /etc/init.d/redisd
修改EXEC、CLIEXEC的参数以下算法
EXEC=/usr/local/redis-5.0.8/src/redis-server CLIEXEC=/usr/local/redis-5.0.8/src/redis-cli
设置开机自启动数据库
cd /etc/init.d chkconfig redisd on
增长一个log日志文件夹(这里的文件夹和后文中的配置文件相关)安全
mkdir /usr/local/redis-5.0.8/logs
请关注这三个参数 masterauth、requirepass、slave-priority服务器
masterauth:这个密码是指mastre节点的requirepass的值,而咱们这里是配置master,那么,masterauth和 requirepass的值相同。数据结构
requirepass:这个是redis的密码。app
slave-priority:这个参数,下面有详细的解释dom
根据笔者的经验,在master节点,只修改以上三个参数,若是有兴趣修改其余参数,自行研究。
# 当master服务设置了密码保护时,slav服务链接master的密码 masterauth "tqOJIsjrjLFUtvNV" # 密码验证 # 警告:由于Redis太快了,因此外面的人能够尝试每秒150k的密码来试图破解密码。这意味着你须要 # 一个高强度的密码,不然破解太容易了 requirepass tqOJIsjrjLFUtvNV # slave的优先级是一个整数展现在Redis的Info输出中。若是master再也不正常工做了,哨兵将用它来 # 选择一个slave提高=升为master。 # 优先级数字小的salve会优先考虑提高为master,因此例若有三个slave优先级分别为10,100,25, # 哨兵将挑选优先级最小数字为10的slave。 # 0做为一个特殊的优先级,标识这个slave不能做为master,因此一个优先级为0的slave永远不会被 # 哨兵挑选提高为master slave-priority 1 # 守护进程模式 daemonize yes # pid file 修改pidfile指向路径 pidfile /usr/local/redis-5.0.8/redis_master.pid # 监听端口 port 6379 # TCP接收队列长度,受/proc/sys/net/core/somaxconn和tcp_max_syn_backlog这两个内核参数的影响 #tcp-backlog 511 # 一个客户端空闲多少秒后关闭链接(0表明禁用,永不关闭) timeout 0 # 若是非零,则设置SO_KEEPALIVE选项来向空闲链接的客户端发送ACK tcp-keepalive 60 # 指定服务器调试等级 # 可能值: # debug (大量信息,对开发/测试有用) # verbose (不少精简的有用信息,可是不像debug等级那么多) # notice (适量的信息,基本上是你生产环境中须要的) # warning (只有很重要/严重的信息会记录下来) loglevel notice # 指明日志文件名 logfile "/usr/local/redis-5.0.8/logs/redis6379.log" # 设置数据库个数 databases 16 # 会在指定秒数和数据变化次数以后把数据库写到磁盘上 # 900秒(15分钟)以后,且至少1次变动 # 300秒(5分钟)以后,且至少10次变动 # 60秒以后,且至少10000次变动 save 900 1 save 300 10 save 60 10000 # 默认若是开启RDB快照(至少一条save指令)而且最新的后台保存失败,Redis将会中止接受写操做 # 这将使用户知道数据没有正确的持久化到硬盘,不然可能没人注意到而且形成一些灾难 stop-writes-on-bgsave-error yes # 当导出到 .rdb 数据库时是否用LZF压缩字符串对象 rdbcompression yes # 版本5的RDB有一个CRC64算法的校验和放在了文件的最后。这将使文件格式更加可靠。 rdbchecksum yes # 持久化数据库的文件名 dbfilename dump-master.rdb # 工做目录 dir /usr/local/redis-5.0.8/logs/ # 当一个slave失去和master的链接,或者同步正在进行中,slave的行为能够有两种: # # 1) 若是 slave-serve-stale-data 设置为 "yes" (默认值),slave会继续响应客户端请求, # 多是正常数据,或者是过期了的数据,也多是还没得到值的空数据。 # 2) 若是 slave-serve-stale-data 设置为 "no",slave会回复"正在从master同步 # (SYNC with master in progress)"来处理各类请求,除了 INFO 和 SLAVEOF 命令。 slave-serve-stale-data yes # 你能够配置salve实例是否接受写操做。可写的slave实例可能对存储临时数据比较有用(由于写入salve # 的数据在同master同步以后将很容易被删除 slave-read-only yes # 是否在slave套接字发送SYNC以后禁用 TCP_NODELAY? # 若是你选择“yes”Redis将使用更少的TCP包和带宽来向slaves发送数据。可是这将使数据传输到slave # 上有延迟,Linux内核的默认配置会达到40毫秒 # 若是你选择了 "no" 数据传输到salve的延迟将会减小但要使用更多的带宽 repl-disable-tcp-nodelay no # redis实例最大占用内存,不要用比设置的上限更多的内存。一旦内存使用达到上限,Redis会根据选定的回收策略(参见: # maxmemmory-policy)删除key maxmemory 15gb # 最大内存策略:若是达到内存限制了,Redis如何选择删除key。你能够在下面五个行为里选: # volatile-lru -> 根据LRU算法删除带有过时时间的key。 # allkeys-lru -> 根据LRU算法删除任何key。 # volatile-random -> 根据过时设置来随机删除key, 具有过时时间的key。 # allkeys->random -> 无差异随机删, 任何一个key。 # volatile-ttl -> 根据最近过时时间来删除(辅以TTL), 这是对于有过时时间的key # noeviction -> 谁也不删,直接在写操做时返回错误。 maxmemory-policy volatile-lru # 默认状况下,Redis是异步的把数据导出到磁盘上。这种模式在不少应用里已经足够好,但Redis进程 # 出问题或断电时可能形成一段时间的写操做丢失(这取决于配置的save指令)。 # # AOF是一种提供了更可靠的替代持久化模式,例如使用默认的数据写入文件策略(参见后面的配置) # 在遇到像服务器断电或单写状况下Redis自身进程出问题但操做系统仍正常运行等突发事件时,Redis # 能只丢失1秒的写操做。 # # AOF和RDB持久化能同时启动而且不会有问题。 # 若是AOF开启,那么在启动时Redis将加载AOF文件,它更能保证数据的可靠性。 appendonly yes # aof文件名 appendfilename "appendonly.aof" # fsync() 系统调用告诉操做系统把数据写到磁盘上,而不是等更多的数据进入输出缓冲区。 # 有些操做系统会真的把数据立刻刷到磁盘上;有些则会尽快去尝试这么作。 # # Redis支持三种不一样的模式: # # no:不要马上刷,只有在操做系统须要刷的时候再刷。比较快。 # always:每次写操做都马上写入到aof文件。慢,可是最安全。 # everysec:每秒写一次。折中方案。 appendfsync everysec # 若是AOF的同步策略设置成 "always" 或者 "everysec",而且后台的存储进程(后台存储或写入AOF # 日志)会产生不少磁盘I/O开销。某些Linux的配置下会使Redis由于 fsync()系统调用而阻塞好久。 # 注意,目前对这个状况尚未完美修正,甚至不一样线程的 fsync() 会阻塞咱们同步的write(2)调用。 # # 为了缓解这个问题,能够用下面这个选项。它能够在 BGSAVE 或 BGREWRITEAOF 处理时阻止主进程进行fsync()。 # # 这就意味着若是有子进程在进行保存操做,那么Redis就处于"不可同步"的状态。 # 这其实是说,在最差的状况下可能会丢掉30秒钟的日志数据。(默认Linux设定) # # 若是你有延时问题把这个设置成"yes",不然就保持"no",这是保存持久数据的最安全的方式。 no-appendfsync-on-rewrite yes # 自动重写AOF文件 auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb # AOF文件可能在尾部是不完整的(这跟system关闭有问题,尤为是mount ext4文件系统时 # 没有加上data=ordered选项。只会发生在os死时,redis本身死不会不完整)。 # 那redis重启时load进内存的时候就有问题了。 # 发生的时候,能够选择redis启动报错,而且通知用户和写日志,或者load尽可能多正常的数据。 # 若是aof-load-truncated是yes,会自动发布一个log给客户端而后load(默认)。 # 若是是no,用户必须手动redis-check-aof修复AOF文件才能够。 # 注意,若是在读取的过程当中,发现这个aof是损坏的,服务器也是会退出的, # 这个选项仅仅用于当服务器尝试读取更多的数据但又找不到相应的数据时。 aof-load-truncated yes # Lua 脚本的最大执行时间,毫秒为单位 lua-time-limit 5000 # Redis慢查询日志能够记录超过指定时间的查询 slowlog-log-slower-than 10000 # 这个长度没有限制。只是要主要会消耗内存。你能够经过 SLOWLOG RESET 来回收内存。 slowlog-max-len 128 # redis延时监控系统在运行时会采样一些操做,以便收集可能致使延时的数据根源。 # 经过 LATENCY命令 能够打印一些图样和获取一些报告,方便监控 # 这个系统仅仅记录那个执行时间大于或等于预约时间(毫秒)的操做, # 这个预约时间是经过latency-monitor-threshold配置来指定的, # 当设置为0时,这个监控系统处于中止状态 latency-monitor-threshold 0 # Redis能通知 Pub/Sub 客户端关于键空间发生的事件,默认关闭 notify-keyspace-events "" # 当hash只有少许的entry时,而且最大的entry所占空间没有超过指定的限制时,会用一种节省内存的 # 数据结构来编码。能够经过下面的指令来设定限制 hash-max-ziplist-entries 512 hash-max-ziplist-value 64 # 与hash似,数据元素较少的list,能够用另外一种方式来编码从而节省大量空间。 # 这种特殊的方式只有在符合下面限制时才能够用 list-max-ziplist-entries 512 list-max-ziplist-value 64 # set有一种特殊编码的状况:当set数据全是十进制64位有符号整型数字构成的字符串时。 # 下面这个配置项就是用来设置set使用这种编码来节省内存的最大长度。 set-max-intset-entries 512 # 与hash和list类似,有序集合也能够用一种特别的编码方式来节省大量空间。 # 这种编码只适合长度和元素都小于下面限制的有序集合 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 # HyperLogLog稀疏结构表示字节的限制。该限制包括 # 16个字节的头。当HyperLogLog使用稀疏结构表示 # 这些限制,它会被转换成密度表示。 # 值大于16000是彻底没用的,由于在该点 # 密集的表示是更多的内存效率。 # 建议值是3000左右,以便具备的内存好处, 减小内存的消耗 hll-sparse-max-bytes 3000 # 启用哈希刷新,每100个CPU毫秒会拿出1个毫秒来刷新Redis的主哈希表(顶级键值映射表) activerehashing yes # 客户端的输出缓冲区的限制,可用于强制断开那些由于某种缘由从服务器读取数据的速度不够快的客户端 client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 # 默认状况下,“hz”的被设定为10。提升该值将在Redis空闲时使用更多的CPU时,但同时当有多个key # 同时到期会使Redis的反应更灵敏,以及超时能够更精确地处理 hz 10 # 当一个子进程重写AOF文件时,若是启用下面的选项,则文件每生成32M数据会被同步 aof-rewrite-incremental-fsync yes
redis-2的配置文件基本上与redis-1的配置文件一致。我这里重点讲一下不一样点
# 这个配置是redis-1中没有的,须要在redis-2中新增 # 这里的IP是redis-1的IP地址,端口是redis-1 6379.conf配置文件中port的值,默认值是6379 slaveof 1.1.1.1 6379
masterauth:在从库中,这里的值是主节点(也就是redis-1)配置文件中requirepass的值
requirepass:这个密码能够随意设置。
slave-priority:在集群中,这个参数,设置成不一样的值,能够根据设备性能好坏来设置大小
这个配置文件参考Redis-2的配置便可。
接下来能够启动啦~分别启动三台服务器上的redis
启动 service redisd start 关闭 service redisd stop
这个时候,能够用RedisDesktopManager,来链接测试一下。
1.1.1.1 能够读写
1.1.1.2 和 1.1.1.3 只读,数据是从1.1.1.1同步过来(记得刷新数据)
Redis-1 的哨兵配置
dir "/usr/local/redis-5.0.8/logs/" logfile "/usr/local/redis-5.0.8/logs/sentinel26379.log" daemonize yes # 本机ip bind 1.1.1.1 127.0.0.1 port 26379 # 主机点ip sentinel monitor mymaster 1.1.1.1 6379 2 # 这里的密码是指 Redis-1 的 requirepass sentinel auth-pass mymaster 密码 sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1
Redis-2 的哨兵配置
dir "/usr/local/redis-5.0.8/logs/" logfile "/usr/local/redis-5.0.8/logs/sentinel26379.log" daemonize yes # 本机ip bind 1.1.1.2 127.0.0.1 port 26379 # 主机点ip sentinel monitor mymaster 1.1.1.1 6379 2 # 这里的密码是指 Redis-1 的 requirepass sentinel auth-pass mymaster 密码 sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1
Redis-3 的哨兵配置
dir "/usr/local/redis-5.0.8/logs/" logfile "/usr/local/redis-5.0.8/logs/sentinel26379.log" daemonize yes # 本机ip bind 1.1.1.3 127.0.0.1 port 26379 # 主机点ip sentinel monitor mymaster 1.1.1.1 6379 2 # 这里的密码是指 Redis-1 的 requirepass sentinel auth-pass mymaster 密码 sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1
cp /etc/init.d/redisd /etc/init.d/redis-sentinel vi /etc/init.d/redis-sentinel
修改一下内容
REDISPORT=6379 修改成 REDISPORT=6379 增长一行参数 PARAM=" --sentinel" $EXEC $CONF 修改成 $EXEC $CONF $PARAM
开机自启动哨兵
chkconfig redis-sentinel on
启动哨兵
service redis-sentinel start
关闭master,也就是 Redis-1
ps -ef | grep redis kill ?
查看日志
tail -f /usr/local/redis-5.0.8/logs/sentinel26379.log
日志内容最重要的一句,表示切换了master +switch-master mymaster 1.1.1.1 6379 1.1.1.2 6379
终端验证
在RedisDesktopManager中验证。