Redis Standalone master节点镜像制作

  • 安装 agent
    下载青云提供的 app agent Linux 版本, Windows 版本,解压后运行 ./install.sh (Windows 下双击 install.bat)。

  • 创建 /etc/confd/conf.d/redis.conf.toml

      [template]
      src = "redis.conf.tmpl"
      dest = "/opt/redis/redis.conf"
      keys = [
          "/",
      ]
      reload_cmd = "/opt/redis/bin/restart-redis-server.sh"
    
  • 创建 /etc/confd/templates/redis.conf.tmpl

          {% raw %}
        aof-rewrite-incremental-fsync yes
          appendfilename appendonly.aof
          auto-aof-rewrite-percentage 10
          auto-aof-rewrite-min-size 64mb
          bind 0.0.0.0
          client-output-buffer-limit normal 0 0 0
          client-output-buffer-limit pubsub 32mb 8mb 60
          client-output-buffer-limit slave 256mb 64mb 60
          daemonize yes
          databases 16
          dbfilename dump.rdb
          dir /data/redis
          hll-sparse-max-bytes 3000
          hz 10
          logfile /data/redis/logs/redis-server.log
          loglevel notice
          lua-time-limit 5000
          pidfile /var/run/redis/redis-server.pid
          repl-disable-tcp-nodelay no  
          rdbchecksum yes
          rdbcompression yes
          save ""
          slave-priority 0
          slave-read-only yes
          slave-serve-stale-data yes
          slowlog-max-len 128
          stop-writes-on-bgsave-error yes
          tcp-backlog 511
          {{range gets "/env/*"}}{{$v := .Value}}{{ if gt ( len ( $v ) ) 0 }}{{base .Key}} {{.Value}}
          {{ else }}{{base .Key}} ""
          {{end}}{{end}}
          {% endraw %}
    

最后 range 部分是 confd (已通过前面安装 agent 的方式部署到镜像里)这个服务读取青云提供的 metadata 服务来更新应用的配置, 后面的路径表示这个节点本身所在集群或自身的所有信息,/env 即表示获取本节点的应用参数配置,获取某个 key 的值需要在 toml 模版文件里 监听相应的 key,为简单起见,监听根节点/即可。 if/else 是因为 Redis 对空的值需要用引号引起来。
关于 confd 请参见 confd quick start guide 模版文件语法参见 templatestemplates

  • 补充脚本
    在此例中有两个脚本 stop-redis-server.sh (应用模版中定义的 stop service) 和 restart-redis-server.sh,Redis 官方并没有提供这些脚本,所以需要自己完善,示范如下。

    • 创建 /opt/redis/bin/stop-redis-server.sh

        #! /bin/bash
        #
        # Copyright (C) 2015 Yunify Inc.
        #
        # Script to stop redis-server.
      
        PID=$(pidof redis-server)
        if [ -z "$PID" ]; then
            echo "redis-server is not running" > /var/log/redis.log 2>&1
            exit 0
        fi
      
        # Try to terminate redis-server
        kill -SIGTERM $PID
      
        # Check if redis-server is terminated
        for i in $(seq 0 2); do
           if ! ps -ef | grep ^stop-redis-server > /dev/null; then
               echo "redis-server is successfully terminated" >> /var/log/redis.log 2>&1
               exit 0
           fi
           sleep 1
        done
      
        # Not terminated yet, now I am being rude!
        # In case of a new redis-server process is somebody else (unlikely though),
        # we get the pid again here.
        kill -9 $(pidof redis-server)
        if [ $? -eq 0 ]; then
            echo "redis-server is successfully killed" >> /var/log/redis.log 2>&1
            exit 0
        else
            echo "Failed to kill redis-server" >> /var/log/redis.log 2>&1
            exit 1
        fi
      
    • 创建 /opt/redis/bin/restart-redis-server.sh

        #! /bin/bash
      
        PID=$(pidof redis-server)
        if [ -z "$PID" ]; then
            echo "redis-server is not running"
            exit 0
        fi
      
        # Stop redis server
        /opt/redis/bin/stop-redis-server.sh
      
        # Start redis server
        if [ $? -eq 0 ]; then
            /opt/redis/bin/redis-server /opt/redis/redis.conf
            if [ $? -eq 0 ]; then
                echo "Restart redis-server successful"
                exit 0
            else
                echo "Failed to restart redis-server" 1>&2
                exit 1
            fi
        else
            echo "Failed to kill redis-server" 1>&2
            exit 1
        fi
      

results matching ""

    No results matching ""