标签:redis 主从复制 sentinel机制
Redis,Remote Dictionary Server,是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可以基于内存亦可持久化的日志型、kv数据库,并提供多种语言的API。
特点:
Redis支持数据的持久化,可以将内存中的数据保存到磁盘上,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-salve模式的数据备份。
功能:
数据结构服务器:值可以是string,map,lsit,sets,sorted sets等类型。
单进程:CPU并非瓶颈;
持久化机制:snapshoting,AOF
Replication:主从,主(rw)从(read-only)
优势:
性能极高;
丰富的数据类型;
原子;
丰富的特性;
命令行客户端命令:
Redis-cli:
redis-cli [OPTIONS] [cmd [arg [arg ...]]]
常用选项:
-h <hostname>
-p <port>
-a <password>
演示1:
1. 配置yum源安装redis
#yum install redis –y
2. 查看安装redis生成的文件;
3. 修改配置文件;
4. 启动服务,并查看端口;
5. 用客户端命令连接;
Redis:k/v
1. String(字符串):
作用:用于管理redis字符串值;
命令用法:
演示:
2. List(列表)
作用:redis列表是简单的字符串列表,按照插入顺序,你可以添加一个元素导到列表的头部(左边)或者尾部(右边);
一个列表最多可以包含2^32 – 1个元素。
相关命令:
LPUSH:将一个或多个值插入到列表头部
RPUSH:在列表中添加一个或多个值;
LPOP:移出并获取列表的第一个元素;
RPOP:移除并获取列表最后一个元素;
LINDEX:通过索引获取列表中的元素;
LSET:通过索引设置列表元素的值;
演示:
3. Set(集合)
作用:redis的set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1);
基本命令:
SADD:向集合添加一个或多个成员;
SINTER:返回给定所有集合的交集;
SUNION:返回所有给定集合的并集
SPOP:移除并返回集合中的一个随机元素;
SISMEMBER:判断member元素是否是结合key的成员;
SMEMBERS:列出集合中的元素;
演示:
4. Hash(哈希)
作用:redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
基本命令:
HSET:将hash表key中的字段field的值设为value
HSETNX:只有在字段field不存在时,设置哈希表字段的值;
HGET:获取存储在哈希表中指定字段的值。
HKEYS:获取所有哈希表中的字段;
HVALS:获取哈希表中的所有值;
HDEL:删除一个或多个哈希表字段;
演示:
5. Sorted set(有序集合)
作用:redis有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。Redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)确可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。集合中最大的成员数为2^32 – 1.
基本命令:
ZADD:向有序集合中添加一个或多个成员,或者更新已存在成员的分数
ZRANGE:通过索引区间返回有序集合成指定区间内的成员;
ZCARD:获取有序集合的成员数;
ZRANK:返回有序集合中指定成员的索引。
配置和使用redis:
1. 配置和使用redis;
配置段:
基本配置项;
网络配置项;
持久化相关的配置;
复制相关的配置;
安全相关的配置;
Limit相关的配置;
Slowlog相关的配置;
Includes
Advanced配置;
通用配置项:
Deamonize,supervised,loglevel,logfile,pidfile
Databases:
设定设局库数量,默认为16个,每个数据库的名字均为整数,从0开始编号,默认操作的数据库为0;
切换数据库的方法:SELECT <dbid>
网络配置项:
Bind IP
Port PORT
Tcp-backlog:后援队列长度;
Unixsocket:监听的套接字文件;
Timeout:连接的超时时长;
安全相关的配置:
Repuirepass <PASSWORD>
在redis-cli接口中使用AUTH命令完成认证;或者在连接时使用-a指明密码;
Rename-command <COMMAND> <NEW_CMND_NAME>
在AOF和Replication坏境中,不建议使用
认证实现方法:
1) Redis.conf
Requirepass PASSWORD
2) Redis-cli
AUTH PASSWORD
清空数据库:
FLUSHDB:清空当前库
FLUSHALL:清空所有库
演示:
1) 编辑配置文件,启用认证功能;
2) 重启redis服务,并测试查看;
2. 事务功能;
通过MULTI,EXEC,WATCH等命令实现事务功能;将一个或多个命令归并为一个操作提醒服务器按顺序执行的机制;不支持回滚操作;
MULTI:启动一个事务;
EXEC:执行事务;
一次性将事务中的所有操作执行完成后返回给客户端;
WATCH:乐观锁;在EXEC命令执行之前,用于监视指定数量键;如果监视中的某任意数据被修改,则服务器拒绝执行事务;
DISCARD:取消事务,放弃执行事务块内的命令;
UNWATCH:取消WATCH命令对所有key的监控;
演示:
1) 开始一个事务,最后由EXEC触发事务;
2) 用WATCH命令监视一个或多个key,然后启动一个事务,在未执行EXEC之前,在另一个终端修改这个被监视的key;
在上面的EXEC执行之前,在另一个终端上执行如下命令;
3. Connection(连接)及Server相关的命令;
Connection命令:
AUTH:认证相关的命令;
ECHO:
PING:
QUIT:
SELECT:切换数据库;
Server命令:
Redis服务器命令主要是用于管理redis服务。
1) BGREWRITEOF:异步执行一个AOF(AppendOnlyFile)文件重写操作;
2) BGSAVE:在后台异步保存当前数据库的数据到磁盘;
3) CLIENT KILL [ip:port] [ID client-id]:关闭客户端连接;
4) CLIENT LIST:获取连接到服务器的客户端连接列表;
5) CLIENT GETNAME:获取连接的名称;
6) CLIENT PAUSE timeout:在指定的时间内终止运行来自客户端的命令;
7) CLIENT SETNAME connection-name:设置当前连接的名称;
8) CLUSTER SLOTS:获取集群节点的映射数组;
9) COMMAND:获取redis命令详情数组;
10) COMMAND COUNT:获取redis命令总数;
11) COMMAND GETKEYS:获取给指定命令的所有键;
12) TIME:返回当前服务器的时间;
13) COMMAND INFO command-name [command-name]:获取指定redis命令描述的数组;
14) CONFIG GET parameter:获取指定配置参数的值;
15) CONFIG REWRITE:对启动redis服务器时所指定的redis.conf配置文件进行改写;
16) CONFIG SET parameter value:修改redis配置参数,无须重启;
17) CONFIG RESETSTAT:重置INFO命令中某些统计数据;
18) DBSIZE:返回当前数据库的key的数量;
19) DEBUG OBJECT key:获取key的调试信息;
20) DEBUG SEGFAULT:让redis服务崩溃;
21) FLUSHALL:删除所有数据库的所有key;
22) FLUSHDB:删除当前数据库的所有key;
23) INFO [section]:获取redis服务器的各种信息和统计数值;
24) LASTSAVE:返回最近一次redis成功将数据保存到磁盘上的时间,以UNIX时间戳格式表示;
25) MONITOR:实时打印出redis服务器接收到的命令,调试用;
26) ROLE:返回主从示例所属的角色;
27) SAVE:异步保存数据到硬盘;
28) SHUTDOWN [NOSAVE][SAVE]:异步保存数据到硬盘,并关闭服务器;
29) SLAVEOF host port:将当前服务器转变为指定服务器的从属服务器;
30) SLOWLOG subcommand [argument]:管理redis的慢查询日志;
31) SYNC:用于复制功能(replication)的内部命令;
4. 发布与订阅(publish/subscribe)
频道:消息队列;
SUBSCRIBE:订阅一个或多个队列;
PUBLISH:向频道发布消息;
UNSUBSCRIBE:退订此前订阅的频道;
PSUBSCRIBE:模式订阅;
演示:
1) 在客户端1订阅频道;
2) 在另外一个客户端向频道发布消息;
3) 在客户端1上会显示如下的消息;
5. Redis的持久化;
RDB和AOF
RDB:snapshot,二进制格式;按事先定制的策略,周期性的将数据保存至磁盘;数据文件默认为dump.rdb;
客户端也可显式使用SAVE或BGSAVE命令启动快照保存机制;
SAVE:同步,在主线程中保存快照;此时会阻塞所有客户端请求;
BGSAVE:异步,
在配置文件中定义周期性的工作机制:
1) 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合;
2) 指定存储至本地数据库时是否压缩数据,默认为yes,redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大;
rdbcompression yes
3) 指定本地数据库文件名,默认值为dump.rdb
dbfilename dump.rdb
4) 指定本地数据库存放目录;
AOF:Append Only File
记录每一次写操作至指定的文件尾部都实现持久化;当redis重启时,可通过重新执行文件中的命令在内存重建数据库;
BGREWRITEAOF:AOF文件重写;不会读取正在使用的AOF文件,而通过将内存中的数据以命令方式保存到临时文件中,完成之后替换原来的AOF文件;
AOF重写过程:
1) Redis主进程通过fork创建子进程;
2) 子进程根据redis内存中的数据创建数据库重建命令序列于临时文件中;
3) 父进程继承client的请求,并会把这些请求中的写操作继续追加至原来的AOF文件;额外地,这些新的写请求还会被放置于一个缓冲队列中;
4) 子进程重写完成,会通知父进程;父进程把缓冲中的命令写到临时文件中
5) 父进程用临时文件替换老的aof文件;
相关参数:
1) appendonly no:指定是否在每次更新操作后进行日志记录,redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断点时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no;
2) appendfilename appendonly.aof:指定更新日志文件名,默认为appendonly.aof;
3) appendfsync everysec:指定更新日志条件,共有3个可选值;
no:表示等操作系统进行数据缓存同步到磁盘(快)
always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
everysync:表示每秒同步一次(折中,默认值)
4) no-appendfsync-on-rewrite no
5) auto-aof-rewrite-percentage 100:表示现有的aof文件是上次文件大小的2倍,即改变已达到100%,就再次重写;
6) auto-aof-rewrite-min-size 64mb:表示重写的大小至少达到64M之后才开始重写;
note:持久本身不能取代备份;还应该指定备份策略,对redis数据库定期进行备份;
BDF与AOF同时启用:
1) BGSAVE和BGREWRITEAOF不会同时执行;
2) 在redis服务器启动用于数据恢复时,会优先选用AOF;
6. Redis的主从复制;
1) 特点
一个master可以有多个slave;支持链式复制;master以非阻塞方式同步数据至slave;
2) Slave节点操作;
> SLAVAOF MASTER_IP MASTER_PORT
Note:如果master使用requirepass开启了认证功能,从服务器要使用masterauth <PASSWORD>来连入服务请求使用此密码认证;
如果当前服务器已经是个主服务器的从属服务器,那么执行SLAVEOF host port将使当前服务器停止对旧主服务器的同步,丢弃旧数据集,转而开始对新主服务器进行同步;
另外,对一个从属服务器执行命令SLAVEOF NO ONE将使得这个从属服务器关闭复制功能,并从从属服务器转变回主服务器,原来同步所得的数据集不会丢弃;
利用SLAVEOF NO ONE不会丢弃同步所得到的数据集,这个特性,可以在主服务器失败的时候,将从属服务器用作新的主服务器,从而实现无间断运行;
演示:
1) 准备一个新的节点node2(192.168.19.145),安装redis,将其配置为node1(192.168.19.140)的从库;
Note:由于一开始两台主机上的iptables和selinux没有关闭,导致数据不能同步过来;
从节点node2上查看INFO信息及日志如下:
主节点查看INFO信息及日志如下:
7. Redis的sentinel机制
用于管理多个redis服务实现HA;
监控、通知、自动故障转移;
流言协议,投票协议;
程序:
Redis-sentinel /path/to/file.conf
Redis-server /path/to/file.conf --sentinel
1) 服务器自身初始化,运行redis-server中专用于sentinel功能的代码;
2) 初始化sentinel状态,根据给定的配置文件,初始化监控的master服务器列表;
3) 创建连向master的连接;
专用配置文件:/etc/redis-sentinel.conf
1) # sentinel monitor <master-name> <ip> <redis-port> <quorum>
连接的主节点,可以有多行,quorum表示法定票数,建议sentinel节点为奇数个;
只需要指明主节点即可,从节点会通过主节点自动获取;
sentinel monitor mymaster 127.0.0.1 6379 2
2) sentinel down-after-milliseconds <master-name> <milliseconds>
判断某主节点不在线的超时时长;
sentinel down-after-milliseconds mymaster 30000
3) sentinel parallel-syncs <master-name> <numslaves>
执行故障转移时,允许最多有多少个从服务器可以向主服务器发起连接请求;
entinel parallel-syncs mymaster 1
4) sentinel failover-timeout <master-name> <milliseconds>
故障转移的超时时间,即当主服务器出现故障时,提升新的服务器为主服务器的超时时间;
sentinel failover-timeout mymaster 180000
5) sentinel auth-pass <master-name> <password>
连接主节点的认证密码
主管下线,客观下线:
主管下线:一个sentinel示例判断出某节点下线;
客观下线:多个sentinel节点协商后判断出某节点下线;
专用命令:
SENTINEL masters
SENTINEL slaves <master name>
SENTINEL get-master-addr-by-name <master name>
SENTINEL reset
SENTINEL failover <master name>
演示:
实验环境:
Node1节点为master节点,也为sentinel节点,地址:192.168.19.141;node2:192.168.19.145和node3:192.168.19.134为从节点;
1) 准备操作环境;
主节点node1:
从节点node2:
从节点node3:
2) 在主节点node1上配置启用sentinel机制,编辑配置文件/etc/redis-sentinel.conf文件并启动;
Note:要启用daemonize yes选项,让sentinel以守护进程的方式启动;否则,会出现启动问题;而将Protected-mode设为no,因为在后面的启动连接操作中,不讲保护模式取消,不能执行操作;
开启服务,查看26379端口;
3) 连接sentinel执行命令;
查看从节点服务器信息;
4) 测试,让主节点下线,再次查看sentinel信息;
让node1下线:
查看主节点变成了node2;
标签:redis 主从复制 sentinel机制
原文地址:http://blog.51cto.com/claude666/2094240