Skip to content

Instantly share code, notes, and snippets.

@yankooo
Created September 26, 2023 14:16
Show Gist options
  • Save yankooo/291b303a57af3e16d8d59195f3a7b2c4 to your computer and use it in GitHub Desktop.
Save yankooo/291b303a57af3e16d8d59195f3a7b2c4 to your computer and use it in GitHub Desktop.
mha
package main
import (
"database/sql"
"fmt"
"log"
"time"
_ "github.com/go-sql-driver/mysql"
)
// MySQL主从关系
var (
master = "root:baidu@123@tcp(10.0.0.235:3306)/"
)
// DBWrapper 包装数据库客户端
type DBWrapper struct {
dsn string
db *sql.DB
}
func (dbw *DBWrapper) prepare() error {
db, err := sql.Open("mysql", dbw.dsn)
if err != nil {
return err
}
dbw.db = db
return nil
}
func (dbw *DBWrapper) destroy() {
if dbw.db != nil {
dbw.db.Close()
}
}
func (dbw *DBWrapper) exec(sql string) (sql.Result, error) {
err := dbw.prepare()
if err != nil {
return nil, err
}
defer dbw.destroy()
return dbw.db.Exec(sql)
}
func (dbw *DBWrapper) query(sql string) (*sql.Rows, error) {
err := dbw.prepare()
if err != nil {
return nil, err
}
defer dbw.destroy()
return dbw.db.Query(sql)
}
func main() {
wrapper := &DBWrapper{dsn: master}
failTimes := 0
for {
// 探测Master存活
rows, err := wrapper.query("SELECT 1")
if err != nil {
failTimes++
log.Printf("Master探测连续失败%d次,错误:%v\n", failTimes, err)
} else {
rows.Close()
failTimes = 0
}
// 未到达failover阈值
if failTimes < 10 {
time.Sleep(1 * time.Second)
continue
}
// 触发failover流程
fmt.Println("Master failover开始执行!")
// 实现具体的 failover 逻辑...
break
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment