Created
September 26, 2023 14:16
-
-
Save yankooo/291b303a57af3e16d8d59195f3a7b2c4 to your computer and use it in GitHub Desktop.
mha
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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