1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/siddontang-go-mysql

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

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

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 )

Вы можете оставить комментарий после Вход в систему

Введение

a powerful mysql toolset with Go Развернуть Свернуть
BSD-3-Clause
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/siddontang-go-mysql.git
git@api.gitlife.ru:oschina-mirror/siddontang-go-mysql.git
oschina-mirror
siddontang-go-mysql
siddontang-go-mysql
master