Tento configurar o High Availability usando o Spider Engine e o MariaDB 10.0.14, mas não tenho certeza de qual configuração usar para que funcione conforme o esperado.
O que eu quero é:
- Acessando uma tabela remota usando o Spider Engine em um servidor remoto A (digamos "servidor principal" abaixo)
- Se o servidor principal A estiver inativo => acesse o "servidor de backup" B
Com base na documentação , fiz a seguinte configuração:
CREATE SERVER server_main
FOREIGN DATA WRAPPER mysql
OPTIONS(
HOST '10.2.0.1',
PORT 3306,
DATABASE 'db01',
USER 'spider',
PASSWORD '123456'
);
CREATE SERVER server_backup
FOREIGN DATA WRAPPER mysql
OPTIONS(
HOST '10.2.0.2',
PORT 3306,
DATABASE 'db01',
USER 'spider',
PASSWORD '123456'
);
INSERT INTO mysql.spider_link_mon_servers
(db_name, table_name, link_id, sid, server)
VALUES
('%', '%', '%', 100, 'server_main'),
('%', '%', '%', 101, 'server_backup');
SELECT spider_flush_table_mon_cache();
-- Created on 10.2.0.1 (server_main)
CREATE TABLE `np` (
`s` text
) ENGINE=InnoDB;
INSERT INTO np VALUES ('main');
-- Created on 10.2.0.2 (server_backup)
CREATE TABLE `np` (
`s` text
) ENGINE=InnoDB;
INSERT INTO np VALUES ('backup');
CREATE TABLE `np` (
`s` text
) ENGINE=SPIDER COMMENT='wrapper "mysql", srv "server_main server_backup", database "db01", table "np", mbk "2", mkd "2", msi "100 101", link_status "0 0"';
Metade do tempo, o spider usa server_main e server_backup:
db_spider =# SELECT * FROM np;
+------+
| s |
+------+
| main |
+------+
1 row in set (0.00 sec)
db_spider =# Bye
[...]
db_spider =# SELECT * FROM np;
+--------+
| s |
+--------+
| backup |
+--------+
1 row in set (0.00 sec)
Mas se eu parar a instância principal do mysqld, ela ainda tentará acessar o nó com falha:
db_spider =# SELECT * FROM np;
ERROR 1032 (HY000): Can't find record in 'spider_tables'
db_spider =# Bye
[...]
db_spider =# SELECT * FROM np;
+--------+
| s |
+--------+
| backup |
+--------+
1 row in set (0.00 sec)
Talvez eu tenha configurado incorretamente ou perdido algumas configurações? As opções "msi" e "link_status" não estão muito claras para mim na verdade...
Achei meu erro. Percebi que a tabela spider_link_mon_servers deve conter nós de aranha, não nós de back-end. E meus nós de aranha não estão sendo executados na mesma instância que os back-ends. As tabelas spider são executadas na porta 3307.
Portanto, preciso configurar os servidores de monitoramento assim (vamos chamá-los de "proxy"):
Agora, se eu parar a instância "principal" (3306 uma), o spider a detecta e acessa apenas o nó de backup.
Ainda há um recurso que não consegui operar: use apenas o back-end principal se estiver ativo e use o back-end de backup apenas se o back-end principal morrer ...
EDIÇÃO 11/02/2014:
O parâmetro "alc" (active_link_count) definido como 1 é o que eu preciso para usar o segundo back-end apenas como back-end de failover. Então, algo assim funcionou: