暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ansible-playbook配置redis的sentinel高可用集群

运维部落 2016-07-20
935
redis sentinel是redis自带的解决方法,轻量并简单,下面用ansible安装redis,配置方法是:
1: 先做一个主从
2: sentinel监控redis主从,如果发现主挂了,提升redis从为主

一、配置主机间的域名解析

# cat /root/ansible/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.211.55.4 vm01
10.211.55.5 vm02
10.211.55.6 vm03

二、配置Ansible的Inventory

# egrep -v "^$|^#" /etc/ansible/hosts
[server]
10.211.55.4 host_name=vm01
10.211.55.5 host_name=vm02
10.211.55.6 host_name=vm03

三、准备redis服务管理脚本

#!/bin/sh
#
# redis - this script starts and stops the redis-server daemon
#
# chkconfig:   - 85 15 
# description:  Redis is a persistent key-value database
# processname: redis-server
# config:      /etc/redis.conf 
# config:      /etc/sysconfig/redis
# pidfile:     /var/run/redis.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
redis="/usr/local/bin/redis-server"
prog=$(basename $redis)
REDIS_CONF_FILE="/etc/redis.conf"
[ -f /etc/sysconfig/redis ] && . /etc/sysconfig/redis
lockfile=/var/lock/subsys/redis
start() {
    [ -x $redis ] || exit 5
    [ -f $REDIS_CONF_FILE ] || exit 6
    echo -n $"Starting $prog: "
    daemon $redis $REDIS_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}
stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}
restart() {
    stop
    start
}
reload() {
    echo -n $"Reloading $prog: "
    killproc $redis -HUP
    RETVAL=$?
    echo
}
force_reload() {
    restart
}
rh_status() {
    status $prog
}
rh_status_q() {
    rh_status >/dev/null 2>&1
}
case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
            ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
        exit 2
esac

四、编写ansible-playbook

下面以vm01为redis主,vm02为redis从,vm03 redis停止 ,作为sentinel。 在vm02的/etc/redis.conf
最后一行添加:slaveof 10.211.55.4 6379
,并重启。
#jinja2:  variable_start_string: "[%" , variable_end_string: "%]"
---
  - hosts: server
    remote_user: root
    vars:
      hostname: '[% host_name %]'
      ipv4: '{{ansible_default_ipv4.address}}'
    tasks:
    - name: time sync
      command: ntpdate ntp1.aliyun.com
    - name: copy hosts file
      copy: src=/root/ansible/hosts dest=/etc/hosts owner=root group=root mode=0644 force='yes'
    - name: set hostname
      shell: 'hostname {{host_name}}'
      register: host_name_change
    - debug: msg='{{host_name_change.stdout}}'
    - name: close iptables
      service: name=iptables enabled=yes state=stopped
    - name: copy redis.tar.gz
      copy: src=/root/ansible/redis-3.2.0.tar.gz dest=/tmp/  owner=root group=root mode=0644
    - name: install redis
      shell: cd /tmp/; tar -xzf /tmp/redis-3.2.0.tar.gz; cd /tmp/redis-3.2.0; make -j4; make install
    - name: copy redis.conf to /etc dir
      copy: src=/tmp/redis-3.2.0/redis.conf dest=/etc/ owner=root group=root mode=0644 force='yes'
    - name: copy redis init file to /etc/init.d/
      copy: src=/root/ansible/redis_init.sh dest=/etc/init.d/redis owner=root group=root mode=0755 force='yes'
    - name: mkdir /var/redis
      shell: mkdir -p /var/redis
    - name: change redis config
      shell: sed -i 's/daemonize\ no/daemonize\ yes/g' /etc/redis.conf ; sed -i '/bind 127.0.0.1/d' /etc/redis.conf;echo bind {{ipv4}} 127.0.0.1 >> /etc/redis.conf; sed -i 's/dir\ .\//dir\ \/var\/redis/g' /etc/redis.conf; sed -i 's/appendonly\ no/appendonly\ yes/g' /etc/redis.conf
    - name: start redis service
      service: name=redis enabled=yes state=restarted
    - name: redis status
      shell: echo info |redis-cli |head -n 19
      register: result
    - debug: msg={{result}}
从info replication可以获取主从关系的信息,也可以role命令查看master,slave,sentinel各角色的信息
root@vm02 ~]# redis-cli -h 10.211.55.5
10.211.55.5:6379> info replication
# Replication
role:slave
master_host:10.211.55.4
master_port:6379
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_repl_offset:29
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
在vm03中停止redis服务,启用sentinel功能,如下:
root@vm03 ~]# service redis stop
Stopping redis-server:                                     [  OK  ]
[root@vm03 ~]# cp /tmp/redis-3.2.0/sentinel.conf /etc/
[root@vm03 ~]# egrep -v "^$|^#" /etc/sentinel.conf
port 26379
dir /tmp
sentinel monitor mymaster 10.211.55.4 6379 1
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
[root@vm03 ~]# redis-sentinel /etc/sentinel.conf &
[1] 20262
[root@vm03 ~]#                 _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 3.2.0 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in sentinel mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379
 |    `-._   `._    /     _.-'    |     PID: 20262
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           http://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'
20262:X 11 May 15:21:18.437 # Sentinel ID is ea87ab5547e731d11cd95359f414475458e44f87
20262:X 11 May 15:21:18.437 # +monitor master mymaster 10.211.55.4 6379 quorum 1
20262:X 11 May 15:21:18.438 * +slave slave 10.211.55.5:6379 10.211.55.5 6379 @ mymaster 10.211.55.4 6379

五、验证redis主从工作情况

在redis主设置数据,从应该可以能同步到,也可以查看/var/reids/redis.log日志以获得信息
# redis-cli
127.0.0.1:6379> set website devops2u.com
OK
127.0.0.1:6379> get website
"devops2u.com"
这时,把vm01的redis主停止,查看redis从和sentinel的变化,以下是redis从状态的转变:
[root@vm02 ~]# redis-cli -h 10.211.55.5
10.211.55.5:6379> keys *
1) "website"
10.211.55.5:6379> info replication
# Replication
role:slave
master_host:10.211.55.4
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:26781
master_link_down_since_seconds:8
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
10.211.55.5:6379> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
以下是redis sentinel的日志:
20262:X 11 May 15:28:17.289 # +sdown master mymaster 10.211.55.4 6379
20262:X 11 May 15:28:17.289 # +odown master mymaster 10.211.55.4 6379 #quorum 1/1
20262:X 11 May 15:28:17.289 # +new-epoch 1
20262:X 11 May 15:28:17.289 # +try-failover master mymaster 10.211.55.4 6379
20262:X 11 May 15:28:17.304 # +vote-for-leader ea87ab5547e731d11cd95359f414475458e44f87 1
20262:X 11 May 15:28:17.304 # +elected-leader master mymaster 10.211.55.4 6379
20262:X 11 May 15:28:17.304 # +failover-state-select-slave master mymaster 10.211.55.4 6379
20262:X 11 May 15:28:17.388 # +selected-slave slave 10.211.55.5:6379 10.211.55.5 6379 @ mymaster 10.211.55.4 6379
20262:X 11 May 15:28:17.388 * +failover-state-send-slaveof-noone slave 10.211.55.5:6379 10.211.55.5 6379 @ mymaster 10.211.55.4 6379
20262:X 11 May 15:28:17.455 * +failover-state-wait-promotion slave 10.211.55.5:6379 10.211.55.5 6379 @ mymaster 10.211.55.4 6379
20262:X 11 May 15:28:18.333 # +promoted-slave slave 10.211.55.5:6379 10.211.55.5 6379 @ mymaster 10.211.55.4 6379
20262:X 11 May 15:28:18.333 # +failover-state-reconf-slaves master mymaster 10.211.55.4 6379
20262:X 11 May 15:28:18.419 # +failover-end master mymaster 10.211.55.4 6379
20262:X 11 May 15:28:18.420 # +switch-master mymaster 10.211.55.4 6379 10.211.55.5 6379
20262:X 11 May 15:28:18.420 * +slave slave 10.211.55.4:6379 10.211.55.4 6379 @ mymaster 10.211.55.5 6379
20262:X 11 May 15:28:48.473 # +sdown slave 10.211.55.4:6379 10.211.55.4 6379 @ mymaster 10.211.55.5 6379

号外号外:

 现在我们公众号推出参与奖和互动奖,凡是通过微信与我们参与讨论互动最多的朋友,将获得我们送出的神秘礼物,还有机会获得Ansible中文官网马上将出版的新书哦! 我们将不定期的推出奖励计划 ! 奖励多多,小伙伴们,一起来吧!


以上是今天为大家带来的内容,如果有任何问题,大家也可以添加以下QQ群参与问题的讨论。
  • Ansible中文权威群:372011984(已满)
  • AWK&SED企业实战: 260039357
  • docker企业架构实践:491533668
  • Jumpserver交流群 :399218702
  • Ansible中文权威-2号群:486022616

关于我们:


文章转载自运维部落,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论