プロジェクトのredisは、awsのredisサービスを直接使用します。redisはクラスターです。つまり、次のように、redisクラスターに接続するときにgolangが遭遇するピットです。
まず、私はredisgoを使用します。これは、APIを見る方が便利で、redis-cliに似ており、awsも推奨されるためです。その後、最初は接続に問題はなく、10回以上展開しましたが、ある日展開しました。redisの操作中にサーバーが突然エラーを報告しました。「(エラー)MOVED xxxx xxx.xxx.xxx.xxx:xxxx」をクエリしたところ、redisがクラスターへの接続を選択しなかったことがわかりました。もう一度確認したところ、awsが2つのredisライブラリredisgoとgoを公式に推奨していることがわかりました。 -redis 2つのライブラリ、redisgoはクラスターをサポートしていません(残念です)。問題なく何度もデプロイしました。常にマスターに接続されていた可能性があり、スレーブに接続すると突然エラーが報告されました。幸いなことに、それは早期に発見されました。
go-redis / redisがデータベースに接続すると、公式デモで多数のポートが提供されます。
import "github.com/go-redis/redis/v8"
rdb := redis.NewClusterClient(&redis.ClusterOptions{
Addrs: []string{":7000", ":7001", ":7002", ":7003", ":7004", ":7005"},
// To route commands by latency or randomly, enable one of the following.
//RouteByLatency: true,
//RouteRandomly: true,
})
文字列のスライスに自分のアドレスを入力する限り、これには複数のアドレスを入力できます。アドレスが1つしかない場合は、1つだけ入力します(プロジェクトのredisクラスターは1つのアドレスのみを外部に公開できます)
clusterClient = redis.NewClusterClient(&redis.ClusterOptions{
Addrs: []string{"your addr1"},
})
redis.NewClusterClientインターフェースはデフォルトでマスターに接続されています。スレーブにのみ接続する場合は、パラメーターを使用して制御できます。詳細については、インターフェースの説明を確認してください。
最終的にパッケージを切り替えた後、redisクラスター接続の問題は正常に解決されました。