Twemproxy+HAProxy+Keepalived+Sentinel+主从复制(生产环境)
- https://www.cnblogs.com/huanghongbo/p/8698636.html参考链接
- redis简介
- sentinel 功能
- twemproxy特性
- twemproxy + redis + sentinel 实现redis集群高可用架构图
- 实战一 :环境部署
- 实战二 :redis 主从配置
- 实战三 :sentinel 配置
- 实战四 :twemproxy 配置
redis sentinel
redis sentinel 是redis 官方推荐的redis 高可用(HA)解决方案
sentinel 的功能:
- 监控(Monitoring),sentinel 时刻监控着redis master-slave 是否正常运行
- 通知(Notification),sentinel 可以通过api 来通知管理员,被监控的redis master-slave 出现了问题
- 自动故障转移(Automatic failover),当redis master 出现故障不可用状态,sentinel 会开始一次故障转移,将其中一个 slave 提升为新的master ,将其他的slave 将重新配置使用新的master同步,并使用Redis的服务器应用程序在连接时收到使用新的地址连接
- 配置提供者(Configuration provider) ,sentinel 作为在集群中的权威来源,客户端连接到sentinel来获取某个服务的当前Redis主服务器的地址和其他信息。当故障转移发生时,Sentinel 会报告新地址
twemproxy (nutcraker)
Twemproxy,也叫nutcraker。是一个twtter开源的一个redis 和memcache 快速/轻量级代理服务器;Twemproxy是一个快速的单线程代理程序,支持Memcached ASCII协议和更新的Redis协议
Twemproxy 通过引入一个代理层,可以将其后端的多台 Redis 或 Memcached 实例进行统一管理与分配,使应用程序只需要在 Twemproxy 上进行操作,而不用关心后面具体有多少个真实的 Redis 或 Memcached 存储
twemproxy 的特性:
- 支持失败节点自动删除
- 可以设置重新连接该节点的时间
- 可以设置连接多少次之后删除该节点 - 支持设置HashTag
- 通过HashTag可以自己设定将两个key哈希到同一个实例上去 - 减少与redis的直接连接数
- 保持与redis的长连接
- 减少了客户端直接与服务器连接的连接数量 - 自动分片到后端多个redis实例上
- 多种hash算法:md5、crc16、crc32 、crc32a、fnv1_64、fnv1a_64、fnv1_32、fnv1a_32、hsieh、murmur、jenkins
- 多种分片算法:ketama(一致性hash算法的一种实现)、modula、random
- 可以设置后端实例的权重 - 避免单点问题
- 可以平行部署多个代理层,通过HAProxy做负载均衡,将redis的读写分散到多个twemproxy上。 - 支持状态监控
- 可设置状态监控ip和端口,访问ip和端口可以得到一个json格式的状态信息串
- 可设置监控信息刷新间隔时间 - 使用 pipelining 处理请求和响应
- 连接复用,内存复用
- 将多个连接请求,组成reids pipelining统一向redis请求 - 并不是支持所有redis命令
- 不支持redis的事务操作
- 使用SIDFF, SDIFFSTORE, SINTER, SINTERSTORE, SMOVE, SUNION and SUNIONSTORE命令需要保证key都在同一个分片上
twemproxy + redis + sentinel 高可用架构
- 前端使用twemproxy (主备节点)做代理,将其后端的多台Redis实例分片进行统一管理与分配
- 每一个分片节点的redis slave 都是redis master的副本且只读
- redis sentinel 持续不断的监控每个分片节点的master,当master出现故障且不可用状态时,sentinel 会通知/启动自动故障转移等动作
- sentinel 可以在发生故障转移动作后触发相应脚本(通过 client-reconfig-script 参数配置 ),脚本获取到最新的master来修改 twemproxy 配置并重启 twemproxy
实战一 :环境部署
实验环境
Name |
IP |
Port |
Sentinel Port |
Twemproxy1 |
10.86.7.12 |
14555 |
26379 |
Twemproxy2 |
10.86.7.13 |
14555 |
26379 |
Master1 |
10.86.7.6 |
6379 |
26379 |
Master2 |
10.86.7.7 |
6379 |
26379 |
Master3 |
10.86.7.8 |
6379 |
26379 |
Slave1 |
10.86.7.9 |
6379 |
26379 |
Slave2 |
10.86.7.10 |
6379 |
26379 |
Slave3 |
10.86.7.11 |
6379 |
26379 |
安装redis
分别在八台服务器都安装 redis
1 ## 下载 && 解压并安装 2 wget http://download.redis.io/releases/redis-3.2.0.tar.gz 3 tar -zxf redis-3.2.0.tar.gz 4 cd redis-3.2.0 5 yum install gcc 6 make PREFIX=/usr/local/redis install 7 taskset -c 1 make test 指定 CPU1 编译测试 8 ls /usr/local/redis/bin/ -l 9 -rwxr-xr-x 1 root root 2426691 Mar 3 10:44 redis-benchmark 10 -rwxr-xr-x 1 root root 25165 Mar 3 10:44 redis-check-aof 11 -rwxr-xr-x 1 root root 5173309 Mar 3 10:44 redis-check-rdb 12 -rwxr-xr-x 1 root root 2577229 Mar 3 10:44 redis-cli 13 lrwxrwxrwx 1 root root 12 Mar 3 10:44 redis-sentinel -> redis-server 14 -rwxr-xr-x 1 root root 5173309 Mar 3 10:44 redis-server 15 /usr/local/redis/bin/redis-server -v 16 Redis server v=3.2.0 sha=00000000:0 malloc=jemalloc-4.0.3 bits=64 build=e14048a755820e0
安装twemproxy
在 10.86.7.12 10.86.7.13 服务器安装 twemproxy
安装twemproxy 前,需要安装autoconf,automake,libtool 软件包
1、编译安装autoconf
1 ## 下载 && 解压并安装 2 wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz 3 tar zxf autoconf-2.69.tar.gz 4 ./configure 5 make && make install
2、编译安装automake
1 ## 下载 && 解压并安装 2 wget http://ftp.gnu.org/gnu/automake/automake-1.15.tar.gz 3 tar zxf automake-1.15.tar.gz 4 ./configure 5 make && make install
3、编译安装libtool
1 ## 下载 && 解压并安装 2 wget https://ftp.gnu.org/gnu/libtool/libtool-2.4.6.tar.gz 3 tar zxf libtool-2.4.6.tar.gz 4 cd libtool-2.4.6 5 ./configure 6 make && make install
4、编译安装twemproxy
1 ## 下载 && 解压并安装 2 wget https://github.com/twitter/twemproxy/archive/master.zip 3 unzip master.zip 4 cd twemproxy-master 5 ## 在twemproxy源码目录执行autoreconf 生成 configure文件等 6 aclocal 7 autoreconf -f -i -Wall,no-obsolete 8 ## 然后编译安装 9 ./configure --prefix=/usr/local/twemproxy/ 10 make && make install
注意:如果没有安装libtool 的话,autoreconf 的时候会报错,如下:
configure.ac:133: the top level configure.ac:36: error: possibly undefined macro: AC_PROG_LIBTOOL If this token and others are legitimate, please use m4_pattern_allow. See the Autoconf documentation. autoreconf: /usr/local/bin/autoconf failed with exit status: 1
实战二 : redis 主从配置
1、创建目录环境
1 ## 2 ## 在Redis Master 和 Redis Slave 创建目录 3 mkdir -p usr/local/redis/{6379,26379} 4 5 ## 在twemproxy01 和 twemproxy02 创建目录 6 mkdir -p /usr/local/redis/26379/ 7 mkdir -p /usr/local/twemproxy/{conf,logs}
10.86.7.6(主) --> 10.86.7.9(从) 10.86.7.7(主) --> 10.86.7.10(从) 10.86.7.8(主) --> 10.86.7.11(从)
在 10.86.7.6 配置Master 文件

1 daemonize yes ##使用daemon 方式运行程序,默认为非daemon方式运行 2 pidfile "/data/nosql/redis_4500/redis.pid" ##pid文件位置 3 port 4500 ##监听端口 4 bind 192.168.16.22 ##绑定ip 5 timeout 0 ## client 端空闲断开连接的时间 6 loglevel warning ##日志记录级别,默认是notice,我这边使用warning,是为了监控日志方便。 7 ## 使用warning后,只有发生告警才会产生日志,这对于通过判断日志文件是否为空来监控报警非常方便。 8 logfile "/data/nosql/redis_4500/redis.log" 9 databases 16 ##默认是0,也就是只用1 个db,我这边设置成16,方便多个应用使用同一个redis server。 10 ##使用select n 命令可以确认使用的redis db ,这样不同的应用即使使用相同的key也不会有问题。 11 12 ##下面是SNAPSHOTTING持久化方式的策略。 13 ##为了保证数据相对安全,在下面的设置中,更改越频繁,SNAPSHOTTING越频繁, 14 ##也就是说,压力越大,反而花在持久化上的资源会越多。 15 ##所以我选择了master-slave模式,并在master关掉了SNAPSHOTTING。 16 save 900 1 #在900秒之内,redis至少发生1次修改则redis抓快照到磁盘 17 save 300 10 #在300秒之内,redis至少发生100次修改则redis抓快照到磁盘 18 save 60 10000 #在60秒之内,redis至少发生10000次修改则redis抓快照到磁盘 19 stop-writes-on-bgsave-error yes 20 rdbcompression yes ##使用压缩 21 rdbchecksum yes 22 dbfilename "dump.rdb" 23 dir "/data/nosql/redis_4500" 24 25 ## replication 设置 26 slave-serve-stale-data yes 27 slave-read-only yes 28 slave-priority 100 29 30 ###LIMIT 设置 31 maxmemory 256mb ##redis最大可使用的内存量,如果使用redis SNAPSHOTTING的copy-on-write的持久会写方式,会额外的使用内存, 32 ##为了使持久会操作不会使用系统VM,使redis服务器性能下降,建议保留redis最大使用内存的一半来留给持久化使用 33 maxmemory-policy allkeys-lru ##使用LRU算法删除设置了过期时间的key,但如果程序写的时间没有写key的过期时间 34 ##建议使用allkeys-lru,这样至少保证redis不会不可写入 35 36 ##append only mode设置 37 appendonly no 38 appendfsync everysec 39 no-appendfsync-on-rewrite no 40 auto-aof-rewrite-percentage 100 41 auto-aof-rewrite-min-size 64mb 42 lua-time-limit 5000 43 44 ###slow log 设置 45 slowlog-log-slower-than 10000 46 slowlog-max-len 128 47 48 ##advanced config设置,下面的设置主要是用来节省内存的 49 hash-max-ziplist-entries 1024 50 hash-max-ziplist-value 2048 51 list-max-ziplist-entries 512 52 list-max-ziplist-value 64 53 set-max-intset-entries 512 54 zset-max-ziplist-entries 128 55 zset-max-ziplist-value 64 56 activerehashing yes 57 58 client-output-buffer-limit normal 0 0 0 59 client-output-buffer-limit slave 256mb 64mb 60 60 client-output-buffer-limit pubsub 32mb 8mb 60
1 bind 0.0.0.0 ##绑定ip 2 protected-mode yes ##使用daemon 方式运行程序,默认为非daemon方式运行 3 port 6379 ##监听端口 4 tcp-backlog 511 5 timeout 0 ## client 端空闲断开连接的时间 6 tcp-keepalive 0 7 daemonize yes 8 supervised no 9 pidfile "/var/run/redis_6379.pid" ##pid文件位置 10 loglevel notice ##日志记录级别,默认是notice,我这边使用warning,是为了监控日志方便。 11 ## 使用warning后,只有发生告警才会产生日志,这对于通过判断日志文件是否为空来监控报警非常方便 12 logfile "" 13 databases 16 ##默认是0,也就是只用1 个db,我这边设置成16,方便多个应用使用同一个redis server。 14 ##使用select n 命令可以确认使用的redis db ,这样不同的应用即使使用相同的key也不会有问题 15 16 ##下面是SNAPSHOTTING持久化方式的策略。 17 ##为了保证数据相对安全,在下面的设置中,更改越频繁,SNAPSHOTTING越频繁, 18 ##也就是说,压力越大,反而花在持久化上的资源会越多。 19 ##所以我选择了master-slave模式,并在master关掉了SNAPSHOTTING。 20 save 900 1 #在900秒之内,redis至少发生1次修改则redis抓快照到磁盘 21 save 300 10 #在300秒之内,redis至少发生100次修改则redis抓快照到磁盘 22 save 60 10000 #在60秒之内,redis至少发生10000次修改则redis抓快照到磁盘 23 stop-writes-on-bgsave-error yes 24 rdbcompression yes ##使用压缩 25 rdbchecksum yes 26 dbfilename "dump.rdb" 27 dir "/export/redis" 28 29 ## replication 设置 30 slave-serve-stale-data yes 31 slave-read-only yes 32 repl-diskless-sync no 33 repl-diskless-sync-delay 5 34 repl-disable-tcp-nodelay no 35 slave-priority 100 36 37 38 ##append only mode设置 39 appendonly yes 40 appendfilename "Master3_appendonly.aof" 41 appendfsync everysec 42 no-appendfsync-on-rewrite no 43 auto-aof-rewrite-percentage 100 44 auto-aof-rewrite-min-size 64mb 45 aof-load-truncated yes 46 lua-time-limit 5000 47 slowlog-log-slower-than 10000 48 slowlog-max-len 128 49 latency-monitor-threshold 0 50 notify-keyspace-events "" 51 hash-max-ziplist-entries 512 52 hash-max-ziplist-value 64 53 list-max-ziplist-size -2 54 list-compress-depth 0 55 set-max-intset-entries 512 56 zset-max-ziplist-entries 128 57 zset-max-ziplist-value 64 58 hll-sparse-max-bytes 3000 59 activerehashing yes 60 client-output-buffer-limit normal 0 0 0 61 client-output-buffer-limit slave 256mb 64mb 60 62 client-output-buffer-limit pubsub 32mb 8mb 60 63 hz 10 64 aof-rewrite-incremental-fsync yes 65 # Generated by CONFIG REWRITE
启动master 6379端口
1 /usr/local/redis/bin/redis-server /usr/local/redis/6379/redis.conf
3、在 10.86.7.9 配置 10.86.7.6:6379 redis slave
在 10.86.7.9 配置slave文件
redis slave 从实例需要多加一个配置参数: slaveof 10.86.7.6 6379 , 指明master 的ip 和端口
1 bind 0.0.0.0 2 protected-mode yes 3 port 6379 4 tcp-backlog 511 5 timeout 0 6 tcp-keepalive 0 7 daemonize yes 8 supervised no 9 pidfile "/var/run/redis_6379.pid" 10 loglevel notice 11 logfile "/export/test1/redis_6379.log" 12 databases 16 13 save 900 1 14 save 300 10 15 save 60 10000 16 stop-writes-on-bgsave-error yes 17 rdbcompression yes 18 rdbchecksum yes 19 dbfilename "dump.rdb" 20 dir "/export/redis" 21 slave-serve-stale-data yes 22 slave-read-only yes 23 repl-diskless-sync no 24 repl-diskless-sync-delay 5 25 repl-disable-tcp-nodelay no 26 slave-priority 100 27 appendonly yes 28 appendfilename "Slave3_appendonly.aof" 29 appendfsync everysec 30 no-appendfsync-on-rewrite no 31 auto-aof-rewrite-percentage 100 32 auto-aof-rewrite-min-size 64mb 33 aof-load-truncated yes 34 lua-time-limit 5000 35 slowlog-log-slower-than 10000 36 slowlog-max-len 128 37 latency-monitor-threshold 0 38 notify-keyspace-events "" 39 hash-max-ziplist-entries 512 40 hash-max-ziplist-value 64 41 list-max-ziplist-size -2 42 list-compress-depth 0 43 set-max-intset-entries 512 44 zset-max-ziplist-entries 128 45 zset-max-ziplist-value 64 46 hll-sparse-max-bytes 3000 47 activerehashing yes 48 client-output-buffer-limit normal 0 0 0 49 client-output-buffer-limit slave 256mb 64mb 60 50 client-output-buffer-limit pubsub 32mb 8mb 60 51 hz 10 52 aof-rewrite-incremental-fsync yes 53 slaveof 10.86.7.6 6379
启动 slave 实例服务
1 /usr/local/redis/bin/redis-server /usr/local/redis/6379/redis.conf
4、其他主从关系
1 10.86.7.7:6379 -> 10.86.7.10:6379 的 master->slave 同理 2 10.86.7.8:6379 -> 10.86.7.11:6379 的 master->slave 同理
5、检查两个主从实例信息:
1 [root@wdcy-redis-master1 ~]# ps -ef |grep redis|grep server 2 root 111167 1 0 09:34 ? 00:00:12 /usr/local/redis/bin/redis-server 0.0.0.0:6379 3 4 [root@wdcy-redis-slave3 ~]# ps -ef |grep redis|grep server 5 root 115053 1 0 09:23 ? 00:00:20 /usr/local/redis/bin/redis-server 0.0.0.0:6379
1 ## 检查主从信息 info replication 2 ### 6379端口主信息 3 [root@wdcy-redis-master1 ~]# /usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 info replication 4 # Replication 5 role:master 6 connected_slaves:1 7 slave0:ip=10.86.7.9,port=6379,state=online,offset=4857510,lag=0 8 master_repl_offset:4857956 9 repl_backlog_active:1 10 repl_backlog_size:1048576 11 repl_backlog_first_byte_offset:3809381 12 repl_backlog_histlen:1048576 13 14 ##################################### 15 [root@wdcy-redis-slave1 ~]# /usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 info replication 16 # Replication 17 role:slave 18 master_host:10.86.7.6 19 master_port:6379 20 master_link_status:up 21 master_last_io_seconds_ago:0 22 master_sync_in_progress:0 23 slave_repl_offset:4876026 24 slave_priority:100 25 slave_read_only:1 26 connected_slaves:0 27 master_repl_offset:0 28 repl_backlog_active:0 29 repl_backlog_size:1048576 30 repl_backlog_first_byte_offset:0 31 repl_backlog_histlen:0
6、检查两个主从实例同步:
检查 10.86.7.6:6379 -> 10.86.7.9:6379(主->从)同步
## 主设置一个key [root@wdcy-redis-master1 ~]# redis-cli -h 10.86.7.6 -p 6379 set zhu '10.86.7.6 6379 test' OK ## 在从获取 [root@wdcy-redis-slave1 ~]# /usr/local/redis/bin/redis-cli -h 10.86.7.9 -p 6379 get zhu "10.86.7.6 6379 test"
ok , 主从同步没有问题
实战三 : sentinel 配置
在八台服务器配置 sentinel ,sentinel 默认监听端口是 26379
1、八台服务器的sentinel 配置文件 /usr/local/redis/26379/sentinel.conf ,内容如下:
1 # Global 2 port 26379 ##监听端口 3 daemonize yes ##使用daemon方式运行程序,默认为非daemon方式运行 4 dir "/export/sentinel" 5 logfile "/export/sentinel/26379.log" 6 pidfile "/export/sentinel/26379.pid" 7 ## 8 ## sentinel monitor <master-group-name> <ip> <port> <quorum> 9 ####行尾的<quorum>是数字 10 ####这个数字表明需要最少多少个sentinel互相沟通来确认某个master是否真的死了 11 # 12 ## sentinel <option_name> <master-group-name> <option_value> 13 #### down-after-milliseconds : sentinel会向master发送心跳PING来确认master是否存活,如果master在“一定时间范围”内不回应PONG或者是回复了一个错误消息,那么这个sentinel会主观地(单方面地)认为这个master已经不可用了(subjectively down, 也简称为SDOWN)。而这个down-after-milliseconds就是用来指定这个“一定时间范围”的,单位是毫秒。 14 #### failover-timeout : 这个选项确定自动转移故障超时时间,单位毫秒 15 #### parallel-syncs : 在发生failover主备切换时,这个选项指定了最多可以有多少个slave同时对新的master进行同步 16 protected-mode no 17 18 19 ### 20 sentinel monitor redis_14555_g1_6379 10.86.7.6 6379 2 21 sentinel down-after-milliseconds redis_14555_g1_6379 2500 22 sentinel parallel-syncs redis_14555_g1_6379 1 23 sentinel failover-timeout redis_14555_g1_6379 10000 24 25 26 sentinel monitor redis_14555_g2_6379 10.86.7.7 6379 2 27 sentinel down-after-milliseconds redis_14555_g2_6379 2500 28 sentinel parallel-syncs redis_14555_g2_6379 1 29 sentinel failover-timeout redis_14555_g2_6379 10000 30 31 sentinel monitor redis_14555_g3_6379 10.86.7.8 6379 2 32 sentinel down-after-milliseconds redis_14555_g3_6379 2500 33 sentinel parallel-syncs redis_14555_g3_6379 1 34 sentinel failover-timeout redis_14555_g3_6379 10000
上面的配置项配置了两个名字分别为redis_14555_g1_6379 和redis_14555_g2_6379 的master,配置文件只需要配置master的信息就好啦,不用配置slave的信息,因为slave能够被自动检测到(master节点会有关于slave的消息)。需要注意的是,配置文件在sentinel运行期间是会被动态修改的,例如当发生主备切换时候,配置文件中的master会被修改为另外一个slave。这样,之后sentinel如果重启时,就可以根据这个配置来恢复其之前所监控的redis集群的状态。
大家在这里记一下我给两个master的命名为 redis_14555_g1_4500 和 redis_14555_g2_4501 ,是有目的的,为了sentinel 后面触发修改twemproxy 的配置文件和重启有关系
sentinel 的配置信息也可以通过动态配置 ,如 SENTINEL SET command动态修改
2、在六台服务器Master 和 slave 分别启动 sentinel 服务
/usr/local/redis/bin/redis-sentinel /usr/local/redis/26379/sentinel.conf
3、测试sentinel 自动故障转移(kill掉一个master ,sentinel 会将slave 提升为master)
实战四 : twemproxy 配置
因为sentinel 确保了 redis 主从故障转移,当master 出现故障后,将slave提升为master 继续为客户端提供缓存服务;但是新的master ip 和端口信息已经发生了改变,所以客户端需要重新配置文件或者改造程序才能重新连接新的master ,这样有点不方便 。为了方便客户端无需改造及redis 达到高可用状态(故障恢复时间保持在1分钟内),我们采用 twemproxy 做redis 前端代理,分片存储数据,结合sentinel故障转移时的通知/触发脚本功能,做一个自动故障转移且高可用的redis 集群。也就是本文最开始的架构图 twemproxy + redis + sentinel + 脚本 实现redis高可用架构(高可用集群)
redis 主从 和 sentinel 基本都已经配置好了,我们现在来配置一下 twemproxy
1、在 10.86.7.12 服务器上配置twemproxy ,配置文件为 /usr/local/twemproxy/conf/redis_14555.yml
内容为:
1 redis_14555: 2 listen: 0.0.0.0:14555 3 hash: fnv1a_64 4 distribution: ketama 5 redis: true 6 server_retry_timeout: 2000 7 server_failure_limit: 1 8 servers: 9 - 10.86.7.6:6379:1 10 - 10.86.7.7:6379:1 11 - 10.86.7.8:6379:1
注意:auto_eject_hosts: true
uto_eject_hosts: A boolean value that controls if server should be ejected temporarily when it fails consecutively server_failure_limit times. 这个值的选择需要慎重,当为true的时候可能导致数据的不一致性问题。(测试过程中发现) 比如一个key在第一个个实例中(shard),当这个实例down掉之后,假设这个key再次写入(更新)会写入到第二个redis实例中(shard)。 当第一个实例恢复之后,twemproxy会到第一个实例中读取这个key,而不是第二个redis实例,这样数据存在不一致性。或者读取了错误的数据。 当redis作为DB使用的时候,不推荐使用auto_eject_hosts设置为true,数据的一致性和有效性得不到保证
上面配置了三个个redis master 的分片 10.86.7.6:6379 10.86.7.7:6379和 10.86.7.8:6379
这里的参数我们先不讲,我们看看配置的文件名是 redis_14555.yml ,大家有没有想起来,跟sentinel monitor 监控的 master-group-name 有关系,对了取的就是master-group-name 的前半段(redis_14555_g1_6379); 大家再记住一下,后面还会用到
2、启动twemproxy
/usr/local/twemproxy/sbin/nutcracker -c /usr/local/twemproxy/conf/redis_14555.yml
[root@wdcy-twemproxy01 conf]# ps -ef |grep nutcracker root 58627 1 0 09:37 ? 00:00:00 /usr/local/twemproxy/sbin/nutcracker -c /usr/local/twemproxy/conf/redis_14555.yml -p /usr/local/twemproxy/conf/redis_14555.pid -o /usr/local/twemproxy/logs/redis_14555.log -v 11 -d root 60835 60764 0 12:18 pts/0 00:00:00 grep --color=auto nutcracker
启动相关参数信息说明:
Usage: nutcracker [-?hVdDt] [-v verbosity level] [-o output file] [-c conf file] [-s stats port] [-a stats addr] [-i stats interval] [-p pid file] [-m mbuf size] Options: -h, --help : this help -V, --version : show version and exit -t, --test-conf : test configuration for syntax errors and exit -d, --daemonize : run as a daemon -D, --describe-stats : print stats description and exit -v, --verbose=N : set logging level (default: 5, min: 0, max: 11) -o, --output=S : set logging file (default: stderr) -c, --conf-file=S : set configuration file (default: conf/nutcracker.yml) -s, --stats-port=N : set stats monitoring port (default: 22222) -a, --stats-addr=S : set stats monitoring ip (default: 0.0.0.0) -i, --stats-interval=N : set stats aggregation interval in msec (default: 30000 msec) -p, --pid-file=S : set pid file (default: off) -m, --mbuf-size=N : set size of mbuf chunk in bytes (default: 16384 bytes)
3、测试 twemproxy set/get ,后端分片查看
1 ## 测试set 和 get 2 3 ## 测试短key - value 4 [root@wdcy-twemproxy01 conf]# redis-cli -h 10.86.7.12 -p 14555 set key1 'value1' 5 OK 6 [root@wdcy-twemproxy01 conf]# redis-cli -h 10.86.7.12 -p 14555 get key1 7 "value1" 8 9 10 ## 测试长key - value 11 [root@wdcy-twemproxy01 conf]# redis-cli -h 10.86.7.12 -p 14555 set key123456789 'value123456789' 12 OK 13 [root@wdcy-twemproxy01 conf]# redis-cli -h 10.86.7.12 -p 14555 get key123456789 14 "value123456789" 15 16 ## 直接通过后端redis 的master get key 查看存储,会发现已经分片了 17 [root@wdcy-redis-master2 ~]# redis-cli -h 10.86.7.6 -p 6379 get key123456789 18 "value123456789" 19 [root@wdcy-redis-master2 ~]# redis-cli -h 10.86.7.7 -p 6379 get key123456789 20 (nil) 21 [root@wdcy-redis-master2 ~]# redis-cli -h 10.86.7.8 -p 6379 get key123456789 22 (nil)
我们现在将 10.86.7.6:6379 master 直接kill 掉 ,并查看 10.86.7.6:6379 的从服务110.86.7.9:6379是否被提示为 master
1 [root@wdcy-redis-master1 ~]# !ps 2 ps aux|grep redis 3 root 119165 0.2 0.0 137240 3492 ? Ssl 09:32 0:28 /usr/local/bin/redis-server 0.0.0.0:6379 4 root 122212 0.0 0.0 139088 2316 ? Ssl 12:26 0:00 /usr/local/redis/bin/redis-sentinel 0.0.0.0:26379 [sentinel] 5 root 122216 0.0 0.0 116872 1004 pts/0 S+ 12:26 0:00 grep --color=auto redis 6 [root@wdcy-redis-master1 ~]# kill -9 119165 7 8 ## 查看从服务是否被提升为新的 master ,如下所示,很明显已经被提升为master了 9 [root@wdcy-redis-master1 ~]# redis-cli -h 10.86.7.9 -p 6379 info replication 10 # Replication 11 role:master 12 connected_slaves:0 13 master_repl_offset:0 14 repl_backlog_active:0 15 repl_backlog_size:1048576 16 repl_backlog_first_byte_offset:0 17 repl_backlog_histlen:0
为了让redis 达到高可用状态,我们还需要在 sentinel 发送故障转移的时候,将新的master ip和端口告知twemproxy ,并修改twemproxy的配置文件和重启nutcracker服务,下一步见分晓
4、sentinel 配置 client-reconfig-script 脚本
增加脚本 /usr/local/redis/26379/client-reconfig.sh ; 并添加执行权限 chmod +x /usr/local/redis/26379/client-reconfig.sh ; 脚本内容如下
1 #!/bin/sh 2 ### sentinel 触发执行此脚本时,会默认传递几个参数过来 3 ### <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port> 4 # 5 monitor_name="$1" ##monitor master-group-name 6 master_old_ip="$4" 7 master_old_port="$5" 8 master_new_ip="$6" 9 master_new_port="$7" 10 twemproxy_name=$(echo $monitor_name |awk -F'_' '{print $1"_"$2}') ##注意 11 ## 本文前面已经提了2次让大家记住一个地方 master-group-name ,我这边的命名规则 redis_14555_g1_4500 , 这里我就是为了获取redis_14555 , 因为twemproxy 的配置文件名用的是 redis_14555.yml ; 12 ## 这里通过获取 master-group-name 来修改 twemproxy 的配置文件,这里定的一点规范而已 13 14 twemproxy_bin="/usr/local/twemproxy/sbin/nutcracker" 15 twemproxy_conf="/usr/local/twemproxy/conf/${twemproxy_name}.yml" 16 twemproxy_pid="/usr/local/twemproxy/conf/${twemproxy_name}.pid" 17 twemproxy_log="/usr/local/twemproxy/logs/${twemproxy_name}.log" 18 twemproxy_cmd="${twemproxy_bin} -c ${twemproxy_conf} -p ${twemproxy_pid} -o ${twemproxy_log} -v 11 -d" 19 20 ## 将新的master 端口和ip 替换掉 twemproxy 配置文件中旧的master 信息 21 sed -i "s/${master_old_ip}:${master_old_port}/${master_new_ip}:${master_new_port}/" ${twemproxy_conf} 22 23 ## kill 掉根据redis_14555.yml配置启动的nutcracker 进程 ,并重新启动 24 ps -ef |grep "${twemproxy_cmd}" |grep -v grep |awk '{print $2}'|xargs kill 25 ${twemproxy_cmd} 26 27 sleep 1 28 ps -ef |grep "${twemproxy_cmd}" |grep -v grep
动态修改10.86.7.12:26379 sentinel 的配置,添加 client-reconfig-script 项
1 redis-cli -h 127.0.0.1 -p 26379 sentinel set redis_14555_g1_6379 client-reconfig-script /usr/local/redis/26379/client-reconfig.sh 2 redis-cli -h 127.0.0.1 -p 26379 sentinel set redis_14555_g2_6379 client-reconfig-script /usr/local/redis/26379/client-reconfig.sh 3 redis-cli -h 127.0.0.1 -p 26379 sentinel set redis_14555_g3_6379 client-reconfig-script /usr/local/redis/26379/client-reconfig.sh
5、再次测试 twemproxy
我们确认一下 twemproxy的配置文件的 servers 信息:(/usr/local/twemproxy/conf/redis_14555.yml)
1 [root@wdcy-twemproxy01 26379]# more /usr/local/twemproxy/conf/redis_14555.yml 2 redis_14555: 3 listen: 0.0.0.0:14555 4 hash: fnv1a_64 5 distribution: ketama 6 redis: true 7 server_retry_timeout: 2000 8 server_failure_limit: 1 9 servers: 10 - 10.86.7.6:6379:101 master1 11 - 10.86.7.7:6379:101 master2 12 - 10.86.7.8:6379:101 master3
### 确定servers项的信息为 10.86.7.6:6379:101 master1 10.86.7.7:6379:101 master2 和 10.86.7.8:6379:101 master3
好了,在10.86.7.6服务器上,我们把 10.86.7.6:6379 master 干掉,直接kill 掉
1 [root@wdcy-redis-master1 6379]# ps aux|grep redis 2 root 125596 0.1 0.0 137032 2248 ? Ssl 14:35 0:00 /usr/local/bin/redis-server 0.0.0.0:6379 3 root 125618 0.5 0.0 139088 2460 ? Ssl 14:36 0:00 /usr/local/redis/bin/redis-sentinel 0.0.0.0:26379 [sentinel] 4 root 125665 0.0 0.0 116872 1004 pts/0 S+ 14:38 0:00 grep --color=auto redis 5 [root@wdcy-redis-master1 6379]# /usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 info replication 6 # Replication 7 role:master 8 connected_slaves:1 9 slave0:ip=10.86.7.9,port=6379,state=online,offset=7939,lag=1 10 master_repl_offset:8085 11 repl_backlog_active:1 12 repl_backlog_size:1048576 13 repl_backlog_first_byte_offset:2 14 repl_backlog_histlen:8084 15 [root@wdcy-redis-master1 6379]# kill -9 125596
再次查看twemproxy 的配置文件的 servers 信息:
1 [root@wdcy-twemproxy01 26379]# !more 2 more /usr/local/twemproxy/conf/redis_14555.yml 3 redis_14555: 4 listen: 0.0.0.0:14555 5 hash: fnv1a_64 6 distribution: ketama 7 redis: true 8 server_retry_timeout: 2000 9 server_failure_limit: 1 10 servers: 11 - 10.86.7.9:6379:101 master1 12 - 10.86.7.7:6379:101 master2 13 - 10.86.7.8:6379:101 master3
10.86.7.6:6379:101 master1 已经替换成从接替后的IP 端口 - 10.86.7.9:6379:101 master1
强大的分割线--------------------------------------------------------------------------一下内容为笔记,可忽略
本选型可以结合业务需求决定版本相关信息如下:
https://www.cnblogs.com/nb-blog/p/12400707.html
这里我们使用Redis 3.2.0 版本
Redis3.2
Redis3.2在2016年5月6日正式发布,相比于Redis3.0主要特征如下:
1.添加GEO相关功能。
2.SDS在速度和节省空间上都做了优化。
3.支持用upstart或者systemd管理Redis进程。
4.新的List编码类型:quicklist。
5.从节点读取过期数据保证一致性。
6.添加了hstrlen命令。
7.增强了debug命令,支持了更多的参数。
8.Lua脚本功能增强。
9.添加了Lua Debugger。
10.config set 支持更多的配置参数。
11.优化了Redis崩溃后的相关报告。
12.新的RDB格式,但是仍然兼容旧的RDB。
13.加速RDB的加载速度。
14.spop命令支持个数参数。
15.cluster nodes命令得到加速。
16.Jemalloc更新到4.0.3版本
安装分为几个步骤
- 安装Redis
- 配置主从
- 配置sentinel
- 安装Twemproxy
编译安装Redis

1 下载地址:wget http://download.redis.io/releases/redis-3.2.0.tar.gz 2 安装GCC: 3 yum install gcc 4 编译安装并制定安装目录; 5 make PREFIX=/usr/local/redis install 6 创建相关目录 7 mkdir /usr/local/redis/{6379,26379} 8 指定 CPU1 编译测试安装 9 taskset -c 1 make test
配置Redis主从
mkdir /usr/local/redis/{6379,26379} cd 6379 vim redis.conf
Redis 主库

1 bind 0.0.0.0 2 protected-mode yes 3 port 6379 4 tcp-backlog 511 5 timeout 0 6 tcp-keepalive 0 7 daemonize yes 8 supervised no 9 pidfile "/var/run/redis_6379.pid" 10 loglevel notice 11 logfile "" 12 databases 16 13 save 900 1 14 save 300 10 15 save 60 10000 16 stop-writes-on-bgsave-error yes 17 rdbcompression yes 18 rdbchecksum yes 19 dbfilename "dump.rdb" 20 dir "/export/redis/6379" 21 slave-serve-stale-data yes 22 slave-read-only yes 23 repl-diskless-sync no 24 repl-diskless-sync-delay 5 25 repl-disable-tcp-nodelay no 26 slave-priority 100 27 appendonly yes 28 appendfilename "Master1_appendonly.aof" 29 appendfsync everysec 30 # no-appendfsync-on-rewrite no 31 no-appendfsync-on-rewrite yes 32 auto-aof-rewrite-percentage 100 33 auto-aof-rewrite-min-size 64mb 34 aof-load-truncated yes 35 lua-time-limit 5000 36 slowlog-log-slower-than 10000 37 slowlog-max-len 128 38 latency-monitor-threshold 0 39 notify-keyspace-events "" 40 hash-max-ziplist-entries 512 41 hash-max-ziplist-value 64 42 list-max-ziplist-size -2 43 list-compress-depth 0 44 set-max-intset-entries 512 45 zset-max-ziplist-entries 128 46 zset-max-ziplist-value 64 47 hll-sparse-max-bytes 3000 48 activerehashing yes 49 client-output-buffer-limit normal 0 0 0 50 client-output-buffer-limit slave 256mb 64mb 60 51 client-output-buffer-limit pubsub 32mb 8mb 60 52 hz 10 53 aof-rewrite-incremental-fsync yes

1 # 指定 redis 只接收来自于该IP地址的请求,如果不进行设置,那么将处理所有请求 2 bind 0.0.0.0 3 4 #是否开启保护模式,默认开启。要是配置里没有指定bind和密码。开启该参数后,redis只会本地进行访问,拒绝外部访问。要是开启了密码和bind,可以开启。否则最好关闭,设置为no 5 protected-mode yes 6 7 #redis监听的端口号 8 port 6379 9 10 #此参数确定了TCP连接中已完成队列(完成三次握手之后)的长度, 当然此值必须不大于Linux系统定义 11 的/proc/sys/net/core/somaxconn值,默认是511,而Linux的默认参数值是128。当系统并发量大并且客户端 12 速度缓慢的时候,可以将这二个参数一起参考设定。该内核参数默认值一般是128,对于负载很大的服务程序来说 13 大大的不够。一般会将它修改为2048或者更大。在/etc/sysctl.conf中添加:net.core.somaxconn = 2048, 14 然后在终端中执行sysctl -p 15 tcp-backlog 511 16 17 #此参数为设置客户端空闲超过timeout,服务端会断开连接,为0则服务端不会主动断开连接,不能小于0 18 timeout 0 19 20 #tcp keepalive参数。如果设置不为0,就使用配置tcp的SO_KEEPALIVE值,使用keepalive有两个好处:检测挂 21 掉的对端。降低中间设备出问题而导致网络看似连接却已经与对端端口的问题。在Linux内核中,设置了 22 keepalive,redis会定时给对端发送ack。检测到对端关闭需要两倍的设置值 23 tcp-keepalive 0 24 25 #是否在后台执行,yes:后台运行;no:不是后台运行 26 daemonize yes 27 28 #supervised no - 没有监督互动 29 #supervised upstart - 通过将Redis置于SIGSTOP模式来启动信号 30 #supervised systemd - signal systemd将READY = 1写入$ NOTIFY_SOCKET 31 #supervised auto - 检测upstart或systemd方法基于 UPSTART_JOB或NOTIFY_SOCKET环境变量 32 supervised no 33 34 #redis的进程文件 35 pidfile "/var/run/redis_6379.pid" 36 37 #指定了服务端日志的级别。级别包括:debug(很多信息,方便开发、测试),verbose(许多有用的信息, 38 但是没有debug级别信息多),notice(适当的日志级别,适合生产环境),warn(只有非常重要的信息) 39 loglevel notice 40 41 #指定了记录日志的文件。空字符串的话,日志会打印到标准输出设备。后台运行的redis标准输出是/dev/null 42 logfile "" 43 44 #是否打开记录syslog功能 45 # syslog-enabled no 46 47 #syslog的标识符。 48 # syslog-ident redis 49 50 #日志的来源、设备 51 # syslog-facility local0 52 53 #数据库的数量,默认使用的数据库是0。可以通过”SELECT 【数据库序号】“命令选择一个数据库,序号从0开始 54 databases 16 55 56 #RDB核心规则配置 save <指定时间间隔> <执行指定次数更新操作>,满足条件就将内存中的数据同步到硬盘 57 中。官方出厂配置默认是 900秒内有1个更改,300秒内有10个更改以及60秒内有10000个更改,则将内存中的 58 数据快照写入磁盘。 59 若不想用RDB方案,可以把 save "" 的注释打开,下面三个注释 60 # save "" 61 save 900 1 62 save 300 10 63 save 60 10000 64 65 #当RDB持久化出现错误后,是否依然进行继续进行工作,yes:不能进行工作,no:可以继续进行工作,可以通 66 过info中的rdb_last_bgsave_status了解RDB持久化是否有错误 67 stop-writes-on-bgsave-error yes 68 69 #配置存储至本地数据库时是否压缩数据,默认为yes。Redis采用LZF压缩方式,但占用了一点CPU的时间。若关闭该选项, 70 但会导致数据库文件变的巨大。建议开启。 71 rdbcompression yes 72 73 #是否校验rdb文件;从rdb格式的第五个版本开始,在rdb文件的末尾会带上CRC64的校验和。这跟有利于文件的 74 容错性,但是在保存rdb文件的时候,会有大概10%的性能损耗,所以如果你追求高性能,可以关闭该配置 75 rdbchecksum yes 76 77 #指定本地数据库文件名,一般采用默认的 dump.rdb 78 dbfilename "dump.rdb" 79 80 #数据目录,数据库的写入会在这个目录。rdb、aof文件也会写在这个目录 81 dir "/export/redis/6379" 82 83 84 85 # 复制选项,slave复制对应的master。 86 # replicaof <masterip> <masterport> 87 #如果master设置了requirepass,那么slave要连上master,需要有master的密码才行。masterauth就是用来配置master的密码,这样可以在连上master后进行认证。 88 # masterauth <master-password> 89 90 #当从库同主机失去连接或者复制正在进行,从机库有两种运行方式:1) 如果slave-serve-stale-data设置为yes(默认设置),从库会继续响应客户端的请求。2) 如果slave-serve-stale-data设置为no,INFO,replicaOF, AUTH, PING, SHUTDOWN, REPLCONF, ROLE, CONFIG,SUBSCRIBE, UNSUBSCRIBE,PSUBSCRIBE, PUNSUBSCRIBE, PUBLISH, PUBSUB,COMMAND, POST, HOST: and ATENCY命令之外的任何请求都会返回一个错误”SYNC with master in progress” 91 slave-serve-stale-data yes 92 93 #配置从是否为只读,开启后从则不能写入数据,新版本是:#replica-read-only yes 94 slave-read-only yes 95 96 97 # 是否使用socket方式复制数据。目前redis复制提供两种方式,disk和socket。如果新的slave连上来或者重连的slave无法部分同步,就会执行全量同步,master会生成rdb文件。有2种方式:disk方式是master创建一个新的进程把rdb文件保存到磁盘,再把磁盘上的rdb文件传递给slave。socket是master创建一个新的进程,直接把rdb文件以socket的方式发给slave。disk方式的时候,当一个rdb保存的过程中,多个slave都能共享这个rdb文件。socket的方式的一个个slave顺序复制。在磁盘速度缓慢,网速快的情况下推荐用socket方式 98 repl-diskless-sync no 99 100 #diskless复制的延迟时间,防止设置为0。一旦复制开始,节点不会再接收新slave的复制请求直到下一个rdb传输。所以最好等待一段时间,等更多的slave连上来 101 repl-diskless-sync-delay 5 102 103 #slave根据指定的时间间隔向服务器发送ping请求。时间间隔可以通过 repl_ping_slave_period 来设置,默认10秒。 104 # repl-ping-slave-period 10 105 106 # 复制连接超时时间。master和slave都有超时时间的设置。master检测到slave上次发送的时间超过repl-timeout,即认为slave离线,清除该slave信息。slave检测到上次和master交互的时间超过repl-timeout,则认为master离线。需要注意的是repl-timeout需要设置一个比repl-ping-slave-period更大的值,不然会经常检测到超时 107 # repl-timeout 60 108 109 #是否禁止复制tcp链接的tcp nodelay参数,可传递yes或者no。默认是no,即使用tcp nodelay。如果master设置了yes来禁止tcp nodelay设置,在把数据复制给slave的时候,会减少包的数量和更小的网络带宽。但是这也可能带来数据的延迟。默认我们推荐更小的延迟,但是在数据量传输很大的场景下,建议选择yes 110 repl-disable-tcp-nodelay no 111 112 #当 master 不能正常工作的时候,Redis Sentinel 会从 slaves 中选出一个新的 master, 113 # 这个值越小,就越会被优先选中,但是如果是 0 , 那是意味着这个 slave 不可能被选中。 114 # 默认优先级为 100 115 slave-priority 100 116 117 持久化方式AOF 118 #每次启动时Redis都会先把这个文件的数据读入内存里,先忽略RDB文件 119 appendonly yes 120 121 #AOF文件名称 122 appendfilename "Master1_appendonly.aof" 123 124 #默认的 “everysec” 通常来说能在速度和数据安全性之间取得比较好的平衡 125 appendfsync everysec 126 127 #如果AOF的同步策略设置成 “always” 或者 “everysec”,并且后台的存储进程(后台存储或写入AOF 日志)会产生很多磁盘I/O开销。某些Linux的配置下会使Redis因为 fsync()系统调用而阻塞很久。 128 #注意,目前对这个情况还没有完美修正,甚至不同线程的 fsync() 会阻塞我们同步的write(2)调用。 129 #为了缓解这个问题,可以用下面这个选项。它可以在 BGSAVE 或 BGREWRITEAOF 处理时阻止fsync()。 130 #这就意味着如果有子进程在进行保存操作,那么Redis就处于"不可同步"的状态。 131 #这实际上是说,在最差的情况下可能会丢掉30秒钟的日志数据。(默认Linux设定) 132 #如果把这个设置成"yes"带来了延迟问题,就保持"no",这是保存持久数据的最安全的方式。 133 no-appendfsync-on-rewrite no 134 135 #自动重写AOF文件。如果AOF日志文件增大到指定百分比,Redis能够通过 BGREWRITEAOF 自动重写AOF日志文件。 136 #工作原理:Redis记住上次重写时AOF文件的大小(如果重启后还没有写操作,就直接用启动时的AOF大小) 137 #这个基准大小和当前大小做比较。如果当前大小超过指定比例,就会触发重写操作。 138 #你还需要指定被重写日志的最小尺寸,这样避免了达到指定百分比但尺寸仍然很小的情况还要重写。 139 #指定百分比为0会禁用AOF自动重写特性。 140 auto-aof-rewrite-percentage 100 141 142 #文件达到大小阈值的时候进行重写 143 auto-aof-rewrite-min-size 64mb 144 145 #如果设置为yes,如果一个因异常被截断的AOF文件被redis启动时加载进内存,redis将会发送日志通知用户 146 #如果设置为no,erdis将会拒绝启动。此时需要用"redis-check-aof"工具修复文件。 147 aof-load-truncated yes 148 149 #加载时Redis识别出AOF文件以“REDIS”开头字符串, 150 #并加载带此前缀的RDB文件,然后继续加载AOF 151 aof-use-rdb-preamble yes 152 153 Lua脚本配置 154 #Lua 脚本的最大执行毫秒数 155 lua-time-limit 5000 156 157 #记录超过多少微秒的查询命令 158 #1000000等于1秒,设置为0则记录所有命令 159 slowlog-log-slower-than 10000 160 161 #记录大小,可通过SLOWLOG RESET命令重置 162 slowlog-max-len 128 163 164 #记录执行时间大于或等于预定时间(毫秒)的操作,为0时不记录 165 latency-monitor-threshold 0 166 167 #Redis能通知 Pub/Sub 客户端关于键空间发生的事件,默认关闭 168 notify-keyspace-events "" 169 170 #当hash只有少量的entry时,并且最大的entry所占空间没有超过指定的限制时,会用一种节省内存的 171 #数据结构来编码。可以通过下面的指令来设定限制 172 hash-max-ziplist-entries 512 173 hash-max-ziplist-value 64 174 175 #当取正值的时候,表示按照数据项个数来限定每个quicklist节点上的ziplist长度。比如,当这个参数配置 176 #成5的时候,表示每个quicklist节点的ziplist最多包含5个数据项。 177 #当取负值的时候,表示按照占用字节数来限定每个quicklist节点上的ziplist长度。这时,它只能取-1到-5 178 #这五个值,每个值含义如下: 179 #-5: 每个quicklist节点上的ziplist大小不能超过64 Kb。(注:1kb => 1024 bytes) 180 #-4: 每个quicklist节点上的ziplist大小不能超过32 Kb。 181 #-3: 每个quicklist节点上的ziplist大小不能超过16 Kb。 182 #-2: 每个quicklist节点上的ziplist大小不能超过8 Kb。(-2是Redis给出的默认值) 183 #-1: 每个quicklist节点上的ziplist大小不能超过4 Kb。 184 list-max-ziplist-size -2 185 186 #这个参数表示一个quicklist两端不被压缩的节点个数。 187 #注:这里的节点个数是指quicklist双向链表的节点个数,而不是指ziplist里面的数据项个数。 188 #实际上,一个quicklist节点上的ziplist,如果被压缩,就是整体被压缩的。 189 #参数list-compress-depth的取值含义如下: 190 #0: 是个特殊值,表示都不压缩。这是Redis的默认值。 191 #1: 表示quicklist两端各有1个节点不压缩,中间的节点压缩。 192 #2: 表示quicklist两端各有2个节点不压缩,中间的节点压缩。 193 #3: 表示quicklist两端各有3个节点不压缩,中间的节点压缩。 194 #依此类推… 195 #由于0是个特殊值,很容易看出quicklist的头节点和尾节点总是不被压缩的,以便于在表的两端进行快速存取。 196 list-compress-depth 0 197 198 #set有一种特殊编码的情况:当set数据全是十进制64位有符号整型数字构成的字符串时。 199 #下面这个配置项就是用来设置set使用这种编码来节省内存的最大长度。 200 set-max-intset-entries 512 201 202 #与hash和list相似,有序集合也可以用一种特别的编码方式来节省大量空间。 203 #这种编码只适合长度和元素都小于下面限制的有序集合 204 zset-max-ziplist-entries 128 205 zset-max-ziplist-value 64 206 207 HyperLogLog稀疏结构表示字节的限制。该限制包括 208 #16个字节的头。当HyperLogLog使用稀疏结构表示 209 #这些限制,它会被转换成密度表示。 210 #值大于16000是完全没用的,因为在该点 211 #密集的表示是更多的内存效率。 212 #建议值是3000左右,以便具有的内存好处, 减少内存的消耗 213 hll-sparse-max-bytes 3000 214 215 #启用哈希刷新,每100个CPU毫秒会拿出1个毫秒来刷新Redis的主哈希表(顶级键值映射表) 216 activerehashing yes 217 218 #客户端的输出缓冲区的限制,可用于强制断开那些因为某种原因从服务器读取数据的速度不够快的客户端 219 client-output-buffer-limit normal 0 0 0 220 client-output-buffer-limit slave 256mb 64mb 60 221 client-output-buffer-limit pubsub 32mb 8mb 60 222 223 #默认情况下,“hz”的被设定为10。提高该值将在Redis空闲时使用更多的CPU时,但同时当有多个key 224 #同时到期会使Redis的反应更灵敏,以及超时可以更精确地处理 225 hz 10 226 #当一个子进程重写AOF文件时,如果启用下面的选项,则文件每生成32M数据会被同步 227 aof-rewrite-incremental-fsync yes 228 #当redis保存RDB文件时,如果启用了以下选项,每生成32 MB数据,文件将被fsync-ed。 229 #这很有用,以便以递增方式将文件提交到磁盘并避免大延迟峰值。 230 rdb-save-incremental-fsync yes
Redis 从库
修改如下配置项的MasterIP MasterPort 即可

1 bind 0.0.0.0 2 protected-mode yes 3 port 6379 4 tcp-backlog 511 5 timeout 0 6 tcp-keepalive 0 7 daemonize yes 8 supervised no 9 pidfile "/var/run/redis_6379.pid" 10 loglevel notice 11 logfile "" 12 databases 16 13 save 900 1 14 save 300 10 15 save 60 10000 16 stop-writes-on-bgsave-error yes 17 rdbcompression yes 18 rdbchecksum yes 19 dbfilename "dump.rdb" 20 dir "/export/redis/6379" 21 slave-serve-stale-data yes 22 slave-read-only yes 23 repl-diskless-sync no 24 repl-diskless-sync-delay 5 25 repl-disable-tcp-nodelay no 26 slave-priority 100 27 appendonly yes 28 appendfilename "Master1_appendonly.aof" 29 appendfsync everysec 30 # no-appendfsync-on-rewrite no 31 no-appendfsync-on-rewrite yes 32 auto-aof-rewrite-percentage 100 33 auto-aof-rewrite-min-size 64mb 34 aof-load-truncated yes 35 lua-time-limit 5000 36 slowlog-log-slower-than 10000 37 slowlog-max-len 128 38 latency-monitor-threshold 0 39 notify-keyspace-events "" 40 hash-max-ziplist-entries 512 41 hash-max-ziplist-value 64 42 list-max-ziplist-size -2 43 list-compress-depth 0 44 set-max-intset-entries 512 45 zset-max-ziplist-entries 128 46 zset-max-ziplist-value 64 47 hll-sparse-max-bytes 3000 48 activerehashing yes 49 client-output-buffer-limit normal 0 0 0 50 client-output-buffer-limit slave 256mb 64mb 60 51 client-output-buffer-limit pubsub 32mb 8mb 60 52 hz 10 53 aof-rewrite-incremental-fsync yes 54 #此处修改Master IP Port 55 slaveof ${MasterIP} ${MasterPort}
配置sentinel

1 # Global 2 port 26379 3 daemonize yes 4 loglevel notice 5 logfile "/export/sentinel/26379.log" 6 pidfile "/export/sentinel/26379.pid" 7 dir "/export/sentinel" 8 bind 0.0.0.0 9 protected-mode no 10 ### 11 sentinel monitor redis_14555_g1_6379 10.86.7.6 6379 2 12 sentinel down-after-milliseconds redis_14555_g1_6379 2500 13 sentinel parallel-syncs redis_14555_g1_6379 1 14 sentinel failover-timeout redis_14555_g1_6379 10000 15 16 17 sentinel monitor redis_14555_g2_6379 10.86.7.7 6379 2 18 sentinel down-after-milliseconds redis_14555_g2_6379 2500 19 sentinel parallel-syncs redis_14555_g2_6379 1 20 sentinel failover-timeout redis_14555_g2_6379 10000 21 22 sentinel monitor redis_14555_g3_6379 10.86.7.8 6379 2 23 sentinel down-after-milliseconds redis_14555_g3_6379 2500 24 sentinel parallel-syncs redis_14555_g3_6379 1 25 sentinel failover-timeout redis_14555_g3_6379 10000
本文来自博客园,作者:IT老登,转载请注明原文链接:https://www.cnblogs.com/nb-blog/p/12425012.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
2019-03-06 expect 批量自动部署ssh 免密登陆 之 二