redis主/从配置及基于sentinel的故障转移

一、NoSQL基础概念:

ACID:原子性、一致性、隔离性、持久性;
特性:数据量大、数据变化非常大(数据增长化、流量分布变化、数据间耦合结构变化)、数据源很多;

CAP、BASE
CAP C:多个数据节点的的数据一致;
A:用户发出请求后的有限时间范围内返回结果;
P:network partition,网络发生分区后,服务是否依可用;
CAP理论:一个分布式系统不可能时满足C、A、P三个特性,最多可同时满足其中两者
对于分布式系统满足分区容错性几乎是必须的。
AP:放弃C,但并非全部放弃,是在一段时间不保证一致,但最终是一致的;
CP:放弃A,而提供高可用的服务器;

BASE:BA,S,E,基于CAP演化而来 

BA:Basically Availabel,基本可用;
S:Soft state,软状态/柔性事务,即状态可以在一个时间窗口内是不同步的;
E:Eventually consisitency,最终的一致性;
NoSQL:Not Only SQL 
k/v:Dynamo,redis 
document:文档数据库,mongodb 
BraphDB:图式数据库,Neo4j 

二、Redis简介:

REmote DIctionary Server:数据结构服务器,k/v数据结构;
内存存储:in-memory 持久化 主从(sentinel) Cluster(shard)
数据结构服务器:
String,Lists,Hashs,Sets,Sorted Sets,Bitmaps,Hyperloglogs 
PUB/SUB 
单进程:CPU并非瓶颈;
持久化: snapshotting AOF
Replication: 主/从 主:rw 从:read-only

程序环境

配置文件:/etc/redis.conf 
主程序:/usr/bin/rdis-server 监听端口 6379/tcp  
客户端:/usr/bin/redis-cli  
Unit File: /usr/lib/systemd/system/reids.service 
数据目录: /var/lib/redis 
redis: k/v
key:直接ASCII字符串;
value:strings,litst,hashes,sets,sotred sets,bitmaps,hyperloglogs 

group:
@generice,@string,@list,@…

@string  @list @set @sorted_set @hash
SE LPUSH SADD ZADD HSET
GET RPUSH SPOP  ZCARD  HGET
EXISTS LPOR  SREM ZCOUNT  HMGET 
NCRI RPOP  SRANDMEMBER ZRANK  HKEYS  
DECR LINDEX SINTER HVALS
LSET SUNION  HDEL
HGETALL

配置和使用redis:
/etc/redis.conf的配置项 
基本配置项,网络配置项,持久化相关配置,复制相关的配置,安全相关的配置,Limit相关的配置
SlowLog相关的配置 INCLUDES Advanced配置

通用配置项:

daemonize,supervised,loglevel,pidfile,logfile 
database,设定数据库数量,默认为16个,每个数据库的名字均为整数,从0开始编号,默认操作的数据库为0;
切换数据库的方法:SELECT<dbid>
网络配置项:bind IP 、 port PORT 、 protected-mode 、tcp-backlog 、 Unixsocket 、timeoute(连接空闲的超时时长)
安全配置:requirepass:<PASSWORD> rename-command:<COMMAND><NEW_CMND_NAME>在AOF或Replication环境中,不推荐使用;
Limits相关的配置:
maxclients maxmemory<bytes> maxmemory-policy noevication
淘汰策略:volatile-lru,allkeys-lru,volatile-random,allkeys-random,volatile-ttl,noeviction
maxmemory-sample 5 淘汰算法运行的采样样本数;
SlowLog相关的配置:
slowlog-log-slower-than 10000 单位是微秒;
slow-max-len 128
SlowLog记录的日志是最大条目;
ADVANCED配置;
hash-max-ziplist-entries 512 
hash-max-ziplist-value 64 设置ziplist的键数量最大值,每个值的最大空间;
client-output-buffer-limit normal 0 0 0 
client-output-buffer-limit slave 256mb 64mb 60 
client-output-buffer-limit pubsub 32mb 8mb 60
<hard-limit>
<soft-limit>
<soft-limit-seconds>
redis-cli命令:
Usage: redis-cli [OPTIONS] [cmd [arg [arg …]]]
-h HOST -p PORT -a PASSWORD -n DBID 
与Connection相关的命令;
AUTH<password> ECHO<message> PING QUIT SELECT dbid 
清空数据库命令(小心使用):
FLUSHD: Remove all keys from the current,database ; 
FLUSHALL: Remove all keys from all databases;
Server相关的命令:
CLIENT GETNAME   *CLIENT KILL *CLIENT LIST  LIENT PAUSE CLIENT REPLY 
CLIENT SETNAME:Set the current connection name 
CONFIG GET   CONFIG RESETSTAT   CONFIG REWRITE   CONFIG SET 

INFO:服务器状态信息查看;分为多个session ; 
INFO [section]
Redis的持久化;
RDB:snapshotting,二进制格式;按事先定制的策略,周期性地将数据从内存同步至磁盘;数据文件默认是dump,rdb;  
客户端显示使用SAVA或BGSAVE命令来手动启动快照 保存机制 ;
SAVE:同步,即在主线程中保存快照 ,此时会阻塞所有客户端请求;
BGSAVE:异步;
AOF:Append Only FIle, fsync 
记录每次写操作至指定的文件尾部实现的持久化,当redis重启时,可能过重新执行文件中的命令在内存中重建 出数据库;
BGREWRITEAOF:AOF文件重写;
不会读取正在使用AOF文件,而是通过将内存中的数据以命令的方式保存至临时文件中,完成之后替换原来的AOF文件;

RDB相关的配置:
*save <seconds> <changes>
save 900 1 
save 300 10
save 60 10000
这段配置的内容表示:三个策略满足其中任意一个均会触发SNAPSHOTTING操作;900s内至少有一个key有变化 
300s内至少有10个key有变化,60s内至少有1万个key发生变化;
stop-writes-on-bgsave-error yes dump操作出现错误时,是否禁止新写入操作请求;
rdbcompression yes  rdbchecksum yes 
dbfilename dump.rdb: 指定rdb文件名 
*dir /var/lib/redis:rdb文件的存储路径
AOF相关的配置
*appendonly no 
appendfilename “appendonly.aof”
*appendfsync 
Redis supports three different modes; 
no:redis不执行主动同步操作,而是OS进行;
everysec:每秒一次;
always:每语句一次;
no-appendfsync-on-rewrite no
是否在后台执行aof重写期间不调用fsync,默认no,表示调用;
auto-aof-rewrite-percentage 100 
auto-aof-rewrite-min-size 64mb 
上述两个条件同时满足时,会触发重写AOF;与上次aof文件大小相比,其增长量超过100%,且大小不少于64MB; 
aof-load-truncated yes 
注意:持久机制本身不能取代备份;应该制订备份策略;对redis库定期备份;

RDB与AOF同时启用;

(1)BGSAVE和BGREWRITEAOF不会同时进行;
(2)Redis服务器启动时用持久化的数据文件恢复数据,会优先使用AOF;

复制:
特点:一个Master可以有多个slave主机,支持链式复制;
Master以非阻塞方式同步数据至slave主机; 
配置slave节点;
redis-cli> SLAVEOF <MASTER_IP> <MASTER_PORT>
redis-cli> CONFIG SET Masterauth <PASSWORD>
sentinel:主要完成三个功能:监控、通知、自动故障转移;
选举方式:流言协议、投票协议;

配置项:

port 26379
sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel auth-pass <master-name> <passowrd>
<quorum>表示sentinel集群的quorum机制,即至少有quorum个sentinel节点同时判定主节点故障时, 才认为其真的故障
s_down:subjectively down 
o_down: objectively down 
sentinel down-after-milliseconds <master-name><milliseconds>
监控到指定的集群的主节点异常状态持续多久才将标记为“故障”; 
sentinel parallel-syncs <master-name> <numslaves>
指在failover过程中,能够被sentinel并行配置的从节点的数量;
sentinel failover-time <master-name> <milliseconds>
sentinel必须在此指定的时长内完成故障转移操作, 否则,将视为故障转移操作失败;
sentinel notification-scripts <master-name> <script-path>
通知脚本,此脚本被自动传递多个参数;

redis-cli -h SENITINEL_HOST -p SENTINEL_PORT 
redis-cli> 
SENTINEL masters 
SENTINEL slaves <MASTER_NAME>
SENTINEL failover <MASTER_NAME>
SENTINEL get-master-addr-by-name <MASTER_NAME>

三、配置及安装 

注:各主机的/etc/hosts文件如下 
172.16.23.10 node0 node0.rj.com
172.16.23.11 node1 node1.rj.com
172.16.23.12 node2 node2.rj.com
172.16.23.13 node3 node3.rj.com
本次测试的ansible hosts文件配置如下 
[node]
node0
node1
node2
node3

下载安装包 redis-3.2.3-1.el7.x86_64.rpm 

# ansible node -m copy -a "src=/root/redis-3.2.3-1.el7.x86_64.rpm dest=/root"
# for i in {0..3} ; do ssh node$i "yum -y install /root/redis-3.2.3-1.el7.x86_64.rpm" ; done
# vim /etc/redis.conf 主服务器端,需要修改以下的几项 
bind 0.0.0.0
masterauth centos.123 设置此台服务器当成为从服务器时,连接主而需要的密码;
slave-serve-stale-data yes
requirepass centos.123
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-ping-slave-period 10
repl-timeout 60
repl-disable-tcp-nodelay no
repl-backlog-size 1mb
slave-priority 100
min-slaves-to-write 3
min-slaves-max-lag 10
将/etc/redis.conf 分发到其它三个从结点的 /etc/redis.conf,然后启动服务 
# ansible node -m copy -a "src=redis.conf dest=/etc/redis.conf "
# ansible node -m service -a "name=redis state=started"
此时,可以启用 /etc/ansible/hosts 中的node0 
[root@node0 ~]# ansible node -m shell -a "ss -tnl | grep 6379"
node1 | success | rc=0 >>
LISTEN     0      128          *:6379                     *:*                  

node3 | success | rc=0 >>
LISTEN     0      128          *:6379                     *:*                  

node2 | success | rc=0 >>
LISTEN     0      128          *:6379                     *:*                  

node0 | success | rc=0 >>
LISTEN     0      128          *:6379                     *:*                  
手动配置node1,node2,node3三个从结点
[root@node1 ~]# redis-cli 
127.0.0.1:6379> SLAVEOF 172.16.23.10 6379 
127.0.0.1:6379> CONFIG SET masterauth centos.123
[root@node2 ~]# redis-cli 
127.0.0.1:6379> SLAVEOF 172.16.23.10 6379
127.0.0.1:6379> CONFIG SET masterauth centos.123
[11:22:25root@node3~]#redis-cli 
127.0.0.1:6379> SLAVEOF 172.16.23.10 6379 
127.0.0.1:6379> CONFIG SET masterauth centos.123

通过以上的端口信息,可以看出四台主机的已经正常启动了 
查看主结点的工作信息 

[root@node0 ~]# redis-cli 
127.0.0.1:6379> AUTH centos.123
OK
127.0.0.1:6379> INFO Replication
# Replication
role:master
connected_slaves:3
min_slaves_good_slaves:3
slave0:ip=172.16.23.12,port=6379,state=online,offset=3641,lag=1
slave1:ip=172.16.23.13,port=6379,state=online,offset=3641,lag=1
slave2:ip=172.16.23.11,port=6379,state=online,offset=3641,lag=1
master_repl_offset:3641
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:3640

查看其它三个结点的信息

[root@node1 ~]# redis-cli 
127.0.0.1:6379> AUTH centos.123
OK
127.0.0.1:6379> INFO Replication
# Replication
role:slave
master_host:172.16.23.10 node1这台从服务器指向 node0(172.16.23.10) 这台主机 
master_port:6379
master_link_status:up
master_last_io_seconds_ago:7
master_sync_in_progress:0
slave_repl_offset:3865
slave_priority:100
slave_read_only:1
connected_slaves:0
min_slaves_good_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
[root@node2 ~]# redis-cli 
127.0.0.1:6379> AUTH centos.123
OK
127.0.0.1:6379> INFO Replication
# Replication
role:slave
master_host:172.16.23.10 node2主服器也指上node0
master_port:6379
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_repl_offset:365
slave_priority:100
slave_read_only:1
connected_slaves:0
min_slaves_good_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6379> 
[21:23:22root@node3~]#redis-cli 
127.0.0.1:6379> AUTH centos.123
OK
127.0.0.1:6379> INFO Replication
# Replication
role:slave
master_host:172.16.23.10 node3主服器也指向node0
master_port:6379
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_repl_offset:4187
slave_priority:100
slave_read_only:1
connected_slaves:0
min_slaves_good_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

至此为至redis主/从已经实现
接下来在四个结点上配置sentinel,实现故障转移。此处实现累似于MariaDB的MHA 

   # vim /etc/redis-sentinel.conf 修改以下参数 
sentinel monitor mymaster 172.16.23.10 6379 3 注(若redis-sentinel只在一个结点上安装时,这里应该是 1,因为只有一个台服务器结点可以满足切换服务的要求)
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 18000
sentinel auth-pass mymaster centos.123
[root@node0 ~]# ansible node -m copy -a "src=/etc/redis-sentinel.conf dest=/etc/"
[root@node0 ~]# ansible node -m service -a "name=redis-sentinel state=started"
[root@node0 ~]# ansible node -m shell -a "ss -tnl | grep 26379" 查看四个结点的redis-sentinel服务是否启动
node1 | success | rc=0 >>
LISTEN     0      128          *:26379                    *:*                  
LISTEN     0      128         :::26379                   :::*                  

node2 | success | rc=0 >>
LISTEN     0      128          *:26379                    *:*                  
LISTEN     0      128         :::26379                   :::*                  

node0 | success | rc=0 >>
LISTEN     0      128          *:26379                    *:*                  
LISTEN     0      128         :::26379                   :::*                  

node3 | success | rc=0 >>
LISTEN     0      128          *:26379                    *:*                  
LISTEN     0      128         :::26379                   :::*                  

[root@node0 etc]# redis-cli  -p 26379 此时可以看出redis的主结点在node0上 
127.0.0.1:26379> SENTINEL masters
1)  1) "name"
2) "mymaster"
3) "ip"
4) "172.16.23.10"
5) "port"
6) "6379"
7) "runid"
8) "7e2c542c1bdef470ce53246ee4e4906b08add3d3"
9) "flags"
  10) "master"

在node0上执行systemctl stop redis时,主自动切换主服务器 

[root@node0 etc]# redis-cli  -p 26379 此时可以看出redis的主结点在node3上 
127.0.0.1:26379> SENTINEL masters 
1)  1) "name"
2) "mymaster"
3) "ip"
4) "172.16.23.13"
5) "port"
6) "6379"
7) "runid"
8) "15f8f4ca4f7f907bf420a01a21d52733aed476d3"
9) "flags"
  10) "master" 

在node3上执行

[17:10:30root@node3~]#iptables -I INPUT -d 172.16.23.13 -p tcp --dport 6379 -j REJECT 
[root@node0 etc]# redis-cli  -p 26379 此时可以看出reids的主结点在node1上
127.0.0.1:26379> SENTINEL masters
1)  1) "name"
2) "mymaster"
3) "ip"
4) "172.16.23.11"
5) "port"
6) "6379"
7) "runid"
8) "7d44ebc0898fbac4f31895b928f8a321d7599477"
9) "flags"
  10) "master"

在node1上查看主/从信息

[root@node1 ~]# redis-cli 
127.0.0.1:6379> AUTH centos.123
OK
127.0.0.1:6379> INFO Replication
# Replication
role:master
connected_slaves:1
min_slaves_good_slaves:1
slave0:ip=172.16.23.12,port=6379,state=online,offset=34328,lag=1
master_repl_offset:34467
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:20961
repl_backlog_histlen:13507

原创文章,作者:renjin,如若转载,请注明出处:http://www.178linux.com/69938

(0)
renjinrenjin
上一篇 2014-10-08
下一篇 2014-11-12

相关推荐

  • week3:cut,sort,grep等shell工具的应用及用户,组管理类命令

    1、列出当前系统上所有已经登录的用户的用户名,注意,同一个用户登录多次只显示一次即可    who | cut -d' ' -f1 | sort –u 2、取出最后登录到当前系统的用户相关信息    who | cut -d' ' -f1 | tail -1 | id 3、取出当…

    Linux干货 2016-11-20
  • rrdtool学习笔记

    一、前言 为了做云缓存平台的技术储备,从零开始学习了rrdtool,rrdtool非常强大,刚接触会有摸不着边的感觉,尤其是一堆概念性的东西。学习的切入点便是这些概念,一一理解后你才能品尝到rrdtool的清香,首先要感谢ailms整理的“RRDtool简体中文教程v1.01”,通俗易懂的概况了rrdtool的所有知识。现在整理自己在学习过程中的一些笔记。 …

    2015-03-21
  • N22-第5周博客作业

    1、显示当前系统上root、fedora或user1用户的默认shell; grep -E "^(root|fedora|user1)\>" /etc/passwd | cut -d: -f7 2、找出/etc/rc.d/init.d/functions文件中某单…

    Linux干货 2016-12-05
  • bash变量类型及区别之浅谈

    变量类型,区别 位置变量$0 $1,$2,$# $@ $* 变量的类型:本地变量、环境变量、位置变量 本地变量:生效范围为当前shell进程,对当前shell之外的其他shell进程包括当前shell的子进程均无效 环境变量:生效范围为当前shell进程及子进程 位置变量:$1,…..$n,${10}来表示,用于放脚本在脚本代码中调用通过命令行传…

    Linux干货 2016-08-12
  • SSH端口转发

      SSH 会自动加密和解密所有SSH 客户端与服务端之间的网络数据。但是,SSH 还能够将其他TCP 端口的网络数据通过SSH 链接来转发,并且自动提供了相应的加密及解密服务。这一过程也被叫做“隧道”(tunneling),这是因为SSH 为其他TCP 链接提供了一个安全的通道来进行传输而得名。例如,Telnet,SMTP,LDAP 这些TCP 应用均能够…

    2017-09-10
  • 马哥教育网络21期+第九周练习博客

    马哥教育网络21期+第九周练习博客 1、写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin);分别这两类用户的个数;通过字符串比较来实现; [root@localhost bin]# cat 1.sh  #!/bin/bash # while&nbsp…

    Linux干货 2016-09-05