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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




