domingo, 14 de abril de 2019

Configuração simples do KeepaliveD

Então keepalived tem sido em torno de um bom tempo agora .... no entanto, ainda é um mistério para muitos.
Portanto, este é um exemplo muito simples de como o keepalived pode funcionar com o MySQL. Espero que isso possa ajudar as pessoas com dúvidas.

Nós teremos um mestre simples para configurar escravos. Significado .. nós escrevemos para um a menos que tenhamos failover para o segundo para algum evento.

1º - instalar keepalived


# yum search keepalived
keepalived .x86_64: Balanceador de carga e serviço de alta disponibilidade

  Apenas para nomes e resumos, use "pesquisar todos" para tudo.
# yum -y install keepalived

Agora você deve ter um arquivo de configuração

# ls -ltr /etc/keepalived/keepalived.conf  

Mantenha o original como você sempre faz backup .. certo ....
# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.orig

Então você precisa descobrir um ipaddress que você pode usar para o seu ip virtual. Eu escolhi 192.168.0.123 para este exemplo.

Em seguida, vamos configurar um script para ser usado em nosso novo arquivo de configuração.

Algumas coisas que fiz aqui ..
Eu deixei um arquivo .cnf para keepalived e um log all no / etc / keepalived.
Isso simplifica o exemplo para que você possa fazer isso ou usar seus próprios arquivos cnf.

Um roteiro:

cat /etc/keepalived/keepalived_check.sh  
#! / bin / bash

# monitorar o status do mysql

# se este nó mysql estiver morto

# e seu escravo está vivo, então pare seu keepalived. O outro nó ligará o IP.



exportar MYSQL_HOME = / etc / keepalived /

Exportar PATH = $ MYSQL_HOME / bin: $ PATH



mysql = "/ usr / bin / mysql"

mysqladmin = "/ usr / bin / mysqladmin"

delay_file = "$ MYSQL_HOME / slave_delay_second.log"

slave_host = $ 1





ALIVE = $ ($ mysqladmin --defaults-file = $ MYSQL_HOME / .my.localhost.cnf   ping | grep alive | wc -l);

REMOTEALIVE = $ ($ mysqladmin --defaults-file = $ MYSQL_HOME / .my.remotehost.cnf   ping | grep alive | wc -l);



if [[$ ALIVE -ne 1]]

então

#echo "MySQL está inoperante"

        if [[$ REMOTEALIVE-eq 1]]

        então

#         eco "Shutdown keep alive"

            systemctl stop keepalived  

#       echo "stop keepalived"

        fi

#outro

#echo "MySQL está ativo"

#encontro

fi



sair 0 #todo feito

Novo arquivo de configuração

cat /etc/keepalived/keepalived.conf
global_defs {



      notification_email {

        anothermysqldba@gmail.com  

      }



      notification_email_from anothermysqldba@gmail.com  

      smtp_server localhost

      smtp_connect_timeout 30



      }







vrrp_script check_mysql {

   script "/etc/keepalived/keepalived_check.sh"

   intervalo 2

   peso 2

}







vrrp_instance VI_1 {



      estado MESTRE

      interface enp0s8   # <--- O NOME DA INTERFACE REALIZA SEU IP REAL / sbin / ifconfig

        # encontrado com show ip link

      virtual_router_id 51

      prioridade 101

      advert_int 1

      nopreempt   # somente necessário no nó de prioridade mais alta

      autenticação {

        auth_type PASS

        auth_pass 1111

      }





      track_script {

        check_mysql

      }



      virtual_ipaddress {

        192.168.0.123  

      }




}



Isso tudo é ótimo, mas funciona ...

Então nós temos 2 hosts

[root @ centosa keepalived] # hostname

centosa

[root @ centosb keepalived] # hostname
centosb

Comece a manter o serviço

[root @ centosa keepalived] # systemctl status keepalived
● keepalived.service - Monitor de alta disponibilidade de LVS e VRRP
   Carregado: carregado (/usr/lib/systemd/system/keepalived.service; desativado; predefinido do fornecedor: desativado)
   Ativo: inativo (morto)
[root @ centosa keepalived] # systemctl restart keepalived
[root @ centosa keepalived] # systemctl status keepalived
keepalived.service - Monitor de alta disponibilidade de LVS e VRRP
   Carregado: carregado (/usr/lib/systemd/system/keepalived.service; desativado; predefinido do fornecedor: desativado)
    Ativo: ativo (em execução)

[root @ centosa keepalived] # ssh 192.168.0.123 'hostname'
Senha: root@192.168.0.123:  

centosa

Prove as conexões já funcionam

[root @ centosa keepalived] # mysql --defaults-file = .my.remotehost.cnf --host = 192.168.0.101   -e "selecione @@ hostname"
+ ------------ +
| @@ hostname |
+ ------------ +
| centosb     |
+ ------------ +
[root @ centosa keepalived] # mysql --defaults-file = .my.remotehost.cnf --host = 192.168.0.102   -e "selecione @@ hostname"
+ ------------ +
| @@ hostname |
+ ------------ +
| centosa     |
+ ------------ +

Verifique se está funcionando ...

[root @ centosa keepalived] # status do systemctl keepalived | grep active
    Ativo: ativo  

[root @ centosb keepalived] # status do systemctl keepalived | grep active
    Ativo: ativo  

Teste o VIP atual .. pare o mysql e veja os mesmos hosts de mudança do VIP ...

[root @ centosa keepalived] # mysql --defaults-file = .my.remotehost.cnf --host = 192.168.0.123   -e "selecione @@ hostname"
+ ------------ +
| @@ hostname |
+ ------------ +
| centosa     |
+ ------------ +
[root @ centosa keepalived] # systemctl pára o mysqld  
[root @ centosa keepalived] # mysql --defaults-file = .my.remotehost.cnf --host = 192.168.0.123   -e "selecione @@ hostname"
+ ------------ +
| @@ hostname |
+ ------------ +
| centosb     |
+ ------------ +

terça-feira, 9 de abril de 2019

Às vezes, o banco de dados lento .. não é o banco de dados ...

Então eu fui recentemente perguntado por que o MySQL 5 atualizado, .6 era mais lento que o mais antigo 5.5

Então eu comecei a olhar por cima das variáveis ​​padrão e caches e etc.

O caso de teste era uma rotina simples que levava cerca de duas vezes mais tempo para ser executada em 5.6 do que em 5.5.

Para adicionar ao mix .. a versão 5.6 tinha o dobro do Innodb_buffer_pool_size e, claro, mais ram geral.

Então eu comecei alguns testes com o MySQLslap ...

Testes do Mysqlslap mostram mais lento em 5.6

5,6:
mysqlslap --defaults-file =. /. my.cnf --concurrency = 150 --iterações = 130 - consulta = / teste.sql --create-schema = applicationdata --verbose
Referência
Número médio de segundos para executar todas as consultas: 0,028 segundos
Número mínimo de segundos para executar todas as consultas: 0,019 segundos
Número máximo de segundos para executar todas as consultas: 0,071 segundos
Número de clientes executando consultas: 150
Número médio de consultas por cliente: 1

5,5:
mysqlslap --defaults-file =. /. my.cnf --concurrency = 150 --iterações = 130 --query = / test.sql --create-schema = applicationdata --verbose
Referência
Número médio de segundos para executar todas as consultas: 0,015 segundos
Número mínimo de segundos para executar todas as consultas: 0,011 segundos
Número máximo de segundos para executar todas as consultas: 0,024 segundos
Número de clientes executando consultas: 150
Número médio de consultas por cliente: 1


Tudo isso vai contra os benchmarks públicos
http://dimitrik.free.fr/blog/archives/2013/02/mysql-performance-mysql-56-ga-vs-mysql-55-32cores.html

Então eu verifiquei o nível do disco -

5,6:
# dd if = / dev / zero de = teste bs = 1048576 contagem = 2048
2048 + 0 registros em
2048 + 0 registra
2147483648 bytes (2,1 GB) copiados, 25,7401 s, 83,4 MB / s

# dd if = teste de = / dev / null bs = 1048576
2048 + 0 registros em
2048 + 0 registra
2147483648 bytes (2,1 GB) copiados, 29,1527 s, 73,7 MB / s

5,5:
# dd if = / dev / zero de = teste bs = 1048576 contagem = 2048
2048 + 0 registros em
2048 + 0 registra
2147483648 bytes (2,1 GB) copiados, 19,9214 segundos, 108 MB / s

# dd if = teste de = / dev / null bs = 1048576
2048 + 0 registros em
2048 + 0 registra
2147483648 bytes (2,1 GB) copiados, 20,0243 segundos, 107 MB / s



Aqui os discos com 5.5 são mais lentos independentemente do MySQL. Então, neste caso .... Olhe para corrigir a velocidade do disco .. MySQL estava funcionando bem e vontade.

quarta-feira, 23 de maio de 2018

Proxy MySQL :: HAproxy || ProxySQL e KeepAlived

Então, quando se trata de rotear seu tráfego MySQL, existem várias opções. 

Agora eu tenho visto HAproxy usado com mais freqüência com os clientes, é bastante simples de configurar. Percona tem um exemplo para os interessados:

Pessoalmente eu gosto de ProxySQL. Percona também tem alguns blogs sobre isso também
Percona também tem versão ProxySQL disponível

Eu estava pensando em escrever alguns exemplos, mas no geral Percona explicou tudo muito bem. Eu não quero tirar nada desses posts, em vez disso, salientar que muita informação boa está disponível através desses URLs. Então, em vez de reescrever o que já foi escrito, vou criar uma coleção de informações para os interessados.

Primeiro compare e decida por si mesmo o que você precisa e quer. O link a seguir, claro, vai ser inclinado para o ProxySQL, mas dá-lhe um escopo geral para você considerar.
Se você tem um cluster ou mestre para dominar e não se importa com qual servidor as leituras versus leituras serão feitas, contanto que você tenha uma conexão; então o HAproxy é provavelmente um simples e rápido setup para você.

O bônus com o ProxySQL é a capacidade de classificar o tráfego de maneira ponderada, FÁCIL. Assim, você pode escrever no nó 1 e selecionar pull do nó 2 e do nó 3. A documentação pode ser encontrada aqui:
Sim, isso pode ser feito com o HAproxy, mas você deve instruir o aplicativo de acordo.
Isso é tratado no ProxySQL com base em suas regras de consulta.

Agora a pergunta óbvia aqui: OK, então como você mantém ProxySQL de se tornar o único ponto de falha?

Você pode investir é um balanceador de carga robusto e etc etc etc ... Lançar hardware nele ... Ou tornar mais fácil em si mesmo e apoiar open source e usar KeepAlive d. Isso é muito fácil de configurar e tudo está documentado novamente aqui:
Se você já lidou com lua e mysql-proxy , ProxySQL e Keepalived devem ser muito simples para você. Se você ainda quiser, por algum motivo: https://launchpad.net/mysql-proxy

Independentemente de você escolher HAproxy, ProxySQL ou outra solução, você precisa garantir que não substitua um único ponto de falha por outro e que keepalived seja ótimo para isso. Tão pouco motivo para não fazer isso se você estiver usando um proxy.

Então, mais algumas coisas no ProxySQL.
http://anothermysqldba.blogspot.com/2018/05/proxy-mysql-haproxy-proxysql-keepalived.html

terça-feira, 20 de março de 2018

MySQL 8.0.4rc

O MySQL 8.0.4rc foi lançado como " Antecipação de Disponibilidade Geral: 2018-03-19 ". 

Eu decidi dar uma olhada rápida e anotar minhas impressões aqui. Algumas dessas notícias são novidades para muitos, pois esse lançamento foi falado por algum tempo, mas adicionei meus pensamentos de qualquer maneira ...

A primeira coisa que notei foi uma simples questão de usar o cliente mysql atualizado. Minha versão mais antiga ainda estava no meu caminho, que resultou em

ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded
Tão simples de corrigir e certifique-se de que está usando o cliente mysql atualizado válido. É claro que existiram outras opções, como alterar o plugin de autenticação de volta para mysql_native_password, mas por que incomodar, use o método seguro. Este é um aprimoramento muito bom para a segurança, então não fique chocado se você tiver alguns problemas de conexão enquanto você obtém suas conexões usando este método mais seguro.


Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 36
Server version: 8.0.4-rc-log

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Então, o primeiro aprimoramento muito legal ...

mysql> show create table user\G
*************************** 1. row ***************************
Tabela: usuário
Criar tabela: CREATE TABLE `user` (
`Host` char (60) COLLATE utf8_bin NOT NULL DEFAULT '',
`User` char (32) COLLATE utf8_bin NOT NULL DEFAULT '',
`Select_priv` enum ('N', 'Y') CONFIGURAÇÃO DO CARÁTER utf8 NÃO NULL DEFAULT 'N',
`Insert_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Update_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Delete_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Create_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Drop_priv` enum ('N', 'Y') CONFIGURAÇÃO DO CARÁTER utf8 NÃO NULL DEFAULT 'N',
`Reload_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Shutdown_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Process_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`File_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Grant_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`References_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Index_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Alter_priv` enum ('N', 'Y') CONFIGURAÇÃO DO CARÁTER utf8 NÃO NULL DEFAULT 'N',
`Show_db_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Super_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Create_tmp_table_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Lock_tables_priv` enum ('N', 'Y') CONFIGURAÇÃO DO CARÁTER utf8 NÃO NULL DEFAULT 'N',
`Execute_priv` enum ('N', 'Y') CONFIGURAÇÃO DO CARÁTER utf8 NÃO NULL DEFAULT 'N',
`Repl_slave_priv` enum ('N', 'Y') CONFIGURAÇÃO DO CARÁTER utf8 NÃO NULL DEFAULT 'N',
`Repl_client_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Create_view_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Show_view_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Create_routine_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Alter_routine_priv` enum ('N', 'Y') CONFIGURAÇÃO DO CARÁTER utf8 NÃO NULL DEFAULT 'N',
`Create_user_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Event_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Trigger_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Create_tablespace_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`ssl_type` enum ('', 'ANY', 'X509', 'ESPECIFICADO') CHARACTER SET utf8 NOT NULL DEFAULT '',
`ssl_cipher` blob NÃO NULL,
`x509_issuer` blob NOT NULL,
`x509_subject` blob NOT NULL,
`max_questions` int (11) não assinado NOT NULL DEFAULT '0',
`max_updates` int (11) não assinado NOT NULL DEFAULT '0',
`max_connections` int (11) não assinado NOT NULL DEFAULT '0',
`max_user_connections` int (11) não assinado NOT NULL DEFAULT '0',
`plugin` char (64) COLLATE utf8_bin NOT NULL DEFAULT 'caching_sha2_password',
texto `authentication_string` COLLATE utf8_bin,
`password_expired` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`password_last_changed` timestamp NULL DEFAULT NULL,
`password_lifetime` smallint (5) não assinado DEFAULT NULL,
`account_locked` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Create_role_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Drop_role_priv` enum ('N', 'Y') CHARACTER SET utf8 NÃO NULL DEFAULT 'N',
`Password_reuse_history` smallint (5) não assinado DEFAULT NULL,
`Password_reuse_time` smallint (5) não assinado DEFAULT NULL,
CHAVE PRIMÁRIA (`Host`,` Usuário ')
) / *! 50100 TABLESPACE `mysql` * / ENGINE = InnoDB DEFAULT CHARSET = utf8 COLLATE = utf8_bin STATS_PERSISTENT = 0 COMMENT = 'Usuários e privilégios globais'
1 linha no set (0,00 seg)

A tabela de usuários do Yep é InnoDB e possui TableSpace próprio.

Com a adição do novo Dicionário de dados, você notará as alterações de Information_schema.
Então, como um exemplo simples, a tabela de colunas historicamente não foi uma visão, mas agora mudou, juntamente com muitos outros como você pode ver através da URL fornecida.


mysql> show create table COLUMNS \G
*************************** 1. row ***************************
Vista: COLUMNAS
Criar vista: CREATE ALGORITHM = DEFINER DESFASTADO = `mysql.infoschema` @` localhost`

Isso parece ser feito para ajudar o desempenho com o information_schema, mas removendo as criações da tabela temporária por consultas no information_schema.

O capítulo 14 da documentação entra em profundidade sobre isso, a URL fornecida abaixo irá ajudá-lo a encontrar mais informações e as futuras postagens de blog podem afetar mais isso.
O Dicionário de Dados mencionado anteriormente também conduz à capacidade de ter declarações atômicas de linguagem de definição de dados (DDL) ou DDL atômica.


Isso provavelmente tropeçará algumas transações se você não analisar suas consultas antes de configurar a replicação para uma nova instância do MySQL 8.0. Eu digo isso por causa de como o manuseio da manutenção da tabela pode ser afetado. Se você escrever consultas limpas com "If Exists", não será um grande problema. No geral, é um recurso mais baseado em transações que protege suas opções de dados e reversão.


O gerenciamento de recursos parece muito interessante e vou ter que levar mais tempo para se concentrar nisso, pois é um novo recurso com o MySQL 8.0. Em geral, você pode atribuir grupos e não precisa mais definir a prioridade da consulta, mas deixar seu agrupamento definir como uma consulta deve se comportar e os recursos atribuídos a ela.

mysql> select @@version;
+------------+
| @@ version |
+ ------------ +
| 5.7.16-log |
+ ------------ +
1 linha no set (0,00 seg)

mysql> desc INFORMATION_SCHEMA.RESOURCE_GROUPS;
ERRO 1109 (42S02): tabela desconhecida 'RESOURCE_GROUPS' em information_schema

mysql> selecione @@ versão;
+ -------------- +
| @@ version |
+ -------------- +
| 8.0.4-rc-log |
+ -------------- +
1 linha no set (0,00 seg)

mysql> desc INFORMATION_SCHEMA.RESOURCE_GROUPS;
+ ------------------------ + ----------------------- + ------ + ----- + --------- + ------- +
| Campo | Digite | Nulo | Chave | Padrão | Extra |
+ ------------------------ + ----------------------- + ------ + ----- + --------- + ------- +
| RESOURCE_GROUP_NAME | varchar (64) | NO | | NULL | |
| RESOURCE_GROUP_TYPE | enum ('SYSTEM', 'USUÁRIO') | NO | | NULL | |
| RESOURCE_GROUP_ENABLED | tinyint (1) | NO | | NULL | |
| VCPU_IDS | blob | SIM | | NULL | |
| THREAD_PRIORITY | int (11) | NO | | NULL | |
+ ------------------------ + ----------------------- + ------ + ----- + --------- + ------- +
5 linhas no conjunto (0,00 seg)


Mais informações sobre o cache do pool de buffer InnoDB em relação aos índices que estão nele estão agora disponíveis.

mysql> desc INFORMATION_SCHEMA.INNODB_CACHED_INDEXES ;
+----------------+---------------------+------+-----+---------+-------+
| Campo | Digite | Nulo | Chave | Padrão | Extra |
+ ---------------- + --------------------- + ------ + --- - + --------- + ------- +
| SPACE_ID | int (11) não assinado | NO | | | |
| INDEX_ID | bigint (21) não assinado | NO | | | |
| N_CACHED_PAGES | bigint (21) não assinado | NO | | | |
+ ---------------- + --------------------- + ------ + --- - + --------- + ------- +
3 linhas no conjunto (0,01 seg)


Se você não tiver certeza do que configurar o pool de buffer InnoDB, log_sizes ou método de descarga, o MySQL irá configurá-los agora com base na memória disponível.

innodb_dedicated_server

[mysqld]
innodb-dedicated-server=1

mysql> selecione @@ innodb_dedicated_server;
+ --------------------------- +
| @@ innodb_dedicated_server |
+ --------------------------- +
| 1 |
+ --------------------------- +

Este teste simples define meu innodb_buffer_pool_size para 6GB, por exemplo, quando o padrão é 128MB.

Numerosas adições JSON foram feitas, bem como mudanças regulares de expressão. Ambos os quais parecem promissores.

O único aprimoramento de replicação por esta versão em si é que agora é compatível com registro binário de atualizações parciais para documentos JSON usando um formato binário compacto.

No entanto, em geral, muitos recursos estão disponíveis (você pode ler tudo sobre eles aqui ), um dos quais (eu queria que meu cliente tivesse amanhã) é um filtro de replicação por canal.
Minha instância de teste já tinha logs binários ativados, mas eles estão ativados por padrão agora, juntamente com a base de tabela baseada em arquivos baseados em arquivos e informações de escravos (grande fã de ter essa transação por padrão)

No geral, tenha em mente que esta é apenas uma primeira olhada neste lançamento e pensamentos de muito alto nível, muitas outras mudanças existem. Olhar para outras postagens de blog sobre este lançamento, bem como o manual e as notas de versãotambém ajudarão. Certamente, baixe e revele como parece ser muito promissor para os pontos de vista de administração, segurança e replicação.