redis原理及集群主从配置
一、简介
存储系统背景
存储系统有三类:
RDBMS
oracle,dh2,postgresql,mysql,sql server
NoSQL:
KV NoSQL:redis,memcached
列式Column Family NoSQL: HBase,每一行每一字段可以保留n份,也是按照字段存储
文档Documentation NoSQL: MongoDB
图式Graph NoSQL: Neo4j
NewSQL
aerospike,foundationDB,rethinkDB...
1、什么是redis
redis是一个开源的使用ANSI C 语言编写、支持网络、可基于内存即可持久化的日志型,key-value数据库(是一个key-value存储系统),支持多种语言的API
它是一个高级key-value数据库,跟memcached类似,但是redis的数据可以持久化,并且支持数据类型更丰富,同时还支持服务端的计算集合的并、交、和补集等,支持多种排序功能。
2、特点:
常用来和memcache做比较,但redis是nosql,基于key-value(键值)的数据结构的存储,可以存储键值,字典,图表
完全工作在内存中,数据保存在内存,性能不错,数据周期性备份到硬盘,(持久化)的单线程服务器
可以通过lua脚本扩展
支持sentinel主从架构高可用
分布式
3、性能
虽然是单线程,kv是一个单纯简单的存储cpu通常不会形成瓶颈的,官方测试50个并发请求10w次,写的速度是110000次/s,读的速度是81000次/s,读写大小为256bytes的字符串;
4、持久化persistence
RDB: snapshot,二进制格式;按事先定制的策略,周期性地将数据保存至磁盘;数据文件默认为dump.rdb;
客户端也可显式使用SAVA或BGSAVE命令启动快照保存机制;
SAVE: 同步,在主线程中保存快照;此时会阻塞所有客户端请求;
BGSAVE:异步,
AOF:Append Only File
记录每一次写操作至指定的文件尾部实现持久化;当redis重启时,可通过重新执行文件中的命令在内存重建数据库;
BGREWRITEAOF:AOF文件重写;
不会读取正在使用AOF文件,而通过将内存中的数据以命令的方式保存到临时文件中,完成之后替换原来的AOF文件;
5、是一个数据结构服务器它支持的value类型有:
String字符串, List链表, Hash哈希, Set集合, Sorted Set有序集合, Bitmap, HyperLoglog
Strings:
SET key value [EX #] [NX|XX]
GET
INCR
DECR
EXIST
Lists:
LPUSH
RPUSH
LPOP
RPOP
LINDEX
LSET
Sets:
SADD
SINTER
SUNION
SPOP
SISMEMBER
Sorted Sets:
ZADD
ZRANGE
ZCARD
ZRANK
Hashes:
HSET
HSETNX
HGET
HKEYS
HVALS
HDEL
Bitmaps, HyperLogLog
6、守护进程
监听端口为6379/tcp
7、数据库对比
常见数据库功能对比
名称 | 数据库类型 | 数据存储选项 | 操作类型 | 备注 |
redis | 内存存储,nosql数据库 | 支持字符串、列表、集合、散列标、有序集合 | 增、删、修改、更新 | 支持分布式存储,主从同步及高可用,单线程 |
memcached | 内存缓存数据库 | 键值之间得映射 | 增、删、修改、更新 | 支持多线程 |
mysql | 典型关系数据库,RDBMS | 数据库由多表组成,每张表包含多行 | 增、删、修改、更新 | 支持ACID性质 |
postgresql | 典型关系数据库,RDBMS | 数据库由多表组成,每张表包含多行 | 增、删、修改、更新 | 支持ACID性质 |
mongodb | 硬盘存储,nosql数据库 | 数据库包含多个表 | 增、删、修改、更新 | 主从复制,分片,副本集、空间索引 |
8、简述和memcached之间的对比
redis不仅仅支持简单的kv类型数据,还支持list,set,hash等数据结构
redis支持数据备份
redis支持数据持久化,可以将内存中的数据保持在磁盘中,重启的时候可以在加载使用
集群,memcache不支持集群,多台memcache 共处
9、redis的master/slave复制:
支持一个master多个slave
slave可以介绍其他slave的链接来替代他链接master
复制在master是非阻塞的,在slave是阻塞的
复制被利用来提供扩展性,在slave端只提供查询功能及数据的冗余
10、应用场景
缓存(数据查询,短连接、新闻内容、商品内容等)
分布式集群架构中session分离
聊天室在线好友列表
任务队列(秒杀、抢购、12306)
应用排行
网站访问统计
数据统计
为了解决高并发、高可用、高可扩展,大数据存储等一系列问题而产生的数据库解决方案
二、主从复制工作机制
redis持久化解决了redis服务重启后能够将硬盘的持久化数据恢复到内存中,但当redis服务器硬盘坏掉就会导致数据丢失,为了避免这种单点故障就有了主从复制工作机制
一主多从结构
主从复制不会阻塞master,在同步数据时,master可以继续处理client请求
一个redis即可以是主也可以是从
三、多实例redis配置
1、下载软件及安装源
http://download.redis.io/releases/redis-5.0.4.tar.gz
如果源码安装下载源码
如果yum安装请配置源
rpm -ivh http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
2、安装有两种安装方式
1)、yum安装
直接yum install redis
systemctl enable redis
systemctl start redis
Dependencies Resolved #一些依赖 ==================================================================================================================== Package Arch Version Repository Size ==================================================================================================================== Installing: redis x86_64 3.2.12-2.el7 epel 544 k Installing for dependencies: jemalloc x86_64 3.6.0-1.el7 epel 105 k Transaction Summary ==================================================================================================================== Install 1 Package (+1 Dependent package)
Complete! [root@web1 ~]# systemctl start redis [root@web1 ~]# systemctl enable redis Created symlink from /etc/systemd/system/multi-user.target.wants/redis.service to /usr/lib/systemd/system/redis.service. [root@web1 ~]# netstat -untlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 2570/redis-server 1 tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2050/nginx: master tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 2176/dnsmasq tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 875/sshd tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 879/cupsd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2035/master tcp6 0 0 :::111 :::* LISTEN 1/systemd tcp6 0 0 :::80 :::* LISTEN 2050/nginx: master tcp6 0 0 :::22 :::* LISTEN 875/sshd tcp6 0 0 ::1:631 :::* LISTEN 879/cupsd tcp6 0 0 ::1:25 :::* LISTEN 2035/master udp 0 0 0.0.0.0:5353 0.0.0.0:* 574/avahi-daemon: r udp 0 0 127.0.0.1:323 0.0.0.0:* 2334/chronyd udp 0 0 0.0.0.0:52822 0.0.0.0:* 574/avahi-daemon: r udp 0 0 192.168.122.1:53 0.0.0.0:* 2176/dnsmasq udp 0 0 0.0.0.0:67 0.0.0.0:* 2176/dnsmasq udp 0 0 0.0.0.0:177 0.0.0.0:* 890/lightdm udp6 0 0 ::1:323 :::* 2334/chronyd udp6 0 0 :::177 :::* 890/lightdm [root@web1 ~]#
2)、编译安装
解压-->编译-->copy-->启动
这次编译安装一个新版本 mkdir /data cd /data #上传下载的包到此目录 redis-5.0.4.tar.gz tar redis-5.0.4.tar.gz cd rredis-5.0.4 make
3、编译安装及启动
1)创建文件夹及拷贝关键文件
mkdir /data/redis2 cp redis.conf /data/redis2 cp src/redis-server /data/redis2 cd /data/redis2/
2)编辑配置文件
因为有#号开的行可以先过滤掉
sed -ri '/#|^$/d' redis.conf
开始编辑配置文件,修改下面几项
vim redis.conf
port 6380 //监听端口
appendonly no yes //日志开关,不是包报错的日志,是二进制,记录数据变化
pidfile /var/run/redis_6380.pid //pid名字 logfile "/data/redis2/redis.log" //log日志 daemonize yes //后台启动
dbfilename dump.rbd //持久化数据文件
3)启动
标红的就是一个yum安装的实例,一个编译安装的实例,这个就是多实例了
[root@web1 redis2]# ./redis-server ./redis.conf [root@web1 redis2]# netstat -tunlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 2570/redis-server 1 tcp 0 0 192.168.216.51:6380 0.0.0.0:* LISTEN 15434/./redis-serve tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2050/nginx: master tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 2176/dnsmasq tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 875/sshd tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 879/cupsd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2035/master tcp6 0 0 :::111 :::* LISTEN 1/systemd tcp6 0 0 :::80 :::* LISTEN 2050/nginx: master tcp6 0 0 :::22 :::* LISTEN 875/sshd tcp6 0 0 ::1:631 :::* LISTEN 879/cupsd tcp6 0 0 ::1:25 :::* LISTEN 2035/master udp 0 0 0.0.0.0:5353 0.0.0.0:* 574/avahi-daemon: r udp 0 0 127.0.0.1:323 0.0.0.0:* 2334/chronyd udp 0 0 0.0.0.0:52822 0.0.0.0:* 574/avahi-daemon: r udp 0 0 192.168.122.1:53 0.0.0.0:* 2176/dnsmasq udp 0 0 0.0.0.0:67 0.0.0.0:* 2176/dnsmasq udp 0 0 0.0.0.0:177 0.0.0.0:* 890/lightdm udp6 0 0 ::1:323 :::* 2334/chronyd udp6 0 0 :::177 :::* 890/lightdm [root@web1 redis2]#
4)变量,赋值取值,正常关闭,非正常的关闭
[root@web1 redis2]# redis-cli -h 192.168.216.51 -p 6380 192.168.216.51:6380> 192.168.216.51:6380> 192.168.216.51:6380> 192.168.216.51:6380> set home zxg //赋值 OK192.168.216.51:6380> get home //取值 "zxg" 192.168.216.51:6380> get abc 123 (error) ERR wrong number of arguments for 'get' command 192.168.216.51:6380> set abc 123 OK 192.168.216.51:6380> get abc "123"192.168.216.51:6380> KEYS * //查看所有的key 1) "abc" 2) "home" 192.168.216.51:6380>
192.168.216.51:6380> SHUTDOWN //正常关闭,非正常关闭就是kill了
四、主从配置
1、配置从服务器
redis主从配置非常简单,只需要把从服务器改一个配置即可
vim redis.conf
slaveof 192.168.216.51 6379
2、启动服务
[root@web2 ~]# systemctl start redis
[root@web2 ~]# systemctl enable redis
3、查看主从状态测试结果
[root@web1 redis2]# redis-cli -h 192.168.216.51 -p 6379 192.168.216.51:6379> info replication # Replication role:master connected_slaves:1 slave0:ip=192.168.216.52,port=6379,state=online,offset=99,lag=0 master_repl_offset:99 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:98 192.168.216.51:6379>
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.216.51
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:253
slave_priority:100
slave_read_only:1
connected_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>
注意1:从服务器只读
master新建key test zxg
192.168.216.51:6379> set test zxg OK 192.168.216.51:6379> get test "zxg" 192.168.216.51:6379>
slave查看有没有值
127.0.0.1:6379> get test "zxg" 127.0.0.1:6379>
转载请注明出处:https://www.cnblogs.com/zhangxingeng/p/10743476.html