Galera Cluster (MariaDB)

"lynx https://mariadb.com/kb/en/mariadb/mariadb-galera-cluster-10019-release-notes/"
"lynx https://downloads.mariadb.org/"
"lynx https://downloads.mariadb.org/mariadb-galera/10.0/"

"wget http://mirror.23media.de/mariadb/mariadb-galera-10.0.19/bintar-linux-x86_64/mariadb-galera-10.0.19-linux-x86_64.tar.gz"
"tar -xzf mariadb-galera-10.0.19-linux-x86_64.tar.gz"
"mv mariadb-galera-10.0.19-linux-x86_64 /usr/local"
"chown -R mysql:mysql /usr/local/mariadb-galera-10.0.19-linux-x86_64"
"ln -s /usr/local/mariadb-galera-10.0.19-linux-x86_64 /usr/local/mysql"
"ln -s /usr/local/mariadb-galera-10.0.19-linux-x86_64 /usr/local/mariadb"
"ln -s /usr/local/ssl/lib/libssl.so.1.0.0 /usr/lib64/libssl.so.6"
"ln -s /usr/local/ssl/lib/libcrypto.so.1.0.0 /usr/lib64/libcrypto.so.6"

Auf allen Nodes.
"vi /etc/my.cnf" ->
	[mysqld]
	binlog_format=ROW
	default-storage-engine=innodb
	innodb_autoinc_lock_mode=2
	query_cache_size=0
	query_cache_type=0
	bind-address=0.0.0.0
	#galera settings
	wsrep_provider=/usr/local/mysql/lib/libgalera_smm.so
	wsrep_cluster_name="my_wsrep_cluster"
	#wsrep_cluster_address="gcomm://"
	wsrep_cluster_address="gcomm://172.17.190.104,172.17.190.105"
	wsrep_sst_method=rsync
	wsrep_sst_auth=root:PASSWORT
	wsrep_node_address="172.17.190.105"
	wsrep_node_name="suse-test-2"

"cd /usr/local/mysql"
"scripts/mysql_install_db --user=mysql"

Für den ersten Inital Node:
	"/usr/local/mariadb/bin/mysql mysql -p"
	"mysql> UPDATE user SET password = password('neues_password') WHERE user = 'root'; "
	"mysql> GRANT ALL PRIVILEGES ON *.* TO root@localhost IDENTIFIED BY "passwort"; "
	"mysql> GRANT ALL PRIVILEGES ON *.* TO root@172.17.190.8 IDENTIFIED BY "passwort"; "
	"mysql> GRANT ALL PRIVILEGES ON *.* TO root@loadbalancer.moore.corp IDENTIFIED BY "passwort";
	"mysql> UPDATE `mysql`.`user` SET `Grant_priv`='Y' WHERE  `Host`='172.17.190.8' AND `User`='root'; "
	"mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'172.17.190.8' WITH GRANT OPTION; "
	
Für die restlichen Nodes ist das nicht notwendig da die User Daten repliziert werden.
	
#########
Auf der ersten Inital Node:
	"/usr/local/mysql/bin/mysqld --wsrep-new-cluster --wsrep-cluster-address="gcomm://" --user=mysql &"
Auf den restlichen Nodes:
	"/usr/local/mysql/bin/mysqld --user=mysql &"
Falls ein neuer frischer Node zum bestehenden Verbund hinzukommt, einfach
	"/usr/local/mysql/bin/mysqld --user=mysql &"
	das wäre alles. User und Datenbanken werden dann automatisch repliziert.
#########

"mkdir /var/run/mysql/"
"ln -s /tmp/mysql.sock /var/run/mysql/mysql.sock"

"/usr/local/mariadb/bin/mysql mysql -pPASSWORT"

DB Ebene:
MariaDB [mysql]> show databases;
MariaDB [mysql]> SHOW STATUS LIKE 'wsrep_%';

Prüfen ob Cluster in Funktion
mysql -u root -p -e 'SELECT VARIABLE_VALUE as "cluster size" FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME="wsrep_cluster_size"'
+--------------+
| cluster size |
+--------------+
| 1            |
+--------------+
Wenn der zweite Node online ist
+--------------+
| cluster size |
+--------------+
| 2            |
+--------------+


###############################################################################
Replication Test:
Auf Node 1:
mysql -u root -p -e 'CREATE DATABASE playground;'
mysql -u root -p -e 'CREATE TABLE playground.equipment ( id INT NOT NULL AUTO_INCREMENT, type VARCHAR(50), quant INT, color VARCHAR(25), PRIMARY KEY(id));'
mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("slide", 2, "blue")'

Auf Node 2:
mysql -u root -p -e 'SELECT * FROM playground.equipment;'
mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");'

Auf Node 1:
mysql -u root -p -e 'SELECT * FROM playground.equipment;'
###############################################################################
Start Up Prozedur:

"mkdir /var/run/mysql/"
"ln -s /tmp/mysql.sock /var/run/mysql/mysql.sock"

Sollte der Cluster neu gestartet werden, das heiß es läuft kein Node dann:
	"/usr/local/mysql/bin/mysqld --wsrep-new-cluster --wsrep-cluster-address="gcomm://" --user=mysql &"
Für die restlichen bzw. anderen Nodes:
	"/usr/local/mysql/bin/mysqld --user=mysql &"
	
Dei Syncronisationphase kann bis zu 10m dauern.

###############################################################################
Notafall. Ein Cluster Node fällt aus.
"vi /etc/my.cnf" -> ggf. auskommentieren und die restlichen alle Nodes eintragen.
	#wsrep_cluster_address="gcomm://"
	wsrep_cluster_address="gcomm://172.17.190.104,172.17.190.105"
"/usr/local/mysql/bin/mysqld --user=mysql &"

###############################################################################
Commands

/usr/local/mysql/bin/garbd -a gcomm://172.17.190.104?pc.wait_prim=no -g usefull_name
cat /usr/local/mariadb-galera-10.0.19-linux-x86_64/data/gvwstate.dat
cat /usr/local/mariadb-galera-10.0.19-linux-x86_64/data/grastate.da

mysql> SHOW FULL PROCESSLIST; 
mysql> SHOW PROCESSLIST; 
mysql> SHOW ENGINE INNODB STATUS; 
mysql> SHOW STATUS LIKE 'wsrep%';  
mysql> status;
mysql> SHOW GLOBAL VARIABLES LIKE 'wsrep_pro%';
mysql> SHOW GLOBAL STATUS LIKE 'wsrep_cluster_%';

/usr/local/mysql/bin/garbd -a gcomm://172.17.190.105:4567 -g my_wsrep_cluster -l /tmp/1.out -d = Node joinen
###############################################################################
Load Balancer
IPVS sieh IPVS Doku

"echo 1 > /proc/sys/net/ipv4/ip_forward"
"sysctl -w net.ipv4.conf.all.accept_redirects=0"
"sysctl -w net.ipv4.conf.lo.arp_announce=2"
"sysctl -w net.ipv4.vs.conntrack=1"
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE"
"echo 1 > /proc/sys/net/ipv4/vs/expire_quiescent_template"
	ggf. "iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 172.17.190.38"

"ipvsadm -A -t 172.17.190.39:3306"
"ipvsadm -a -t 172.17.190.39:3306 -r 172.17.190.36:3306 -m"
"ipvsadm -a -t 172.17.190.39:3306 -r 172.17.190.37:3306 -m"
"ipvsadm -a -t 172.17.190.39:3306 -r 172.17.190.38:3306 -m"

#Test von einem Client aus.
"mysql -h 172.17.190.39 -u root -pPASSWORT -e 'SELECT * FROM playground.equipment;'"

###############################################################################
SQL Trace Logging

ggf. "vi /etc/my.cnf" ->
	log-error=/var/log/mysqld.log
	general-log
	general-log-file=queries.log
	log-output=file,tables
	log-basename=system

"SHOW GLOBAL VARIABLES LIKE '%log%'; "
"SET GLOBAL sql_log_off = 1; "
"SET GLOBAL log_output = 'FILE,TABLE'; "
"SELECT * FROM mysql.general_log; "oder  "mysql -u root -pPASSWORT -e 'SELECT * FROM mysql.general_log\G' "
	SELECT * FROM mysql.general_log ORDER BY event_time DESC ;
	SELECT * FROM mysql.slow_log;

ggf. 
	SET GLOBAL general_log = 'OFF';
	ALTER TABLE mysql.general_log ENGINE = MyISAM;
	ALTER TABLE mysql.slow_log ENGINE = MyISAM;
	SET GLOBAL general_log = @old_log_state; oder SET GLOBAL general_log = 'ON'; SET GLOBAL sql_log_off = 1; 

Die Logs können leider nicht Galera technisch repliziert werden, da sie auf CSV bzw. MyIsam basieren.
##############################################################################################################################################################
Galera Arbitrator (http://galeracluster.com/documentation-webpages/arbitrator.html)

##############################################################################################################################################################
Troubleshoorting

Fehlermeldung:
WSREP has not yet prepared node for application use

Lösung:
SET GLOBAL wsrep_provider_options='pc.bootstrap=yes';

##
MyISAM Tabllen werd