欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Redis数据库

程序员文章站 2022-05-08 11:29:08
...

官网地址
https://redis.io

Redis介绍

Redis端口号:6379
内存设置:硬盘内存一样大,要么就内存比硬盘大一点

简介

非关系型数据库,将数据放在内存当中。补偿了Memcache的不足,不同的是,Memcache只能将数据缓存到内存中,无法自动定期写入硬盘,这就表示,一断电或重启,内存清空,数据丢失。所以Memcache的应用场景适用于缓存无需持久化的数据。而Redis不同的是它会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,实现数据的持久化.

特点

1、可以将内存中的数据保存在磁盘中
2、不仅仅支持简单的key-value类型的数据,同时还提供lists(列表)、sets(集合)和zsets(有序集合)等数据结构的存储。
3、支持数据的备份,即master-slave模式的数据备份。
4、性能极高:Redis能读的速度是110000次/s,写的速度是81000次/s 。
5、原子性:Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不 执行。单个操作是原子性的,多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
Redis和memcache的区别:Redis和Memcache都是将数据存放在内存中,都是内存数据库
1、memcache还可用于缓存其他东西,例如图片、视频等等。
2、redis用于没有图片视频类的缓存
3、memcache挂掉后,数据不可恢复;redis数据丢失后能通过aof恢复

配置文件详解

#是否后台运行redis,no为后台运行
daemonize yes

#如以后台进程运行,则需指定一个pid,默认为/var/run/redis.pid

pidfile redis.pid #/var/run,pid文件

#绑定主机IP,默认值为127.0.0.1,客户端连接自己的地址

#bind 127.0.0.1

#Redis默认监听端口

port 6379

#客户端闲置多少秒后,断开连接,默认为300(秒)

timeout 300

#日志记录等级,有4个可选值,debug,verbose(默认值),notice,warning

loglevel verbose #只记录报错信息

#指定日志输出的文件名,默认值为stdout,也可设为/dev/null屏蔽日志

logfile stdout

#可用数据库数,默认值为16,默认数据库为0

databases 16

#保存数据到disk的策略

#当有一条Keys数据被改变时,900秒刷新到硬盘一次

save 900 1

#当有10条Keys数据被改变时,300秒刷新到硬盘一次

save 300 10

#当有1w条keys数据被改变时,60秒刷新到硬盘一次

save 60 10000

#dump .rdb #RDB文件是否使用压缩,压缩(会消耗CPU)

rdbcompression yes #空间不够用的时候设为yes

#存储和加载rdb文件时校验,主从数据一不一样

rdbchecksum yes

#rdb文件名,默认值为dump.rdb

dbfilename dump.rdb

#后台存储错误停止写。

stop-writes-on-bgsave-error yes

#本地数据库存放路径,默认值为 ./

dir /var/lib/redis/

########### Replication #####################

#Redis的复制配置

#replicaof 当本机为从服务时,设置主服务的IP及端口

#masterauth 当本机为从服务时,设置主服务的连接密码

#连接密码,和mysql密码那样似的!

#requirepass foobared

#最大客户端连接数,默认不限制,当前为128,128够多了

#maxclients 128

#最大内存使用设置,达到最大内存设置后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理后,仍到达最大内存设置,将无法再进行写入操作。

#maxmemory

#是否在每次更新开启操作后进行日志记录,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认值为no

appendonly no #默认不开启也能主从复制,跟mysql不一样

#更新日志文件名,默认值为appendonly.aof,相当于mysql二进制日志名

#appendfilename

#更新日志条件,共有3个可选值。no表示等操作统一(数据)缓存同步到磁盘。always表示每次更新操作后手动调用。fsync()表示系统3秒数据写到磁盘。everysec表示每秒同步一次(默认值)。

#appendfsync always

appendfsync everysec

#appendfsync no

#当slave失去与master的连接,或正在拷贝中,如果为yes,slave会响应客户端的请求,数据可能不同步甚至没有数据。如果为no,slave会返回错误"SYNC with master in progress",数据还没用同步完!

replica -serve-stale-data yes

#如果为yes,slave实例只读,如果为no,slave实例可读可写。
replica -read-only yes #不能设为只读,不然等主从切换,会有影响

#在slave和master同步后(发送psync/sync),后续的同步是否设置成TCP_NODELAY . 假如设置成yes,则redis会合并小的TCP包从而节省带宽,但会增加同步延迟(40ms),造成master与slave数据不一致 假如设置成no,则redis master会立即发送同步数据,没有延迟

repl-disable-tcp-nodelay no

#如果master不能再正常工作,那么会在多个slave中,选择优先值最小的一个slave提升为master,优先值为0表示不能提升为master。优先级范围(0-255)

replica-priority 100
####LIMITS####

maxclients 10000 #客户端并发连接数的上限是10000,到达上限,服务器会关闭所有新连接并返回错误"max number of clients reached"

maxmemory 15G #设置最大内存,到达上限,服务器会根据驱逐政策(eviction policy)删除某些键值,如果政策被设置为noeviction,那么redis只读,对于插入内存的操作返回错误。

####APPEND ONLY MODE####

appendonly no #redis默认采用快照(snapshotting)异步转存到硬盘中,它是根据save指令来触发持久化的,当Redis异常中断或停电时,可能会导致最后一些写操作丢失。AOF(Append Only File,只追加文件)可以提供更好的持久性,结合apendfsync指令可以把几分钟的数据丢失降至一秒钟的数据丢失,它通过日志把所有的操作记录下来,AOF和RDB持久化可以同时启动。

appendfilename appendonly.aof #指定aof的文件名。

apendfsync always|everysec|no #调用fsync()写数据到硬盘中,always是每一次写操作就马上同步到日志中,everysec是每隔一秒强制fsync,no是不调用fsync(),让操作系统自己决定何时同步。

no-appendfsync-on-rewrite no #如果为yes,当BGSAVE或BGREWRITEAOF指令运行时,即把AOF文件转写到RDB文件中时,会阻止调用fsync()。

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb #Redis会将AOF文件最初的大小记录下来,如果当前的AOF文件的大小增加100%并且超过64mb时,就会自动触发Redis改写AOF文件到RDB文件中,如果auto-aof-rewrite-percentage为0表示取消自动rewrite功能。

####LUA SCRIPTING####

lua-time-limit 5000 #一个Lua脚本最长的执行时间为5000毫秒(5秒),如果为0或负数表示无限执行时间。

####SLOW LOG####

slowlog-log-slower-than 10000 #当某个请求执行时间(不包括IO时间)超过10000微妙(10毫秒)1秒,把请求记录在慢日志中 ,如果为负数不使用慢日志,如果为0强制记录每个指令。

slowlog-max-len 128 #慢日志的最大长度是128,当慢日志超过128时,最先进入队列的记录会被踢出来,慢日志会消耗内存,你可以使用SLOWLOG RESET清空队列回收这些内存。

####ADVANCED CONFIG####

hash-max-ziplist-entries 512

hash-max-ziplist-value 64 #较小的hash可以通过某种特殊的方式进行编码,以节省大量的内存空间,我们指定最大的条目数为512,每个条目的最大长度为64。

list-max-ziplist-entries 512

list-max-ziplist-value 64 #同上。

zset-max-ziplist-entries 128

zset-max-ziplist-value 64 #同上。

activerehashing yes #重新哈希the main Redis hash table(the one mapping top-level keys to values),这样会节省更多的空间。

client-output-buffer-limit normal 0 0 0 #从和主在同步数据时,客户端写入数据时对客户端开启一个缓冲区(内存)内容进行限制可以强迫那些就不从服务器读取数据的客户端断开连接。对于normal client,第一个0表示取消hard limit,第二个0和第三个0表示取消soft limit,normal client默认取消限制,因为如果没有寻问,他们是不会接收数据的。(积压缓冲区 )当客户端插入数据过多时

client-output-buffer-limit slave 256mb 64mb 60 #对于slave client和MONITER client,如果client-output-buffer一旦从服务超过256mb数据没有同步过来,又或者超过64mb持续60秒,那么服务器就主从会立即断开连接(主会认为从效率不好)

client-output-buffer-limit pubsub 32mb 8mb 60 #对于pubsub client,如果client-output-buffer一旦超过32mb,又或者超过8mb持续60秒,那么服务器就会立即断开客户端连接。

####INCLUDES####

include /path/to/conf #包含一些可以重用的配置文件。

hz 10 #Redis 调用内部函数来执行后台任务,比如关闭已经timeout连接,删除过期的keys并且永远不会被访问到的,执行频率根据 hz 后面的值来确定。在Redis 比较空闲的时候,提高这个值,能充分利用CPU,让Redis相应速度更快,可取范围是1-500 ,建议值为 1—100。cpu满负载不建议调

aof-rewrite-incremental-fsync yes # 当子进程重写AOF文件,以下选项开启时,AOF文件会每产生32M数据同步一次。这有助于更快写入文件到磁盘避免延迟

################VIRTUAL MEMORY###########

#是否开启VM功能,默认值为no

vm-enabled no #当内存满了是不会到vm空间来取的

#vm-enabled yes

#虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享

vm-swap-file /tmp/redis.swap

#将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的 (Redis的索引数据就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0。

vm-max-memory 0

vm-page-size 32

vm-pages 134217728

vm-max-threads 4

############# ADVANCED CONFIG ###############

glueoutputbuf yes

hash-max-zipmap-entries 64

hash-max-zipmap-value 512

#是否重置Hash表

activerehashing yes
redis的存储分为内存存储、磁盘存储和log文件三部分
save seconds updates:save配置,指出在多长时间内,有多少次更新操作,将数据同步到数据文件可以多个条件配合,如默认配置文件中的设置,就设置了三个条件。
appendonly yes/no :appendonly配置,指出是否在每次更新操作后进行日志记录,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面的save条件来同步的,所以有的数据会在一段时间内只存在于内存中。
appendfsync no/always/everysec :appendfsync配置,no表示等操作系统进行数据缓存同步到磁盘,always表示每次更新操作后手动调用fsync()将数据写到磁盘,everysec表示每秒同步一次。

Reids基础命令
	[aaa@qq.com ~]# redis-cli -a 123456
	192.168.100.1:6379> set aaa bbb	#创建值
	192.168.100.1:6379> keys * 	#查看所有键
	192.168.100.1:6379> get aaa	#查看键所对应的值
	192.168.100.1:6379> del aaa	#删除aaa键
键的遵循:

1.键的长度不要过长,键的长度越长则消耗的空间越多
2.在同一个库中(名称空间)键的名称不得重复,如果复制键的名称,实际上是修改键中的值
3.在不同的库中(名称空间),键的同一个名称可以重复
4.键可以实现自动过期

持久化概述

redis工作时所有数据集都是存储于内存中的,如果redis崩溃或断电导致所有数据丢失,所以redis提供了持久化功能来保证数据的可靠性,redis持久化有两种实现:RDB和aof
实现数据持久化的两种方式:
(1)使用截图的方式(rdb),将内存中的数据不断写入磁盘(性能高,但可能会引起一定程度的数据丢失)
(2)使用类似mysql的方式(aof),记录每次更新的日志,将数据内容缩小(类似于行的复制)

RDB

周期性地将数据保存至磁盘,使用save命令即可设定周期和策略数据文件默认为dump.rdb,使用save命令进行保存数据至磁盘,可能会丢数据。
stop-writes-on-bgsave-error yes //在进行快照备份时,一旦发生错误的话是否停止写操作
rdbcompression yes //RDB文件是否使用压缩,压缩会消耗CPU
rdbchecksum yes //是否对RDB文件做校验码检测
dbfilename dump.rdb //定义RDB文件的名称
dir /redis/data //定义RDB文件存放的目录路径,需要改!

AOF

附加日志类型的持久化机制,把其中一些冗余的操作给合并一个(和基于行的复制是一样的原理)不会读取正在使用AOF文件,而是通过将内存中的数据,把内存中的所有数据生成一个命令集,以命令的方式保存到临时文件中,完成之后替换原来的AOF文件;所以AOF文件是通过把重写将其变小。文件名为appendonly.aof,浪费了一定的性能,但是能保证缓存的高可用
appendonly no //定义是否开启AOF功能,默认为关闭,启用修改为yes
appendfilename “appendonly.aof” //定义AOF文件
appendfsync always //表示每次收到写命令时,立即写到磁盘上的AOF文件,虽然是最好的持久化功能,但是每次有写命令时都会有磁盘的I/O操作,容易影响redis的性能
appendfsync everysec //表示每秒钟写一次,不管每秒钟收到多少个写请求都往磁盘中的AOF文件中写一次
appendfsync no //表示append功能不会触发写操作,所有的写操作都是提交给OS,由OS自行决定是如何写的
no-appendfsync-on-rewrite no //当此项为yes时,表示在重写时,对于新的写操作不做同步,而暂存在内存中
auto-aof-rewrite-percentage 100 //表示当前AOF文件的大小是上次重写AOF文件的二倍时,则自动日志重写过程
auto-aof-rewrite-min-size 64mb //定义AOF文件重写过程的条件,最少为定义大小则触发重写过程
[aaa@qq.com etc]# ls /redis/data #查看这个目录下的文件(aof和rdb文件)

数据恢复

1.每次redis重启都会去读取相对应的文件,如果误删除或者当redis坏了
2.在Redis服务器恢复数据时,会优先使用AOF
3.可以用备份文件替换原来的文件,使用dump.rdb或者appendonly.aof文件恢复
4.内存–硬盘(dump.rdb )— 传送至从服务器,从服务器数据很可能不一致

哨兵检测原理

sdown主观下线:(如三台哨兵只有一台检测不到master)slave不能转换为master
odown客观下线:(如三台哨兵有两台检测不到master)slave转换为master
当客户端访问redis master时,会先去访问某个哨兵,哨兵去检测当前master然后返回给客户端master地址,客户端接收到当前master地址,直接去访问master

服务启动顺序

首先启动主Redis服务进程,然后启动从服务进程,最后启动哨兵的服务进程。

Redis哨兵模式

Redis数据库

当前实验环境是

一主两从一哨兵,当一个哨兵认为主坏了,主就坏了
192.168.100.1 centos1(主)
192.168.100.2 centos2(从1)
192.168.100.3 centos3(从2)
192.168.100.4 centos4(哨兵)

上传软件包(所有服务器)

[aaa@qq.com~]# ls
redis-5.0.5.tar.gz
[aaa@qq.com~]# tar -zxvf redis-5.0.5.tar.gz
安装gcc
[aaa@qq.com~]# yum install -y gcc
编译安装
[aaa@qq.com~]# cd redis-5.0.5
[aaa@qq.com]# make
[aaa@qq.com]# cd src/
[aaa@qq.com]# make install PREFIX=/usr/local/redis
移动配置文件位置
[aaa@qq.com]# mkdir /usr/local/redis/etc
[aaa@qq.com]# cd …
[aaa@qq.com]# cp redis.conf /usr/local/redis/etc/ #哨兵不做
添加path变量
[aaa@qq.com~]# ln -s /usr/local/redis/bin/* /usr/local/bin/
添加开机自启
[aaa@qq.com~]# chmod +x /etc/rc.d/rc.local
[aaa@qq.com~]# echo “redis-server /usr/local/redis/etc/redis.conf” >> /etc/rc.d/rc.local #是/etc/rc.local/的软连接 或者
[aaa@qq.com~]# chmod +x /etc/ rc.local
[aaa@qq.com~]# echo “redis-server /usr/local/redis/etc/redis.conf” >> /etc/rc.local #哨兵不做

搭建主从
主:

[aaa@qq.com~]# mkdir -p /redis/data #创建rdb文件路径
[aaa@qq.com etc]# mkdir /var/log/redis #创建rof日志文件路径
[aaa@qq.com~]# vim /usr/local/redis/etc/redis.conf
daemonize yes #后台运行
dir “/redis/data” //定义RDB文件存放的目录路径,需要改!
appendonly yes #开启日志文件,但是它现在是根据快照文件进行的
logfile “/var/log/redis/redis_6379.log” #我的日志文件存放位置
bind 127.0.0.1 192.168.100.1 #默认监控127.0.0.1 添加本机IP 192.168.100.1
#requirepass foobared //此项下一行,指定密码即可
requirepass (123456)
启动服务
[aaa@qq.com~]# pkill redis-server #关闭服务
[aaa@qq.com~]# redis-server /usr/local/redis/etc/redis.conf
[aaa@qq.com~]# redis-cli -a -h 192.168.100.1 123456
127.0.0.1:6379> config get dir #设置dump.rdb文件位置

  1. “dir”
  2. “/redis/data” #设置成功
从1:

修改配置文件
[aaa@qq.com~]# mkdir -p /redis/data #创建rdb文件路径
[aaa@qq.com etc]# mkdir /var/log/redis #创建rof日志文件路径
[aaa@qq.com ~]# vim /usr/local/redis/etc/redis.conf
daemonize yes #后台运行
bind 127.0.0.1 192.168.100.2 #侦听本机地址
logfile “/var/log/redis/redis_6379.log”
appendonly yes #开启日志文件,但是它现在是根据快照文件进行的
dir “/redis/data”
replicaof 192.168.100.1 6379 #指定master IP,端口
masterauth 123456 #指定redis密码
启动服务
[aaa@qq.com ~]# redis-server /usr/local/redis/etc/redis.conf

从2:

修改配置文件
[aaa@qq.com~]# mkdir -p /redis/data #创建rdb文件路径
[aaa@qq.com etc]# mkdir /var/log/redis #创建rof日志文件路径
[aaa@qq.com ~]# vim /usr/local/redis/etc/redis.conf
daemonize yes #后台运行
bind 127.0.0.1 192.168.100.3 #侦听本机地址
logfile “/var/log/redis/redis_6379.log”
appendonly yes #开启日志文件,但是它现在是根据快照文件进行的
dir “/redis/data”
replicaof 192.168.100.1 6379 #指定master IP,端口
masterauth 123456 #指定redis密码
启动服务
[aaa@qq.com ~]# redis-server /usr/local/redis/etc/redis.conf
查看主从信息
[aaa@qq.com ~]# redis-cli -h 192.168.100.2
192.168.100.2:6379> info replication #查看主从信息
测试主从数据是否同步
主:127.0.0.1:6379> set test aa
OK
127.0.0.1:6379> get test
“aa”
[aaa@qq.com ~]# redis-cl
从:192.168.100.2:6379> keys *

  1. “test”
    192.168.100.2:6379> get test
    “aa”
哨兵:

移动配置文件位置
[aaa@qq.com~]# cd redis-5.0.5
[aaa@qq.com redis-5.0.5]# cp sentinel.conf /usr/local/redis/etc/
修改sentinel.conf配置文件
[aaa@qq.com ~]# vim /usr/local/redis/etc/sentinel.conf #标红的部分需修改
daemonize yes #后台运行
#port 26379 #后端(哨兵/集群)通信端口
bind 0.0.0.0 #添加监控IP,一定要写0.0.0.0,不然主从切换不了,侦听所有地址
sentinel monitor mymaster(集群名称) 192.168.100.1 6379 1 (几个哨兵认为主坏了进行主从切换) #修改master IP
sentinel auth-pass mymaster 123456 #设置修改主的密码
#sentinel auth-pass
#sentinel author-pass定义服务的密码,mymaster是服务名称,123456是Redis服务器密码
sentinel down-after-milliseconds mymaster 30000 #添加这行
#sentinel down-after-milliseconds //sentinel连接其他节点超时时间,单位为毫秒(默认为30秒)
sentinel parallel-syncs mymaster 1 #添加这行
#sentinel parallel-syncs //提升主服务器时,允许多少个从服务向新的主服务器发起同步请求
sentinel failover-timeout mymaster 180000 #添加这行
#sentinel failover-timeout //故障转移超时时间,在指定时间没能完成则判定为失败,单位为毫秒(默认为180秒)
启动sentinel
[aaa@qq.com etc]# redis-sentinel /usr/local/redis/etc/sentinel.conf
[aaa@qq.com etc]# chmod +x /etc/rc.local
[aaa@qq.com etc]# echo “redis-sentinel /usr/local/redis/etc/sentinel.conf” >> /etc/rc.local #添加开机启动
关闭哨兵的命令是:pkill redis-sentinel
看哨兵是否创建成功
[aaa@qq.com etc]# redis-cli -h 192.168.100.4 -p 26379
192.168.100.1:26379> info sentinel #看到如下信息说明配置成功
#Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.100.1:6379,slaves=2,sentinels=1

测试:

(如果从设置了密码,主坏了之后要想变成从,就要指定新主的密码)
关闭主redis
[aaa@qq.com~]# ps -ef | grep redis
[aaa@qq.com~]# kill -9 955
查看主从状态是否切换完成
[aaa@qq.com ~]# redis-cli -h 192.168.100.4 -p 26379
192.168.100.4:26379> info sentinel
#Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.100.2:6379,slaves=2,sentinels=1
启动从(旧主)
[aaa@qq.com]# redis-server /usr/local/redis/etc/redis.conf
192.168.100.1:26379> info sentinel
#Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.100.2:6379,slaves=4,sentinels=1
查看主从状态
[aaa@qq.com etc]# redis-cli -h 192.168.100.3
192.168.100.3:6381> auth 123456
OK
192.168.100.1:6381> info replication
由以上测试可见,主的故障离线后,sentinel重新选了其一个从reids成为了新的主节点,在原来的主节点重新上线后,仍然不会恢复为主节点。

Reids集群部署

Redis集群其他部署方案
Twemproxy
Codis
云服务器上的集群服务
https://www.jianshu.com/p/53a9f98976a7
https://blog.csdn.net/sanpo/article/details/52839044

要保证集群的高可用,需要每个节点都有从节点,也就是备份节点,所以Redis集群至少需要6台服务器。
redis cluster工作原理:采用多主多从的架构,每个主的数据不一样(槽) 保证集群的高可用
Redis Cluster槽的范围是0 ~ 16383,服务器本身会占用一个槽
可根据master个数平均分给master,也可以自己指定
插入数据时进行某种算法去选择master,再进行插入
Redis数据库

实验环境

主机 IP 角色 端口
centos1 192.168.100.101 Master 6379
centos1 192.168.100.101 Slave 6380
centos2 192.168.100.102 Master 6381
centos2 192.168.100.102 Slave 6382
centos3 192.168.100.103 Master 6383
centos3 192.168.100.103 Slave 6384

修改/etc/hosts文件(所有主机)

[aaa@qq.com ~]# vim /etc/hosts #添加IP与主机名映射
192.168.100.1 centos1
192.168.100.2 centos2
192.168.100.3 centos3

100.101

安装redis
上传软件包
[aaa@qq.com~]# ls
redis-5.0.5.tar.gz
[aaa@qq.com~]# tar -zxvf redis-5.0.5.tar.gz
安装gcc
[aaa@qq.com~]# yum install -y gcc
编译安装
[aaa@qq.com~]# cd redis-5.0.5
[aaa@qq.com]# make
[aaa@qq.com]# cd src/
[aaa@qq.com]# make install PREFIX=/usr/local/redis
[aaa@qq.com]# cd …
添加path变量
[aaa@qq.com~]# ln -s /usr/local/redis/bin/* /usr/local/bin/
创建cluster工作目录
[aaa@qq.com ~]# mkdir -p /etc/redis/cluster/{6379,6380}
[aaa@qq.com ~]# mkdir /var/log/redis #aof文件位置
[aaa@qq.com ~]# mkdir -p /data/redis/data/{6379,6380} #rdb文件位置
生成配置文件
[aaa@qq.com ~]# cp /root/redis-5.0.5/redis.conf /etc/redis/cluster/6379/
[aaa@qq.com ~]# cp /root/redis-5.0.5/redis.conf /etc/redis/cluster/6380/
修改配置文件
[aaa@qq.com ~]# vim /etc/redis/cluster/6379/redis.conf
daemonize yes //redis后台运行
bind 192.168.100.101 //监听地址
pidfile /var/run/redis_6379.pid //pidfile文件对应端口
port 6379 //端口
dir “/data/redis/data/6379” //配置redis rdb数据保存位置
logfile “/var/log/redis/redis_6379.log” //修改log日志路径
cluster-enabled yes //开启集群 把注释#去掉
cluster-config-file nodes_6379.conf //集群的配置,配置文件首次启动自动生成
cluster-node-timeout 15000 //请求超时15s
appendonly yes //aof日志开启,有需要就开启,它会每次写操作都记录日志
[aaa@qq.com ~]# vim /etc/redis/cluster/6380/redis.conf
daemonize yes //redis后台运行
bind 192.168.100.101
pidfile “/var/run/redis_6380.pid”
port 6380
dir “/data/redis/data/6380”
logfile “/var/log/redis/redis_6380.log” //修改log日志路径
cluster-enabled yes //开启集群 把注释#去掉
cluster-config-file nodes_6380.conf //集群的配置,配置文件首次启动自动生成
cluster-node-timeout 15000 //请求超时15s
appendonly yes //aof日志开启,有需要就开启,它会每次写操作都记录日志
启动redis服务并查看端口
[aaa@qq.com ~]# redis-server /etc/redis/cluster/6379/redis.conf
[aaa@qq.com ~]# redis-server /etc/redis/cluster/6380/redis.conf
设置开机自启
[aaa@qq.com ~]# chmod +x /etc/rc.local
[aaa@qq.com ~]# echo “redis-server /etc/redis/cluster/6379/redis.conf” >> /etc/rc.local
[aaa@qq.com ~]# echo “redis-server /etc/redis/cluster/6380/redis.conf” >> /etc/rc.local
拷贝文件到centos1,centos2
[aaa@qq.com ~]# scp -r /etc/redis/ 192.168.100.102:/etc
[aaa@qq.com ~]# scp -r /etc/redis/ 192.168.100.103:/etc
[aaa@qq.com ~]# scp -r /usr/local/redis/ 192.168.100.102:/usr/local/
[aaa@qq.com ~]# scp -r /usr/local/redis/ 192.168.100.103:/usr/local/

100.102

添加path环境变量
[aaa@qq.com ~]# ln -s /usr/local/redis/bin/* /usr/local/bin/
创建工作目录
[aaa@qq.com ~]# mkdir /var/log/redis
[aaa@qq.com ~]# mkdir -p /data/redis/data/{6381,6382}
修改配置文件
[aaa@qq.com ~]# mv /etc/redis/cluster/6379 /etc/redis/cluster/6381
[aaa@qq.com ~]# mv /etc/redis/cluster/6380 /etc/redis/cluster/6382
[aaa@qq.comntos2 ~]# vim /etc/redis/cluster/6381/redis.conf #修改ip
daemonize yes //redis后台运行
bind 192.168.100.102 //监听地址
pidfile /var/run/redis_6381.pid //pidfile文件对应端口
port 6381 //端口
dir “/data/redis/data/6381” //配置redis rdb数据保存位置
logfile “/var/log/redis/redis_6381.log” //修改log日志路径
cluster-enabled yes //开启集群 把注释#去掉
cluster-config-file nodes_6381.conf //集群的配置,配置文件首次启动自动生成
cluster-node-timeout 15000 //请求超时15s
appendonly yes //aof日志开启,有需要就开启,它会每次写操作都记录日志
:%s/6379/6380/g
[aaa@qq.com ~]# vim /etc/redis/cluster/6382/redis.conf #修改ip
daemonize yes //redis后台运行
bind 192.168.100.102 //监听地址
pidfile /var/run/redis_6382.pid //pidfile文件对应端口
port 6382 //端口
dir “/data/redis/data/6382” //配置redis rdb数据保存位置
logfile “/var/log/redis/redis_6382.log” //修改log日志路径
cluster-enabled yes //开启集群 把注释#去掉
cluster-config-file nodes_6382.conf //集群的配置,配置文件首次启动自动生成
cluster-node-timeout 15000 //请求超时15s
appendonly yes //aof日志开启,有需要就开启,它会每次写操作都记录日志
:%s/6380/6382/g
启动redis服务并查看端口
[aaa@qq.com ~]# redis-server /etc/redis/cluster/6381/redis.conf
[aaa@qq.com ~]# redis-server /etc/redis/cluster/6382/redis.conf
添加开机自启
[aaa@qq.com ~]# chmod +x /etc/rc.local
[aaa@qq.com ~]# echo “redis-server /etc/redis/cluster/6381/redis.conf” >> /etc/rc.local
[aaa@qq.com ~]# echo “redis-server /etc/redis/cluster/6382/redis.conf” >> /etc/rc.local

100.103

添加path环境变量
[aaa@qq.com ~]# ln -s /usr/local/redis/bin/* /usr/local/bin/
创建工作目录
[aaa@qq.com ~]# mkdir /var/log/redis
[aaa@qq.com ~]# mkdir -p /data/redis/data/{6383,6384}
修改配置文件
[aaa@qq.com ~]# mv /etc/redis/cluster/6379 /etc/redis/cluster/6383
[aaa@qq.com ~]# mv /etc/redis/cluster/6380 /etc/redis/cluster/6384
[aaa@qq.com ~]# vim /etc/redis/cluster/6383/redis.conf #修改端口和IP
daemonize yes //redis后台运行
bind 192.168.1.13 //监听地址
pidfile /var/run/redis_6383.pid //pidfile文件对应端口
port 6383 //端口
dir “/data/redis/data/6383” //配置redis rdb数据保存位置
logfile “/var/log/redis/redis_6383.log” //修改log日志路径
cluster-enabled yes //开启集群 把注释#去掉
cluster-config-file nodes_6383.conf //集群的配置,配置文件首次启动自动生成
cluster-node-timeout 15000 //请求超时15s
appendonly yes //aof日志开启,有需要就开启,它会每次写操作都记录日志
:%s/6379/6383/g
[aaa@qq.com ~]# vim /etc/redis/cluster/6384/redis.conf #修改端口和IP
daemonize yes //redis后台运行
bind 192.168.1.13 //监听地址
pidfile /var/run/redis_6384.pid //pidfile文件对应端口
port 6384 //端口
dir “/data/redis/data/6384” //配置redis rdb数据保存位置
logfile “/var/log/redis/redis_6384.log” //修改log日志路径
cluster-enabled yes //开启集群 把注释#去掉
cluster-config-file nodes_6384.conf //集群的配置,配置文件首次启动自动生成
cluster-node-timeout 15000 //请求超时15s
appendonly yes //aof日志开启,有需要就开启,它会每次写操作都记录日志
:%s/6380/6384/g
启动redis服务并查看端口
[aaa@qq.com ~]# redis-server /etc/redis/cluster/6383/redis.conf
[aaa@qq.com ~]# redis-server /etc/redis/cluster/6384/redis.conf
添加开机自启
[aaa@qq.com ~]# chmod +x /etc/rc.local
[aaa@qq.com cluster]# echo “redis-server /etc/redis/cluster/6383/redis.conf” >> /etc/rc.local
[aaa@qq.com cluster]# echo “redis-server /etc/redis/cluster/6384/redis.conf” >> /etc/rc.local

创建cluster集群

随便哪台服务器添加集群
[aaa@qq.com 6379]# redis-cli --cluster create 192.168.100.101:6379 192.168.100.102:6381 192.168.100.103:6383 192.168.100.101:6380 192.168.100.102:6382 192.168.100.103:6384 --cluster-replicas 1 #代表主从节点比例
可以看到3主3从,以及每个master分配的信息,最后,输入yes,开始创建集群。
Redis数据库
Redis数据库
Ok表示成功!
集群测试
[aaa@qq.com ~]# redis-cli -h 192.168.100.101 -p 6379 -c #-c表示集群模式,不加-c是进到写的ip服务器当中
192.168.1.10:6379> set hehe haha
OK
192.168.1.10:6379> get hehe
“haha”
去其他主机上查看和创建。
192.168.1.20:6381> get hehe
-> Redirected to slot [4618] located at 192.168.1.10:6379 #会提示数据在192.168.100.102:6379上,并且自动给转换到192.168.1.10:6379主机上。
“haha”
退出后在其他主机上插入一个数据
192.168.1.30:6383> set yingxiong lianmeng
-> Redirected to slot [7501] located at 192.168.1.20:6381 #提示该数据存放到了192.168.1.20:6381这台主机上并且自动转换至该主机
OK
随便停掉哪几个主,停掉后,从会顶替主。把原来的主开启服务之后,就变成了从
查看主从状态:info replication
停掉主6379端口,到192.168.100.102的6382查看状态,主变成了6382
Redis数据库
打开6379端口,到192.168.100.102的6382查看状态,原来的主变成从了
Redis数据库

分开做集群,主从不在同一台!

(每台主机操作步骤一样,除了添加集群,添加群集随便在哪台主机都可以)
输入yes,显示ok,表示集群搭建成功
Redis数据库
Redis数据库
查看端口,有cluster
Redis数据库

集群其他命令

[aaa@qq.com ~]# redis-cli --cluster help
Redis数据库
add-node方法可以添加节点,还可以指定是主节点还是从节点。del-node是删除指定节点。还有其它的fix修复命令,reshard重新分配slot等等。