Thursday, April 4, 2013

Setting up MariaDB Galera Cluster from Scratch

Okay, this one is a little fun for the techie crowd out there. Nobody can say this blog isn't eclectic at least.

MariaDB is the new database program from the folks who created MySQL, arguably the most popular database on the planet. It was created when Oracle gained control of MySQL because, well, Oracle. Galera is a multi-master "live" database that sits on top of MariaDB. The instructions on the web for installing Galera that I've been able to find are woefully inadequate, and presume a certain level of "already installed and configured".

This instruction set is designed to walk through the install procedure from start to end. Text written in courier is meant to be typed in the command line.

You're going to want to set up three servers to get this going (this is where VMware is very handy).

1. Install CentOS. I used this image:

But you should go to and pick the proper mirror.
During installation, since this is a net install, use an appropriate location for the url:

When prompted for the type of installation, select "Basic Server". Do NOT select "Database Server" or anything else that might install the MySQL database...that will cause problems. Trust me on this.

2. Create repo files for MariaDB

As root: nano /etc/yum.repos.d/MariaDB.repo
name = MariaDB
baseurl =

rpm --import

3. Create repo files for Percona
nano /etc/yum.repos.d/Percona.repo

name = CentOS $releasever - Percona
enabled = 1
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-percona
gpgcheck = 1

wget -O /etc/pki/rpm-gpg/RPM-GPG-KEY-percona

4. Install Packages
yum install MariaDB-Galera-server galera MariaDB-client nc xtrabackup 

5. Create my.cnf
Below are the defaults that are required to successfully start the cluster.
nano /etc/my.cnf

# this has to be specified for xtrabackup to work
wsrep_provider_options="gcache.size=32G; gcache.page_siz=1G"
# Address of first server started in cluster;
# comment this line out in my.cnf of first server
# This is just an informational string, just make sure
# it matches on all clustered machines
# This is the address of the local machine
# This is just an informational string
# to describe the local machine

Replace <user> and <password> with the appropriate username and password. When configuring the first node, be sure to set up the appropriate user profile and access permissions. After you've set up the first node, the other nodes get the security information automatically. How cool is that? (Be warned: this bit grants access to the database from any machine on the network...replace % with the IP address of an appropriate machine if you don't want that!)
Sign into the local MariaDB:
mysql -u rootCREATE USER 'monty'@'localhost' IDENTIFIED BY 'some_pass';

6. Disable the Firewall
Not the best solution, but the cluster seems to use more than just port 4567. Haven't quite worked this one out yet. Suggestions?
service iptables stop chkconfig iptables off
7. Edit script on all nodes to prevent cluster from erroring out on startup


nano /usr/bin/wsrep_sst_commonReplace
echo "WSREP_SST: $* ($tst)" >>/dev/stderrWith
echo "WSREP_SST: $* ($tst)" >&2
8. Start the Server

For all nodes, start the server as the mysql user: su mysql - 
Don't forget the - at the end! That forces the proper environment. 
First server: mysqld --wsrep_cluster_address=gcomm://
As long as my.cnf is correct (wsrep_cluster_address variable),
you can start other machines with: mysqld

A couple of notes:

Set up the first server following these instructions, get it working, then set up each server in turn, following 1 through 8 again, but making the appropriate mods for each.

Start the first server, let it get to "waiting for connections", then start the other servers.
If you shut down the first server for any reason, when you start it up you must use this:
mysqld --wsrep_cluster_address=gcomm://address_of_another_server

Or you're pooched and will have to shut them all down and start the boot sequence from scratch. Yeah, I made that mistake a few times.

That's it! Kind of. I may have glossed over a couple of points. As I discover problems with these instructions I'll update the post. 

Last, but certainly not least, I can't take credit for these instructions beyond typing them here. Credit goes to John Flaskay, my resident expert-in-everything-linux/security/tcp/etc!

Friday, February 22, 2013

Using a Raspberry Pi as Digital Signage

I developed a digital signage application for my employer some time ago, but we ended up using Mac Mini's at the time. With the advent of the Raspberry Pi computer I thought it might make a good candidate for DS, but I had a heck of a time when it first came out getting any kind of movie playlist working.

I tried VLC, some other media players, trying to find a way to make the built in omxplayer play a playlist, nothing. Nada. Nothing worked. I could not figure out how to make an unattended digital signage device.

So I gave up. For a couple months.

When I decided to revisit the issue, a little research showed that nobody had really solved the playlist issue, so I thought I'd try to find another way around it. And I did.

It was always easy enough to just have a script that plays videos in sequence using omxplayer, however this solution wasn't quite perfect because the stream would have a 1 second pause that would show the desktop while it switched videos. The solution turned out to be simply turning on the screen saver. May sound easy, but it took me a while to figure it out!

So other than a slight pause between videos, this solution works perfectly. Here's the steps to get it going:

WARNING! If you do this, the screen saver will kick in every 1 second of idle time, even if you move the mouse. Make sure you have SSH enabled so you can remote into the system to disable this later if you need to!

1. Set up Raspbian on your Pi device according to their instructions.
2. Make sure you're signed on as pi, not root, then from a command line enter:
sudo apt-get install x11-xserver-utils
mkdir /home/pi/digitalsignage
mkdir /home/pi/digitalsignage/movies
nano /home/pi/digitalsignage/

Here I'm using a python script to use the X11 xset command to turn the screen saver on:

import os,sys,time

def SetScreensaver():
    time.sleep(15) # wait for the system to finish booting
    for x in range(0,5): 

        # try turning it on once every minute for the next 5 
        # minutes just in case!
        os.system('xset -display :0.0 s 1 60 -dpms')

        # The -dpms turns the power save option off
if __name__ == '__main__':

Press CTRL-O [ENTER] and CTRL-X to save and exit.

Then we create the player module:
nano /home/pi/digitalsignage/

Enter this text:
import os,sys,time

def RunPlaylist():
    while 1:
        path    =    '/home/pi/digitalsignage/current.m3u' 

        file    =    open(path,'r')
        files   =    file.readlines()
        for file in files:
            filename = file.strip()
            if '.mp4' in filename:
                os.system('/usr/bin/omxplayer /home/pi/digitalsignage/movies/%s>/dev/null' % filename)

if __name__ == '__main__':

Press CTRL-O [Enter] then CTRL-X to save and exit again.

Next you have to copy your MP4 video files to the /home/pi/digitalsignage/movies folder.
Once done, create the playlist. Let's say for this example we have "video1.mp4" and "weather.mp4", and you've uploaded them to the /home/pi/digitalsignage/movies folder. Type:

nano /home/pi/digitalsignage/current.m3u

Enter the following:

Press CTRL-O [Enter] then CTRL-X to save and exit.

Finally, modify the startup:

crontab -e

And add these two lines to the bottom:

@reboot /usr/bin/python /home/pi/digitalsignage/
@reboot /usr/bin/python /home/pi/digitalsignage/

Press CTRL-O [Enter] then CTRL-X to save and exit.

Then reboot:

sudo shutdown -r now

That's it! When your Pi reboots, it will come up with a full video playlist player and start automatically.

Now, I've actually wrapped some other functionality around it for my employer, such as having a web-based management program that will load new videos to the Pi then restart the playlist, that sort of thing, but if you're looking to set up the playlist functionality this should hopefully help!

Monday, December 31, 2012


This one is so easy it's stupid. It just takes a little prep.

6 chicken breasts
1 bag large shrimp (cooked)
1 green pepper
1 red pepper
1/2 purple onion
1 package thick sliced mushrooms (or slice your own)
Olive oil to taste
Soy sauce to taste
1 tablespoon ground oregano

Cut the chicken into pieces, marinate in olive oil, soy sauce and oregano. Put in the fridge for at least three hours. Do the same thing for the frozen shrimp, though you might want to thaw them in cold water for half an hour first.

Marinate the skewers! I forgot is part and ended up with slightly smoked kabobs :)

Cut the veggies into whatever size pieces you like, then marinate them as well.

Throw some lard or other oil into a wok, and cook the chicken pieces until mostly done.

Assemble the skewers! There's enough veggies to alternate meat, veg, meat, veg, etc...

Toss on the BBQ for 10 to 15 minutes. Depending on the size of your BBQ this might two batches...

We were very, very surprised at how delicious these were. 5 stars.

Wednesday, December 19, 2012

Low Carb Cheesecake

3 packages (1 and 1/2 lbs) cream cheese (room temperature)
4 eggs (preferably room temperature)
1 and 1/2 teaspoon vanilla
1 and 1/2 teaspoon lemon juice
1 and 1/3 cups Splenda
1/4 cup sour cream

1 cup almond meal
2 Tablespoon melted butter
2 Tablespoon sugar equivalent in artificial sweetener

Heat oven to 375 F.

Combine ingredients for crust, and press into the bottom of a springform pan. Bake for 8 to 10 minutes, until fragrant and beginning to brown.

Raise oven heat to 400 F.

Put cream cheese in mixing bowl, and beat until fluffy. Add other ingredients, scraping the bowl and beaters each time (this is very important), fully incorporating each ingredient. When all ingredients are combined, scrape one more time, beat one more minute, and pour mixture into pan over crust.

Put the cheesecake on a sheet pan in case of drippage. After putting the cheesecake in the oven at 400 F, turn the oven down to 200 F. Bake for 60 to 90 minutes, checking often after an hour. When the cake is firm to touch but slightly soft in the center, or the center reaches 155 F, remove from oven.

Tuesday, December 18, 2012

Lets kill cancer!

Say what you will about this appearing on The 600 Club, but the science behind it is solid. How do you kill cancer? STOP EATING CARBS! I'm so sick (pun intended) of seeing friends, family and acquaintances suffer from this modern plague. The drug companies can kiss my ars.

Thursday, November 29, 2012

Read something interesting the other day (over at this site).

If you throw a stone in a pond, the wave travels at a certain speed. If you make a sound in the water, the "wave" travels much, much faster than the wave generated by the stone.

The reason is that the wave created by the stone is a transverse wave; the energy is being passed along at right angles to the direction of the wave, so you get that up and down motion in the wave.

Sound is a compression wave (longitudinal), so the energy is passed along in the direction of the wave, hence it's much faster and more efficient.

What if gravity and light were the same way?

We know how fast light travels (about 300,000Km per second). We used to think gravity didn't have a speed, it was instantaneous. We have now been able to measure gravity, so it does take time, just not very much. They estimate that gravity "waves" travel about 20 billion times faster than the speed of light.

So imagine this if you will: The vacuum of space is actually filled with particles called neutrinos. What if neutrino's were the medium in which these waves travel? Gravity would be a "compression" wave, hence it travels much faster, and light would be a transverse wave, so it's not only much slower, but it would resolve the issue that light is both a particle and a wave that science has been struggling with for a hundred years.

Just a theory right now, but seems to fit a lot of facts, and doesn't "not fit" anything we can find yet.

Mind. Blown.