Browse Source

add failover script

Chris Mague 4 years ago
parent
commit
c57ba588b1
4 changed files with 39 additions and 18 deletions
  1. BIN
      misc/failover_timer
  2. 32 16
      misc/failover_timer.go
  3. 4 1
      misc/go.mod
  4. 3 1
      misc/go.sum

BIN
misc/failover_timer


+ 32 - 16
misc/failover_timer.go

@@ -2,31 +2,47 @@ package main
 
 import (
 	"context"
-	"flag"
 	"fmt"
+	"log"
+	"os"
 	"time"
 
 	"github.com/go-redis/redis/v8"
+	"github.com/pborman/getopt/v2"
 )
 
 var ctx = context.Background()
 
 func main() {
-	redisHost := flag.String("host", "localhost", "Redis Host")
-	redisPort := flag.Int("port", 6379, "Redis Port")
-	redisPassword := flag.String("password", "", "RedisPassword")
-	messageCount := flag.Int("message_count", 10000, "run this man times")
-	flag.Parse()
+
+	helpFlag := getopt.BoolLong("help", 'h', "display help")
+	redisHost := getopt.StringLong("host", 's', "", "name or IP of any cluster node")
+	redisPort := getopt.IntLong("port", 'p', 6379, "port for the cluster node")
+	redisPassword := getopt.StringLong("password", 'a', "", "cluster password")
+	messageCount := getopt.IntLong("message-count", 'm', 10000, "Message count")
+	minBackOff := getopt.IntLong("min-backoff", 'i', 500, "ms to start backoff")
+	maxBackOff := getopt.IntLong("max-backoff", 'x', 1000, "ms to start backoff")
+
+	getopt.Parse()
+
+	if *helpFlag || *redisHost == "" {
+		getopt.PrintUsage(os.Stderr)
+		os.Exit(1)
+	}
 
 	client := redis.NewClusterClient(&redis.ClusterOptions{
-		Addrs:        []string{fmt.Sprintf("%s:%d", *redisHost, *redisPort)},
-		MaxRedirects: 3,
-		Password:     *redisPassword,
-		PoolSize:     8,
-		MinIdleConns: 5,
-		PoolTimeout:  0,
-		IdleTimeout:  20 * time.Second,
-		DialTimeout:  2 * time.Second,
+		Addrs:           []string{fmt.Sprintf("%s:%d", *redisHost, *redisPort)},
+		MaxRedirects:    3,
+		Password:        *redisPassword,
+		PoolSize:        8,
+		MinRetryBackoff: time.Duration(*minBackOff) * time.Millisecond,
+		MaxRetryBackoff: time.Duration(*maxBackOff) * time.Millisecond,
+		MinIdleConns:    5,
+		PoolTimeout:     0,
+		ReadTimeout:     4 * time.Millisecond,
+		WriteTimeout:    4 * time.Millisecond,
+		IdleTimeout:     20 * time.Second,
+		DialTimeout:     2 * time.Second,
 	})
 	client.Ping(ctx)
 	for i := 0; i < *messageCount; i++ {
@@ -37,8 +53,8 @@ func main() {
 		if err != nil {
 			fmt.Println(err)
 		}
-		if client.PoolStats().Misses > misses {
-			fmt.Printf("Failover: Client took %d ms to complete operation %+v\n", elapsed.Milliseconds(), client.PoolStats())
+		if client.PoolStats().Misses > misses && elapsed.Milliseconds() > 1 {
+			log.Printf("Failover: Client took %d ms to complete operation %+v\n", elapsed.Milliseconds(), client.PoolStats())
 		}
 
 	}

+ 4 - 1
misc/go.mod

@@ -2,4 +2,7 @@ module github.com/false
 
 go 1.14
 
-require github.com/go-redis/redis/v8 v8.4.2
+require (
+	github.com/go-redis/redis/v8 v8.4.2
+	github.com/pborman/getopt/v2 v2.1.0 // indirect
+)

+ 3 - 1
misc/go.sum

@@ -5,7 +5,6 @@ github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/r
 github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
-github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg=
 github.com/go-redis/redis/v8 v8.4.2 h1:gKRo1KZ+O3kXRfxeRblV5Tr470d2YJZJVIAv2/S8960=
 github.com/go-redis/redis/v8 v8.4.2/go.mod h1:A1tbYoHSa1fXwN+//ljcCYYJeLmVrwL9hbQN45Jdy0M=
 github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@@ -27,6 +26,9 @@ github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9k
 github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
 github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
 github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=
+github.com/pborman/getopt v1.1.0 h1:eJ3aFZroQqq0bWmraivjQNt6Dmm5M0h2JcDW38/Azb0=
+github.com/pborman/getopt/v2 v2.1.0 h1:eNfR+r+dWLdWmV8g5OlpyrTYHkhVNxHBdN2cCrJmOEA=
+github.com/pborman/getopt/v2 v2.1.0/go.mod h1:4NtW75ny4eBw9fO1bhtNdYTlZKYX5/tBLtsOpwKIKd0=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=