- 介绍
Redis Sentinel 是一个分布式系统, 你可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip protocols)来接收关于主服务器是否下线的信息, 并使用投票协议(agreement protocols)来决定是否执行自动故障迁移, 以及选择哪个从服务器作为新的主服务器。
虽然 Redis Sentinel 释出为一个单独的可执行文件 redis-sentinel , 但实际上它只是一个运行在特殊模式下的 Redis 服务器, 你可以在启动一个普通 Redis 服务器时通过给定 –sentinel 选项来启动 Redis Sentinel 。
Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务:
● 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
● 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
● 自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。
实验环境:redis版本:3.2.8,centos6.6
主:6379 ,sentinel:26379
从:6380 ,sentinel:26380
- 目前我在项目中使用的就是该模式,从节点生产中配置了两个
redis主从配置,配置master 只能为写,slave只能为读,在客户端对poolconnect请求时候,,会将读请求转到slave上面,写请求转到master上面,同时,master和slave有同步功能,这就实现了(数据层)读写分离对上层(逻辑层)透明的正常逻辑。无需再通过中间件或者代码进行读写分析实现
结构图:
安装tcl
192.169.1.232 zys-zk01
192.169.1.232 zys-zk02
下载:wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz
#tar -xzvf tcl8.6.1-src.tar.gz
#cd /usr/local/tcl8.6.1/unix/
[root@zys-zk02 unix]#./configure
[root@zys-zk02 unix]# make && make install
- 安装redis
[root@zys-zk01 local]# tar -zxvf redis-3.2.8.tar.gz
[root@zys-zk01 local]#cd redis-3.2.8
[root@zys-zk01 redis-3.2.8]#make && make test && make install
安装好后redis-server -v 可以查看版本
[root@zys-zk01 redis-3.2.8]# redis-server -v
Redis server v=3.2.8 sha=00000000:0 malloc=jemalloc-4.0.3 bits=64 build=615a16d541dda76b
注意:
实际操作中出现的错误
error1:Connect a slave to the master instance (commmands replication) in tests/unit/scripting.tcl
解决到:redis-3.2.8 src目录下执行 make distclean
之后再make test & make install
- 生产环境启动方案
要把redis作为一个系统的daemon进程去运行的,每次系统启动,redis进程一起启动
(1)redis utils目录下,有个redis_init_script脚本
(2)将redis_init_script脚本拷贝到linux的/etc/init.d目录中,将redis_init_script重命名为redis_6379,6379是我们希望这个redis实例监听的端口号
(3)修改redis_6379脚本的第6行的REDISPORT,设置为相同的端口号(默认就是6379)
(4)创建两个目录:/etc/redis(存放redis的配置文件),/var/redis/6379(存放redis的持久化文件)
(5)修改redis配置文件(默认在根目录下,redis.conf),拷贝到/etc/redis目录中,修改名称为6379.conf
(6)修改redis.conf中的部分配置为生产环境
daemonize yes 让redis以daemon进程运行
pidfile /var/run/redis_6379.pid 设置redis的pid文件位置
port 6379 设置redis的监听端口号
dir /var/redis/6379 设置持久化文件的存储位置
(7)启动redis,执行cd /etc/init.d, chmod 777 redis_6379,./redis_6379 start
(8)确认redis进程是否启动,ps -ef | grep redis
(9)让redis跟随系统启动自动启动
在redis_6379脚本中,最上面,加入两行注释
# chkconfig: 2345 90 10
# description: Redis is a persistent key-value database
chkconfig redis_6379 on
上面这些操作是在zys-zk01 这台机器上操作的,在zys-zk02上操作类似,将6379端口或目录换成6380,当然这是两台机器也可以不换端口都用6379,重新启动下机器验证下是否跟操作系统一起启动
zys-zk01:
[root@zys-zk01 ~]# ps -ef|grep redis
root 1753 1 0 09:52 ? 00:00:22 /usr/local/bin/redis-server *:6379
root 2704 1864 0 16:02 pts/0 00:00:00 grep redis
zys-zk02:
[root@zys-zk02 ~]# ps -ef|grep redis
root 1940 1 0 16:12 ? 00:00:00 /usr/local/bin/redis-server *:6380
root 2056 2034 0 16:15 pts/0 00:00:00 grep redis
- 两台机器上的redis安装好以后,下面配置下主从读写分离,zys-zk01机器上为主master,zys-zk02机器上为slave
在zys-zk02 的6380.conf文件上配置slaveof 192.168.1.232 6379
[root@zys-zk02 redis]# vim 6380.conf
加在文件的最后保持
# When a child rewrites the AOF file, if the following option is enabled
# the file will be fsync-ed every 32 MB of data generated. This is useful
# in order to commit the file to the disk more incrementally and avoid
# big latency spikes.
aof-rewrite-incremental-fsync yes
slaveof 192.168.1.232 6379
重启下6380端口的服务
[root@zys-zk02 redis]# /etc/init.d/redis_6380 stop
Stopping ...
Redis stopped
[root@zys-zk02 redis]# /etc/init.d/redis_6380 start
Starting Redis server...
- 测试下主从读写分离
redis-cli SHUTDOWN,连接本机的6379端口停止redis进程
redis-cli -h 127.0.0.1 -p 6379 SHUTDOWN,制定要连接的ip和端口号
redis-cli PING,ping redis的端口,看是否正常
redis-cli,进入交互式命令行
在zys-zk01上
[root@zys-zk01 ~]# /usr/local/bin/redis-cli -h 192.168.1.232 -p 6379
192.168.1.232:6379> set key1 value1
OK
192.168.1.232:6379> get key1
"value1"
在 zys-zk02上
[root@zys-zk02 redis]# /usr/local/bin/redis-cli -h 192.168.1.233 -p 6380
192.168.1.233:6380> get key1
"value1"
192.168.1.233:6380> set key2 value2
(error) READONLY You can't write against a read only slave.
192.168.1.233:6380>
到这里redis的主从,读写分离已经做好了,发现向zys-zk02 6380服务上写入数据是写不进去的
- 下面,动手实操,练习如何操作部署哨兵集群,如何基于哨兵进行故障转移,还有一些企业级的配置方案
哨兵的具体配置放在下一篇吧