|  |  |  | #!/bin/bash | 
					
						
							|  |  |  | # forksand-mariadb-setup | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Script template for setting up MySQL compatible MariaDB Cluster | 
					
						
							|  |  |  | # on four nodes: sql1 sql2 sql3 sql4 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # https://mariadb.com/kb/en/library/getting-started-with-mariadb-galera-cluster/ | 
					
						
							|  |  |  | #  | 
					
						
							|  |  |  | # Get repo mirror: | 
					
						
							|  |  |  | # https://downloads.mariadb.org/mariadb/repositories | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | exit 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # As root | 
					
						
							|  |  |  | apt-get install software-properties-common dirmngr | 
					
						
							|  |  |  | apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xF1656F24C74CD1D8 | 
					
						
							|  |  |  | add-apt-repository 'deb [arch=amd64] http://sfo1.mirrors.digitalocean.com/mariadb/repo/10.3/debian stretch main' | 
					
						
							|  |  |  | apt-get update | 
					
						
							|  |  |  | apt-get install mariadb-server | 
					
						
							|  |  |  | apt-get clean | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Set config like here: | 
					
						
							|  |  |  | # https://mariadb.org/installing-mariadb-galera-cluster-on-debian-ubuntu/ | 
					
						
							|  |  |  | # /etc/mysql/my.cnf | 
					
						
							|  |  |  | # ================================================= | 
					
						
							|  |  |  | [galera] | 
					
						
							|  |  |  | # Mandatory settings | 
					
						
							|  |  |  | wsrep_on=ON | 
					
						
							|  |  |  | wsrep_provider=/usr/lib/galera/libgalera_smm.so | 
					
						
							|  |  |  | wsrep_cluster_address="gcomm://10.42.1.171,10.42.1.172,10.42.1.173,10.42.1.174" | 
					
						
							|  |  |  | wsrep_cluster_name="XXX" | 
					
						
							|  |  |  | binlog_format=row | 
					
						
							|  |  |  | default_storage_engine=InnoDB | 
					
						
							|  |  |  | innodb_autoinc_lock_mode=2 | 
					
						
							|  |  |  | wsrep_sst_method=rsync | 
					
						
							|  |  |  | query_cache_size=0 | 
					
						
							|  |  |  | query_cache_type=0 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Allow server to accept connections on all interfaces. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | bind-address=10.42.1.174 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Optional setting | 
					
						
							|  |  |  | #wsrep_slave_threads=1 | 
					
						
							|  |  |  | #innodb_flush_log_at_trx_commit=0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # ================================================= | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | service mysql stop | 
					
						
							|  |  |  | # on just sql1: | 
					
						
							|  |  |  | galera_new_cluster | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # See if the cluster node comes up: | 
					
						
							|  |  |  | mysql -p -u root -e 'SELECT VARIABLE_VALUE as "cluster size" FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME="wsrep_cluster_size"' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Start another node, sql2: | 
					
						
							|  |  |  | service mysql start | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # See if it came up: | 
					
						
							|  |  |  | mysql -p -u root -e 'SELECT VARIABLE_VALUE as "cluster size" FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME="wsrep_cluster_size"' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Then do sql3 sql4 | 
					
						
							|  |  |  | service mysql start | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # See if it came up: | 
					
						
							|  |  |  | mysql -p -u root -e 'SELECT VARIABLE_VALUE as "cluster size" FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME="wsrep_cluster_size"' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ############################################### | 
					
						
							|  |  |  | # run this to lock down: | 
					
						
							|  |  |  | mysql_secure_installation | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ########################################### | 
					
						
							|  |  |  | # If all cluster nodes get shutdown at the same time, the cluster needs to be boot strapped again. | 
					
						
							|  |  |  | # On just one node, the most advanced, if known (e.g. sql1): | 
					
						
							|  |  |  | galera_new_cluster | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # On other nodes sql2 sql3 sql4 | 
					
						
							|  |  |  | service mysql start | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Maybe need on most advanced node: | 
					
						
							|  |  |  | # sed -i -e 's/safe_to_bootstrap: 0/safe_to_bootstrap: 1/g' /var/lib/mysql/grastate.dat | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ########################## | 
					
						
							|  |  |  | # haproxy | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # for code.forksand.com, insert on sql1 (or any of them): | 
					
						
							|  |  |  | # http://galeracluster.com/documentation-webpages/haproxy.html | 
					
						
							|  |  |  | USE mysql; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # This fails. Not a good way to create users either. | 
					
						
							|  |  |  | CREATE USER 'haproxy'@'10.42.1.163' IDENTIFIED BY 'password'; | 
					
						
							|  |  |  | FLUSH PRIVILEGES; | 
					
						
							|  |  |  | SHOW GRANTS FOR 'haproxy'@'10.42.1.163'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # pen proxy instead of haproxy | 
					
						
							|  |  |  | # To run manually: | 
					
						
							|  |  |  | pen -l pen.log -p pen.pid localhost:3306 10.42.1.171:3306 10.42.1.172:3306 10.42.1.173:3306 10.42.1.174:3306 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | useradd pen | 
					
						
							|  |  |  | echo "d /var/run/pen 0755 pen pen -" > /etc/tmpfiles.d/pen.conf | 
					
						
							|  |  |  | systemd-tmpfiles --create | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | mkdir -p /etc/pen | 
					
						
							|  |  |  | cat > /etc/pen/galera.cfg <<EOF | 
					
						
							|  |  |  | server 0 address 10.42.1.171 port 3306 | 
					
						
							|  |  |  | server 2 address 10.42.1.172 port 3306 | 
					
						
							|  |  |  | server 3 address 10.42.1.173 port 3306 | 
					
						
							|  |  |  | server 4 address 10.42.1.174 port 3306 | 
					
						
							|  |  |  | debug 1 | 
					
						
							|  |  |  | EOF | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | cat > /lib/systemd/system/pen-galera.service <<EOF | 
					
						
							|  |  |  | [Unit] | 
					
						
							|  |  |  | Description=Pen load balancer (galera) | 
					
						
							|  |  |  | After=network.target | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [Service] | 
					
						
							|  |  |  | User=pen | 
					
						
							|  |  |  | Type=forking | 
					
						
							|  |  |  | PIDFile=/var/run/pen/galera.pid | 
					
						
							|  |  |  | ExecStart=/usr/bin/pen -u pen -C /var/run/pen/galera.ctl -F /etc/pen/galera.cfg -p /var/run/pen/galera.pid 127.0.0.1:3306 | 
					
						
							|  |  |  | Restart=on-failure | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [Install] | 
					
						
							|  |  |  | WantedBy=multi-user.target | 
					
						
							|  |  |  | EOF | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | systemctl restart pen-galera | 
					
						
							|  |  |  | systemctl enable pen-galera.service | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ################ | 
					
						
							|  |  |  | # XXX fix on sql1 sql2 sql3 sql4 | 
					
						
							|  |  |  | # For firewall, need to open port 4444 for rsync when cluster node needs to sync up. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | -A INPUT -p tcp --dport 4444 -j ACCEPT | 
					
						
							|  |  |  | 
 |