配置Redis主从复制和集群配置详解
1. 配置redis主从复制。
1.1. 应用场景
一般来说,要将Redis运用于工程项目中,只使用一台Redis是万万不能的,原因如下:
a) 从结构上,单个Redis服务器会发生单点故障,并且一台服务器需要处理所有的请求负载,压力较大;
b) 从容量上,单个Redis服务器内存容量有限,就算一台Redis服务器内存容量为256G,也不能将所有内存用作Redis存储内存,一般来说,单台Redis最大使用内存不应该超过20G。
1.2. 基本原理
电商网站上的商品,一般都是一次上传,无数次浏览的,说专业点也就是"多读少写"。
对于这种场景,我们可以使如下这种架构:
1.3. 详细配置
1) 规划主备网络信息,主机192.168.153.164 备机192.168.153.165.保证两台机器互联。
画图说明
2) 安装redis,并配置,可以参考前天的redis安装步骤。
a) 修改yum源,增加redis的yum配置
b) yum install epel-release -y yum install redis -y
c) 修改配置文件/etc/redis.conf
3) 修改备机配置在备机192.168.153. 165的redis.conf中加下面配置
4) slaveof 192.168.153. 164 6379
5) 测试效果
a) 在主机上设值chenjian=666
b) 在备机上取值get chenjian,正常显示
c) 注意点:要保证主机先启动。
1.4. redis主从复制的特点。
通过主从复制可以允许多个slave server拥有和master server相同的数据库副本。下面是关于redis主从复制的一些特点
a) master可以有多个slave
b) 除了多个slave连到相同的master外,slave也可以连接其他slave形成图状结构
c) 主从复制不会阻塞master。也就是说当一个或多个slave与master进行初次同步数据时,master可以继续处理client发来的请求。相反slave在初次同步数据时则会阻塞不能处理client的请求。
d) 主从复制可以用来提高系统的可伸缩性,我们可以用多个slave 专门用于client的读请求,比如sort操作可以使用slave来处理。也可以用来做简单的数据冗余
e) 可以在master禁用数据持久化,只需要注释掉master 配置文件中的所有save配置,然后只在slave上配置数据持久化。
2. 配置redis集群
2.1. 应用场景
当主备复制场景,无法满足主机的单点故障时,需要引入集群配置。
2.2. 基本原理
哨兵选举机制,如果有半数节点发现某个异常节点,共同决定改异常节点的状态,如果该节点是主节点,对应的备节点自动顶替为主节点。Sentinel(哨兵)是Redis 的高可用性解决方案:由一个或多个Sentinel 实例 组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器。
2.3. 详细配置
1) 步骤一,规划网络。
用一台虚拟机模拟6个节点,一台机器6个节点,创建出3 master、3 salve 环境。虚拟机是 CentOS6.9 ,ip地址192.168.153.164
2) 步骤二,下载redis的源码包
wget http://download.redis.io/releases/redis-3.2.11.tar.gz将包中的 redis-trib.rb 复制到 /usr/local/bin 目录下
3) 步骤三, 创建 Redis 节点
首先在 192.168.153.164 机器上 /usr/local 目录下创建 redis_cluster 目录;
mkdir redis_cluster
在 redis_cluster 目录下,创建名为7001、7002,7003、7004、7005,7006的目录,
mkdir 7001 7002 7003 7004 7005 7006
并将 redis.conf 拷贝到这三个目录中,拷贝之前,先修改redis.conf
redis.conf文件按照下面8项修改内容,然后分别拷贝到6个不同的目录7001,7002,7003,7004,7005,7006中。
port 7000 //端口7000,7002,7003
bind 本机ip //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群
daemonize yes //redis后台运行
pidfile /var/run/redis_7000.pid //pidfile文件对应7000,7001,7002
cluster-enabled yes //开启集群 把注释#去掉
cluster-config-file nodes_7000.conf //集群的配置 配置文件首次启动自动生成 7000,7001,7002
cluster-node-timeout 15000 //请求超时 默认15秒,可自行设置
appendonly yes //aof日志开启 有需要就开启,它会每次写操作都记录一条日志
4) 步骤四,启动各个节点
redis-server /usr/local/redis_cluster/7001/redis.conf
redis-server /usr/local/redis_cluster/7002/redis.conf
redis-server /usr/local/redis_cluster/7003/redis.conf
redis-server /usr/local/redis_cluster/7004/redis.conf
redis-server /usr/local/redis_cluster/7005/redis.conf
redis-server /usr/local/redis_cluster/7006/redis.conf
检查节点启动状态
5) 步骤五,创建集群
创建集群的命令:
/usr/local/bin/redis-trib.rb create --replicas 1 192.168.153.164:7001 192.168.153.164:7002 192.168.153.164:7003 192.168.153.164:7004 192.168.153.164:7005 192.168.153.164:7006
此错误是操作系统没有安装ruby
解决方法:安装ruby
yum -y install ruby ruby-devel rubygems rpm-build
gem install redis 报错
##升级ruby
gpg2 --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3
curl -L get.rvm.io | bash -s stable
source /usr/local/rvm/scripts/rvm
rvm list known
rvm install 2.3.3
rvm use 2.3.3
rvm use 2.3.3 --default
ruby --version
再次执行,成功!
gem install redis
6) 验证集群
redis-cli -c -h 192.168.153.164 -p 7001 其中-c表示以集群方式连接redis,-h指定ip地址,-p指定端口号
保存数据,chenjian保存到12007的槽位,12007所在的节点是7003端口对应的节点。
在其他节点,例如7006上获取chenjian。
验证主节点异常时,备节点自动顶替主节点
杀死7002对应的进程,即让主节点7002异常,检查7005是否顶替成为主节点。
2.4. 集群的特点(1)所有的redis 节点彼此互联(PING-PONG 机制),内部使用二进制协议优化传输速度和带宽; (2)节点的fail 是通过集群中超过半数的节点检测失效时才生效; (3)客户端与redis 节点直连,不需要中间proxy 层。客户端不需要连接集群所有节点,连接集群中任何一 个可用节点即可; (4)redis-cluster把所有的物理节点映射到[0-16383]个slot(哈希槽)上,cluster 负责维护 node<->slot<->value 。
2.5. 集群选举容错
(1):什么时候整个集群不可用(cluster_state:fail)? A:如果集群任意master 挂掉,且当前master 没有slave。集群进入fail 状态,也可以理解成集群的 slot 映射[0-16383]不完整时进入fail 状态。 ps : redis-3.0.0.rc1 加入 cluster-require-full- coverage 参数,默认关闭,打开集群兼容部分失败; B:如果集群超过半数以上master 挂掉,无论是否有slave集群进入fail 状态。ps:当集群不可用时, 所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。