一、环境:
CENTOS7
salt-master:m6 ip:192.168.99.86
redis-master:v73 ip:192.168.99.73
redis-slave:m5 ip:192.168.99.85
二、安装文件、配置文件和目录结构
[root@m6 keepalivedredis]# pwd /srv/salt/keepalivedredis [root@m6 keepalivedredis]# ls install.sls keepalived.conf redis_backup.sh redis_check.sh redis_fault.sh redis.j2 redis_master.sh redis_stop.sh
安装部署文件只有一个,避免得多次引用,方便查看
[root@m6 keepalivedredis]# cat install.sls install_redis: pkg.installed: - name: redis
cpredis_conf: file.managed: - name: /etc/redis.conf - source: salt://keepalivedredis/redis.j2 - user: root - group: root - template: jinja - mode: 644 - require: - pkg: install_redis
mkredisdir: cmd.run: - name: mkdir -pv /data/redis && chown redis.redis /data/redis - unless: test -d /data/redis
redis_running: service.running: - name: redis - enable: True - require: - pkg: install_redis - watch: - file: cpredis_conf
install_keepalived: pkg.installed: - name: keepalived
scripts_dir: cmd.run: - name: mkdir -pv /etc/keepalived/scripts/ - unless: test -d /etc/keepalived/scripts/
keepalived_conf: file.managed: - name: /etc/keepalived/keepalived.conf - source: salt://keepalivedredis/keepalived.conf - user: root - group: root - template: jinja - mode: 644 - require: - pkg: install_keepalived - cmd: scripts_dir
{% for s in ["redis_backup.sh","redis_check.sh","redis_fault.sh","redis_master.sh","redis_stop.sh"] %} keepalived_{{s}}: file.managed: - name: /etc/keepalived/scripts/{{s}} - source: salt://keepalivedredis/{{s}} - user: root - group: root - template: jinja - mode: 755 - require: - pkg: install_keepalived {% endfor %}
keepalived_running: service.running: - name: keepalived - enable: True - require: - pkg: install_keepalived - watch: - file: keepalived_conf
redis的配置文件:
[root@m6 keepalivedredis]# cat redis.j2 bind 0.0.0.0 protected-mode yes port 6379 tcp-backlog 511 timeout 0 tcp-keepalive 300 daemonize no supervised no pidfile /var/run/redis/redis.pid loglevel notice logfile /var/log/redis/redis.log databases 16 save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename dump.rdb dir /data/redis/ {% if grains['role'] == "slave" %} slaveof {{grains['master_ip']}} 6379 {% endif %} slave-serve-stale-data yes slave-read-only yes repl-diskless-sync no repl-diskless-sync-delay 5 repl-disable-tcp-nodelay no slave-priority 100 appendonly no appendfilename "appendonly.aof" appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb aof-load-truncated yes lua-time-limit 5000 slowlog-log-slower-than 10000 slowlog-max-len 128 latency-monitor-threshold 0 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-size -2 list-compress-depth 0 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 aof-rewrite-incremental-fsync yes
keepalived的配置文件:
[root@m6 keepalivedredis]# cat keepalived.conf ! Configuration File for keepalived
vrrp_script chk_redis { script "/etc/keepalived/scripts/redis_check.sh" interval 2 }
vrrp_instance VI_1 { {% if grains['role'] == 'master' %} state MASTER {% else %} state BACKUP {% endif %} interface ens37 virtual_router_id 51 {% if grains['role'] == "master" %} priority 101 {% else %} priority 100 {% endif %} # advert_int 1 nopreempt authentication { auth_type PASS auth_pass redis } track_script { chk_redis } virtual_ipaddress { {{ grains['vip'] }} } notify_master /etc/keepalived/scripts/redis_master.sh notify_backup /etc/keepalived/scripts/redis_backup.sh notify_fault /etc/keepalived/scripts/redis_fault.sh notify_stop /etc/keepalived/scripts/redis_stop.sh }
脚本的内容,网上有很多
[root@m6 keepalivedredis]# cat redis_master.sh #!/bin/bash # REDISCLI="/usr/bin/redis-cli" LOGFILE="/var/log/keepalived-redis-state.log" echo "[master]" >> $LOGFILE date >> $LOGFILE echo "Being master..." >> $LOGFILE 2>&1 echo "run slaveof no one cmd..." >> $LOGFILE $RESISCLI SLAVEOF {{ grains['master_ip'] }} 6479>> $LOGFILE 2>&1 $REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1
[root@m6 keepalivedredis]# cat redis_backup.sh #!/bin/bash # REDISCLI="/usr/bin/redis-cli" LOGFILE="/var/log/keepalived-redis-state.log" echo "[backup]" >> $LOGFILE date >> $LOGFILE echo "being salve..." >> $LOGFILE 2>&1 #sleep 25 echo "run slaveof cmd ..." >> $LOGFILE $REDISCLI SLAVEOF {{ grains['master_ip'] }} 6379 $LOGFILE 2>&1
[root@m6 keepalivedredis]# cat redis_check.sh #!/bin/bash # ALIVE=`/usr/bin/redis-cli PING` if [ "$ALIVE" == "PONG" ];then echo $ALIVE exit 0 else echo $ALIVE exit 1 fi
[root@m6 keepalivedredis]# cat redis_stop.sh #!/bin/bash # LOGFILE=/var/log/keepalived-redis-state.log echo "[stop]" >> $LOGFILE date >> $LOGFILE
[root@m6 keepalivedredis]# cat redis_fault.sh #!/bin/bash # $LOGFILE=/var/log/keepalived-redis-state.log echo "[fault]" >> $LOGFILE date >> $LOGFILE
三、部署过程和测试:
[root@m6 keepalivedredis]# salt "v73" grains.setvals "{'role':'master','vip':'192.168.99.10','master_ip':'192.168.99.85'}"
[root@m6 keepalivedredis]# salt "m5" grains.setvals "{'role':'slave','vip':'192.168.99.10','master_ip':'192.168.99.73'}"
[root@m6 keepalivedredis]# salt -L 'v73,m5' state.sls keepalivedredis.install
测试redis主从切换
[root@v73 ~]# redis-cli -h 192.168.99.10 -p 6379 192.168.99.10:6379> set ktest "vtest" OK 192.168.99.10:6379> exit [root@v73 ~]# service redis stop Redirecting to /bin/systemctl stop redis.service
此时IP发生切换在m5机器
用同样的IP仍然可以访问
[root@m5 network-scripts]# redis-cli -h 192.168.99.10 -p 6379 192.168.99.10:6379> get ktest "vtest" 192.168.99.10:6379>
