Mysql: replica circolare master-master

Alcuni appunti presi http://www.azns.it/2011/04/13/due-server-mysql-in-replica-circolare-master-master/ per configurare un mysql in replica circolare master-master in modo da scalare.

Configurazione server 1:

/etc/mysql/conf.d/replica.cnf
[mysqld]
bind-address			= 0.0.0.0
server-id                       = 10
auto_increment_increment        = 10
auto_increment_offset           = 1
master-host                     = server2.dominio.local
master-user                     = replicauser
master-password                 = replicapass
log_bin				= /var/log/mysql/mysql-bin.log
binlog_ignore_db		= mysql

Configurazione server 2:

/etc/mysql/conf.d/replica.cnf
[mysqld]
bind-address			= 0.0.0.0
server-id                       = 20
auto_increment_increment        = 10
auto_increment_offset           = 2
master-host                     = server1.dominio.local
master-user                     = replicauser
master-password                 = replicapass
log_bin				= /var/log/mysql/mysql-bin.log
binlog_ignore_db		= mysql

Riavviare mysql su entrambi i server e impartire il seguente comando da console:

CREATE USER 'replicauser'@'%.san.local' IDENTIFIED BY 'replicapass';
GRANT replication slave ON *.* TO 'replicauser'@'%.dominio.local';
START slave;
SHOW slave STATUS\G;

Ottimizzare mysql per un sistema con 256MByte di ram

Alcuni appunti su come ho ottimizzato mysql sul mio miniserverino domestico debian con 256MByte di ram

Modificare /etc/mysql/my.cnf e modificare come segue:

skip-innodb                       # Disabilita il supporto a innodb
query_cache_limit       = 1M      # Valore da 1M a 4M, abbassare se swappa
query_cache_size        = 8M      # Rapporto tra quantità di ram e 16 (256MB/16), il valore calcolare sarebbe stato 16 ma io l'ho comunque abbassato

Ho fatto riferimento alla guida riportata qui sotto dove vengono spiegati molti altri parametri da cambiare. Io cambiando i tre valori qui sopra sono riuscito a dimezzare l’utilizzo della ram, da 100MB circa, a 48MB.

http://www.valent-blog.eu/2009/02/16/ottimizzazione-di-mysql/

L’oggetto del mistero svelato

Nel’ormai vecchio post Asus WL500gP v2 …… addio !!! dichiaravo di avere sostituito l’Asus wl-500gp v2, su cui appoggiavano vari servizi della rete casaligna, in favore di un altro oggetto da me ambito da diverso tempo, lasciando l’identità di quest ultimo avvolta nel mistero.

Purtroppo sommerso da impegli familiari e lavorativi non ho potuto fare luce sull’identità del oggetto misterioso e soltanto adesso ho trovato un po di tempo per dare qualce spiegazione.

L’oggetto è un eBox-3853, distribuito da Sintekno. L’ho acquistato su eBay completo di harddisk da 80GByte e doppio alimentatore per 110 €. Direi un prezzo molto interessante tenuto conto che nuovo si aggira intorno ai 250 € più iva (penso senza harddisk).

Si distingue per essere un mini pc fanless a basso consumo di cui mi ha stupito molto il case completamente in alluminio che appare di una solidità veramente unica.

Continue reading “L’oggetto del mistero svelato”

Mysql: query con selezione casuale e ordine nei raggruppamenti

Mysql mette a disposizione la funzione rand() la quele genera un valore in virgola mobile con risultati che possono variare da 0 a 1.

La funzione può essere utilizzata anche per fare estrarre a una SELECT dei record in ordine casuale.

Nel seguente esempio abbiamo una tabella con la seguente struttura:

CREATE TABLE `province_comuni` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`provincia` VARCHAR( 2 ) NOT NULL ,
`comune` VARCHAR( 50 ) NOT NULL
)

da cui vogliamo estrarre 10 comuni casualmente e lo faremo con la seguente query:

SELECT comune
FROM province_comuni
  ORDER BY rand( )
  LIMIT 10

Volendo estrarre casualmente 10 comuni di 10 province diverse anch’esse estratte accaso potremo pensare erroneamente che la seguente query possa funzionare:

SELECT comune, provincia
  FROM province_comuni
  GROUP BY provincia
  ORDER BY rand( )
  LIMIT 10

questa raggruppa per provincia le quali vengono estratte a caso ma i comuni di ognuna d essa manterranno un ordinamento non casuale, questo perché nella SELECT viene eseguito prima il GROUP BY e soltanto dopo l’ORDER BY.
Il problema si risolve facendo prima una SELECT ordinata a due livelli, per provincia e per caso (ORDER BY provincia, rand() )  sulla quale poi eseguiremo un’ulteriore SELECT raggruppando il tutto per provincia e ordinando in modo random:

SELECT *
  FROM (
    SELECT *
      FROM province_comuni
      ORDER BY provincia, rand( )
    ) AS tmp_rand
  GROUP BY provincia
  ORDER BY rand( )
  LIMIT 10

Eseguire una query mysql contenente totali, subtotali e totale generale

E’ possibile estrarre in una unica query totali e subtotali utilizzando l’operatore WITH ROLLUP.  I campi di cui viene mostrato il subtotale vengono riportati con valore null.

Di seguito un esempio che recupera le visite del blog nel mese di maggio suddivise per os e browser con totale generale e subtotale per os.

SELECT os, browser, COUNT( * )
FROM `wp_statpress`
WHERE os <> ''
AND browser <> ''
AND DATE >= "20090501"
AND DATE <= "20090531"
GROUP BY os, browser
WITH ROLLUP
os browser count( * )
Debian Linux Epiphany 2
Debian Linux Firefox 3 44
Debian Linux Iceweasel 209
Debian Linux Internet Explorer 7 3
Debian Linux Links 1
Debian Linux NULL 259
iPhone Safari 20
iPhone NULL 20
Linux Chrome 2
Linux Epiphany 2
Linux Firefox 11
Linux Firefox 2 36
Linux Firefox 3 335
Linux Generic Gecko 26
Linux Iceweasel 2
Linux Konqueror 16
Linux Mozilla Minefield 5
Linux Opera 20
Linux Safari 1
Linux Thunderbird 159
Linux NULL 615
Mac OS X Firefox 2 1
Mac OS X Firefox 3 151
Mac OS X Opera 2
Mac OS X Safari 154
Mac OS X NULL 308
Suse Linux Firefox 3 27
Suse Linux SeaMonkey 1
Suse Linux NULL 28
Symbian Safari 13
Symbian NULL 13
Ubuntu Linux Firefox 2 37
Ubuntu Linux Firefox 3 1058
Ubuntu Linux Mozilla Minefield 2
Ubuntu Linux NULL 1097
Windows 2000 Firefox 2 3
Windows 2000 Firefox 3 2
Windows 2000 Internet Explorer 5 4
Windows 2000 Internet Explorer 6 67
Windows 2000 Opera 4
Windows 2000 NULL 80
Windows 95 Internet Explorer 4 341
Windows 95 Internet Explorer 5 4
Windows 95 NULL 345
Windows CE Internet Explorer 4 1
Windows CE Internet Explorer 6 2
Windows CE NULL 3
Windows ME Internet Explorer 6 9
Windows ME NULL 9
Windows NT 4 Chrome 2
Windows NT 4 Firefox 3 68
Windows NT 4 Internet Explorer 1
Windows NT 4 Internet Explorer 5 2
Windows NT 4 Internet Explorer 6 3
Windows NT 4 Internet Explorer 8 22
Windows NT 4 Opera 1
Windows NT 4 NULL 99
Windows Server 2003 Firefox 3 17
Windows Server 2003 Internet Explorer 6 18
Windows Server 2003 Internet Explorer 7 51
Windows Server 2003 SeaMonkey 1
Windows Server 2003 NULL 87
Windows Vista Chrome 48
Windows Vista Firefox 2 11
Windows Vista Firefox 3 403
Windows Vista Internet Explorer 7 87
Windows Vista Internet Explorer 8 65
Windows Vista Safari 2
Windows Vista NULL 616
Windows XP Chrome 78
Windows XP Firefox 4
Windows XP Firefox 2 357
Windows XP Firefox 3 1817
Windows XP Generic Gecko 1
Windows XP Internet Explorer 6 3123
Windows XP Internet Explorer 7 780
Windows XP Internet Explorer 8 140
Windows XP K-Meleon 1
Windows XP Opera 144
Windows XP Thunderbird 28
Windows XP NULL 6473
NULL NULL 10052
os browser count( * )
Debian Linux Epiphany 2
Debian Linux Firefox 3 44
Debian Linux Iceweasel 209
Debian Linux Internet Explorer 7 3
Debian Linux Links 1
Debian Linux NULL 259
iPhone Safari 20
iPhone NULL 20
Linux Chrome 2
Linux Epiphany 2
Linux Firefox 11
Linux Firefox 2 36
Linux Firefox 3 335
Linux Generic Gecko 26
Linux Iceweasel 2
Linux Konqueror 16
Linux Mozilla Minefield 5
Linux Opera 20
Linux Safari 1
Linux Thunderbird 159
Linux NULL 615
Mac OS X Firefox 2 1
Mac OS X Firefox 3 151
Mac OS X Opera 2
Mac OS X Safari 154
Mac OS X NULL 308
Suse Linux Firefox 3 27
Suse Linux SeaMonkey 1
Suse Linux NULL 28
Symbian Safari 13
Symbian NULL 13
Ubuntu Linux Firefox 2 37
Ubuntu Linux Firefox 3 1058
Ubuntu Linux Mozilla Minefield 2
Ubuntu Linux NULL 1097
Windows 2000 Firefox 2 3
Windows 2000 Firefox 3 2
Windows 2000 Internet Explorer 5 4
Windows 2000 Internet Explorer 6 67
Windows 2000 Opera 4
Windows 2000 NULL 80
Windows 95 Internet Explorer 4 341
Windows 95 Internet Explorer 5 4
Windows 95 NULL 345
Windows CE Internet Explorer 4 1
Windows CE Internet Explorer 6 2
Windows CE NULL 3
Windows ME Internet Explorer 6 9
Windows ME NULL 9
Windows NT 4 Chrome 2
Windows NT 4 Firefox 3 68
Windows NT 4 Internet Explorer 1
Windows NT 4 Internet Explorer 5 2
Windows NT 4 Internet Explorer 6 3
Windows NT 4 Internet Explorer 8 22
Windows NT 4 Opera 1
Windows NT 4 NULL 99
Windows Server 2003 Firefox 3 17
Windows Server 2003 Internet Explorer 6 18
Windows Server 2003 Internet Explorer 7 51
Windows Server 2003 SeaMonkey 1
Windows Server 2003 NULL 87
Windows Vista Chrome 48
Windows Vista Firefox 2 11
Windows Vista Firefox 3 403
Windows Vista Internet Explorer 7 87
Windows Vista Internet Explorer 8 65
Windows Vista Safari 2
Windows Vista NULL 616
Windows XP Chrome 78
Windows XP Firefox 4
Windows XP Firefox 2 357
Windows XP Firefox 3 1817
Windows XP Generic Gecko 1
Windows XP Internet Explorer 6 3123
Windows XP Internet Explorer 7 780
Windows XP Internet Explorer 8 140
Windows XP K-Meleon 1
Windows XP Opera 144
Windows XP Thunderbird 28
Windows XP NULL 6473
NULL NULL 10052

Per approfondimenti consultare i seguenti link:

fonKounter, contatore e statistiche di accesso per il tuo sito web senza mysql (e installazione su Aruba)

Recentemente realizzando il sito web di un cliente ho avuto la necessita di implementarvi un contatore di accessi con relative statistiche.
Esistono molti prodotti open source di ottimo livello ma la maggior parte necessitano php e mysql lato server per funzionare. Avendo solo a disposizione php dovevo trovare qualcosa di diverso. Dopo un pò di ricerche ho trovato l’ottimo funKounter. Questo non necessita di mysql in quanto archivia i dati di accesso su dei semplici file di testo.

Continue reading “fonKounter, contatore e statistiche di accesso per il tuo sito web senza mysql (e installazione su Aruba)”

Controllare la replica mysql

Dopo diversi problemi con la replica di mysql ho realizzato uno script che una volta inserito nel crontab mi avverte per posta di un eventuale errore

check_mysql_replicate.sh

#!/bin/bash
check_str=`mysql -u user_mysql --password=password_mysql -e "SHOW SLAVE STATUSG" |grep Last_Error | cut -d ':' -f 2 `
check=`echo $check_str | tr -d ' '`
if [ $check ]; then
  echo "                 ATTENZIONE !!!!!"
  echo "POSSIBILE ERRORE NELLA REPLICA DI MYSQL"
  echo
  echo
  echo ERRORE=$check_str
fi