1、在配置文件redisconf中把绑定的Ip注释掉
2、在配置文件redisconf中把protected-mode 改为 no
3、在配置文件redisconf中把requirepass 设置redis访问授权密码(自己随意设置就好),也可以登录redis客户端使用命令设置:如下:
/redis-cli
config set requirepass 123 //123是密码
经过以上三步基本就可以了,不过也有特殊情况,访问的端口号6379有可能会被防火墙拦截,需要关闭系统的防火墙或取消对6379端口的拦截,这里不在细述。
接下来就可以创建项目实现 *** 作redis数据库了。在这里我用的开发工具是eclipse,在eclipse中创建一个java Project项目如下图所示:
项目创建完成后,在src同级目录下创建lib文件夹,导入 *** 作数据库所需jar包(晚上自行下载),jedis用来 *** 作数据库,commons-pool用来实现数据库连接池。
启动redis服务器:
创建RedisDemoSimplejava代码如下:
import redisclientsjedisJedis;public class RedisDemoSimple { public static void main(String[] args) { //ip地址为虚拟机Ip 端口为redis端口
Jedis jedis = new Jedis("192168228129", 6379); //redis访问权限 为redis配置文件中redisconf中配置的requirepass
jedisauth("myredis");
jedisset("redis_first", "hello");
Systemoutprintln("key redis_first:"+jedisget("redis_first"));
}
}
控制台打印如下:
启动redis客户端查询插入数据库的值:
到此就连接成功了。
Redis的复制功能是完全建立在之前我们讨论过的基于内存快照的持久化策略基础上的,也就是说无论你的持久化策略选择的是什么,只要用到了Redis的复制功能,就一定会有内存快照发生,那么首先要注意你的系统内存容量规划,原因可以参考我上一篇文章中提到的Redis磁盘IO问题。
Redis复制流程在Slave和Master端各自是一套状态机流转,涉及的状态信息是:
Slave 端:
REDIS_REPL_NONEREDIS_REPL_CONNECTREDIS_REPL_CONNECTED
Master端:
REDIS_REPL_WAIT_BGSAVE_STARTREDIS_REPL_WAIT_BGSAVE_ENDREDIS_REPL_SEND_BULKREDIS_REPL_ONLINE
整个状态机流程过程如下:
Slave端在配置文件中添加了slave of指令,于是Slave启动时读取配置文件,初始状态为REDIS_REPL_CONNECT。
Slave端在定时任务serverCron(Redis内部的定时器触发事件)中连接Master,发送sync命令,然后阻塞等待master发送回其内存快照文件(最新版的Redis已经不需要让Slave阻塞)。
Master端收到sync命令简单判断是否有正在进行的内存快照子进程,没有则立即开始内存快照,有则等待其结束,当快照完成后会将该文件发送给Slave端。
Slave端接收Master发来的内存快照文件,保存到本地,待接收完成后,清空内存表,重新读取Master发来的内存快照文件,重建整个内存表数据结构,并最终状态置位为 REDIS_REPL_CONNECTED状态,Slave状态机流转完成。
Master端在发送快照文件过程中,接收的任何会改变数据集的命令都会暂时先保存在Slave网络连接的发送缓存队列里(list数据结构),待快照完成后,依次发给Slave,之后收到的命令相同处理,并将状态置位为 REDIS_REPL_ONLINE。
整个复制过程完成,流程如下图所示:
Redis复制机制的缺陷
从上面的流程可以看出,Slave从库在连接Master主库时,Master会进行内存快照,然后把整个快照文件发给Slave,也就是没有象MySQL那样有复制位置的概念,即无增量复制,这会给整个集群搭建带来非常多的问题。
比如一台线上正在运行的Master主库配置了一台从库进行简单读写分离,这时Slave由于网络或者其它原因与Master断开了连接,那么当Slave进行重新连接时,需要重新获取整个Master的内存快照,Slave所有数据跟着全部清除,然后重新建立整个内存表,一方面Slave恢复的时间会非常慢,另一方面也会给主库带来压力。
所以基于上述原因,如果你的Redis集群需要主从复制,那么最好事先配置好所有的从库,避免中途再去增加从库。
Cache还是Storage
在我们分析过了Redis的复制与持久化功能后,我们不难得出一个结论,实际上Redis目前发布的版本还都是一个单机版的思路,主要的问题集中在,持久化方式不够成熟,复制机制存在比较大的缺陷,这时我们又开始重新思考Redis的定位:Cache还是Storage?
如果作为Cache的话,似乎除了有些非常特殊的业务场景,必须要使用Redis的某种数据结构之外,我们使用Memcached可能更合适,毕竟Memcached无论客户端包和服务器本身更久经考验。
如果是作为存储Storage的话,我们面临的最大的问题是无论是持久化还是复制都没有办法解决Redis单点问题,即一台Redis挂掉了,没有太好的办法能够快速的恢复,通常几十G的持久化数据,Redis重启加载需要几个小时的时间,而复制又有缺陷,如何解决呢?
Redis可扩展集群搭建1 主动复制避开Redis复制缺陷。
既然Redis的复制功能有缺陷,那么我们不妨放弃Redis本身提供的复制功能,我们可以采用主动复制的方式来搭建我们的集群环境。
所谓主动复制是指由业务端或者通过代理中间件对Redis存储的数据进行双写或多写,通过数据的多份存储来达到与复制相同的目的,主动复制不仅限于用在Redis集群上,目前很多公司采用主动复制的技术来解决MySQL主从之间复制的延迟问题,比如Twitter还专门开发了用于复制和分区的中间件gizzard(>1、安装编译工具
2、安装tcl组件包(安装Redis需要tcl支持)
3、安装Redis
4、设置redis开机启动
5、设置redis配置文件参数
6、测试redis数据库
7、通过php程序连接redis数据库 #php必须先安装Redis扩展
至此,Linux下Redis服务器安装配置完成。Redis-Sentinel是redis官方推荐的高可用性解决方案,
当用redis作master-slave的高可用时,如果master本身宕机,redis本身或者客户端都没有实现主从切换的功能。
而redis-sentinel就是一个独立运行的进程,用于监控多个master-slave集群,
自动发现master宕机,进行自动切换slave > master
每个Sentinel以每秒钟一次的频率向它所知的Master,Slave以及其他 Sentinel 实例发送一个 PING 命令
如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被 Sentinel 标记为主观下线。
如果一个Master被标记为主观下线,则正在监视这个Master的所有 Sentinel 要以每秒一次的频率确认Master的确进入了主观下线状态。
当有足够数量的 Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态, 则Master会被标记为客观下线
在一般情况下, 每个 Sentinel 会以每 10 秒一次的频率向它已知的所有Master,Slave发送 INFO 命令
当Master被 Sentinel 标记为客观下线时,Sentinel 向下线的 Master 的所有 Slave 发送 INFO 命令的频率会从 10 秒一次改为每秒一次
若没有足够数量的 Sentinel 同意 Master 已经下线, Master 的客观下线状态就会被移除。
若 Master 重新向 Sentinel 的 PING 命令返回有效回复, Master 的主观下线状态就会被移除。
主观下线和客观下线
主观下线:Subjectively Down,简称 SDOWN,指的是当前 Sentinel 实例对某个redis服务器做出的下线判断。
客观下线:Objectively Down, 简称 ODOWN,指的是多个 Sentinel 实例在对Master Server做出 SDOWN 判断,并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后,得出的Master Server下线判断,然后开启failover
SDOWN适合于Master和Slave,只要一个 Sentinel 发现Master进入了ODOWN, 这个 Sentinel 就可能会被其他 Sentinel 推选出, 并对下线的主服务器执行自动故障迁移 *** 作。
ODOWN只适用于Master,对于Slave的 Redis 实例,Sentinel 在将它们判断为下线前不需要进行协商, 所以Slave的 Sentinel 永远不会达到ODOWN。
Redis主从复制可将主节点数据同步给从节点,从节点此时有两个作用:
但是问题是:
那么这个问题,redis-sentinel就可以解决了
Redis的一个进程,但是不存储数据,只是监控redis
本实验是在测试环境下,因此只准备一台linux服务器用作环境!!
服务器环境,一台即可完成 *** 作
所有配置文件如下
总体redis配置文件如下,6379为master,6380和6381为slave
redis-6380conf slave配置文件详解,6381端口的配置文件,仅仅和6380端口不一样
在主节点上查看主从通信关系
在从节点上查看主从关系(6380、6379)
此时可以在master上写入数据,在slave上查看数据,此时主从复制配置完成
redis-sentinel-26379conf配置文件写入如下信息
redis-sentinel-26380conf和redis-sentinel-26381conf的配置仅仅差异是port(端口)的不同。
然后启动三个sentinel哨兵
此时查看哨兵是否成功通信
实例的思路
首先查看三个Redis的进程状态
第一个
第二个
第三个
直接干掉master,然后等待其他两个节点是否能自动被哨兵sentienl,切换为master节点
此时查看两个slave的状态
然后会发现slave节点成为master节点!!
0Redis主从架构的问题
1哨兵服务介绍
2架构图
3主从服务搭建
4配置哨兵服务
5启动哨兵服务
6验证哨兵服务
对于Redis的主从架构而言,无法实现 master 和 slave 角色的自动切换, 即当 master 出现 redis 服务异常、主机断电、磁盘损坏等问题导致 master 无法使用,而 redis 高可用无法实现自故障转移(将 slave 提升为 master),需要手动改环境配置才能切换到 slave redis 服务器。另外无法横向扩展 Redis 服务的并行写入性能, 当单台 Redis 服务器性能无法满足业务写入需求的时候就必须需要一种方式解决此问题。
1master和slave角色的无缝切换,让业务无感知从而不影响业务使用
2可以横向动态扩展Redis服务器, 从而实现多台服务器并行写入以实现更高并发的目的。
Sentinel进程是用于监控redis集群中Master主服务器工作的状态,在Master主服务器发生故障的时候,可以实现Master和Slave服务器的切换,保证系统的高可用,其已经被集成在 redis26+的版本中,Redis的哨兵模式到了28版本之后就稳定了下来。一般在生产环境也建议使用Redis28以后版本。哨兵(Sentinel)是一个分布式系统,你可以在一个架构中运行多个哨兵(sentinel) 进程,这些进程使用流言协议(gossipprotocols)来接收关于Master主服务器是否下线的信息,并使用投票协议(Agreement Protocols)来决定是否执行自动故障迁移,以及选择哪个 Slave 作为新的 Master。每个哨兵(Sentinel)进程会向其它哨兵(Sentinel)、Master、Slave定时发送消息,以确认对方是否”活”着,如果发现对方在指定配置时间(可配置的)内未得到回应,则暂时认为对方已掉线,也就是所谓的”主观认为宕机” ,英文名称:Subjective Down,简称SDOWN。有主观宕机,肯定就有客观宕机。当“哨兵群”中的多数 Sentinel 进程在对 Master 主服务器做出 SDOWN 的判断,并且通过SENTINEL is-master-down-by-addr 命令互相交流之后,得出的Master Server下线判断,这种方式就是“客观宕机”,英文名称是: Objectively Down, 简称 ODOWN。通过一定的 vote 算法,从剩下的 slave 从服务器节点中,选一台提升为 Master 服务器节点,然后自动修改相关配置,并开启故障转移(failover)。Sentinel 机制可以解决 master 和 slave 角色的切换问题。
安装
修改配置文件
启动服务
192168177139
192168177140
其他地方配置和主服务器一致
启动服务
查看主从状态
MASTER
SLAVE1
SLAVE2
MASTER
SLAVE1
SLAVE2
主服务器
SLAVE1:升级为主服务器
SLAVE2:主服务器变为node10
主服务器
从服务器
Redis服务器是一种非关系型数据存储服务器,它经常和Linux系统搭配使用。那么如何在Linux系统中安装Redis服务器呢?下面我给大家分享一下。
工具/材料Linux命令行
01首先我们运用tar命令解压redis安装包,如下图所示,这里在使用tar命令的时候运用的是zxvf参数
02接下来进入解压后的文件夹我们执行make命令,对redis进行编译,如下图所示
03编译完了以后我们通过cd命令进入src目录,然后执行make install进行安装,如下图所示
04安装完了以后我们需要创建两个文件夹,如下图所示,etc用来放置配置文件,bin用来放置执行文件
05接下来我们通过cp命令将redisconf配置文件复制到etc目录下面,如下图所示
06然后将src目录下的命令复制到bin目录下面,这里我只复制了几个比较常用的,如下图所示
07接下来我们就可以执行redis-server命令来运行redis服务器了,注意后面加了配置文件路径,如下图所示
08最后当我们看到如下图所示的界面则代表redis安装启动成功,后面我们就可以用它进行数据存储了
Redis 是一个高性能的key-value数据库, 使用内存作为主存储,数据访问速度非常快,当然它也提供了两种机制支持数据持久化存储比较遗憾的是,Redis项目不直接支持Windows,Windows版项目是由微软开放技术团队建立和维护一个实验性项目(支持32,64位),所以并不适用生产环境,但可在Windows环境下用于开发测试。
1下载安装
猛戳这里就到了开源首页,下载源码包,解压ZIP包后进入msvsbinrelease文件夹有三个文件分别对应32,64位,windows服务三个版本,在这里我们选择64位为例,解压redisbin64zip 到D:redis24,这里主要用到redis-serverexe和redis-cliexe, redis-server用于运行Redis服务器,redis-cli是命令行客户端,通过它连接Redis服务器,并使用Redis命令进行各种 *** 作。
2服务启动配置
复制源码包根目录下redisconf到D:redis24,打开CMD命令提示符,输入以下命令启动redis服务。
启动:
redis-server redisconf
这样redis服务就启动成功了。
配置:
更改redis的配置需要修改redisconf文件,以下是它一些主要的配置注释:
#是否作为守护进程运行 daemonize no #Redis 默认监听端口 port 6379 #客户端闲置多少秒后,断开连接 timeout 300 #日志显示级别 loglevel verbose #指定日志输出的文件名,也可指定到标准输出端口 logfile redislog #设置数据库的数量,默认最大是16,默认连接的数据库是0,可以通过select N 来连接不同的数据库 databases 32 #Dump持久化策略 #当有一条Keys 数据被改变是,900 秒刷新到disk 一次 #save 900 1 #当有10 条Keys 数据被改变时,300 秒刷新到disk 一次 save 300 100 #当有1w 条keys 数据被改变时,60 秒刷新到disk 一次 save 6000 10000 #当dump rdb 数据库的时候是否压缩数据对象 rdbcompression yes #dump 持久化数据保存的文件名 dbfilename dumprdb ########### Replication ##################### #Redis的主从配置,配置slaveof则实例作为从服务器 #slaveof 1921680105 6379 #主服务器连接密码 # masterauth <master-password> ############## 安全性 ########### #设置连接密码 #requirepass <password> ############### LIMITS ############## #最大客户端连接数 # maxclients 128 #最大内存使用率 # maxmemory <bytes> ########## APPEND ONLY MODE ######### #是否开启日志功能 appendonly no # AOF持久化策略 #appendfsync always #appendfsync everysec #appendfsync no ################ VIRTUAL MEMORY ########### #是否开启VM 功能 #vm-enabled no # vm-enabled yes #vm-swap-file logs/redisswap #vm-max-memory 0 #vm-page-size 32 #vm-pages 134217728 #vm-max-threads 4
主从复制
在从服务器配置文件中配置slaveof ,填写服务器IP及端口即可,如果主服务器设置了连接密码,在masterauth后指定密码就行了。
持久化
redis提供了两种持久化文案,Dump持久化和AOF日志文件持久化。 Dump持久化是把内存中的数据完整写入到数据文件,由配置策略触发写入,如果在数据更改后又未达到触发条件而发生故障会造成部分数据丢失。 AOF持久化是日志存储的,是增量的形式,记录每一个数据 *** 作动作,数据恢复时就根据这些日志来生成。
3命令行 *** 作
使用CMD命令提示符,打开redis-cli连接redis服务器 ,也可以使用telnet客户端
# redis-cli -h 服务器 –p 端口 –a 密码
redis-cliexe -h 127001 -p 6379
连接成功后,就可对redis数据增删改查了,如字符串 *** 作:
以下是一些服务器管理常用命令:
info #查看服务器信息 select <dbsize> #选择数据库索引 select 1 flushall #清空全部数据 flushdb #清空当前索引的数据库 slaveof <服务器> <端口> #设置为从服务器 slaveof no one #设置为主服务器 shutdown #关闭服务
在 Linux 系统中,可以通过在 redis-cli 命令后指定 -h 参数来指定 Redis 服务器的主机名或 IP 地址。具体而言,可以使用以下命令连接 Redis 服务器:redis-cli -h <host> -p <port>
其中,<host> 是 Redis 服务器的主机名或 IP 地址,<port> 是 Redis 服务器的端口号。例如,如果 Redis 服务器运行在主机名为 redisexamplecom 的服务器上,端口号为 6379,则可以使用以下命令连接到 Redis 服务器:
redis-cli -h redisexamplecom -p 6379
如果 Redis 服务器运行在本地主机上,则可以省略 -h 参数,使用以下命令连接到 Redis 服务器:
redis-cli -p 6379
在上面的命令中,redis-cli 是 Redis 命令行客户端程序的名称,-p 参数指定 Redis 服务器的端口号。连接成功后,就可以在命令行中输入 Redis 命令,与 Redis 服务器进行交互了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)