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原理及集群主从配置

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服务器硬盘坏掉就会导致数据丢失,为了避免这种单点故障就有了主从复制工作机制

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)编辑配置文件

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)启动

[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>

欢迎工作一到五年的Java工程师朋友们加入Java程序员开发: 721575865

群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

相关推荐