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

OSCHINA-MIRROR/siddontang-go-mysql

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Это зеркальный репозиторий, синхронизируется ежедневно с исходного репозитория.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
10 лет назад
10 лет назад
10 лет назад
10 лет назад
10 лет назад
10 лет назад
10 лет назад
10 лет назад
10 лет назад
10 лет назад
10 лет назад
11 лет назад
10 лет назад
3 месяцев назад
10 лет назад
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
Отмена

Обновления

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

Участники (5)

все

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

Создан репозиторий 3 месяца назад
Больше нет результатов для загрузки
1
https://gitlife.ru/oschina-mirror/siddontang-go-mysql.git
git@gitlife.ru:oschina-mirror/siddontang-go-mysql.git
oschina-mirror
siddontang-go-mysql
siddontang-go-mysql
master