Go-MySQL: библиотека на чистом Go для работы с сетевым протоколом MySQL и репликацией
A pure go library to handle MySQL network protocol and replication.
Репликационный пакет обрабатывает протокол репликации MySQL, подобно python-mysql-replication.
Вы можете использовать его в качестве ведомого MySQL для синхронизации binlog от мастера, а затем выполнять действия, такие как обновление кэша и т. д.
import (
"github.com/siddontang/go-mysql/replication"
"os"
)
// Создаём синхронизатор binlog с уникальным идентификатором сервера, идентификатор сервера должен отличаться от других MySQL.
// flavor — это mysql или mariadb
syncer := replication.NewBinlogSyncer(100, "mysql")
// Регистрируем ведомое устройство, мастер MySQL находится по адресу 127.0.0.1:3306, с пользователем root и пустым паролем
syncer.RegisterSlave("127.0.0.1", 3306, "root", "")
// Запускаем синхронизацию с указанным файлом binlog и позицией
streamer, _ := syncer.StartSync(binlogFile, binlogPos)
// или вы можете запустить репликацию gtid следующим образом
// streamer, _ := syncer.StartSyncGTID(gtidSet)
// набор gtid mysql выглядит так «de278ad0-2106-11e4-9f8e-6edd0ca20947:1-2»
// набор mariadb gtid выглядит так «0-1-100»
for {
ev, _ := streamer.GetEvent()
// Дамп события
ev.Dump(os.Stdout)
}
Вывод выглядит следующим образом:
=== RotateEvent ===
Date: 1970-01-01 08:00:00
Log position: 0
Event size: 43
Position: 4
Next log name: mysql.000002
=== FormatDescriptionEvent ===
Date: 2014-12-18 16:36:09
Log position: 120
Event size: 116
Version: 4
Server version: 5.6.19-log
Create date: 2014-12-18 16:36:09
=== QueryEvent ===
Date: 2014-12-18 16:38:24
Log position: 259
Event size: 139
Salve proxy ID: 1
Execution time: 0
Error code: 0
Schema: test
Query: DROP TABLE IF EXISTS `test_replication` /* generated by server */
Canal — это пакет, который может синхронизировать ваш MySQL везде, например, Redis, Elasticsearch.
Сначала canal будет сбрасывать данные вашего MySQL, а затем синхронизировать изменённые данные, используя binlog инкрементно.
Вы должны использовать формат ROW для binlog, полное изображение строки binlog предпочтительно, потому что мы можем столкнуться с некоторыми ошибками, когда первичный ключ изменяется при обновлении для минимального или noblob изображения строки.
Простой пример:
cfg := NewDefaultConfig()
cfg.Addr = "127.0.0.1:3306"
cfg.User = "root"
// Мы заботимся только о таблице canal_test в тестовой базе данных
cfg.Dump.TableDB = "test"
cfg.Dump.Tables = []string{"canal_test"}
c, err := NewCanal(cfg)
type myRowsEventHandler struct {
}
func (h *myRowsEventHandler) Do(e *RowsEvent) error {
log.Infof("%s %v\n", e.Action, e.Rows)
return nil
}
func (h *myRowsEventHandler) String() string {
return "myRowsEventHandler"
}
// Регистрация обработчика для обработки RowsEvent
c.RegRowsEventHandler(&MyRowsEventHandler{})
// Запуск канала
c.Start()
Вы можете увидеть go-mysql-elasticsearch, чтобы узнать, как синхронизировать данные MySQL с Elasticsearch.
Клиентский пакет поддерживает простой драйвер подключения MySQL, который можно использовать для связи с сервером MySQL.
import (
"github.com/siddontang/go-mysql/client"
)
// Подключение MySQL по адресу 127.0.0.1:3306 с пользователем root, пустым паролем и базой данных test
conn, _ := client.Connect("127.0.0.1:3306", "root", "", "test")
conn.Ping()
// Вставка
r, _ := conn.Execute(`insert into table (id, name) values (1, "abc")`)
// Получение последнего вставленного идентификатора
println(r.InsertId)
// Выбор
r, _ := conn.Execute(`select id, name from table where id = 1`)
// Обработка результата
v, _ := r.GetInt(0, 0)
v, _ = r.GetIntByName(0, "id")
Пакет Server предоставляет фреймворк для реализации простого сервера MySQL, который может обрабатывать пакеты от клиента MySQL. Вы можете использовать его для создания собственного прокси MySQL.
import (
"github.com/siddontang/go-mysql/server"
"net"
)
l, _ := net.Listen("127.0.0.1:4000")
c, _ := l.Accept()
// Создание соединения с пользователем root и пустым passowrd
// У нас есть только пустой обработчик для обработки команды
conn, _ := server.NewConn(c, "root", "", server.EmptyHandler{})
for {
conn.HandleCommand()
}
``` **Failover**
Failover позволяет продвинуть новый мастер и автоматически позволить другим слейвам реплицироваться от него, когда старый мастер не работает.
Failover поддерживает MySQL >= 5.6.9 с режимом GTID. Если вы используете более низкую версию, например MySQL 5.0–5.5, пожалуйста, используйте MHA (http://code.google.com/p/mysql-master-ha/) или orchestrator (https://github.com/outbrain/orchestrator).
В то же время Failover также поддерживает MariaDB >= 10.0.9 в режиме GTID.
Почему только GTID? Поддерживать failover без режима GTID очень сложно, потому что слейв не может найти правильное имя файла binlog и позицию с новым мастером. Хотя многие компании используют MySQL 5.0–5.5, я думаю, что обновить MySQL до версии 5.6 или выше легко.
**Driver**
Driver — это пакет, который можно использовать с go-mysql и go database/sql, как и другие драйверы. Простой пример:
import ( "database/sql"
- "github.com/siddontang/go-mysql/driver"
)
func main() { // dsn format: "user:password@addr?dbname" dsn := "root@127.0.0.1:3306?test" db, _ := sql.Open(dsn) db.Close() }
Мы прошли все тесты на https://github.com/bradfitz/go-sql-test, используя драйвер go-mysql. :-)
**Обратная связь**
go-mysql всё ещё находится в разработке, ваша обратная связь очень приветствуется.
Gmail: siddontang@gmail.com
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )