redis的主从复制和高可用集群
一、redis的简介
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都 支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排 序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文 件,并且在此基础上实现了master-slave(主从)同步。
Redis 是一个高性能的key-value数据库。
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布 记录。同步对读取操作的可扩展性和数据冗余很有帮助。
二、redis的安装和部署
系统: redhat 6.5
server1 redis
server2 redis
(一)redis的安装
1、在server1、2上安装redis服务
---> tar zxf redis-4.0.8.tar.gz # 解包
---> cd redis-4.0.9
---> yum install -y gcc # 先安装gcc依赖包
---> make # 此时会出现如下错误
解决方法: 使用命令: make MALLOC=lib
---> make install # 安装 (当在src中执行make test后结果如下。不执行也可以)
---> cd /root/redis-4.0.9/utils
---> ./install_server.sh # 执行redis的安装脚本。有配置,直接回车即可。
# 注意,一定要再utils目录下,否则会提示找不到。
2、检测redis是否安装成功
---> redis-cli
---> info
3、修改master的redis服务的监听端口
---> vim /etc/redis/6379.conf # 注释6379监听的ip
---> /etc/init.d/redis_6379 restart
---> netstat -antlp
注释:在server2和3中只需要安装好redis,并测试即可。
(二)redis实现主从复制
1、在server1中对redis配置文件设置、redis命令行设置键值对
---> vim /etc/redis/6379.conf # 关闭保护模式(注释6379监听的ip,之前做过,在此就不需要注释了)
---> redis-server /etc/redis/6379.conf # 重启服务
---> redis-cli # 设置key-value
---> set name xniu
2、在server2中编辑配置文件
---> vim /etc/redis/6379.conf # 设置自己的master的ip和端口号(和之前的注释端口号)
---> /etc/inti.d/redis_6379 restart
# 然后在redis中查看在server1中设置的变量
---> redis-cli
---> get name
# 此时,我们完成了redis的主从复制。
三、redis集群部署实现高可用
此时,我们使用server1、2、3构成集群。server3的redis安装配置和server2相同。
高可用原理:当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器自动更改自己的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。(redis具有监控、提醒、故障转移功能)
server1 master (前提环境是一主两从)
server2、3 slave
1、在server1中修改sentinel.conf配置文件
---> cd /root/redis-4.0.8
---> cp sentinel.conf /etc/redis # 首先复制到/etc/redis目录下
---> vim /etc/redis/sentinel.conf
# 关闭保护模式
# 配置指示 Sentinel 去监视一个名为 mymaster 的主服务器,这个主服务器的IP为172.25.2.1,端口为6379,而将这个主服务器判断为失效至少需要2个Sentinel同意(只要同意 Sentinel 的数量不达标,自动故障迁移就不会执行)
# down-after-milliseconds 表示 Sentinel 认为服务器已经断线所需的毫秒数。在指定时间内没有返回响应,则视为下线。
---> scp /etc/redis/sentinel.conf server2:/etc/redis # 把修改好的文件复制到server2、server3中
---> scp /etc/redis/sentinel.conf server3:/etc/redis
2) 三台服务器启动sentinel服务。(以server1为例。在server2和3中监控到信息和1相同)
---> redis-sentinel /etc/redis/sentinel.conf # 可以监控到master和slave。
3)在master端使用info查看,也会有master、slave的信息
---> redis-cli
---> info
4)当我们把master中的redis宕掉之后,此时监控中,我们可以看到master切换到其它server3主机上, 而此时server2中配置文件的slaveof的值也变为server3了。
server1:
server3:(监控情况如下)
server2: slaveof的值变为172.25.2.3
四、redis集群化工具的使用
在server1中执行
1、将集群化工具的运行脚本放在第三方软件目录中
---> cd /root/redis-4.0.2/src
---> cp redis-trib.rb /usr/local/bin
---> cd /usr/local/bin
2、执行redis-trib.rb的时候,会出现依赖错误
---> yum install -y ruby
---> yum install -y rubygems-1.3.7-5.el6.noarch.rpm libyaml-0.1.3-4.el6_6.x86_64 ruby-2.2.3-1.el6.x86_64.rpm
---> gem install --local redis-4.0.1.gem
3、查看集群化工具是否安装成功
---> gem list --local # 此时可以看到redis
4)创建集群,并查看集群中的主从关系
---> cd /usr/local
---> mkdir cluster
---> mkdir cluster/700{1..6}
---> vim cluster/7001/redis.conf # 在每个集群节点中添加配置文件
---> redis-server redis.conf # redis.conf是节点的配置文件
# 查看日志,查看节点的信息
---> netstat -antlp # 查看端口是否打开
5)创建集群
---> redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
# 此时有三个master,三个slave
6)在集群中写入值,并查看
---> redis-cli -c -p 7001
---> set name xnih
---> get name
# 此时我们可以查询其他节点的name值
7)宕掉7001的master,然后进入集群查看(此时,依然可以查看到信息。因为宕掉7001,还有它对应的slave在提供数据) 。当把对应的slave都宕掉的话,此时就不能查询到信息。启动slave或master,数据又可以恢复。