Several months ago, I started a little project at work, called Mockload. It
started as a fun way of using the MySQL Proxy, to test our
monitoring agent, as well as the rules engine and graphs on the
Service Manager.
Why?
I needed a tool that would be easy to use, and improve over time.
And that it would allow our QA team to send custom values to the
service manager. The goal was to pretend having some very busy
MySQL servers.
And what better tool, than the MySQL Proxy itself to pretend
being a busy MySQL Server!
The way our agent collects the MySQL related data, is by issuing
different sql queries. So, I thought that I could have a MySQL
proxy instance in between …
A couple of weeks ago I wrote a lua script to use with the MySQL Proxy
that transforms the Proxy into a key=>value lookup
dictionary.
But I couldn't just stop there. So I decided to add replication
to it :).
The basic idea is that you have one proxy that acts like a
master, it can handle all write/read operations. Once it receives
a write query, it will send that query to the slave proxy
instances, and after the last slave gets the query, the master
will return a confirmation to the mysql client.
And of course, you send your read queries to the slave proxy
instances.
Show me the code.
It is available on the …
There are times when you don't need a MySQL server to handle your
queries, this could come handy when you are automating tests, or
writing interesting Lua scripts.
Yes, you can use the MySQL Proxy for this as well. And have it pretend
to be a MySQL server.
Today we'll focus on a simple implementation. We will handle an
initial connection, a SHOW DATABASES query and the exit (QUIT)
command.
You can see all the hooks that the proxy handles on this Lua
script written by Giuseppe
Connecting to a server. …
While I hope the MySQL Proxy never crashes, it will happen, there
will be some strange (or maybe not so strange) usage or workload
and it will die.
To avoid this, you could decide not to use it, or maybe you could
use something like Linux HA to have more than one MySQL Proxy running
at all times. Or you could use one of the new features that comes
with the version 0.7.0.
What is it?
We now have a --keepalive option. As the name indicates, if the
mysql proxy process dies/crashes, it will come back up in a few
seconds (less than 5 seconds).
How does it work?
If you start the MySQL Proxy with the keepalive option, there
will be two processes with the same name. One will be very small,
about 600KB. and then you …
What I really like about having Lua and MySQL Proxy together is
that it turns out to be very flexible, you can have the proxy do
all kinds of things. And the last thing I made the MySQL Proxy do
is to act like memcached.
Well, maybe not, but it handles key => value pairs now
:P
What does it do?
It handles 5 basic query types:
mysql> INSERT "key" = "value";
Very simple, insert a key => value pair on a
proxy.global.db
table, if there is already a value
for that query, it will overwrite it.
mysql> SELECT "key";
It retrieves the value for the specified key.
mysql> DELETE "key";
Deletes the key …
We have an Admin plugin for the MySQL Proxy, but people started
asking how to use it. I only found one example,
thanks to Giuseppe, but people wanted more.
While the admin plugin is somehow limited, it already provides
some nice features. One of the use cases is to give access to
information to only authorized users. The Admin plugin uses its
own username and password to authenticate users. This is not
related to any user on your MySQL server.
The example.
I went ahead and put two scripts together in about an hour. They
are basic, but should give you more of an idea of what you can
do.
Number of queries …
After I wrote about reading a master.info file using the MySQL
Proxy, I went ahead and added the missing piece. Creating a master.info file using the MySQL
Proxy.
A bug?
As I went back to lib/mysql-proto.c looking for a function that I
could duplicate and modify to add the to_masterinfo_string()
function, I realized that I missed a few master_ssl_* fields. It
turned out that I was not exporting all the fields from the
master.info file.
This time, the bug fix was easy enough. After modifying the test case to account for the
missing fields, I added a …
After I wrote about a new feature on MySQL Proxy that helps you read
master.info files, I thought that showing an example could come
handy.
You can find the complete file on the MySQL Forge and once I have a test case for this
script, it will be available on Launchpad.
Explaining the code.
You can see at the top I have
local proto = assert(require("mysql.proto"))
This is important, as it makes the from_masterinfo_string()
function available for use.
I also included a function called get_command(), which is a
modification of code found …
This time I'll write about a nice featured we now have on the
MySQL Proxy.
Parsing master.info
The master.info is a file that the MySQL server creates when you
are running a slave server, you can read the manual for more details.
And now you can use the MySQL Proxy to read that file and parse
the data from it.
Background
It all started when Jan emailed the proxy discuss mailing with
the Changelog from 0.6.1 to 0.7.0. The part that
got my attention was:
"...
Core
[skip]
* added parser for master.info files"
... "
As I was working on a Lua script that did some simulation, I
…
Thanks to Kay, it is now much easier to contribute to the
MySQL
Proxy project. And it turns out you don't have to be a super
C developer to help out.
Yes, you may think, you can report bugs, help answering questions, even submit Lua scripts. But there is another way you can
contribute.
Blueprints
You can check out the blueprints for the Proxy and pick one that seems
"simple" to implement. That's what I did. I went there and picked
" …