访次: AmazingCounters.com 次

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/{637926379}
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 master210.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版本

安装分为几个步骤

  1. 安装Redis
  2. 配置主从
  3. 配置sentinel
  4. 安装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-3.2.0 部署
复制代码

配置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
redis.conf_new 线上版本
复制代码
复制代码
  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.conf
复制代码

 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}
redis.conf_new_slave
复制代码

 

 

配置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
sentinel.conf
复制代码

 

: wget http://download.redis.io/releases/redis-3.2.0.tar.gz

  1. ## 检查主从信息 info replication
  2.  
    ### 4500 端口主信息
posted @   IT老登  阅读(458)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
历史上的今天:
2019-03-06 expect 批量自动部署ssh 免密登陆 之 二
访次: AmazingCounters.com 次
点击右上角即可分享
微信分享提示