Saltstack 利用pillar實現redis多實例部署

需求:基於業務環境,需在一臺機器上部署N多redis實例,之前部署只能實現部署單個redis,在手工修改目錄名字以區分不同redis實例,現想設計能部署一個redis,剩餘實例遞增即可,以實現多實例部署。


設計:多redis啓動只需要一個配置文件和啓動腳本即可,而啓動程序是不變的,那麼我可以安裝一個redis,以/usr/local/redis目錄爲例,在目錄下生成基於應用的redis,下發對應的腳本到/etc/init.d/,而配置文件做成模板化,變化參數通過pillar來渲染,例如log name、pid name、data directory。


note: 多實例部署,要涉及到多個腳本,想通過salt的service.running啓動,那麼必須要滿足幾個條件
   1.rc.d/init.d腳本
   2.腳本內容必須有start、stop、status,status必須有,因爲service模塊會先執行status來判定服務是否在運行,在執行啓動
   3.腳本包含啓動和關閉參數。Sxx、Kxx


整體目錄結構如下
/usr/local/redis/bin
      redis-benchmark
      redis-cli
      redis-server
      redis-check-aof
      redis-check-dump
/usr/local/redis/redis-s-user
      redis.conf
/usr/local/redis/redis-s-group
      redis.conf
/etc/init.d/redis-s-user
/etc/init.d/redis-s-group


上述設計完成,那麼開工,Saltstack安裝,驗證我就不演示啦。直接上代碼


pillar

redis-server1:
  - name: redis-s-user
    port: 7379
  - name: redis-s-group
    port: 7479

定義不同端口和服務名,在SLS文件中渲染。


sls

redis:
  pkg.installed:
    - name: redis
{% if 'redis-server1' in pillar %}
{% for eachredis in pillar['redis-server1'] %}
/usr/local/redis/` eachredis`.`name `/redis.conf:
  file.managed:
    - source: salt://redis/files/redis.conf
    - makedirs: True
    - template: jinja
    - defaults:
        name: ` eachredis`.`name `
        port: ` eachredis`.`port `
    - require:
      - pkg: redis
{% endfor %}
{% endif %}
{% if 'redis-server1' in pillar %}
{% for eachredis in pillar['redis-server1'] %}
/etc/init.d/` eachredis`.`name `:
  file.managed:
    - source: salt://redis/files/test
    - mode: 755
    - require:
      - pkg: redis
    - template: jinja
    - defaults:
        name: ` eachredis`.`name `
  service.running:
    - name: ` eachredis`.`name `
    - enable: True
    - watch:
      - pkg: redis
{% endfor %}
{% endif %}

1.安裝redis服務,包是打的RPM包,包的結構就頂樓 - -

2.下發配置文件,配置文件需要指定不同端口、路徑名。所以提供2個值。

3.下發啓動腳本,redis啓動只需要redis-server指定不同配置文件,所以這裏只給了一個name值


redis啓動腳本

#!/bin/bash
# Init file for redis
# chkconfig: 2345 80 12
# description: redis daemon
# processname: redis
# config: /usr/local/redis/redis.conf
# pidfile: /var/run/redis.pid
source /etc/init.d/functions
BIN="/usr/local/redis/bin"
CONF="/usr/local/redis/` name `/redis.conf"
PIDFILE="/var/run/` name `.pid"
### Read configuration
[ -r "$SYSCONFIG" ] && source "$SYSCONFIG"
RETVAL=0
prog="redis-server"
desc="Redis Server"
start() {
        if [ -e $PIDFILE ];then
             echo "$desc already running...."
             exit 1
        fi
        echo -n $"Starting $desc: "
        daemon $BIN/$prog $CONF
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
        return $RETVAL
}
stop() {
        echo -n $"Stop $desc: "
        kill `cat $PIDFILE`
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog $PIDFILE
        return $RETVAL
}
restart() {
        stop
        start
}
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        restart
        ;;
  condrestart)
        [ -e /var/lock/subsys/$prog ] && restart
        RETVAL=$?
        ;;
  status)
        status $PIDFILE
        RETVAL=$?
        ;;
   *)
        echo $"Usage: $0 {start|stop|restart|condrestart|status}"
        RETVAL=1
esac
exit $RETVAL


redis配置文件

daemonize yes
pidfile /var/run/` name `.pid
port ` port `
timeout 0
tcp-keepalive 0
loglevel warning
logfile /opt/log/redis/` name `.log
databases 16
#save 900 1
#save 300 10
#save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename ` name `.rdb
dir /usr/local/redis/` name `
slave-serve-stale-data yes
slave-read-only yes
repl-disable-tcp-nodelay no
slave-priority 100
appendonly yes
appendfilename ` name `.aof
appendfsync everysec
no-appendfsync-on-rewrite no
#auto-aof-rewrite-percentage 100
#auto-aof-rewrite-min-size 64mb
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
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


那麼現在,只需要同步下去即可。

salt 'test' state.sls redis.install   ->  redis.install =  /srv/salt/redis/install.sls內容就是上面的sls


內容是經過驗證過的,如果有小細節地方麻煩給我留言,及時更正!!

既然能實現多實例redis部署,那麼其他任何服務都是可以,關鍵在於這麼使用。


順便貼個service.running過程。方便大家理解。之前在部署時,出現客戶端手工執行正確,但saltstack調用死活都不成功,告訴我已運行,且需要個狀態。

其實這是init腳本缺了個status函數,saltstack運行service.running先是執行status,判斷服務是否正在運行,未運行,那麼立即start,而探測已運行,則報服務已運行,需要個狀態


啓動過程

wKioL1MxN1DT_HdtAARHCu33cZI317.jpg





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章