MySQL Fabric使用介绍01——高可用性HA
MySQL Fabric是MySQL推出的用来管理一“群”服务器的系统,可以非常简单地用来部署管理MySQL的数据分片(Shading)和高可用性(High Availability)功能。
在这里首先介绍一下高可用性功能的部署和使用。这里用Windows平台的MySQL为例。
一、需要的软件
使用MySQL的Fabric功能需要下载如下软件:
1、 MySQL server 5.6.10以后的版本,Fabric功能需要GTID来实现。
http://dev.mysql.com/downloads/mysql/
为了在本机部署方便,推荐使用压缩版的MySQL,解压后简单配置即可使用,并且安装位置灵活。
2、 MySQL Connectors
目前Connector/Python 1.2.1以后的版本和Connector/J 5.1.27以后的版本
支持MySQL Fabric,
本例使用Connector/Python
http://dev.mysql.com/downloads/connector/python/
选择下载Windows (Architecture Independent), MSI Installer Python 3.4 即可
3、 MySQL Utilities
MySQL Fabric包含在MySQL Utilities里面,因此需要下载MySQL Utilities
http://dev.mysql.com/downloads/utilities/
4、 Python
需要使用Python2.6之后的版本,在Windows使用Python通常需要安装Python
https://www.python.org/downloads/
本例使用的是Python3.4.1
二、软件安装
Windows的软件安装都比较简单,除了MySQL Server以外按照安装向导一直下一步即可,需要注意记住安装路径就可以了。
MySQL Server由于是压缩版的,各位可以把它解压在任何路径下。因为MySQL Fabric是用来管理服务器群的系统,在本例中我们需要使用4个MySQL Server实例来模拟4台服务器进行演示,因此将MySQL Server解压后,需要将里面的data文件夹复制3份放到不同的路径下面,详细设置请参照下一节。
三、系统环境设置
1、 文件设置
MySQL Fabric构成里面需要一个Fabric管理节点,官方称之为backing store.,另外需要3个MySQL Server服务器用来构成一主二从的高可用构成,一主二从主要利用了MySQL的复制功能,如果对MySQL的复制功能不了解,请参照
http://dev.mysql.com/doc/refman/5.6/en/replication.html
因此各个文件的路径如下:
1)Fabric管理节点(backing store)C:\DEMO\Fabric\MGM
2)将前一节提到的data文件夹分别复制到下面3个路径,同时分别做成3个my.ini与data文件夹放在同一路径下
MySQL Server服务器1的数据文件 C:\DEMO\Fabric\HA1\MySQL11\data
MySQL Server服务器2的数据文件 C:\DEMO\Fabric\HA1\MySQL12\data
MySQL Server服务器3的数据文件 C:\DEMO\Fabric\HA1\MySQL13\data
3)MySQL Utilities的安装路径为C:\MySQLUtilities
4)MySQL Fabric需要一个名为fabric.cfg的设置文件,该文件的路径为
MySQL Utilities的安装路径\etc\mysql 因此本例的路径为
C:\MySQLUtilities\etc\mysql\fabric.cfg
下面是本例所使用的设置文件,[DEFAULT]里面是基本Fabric的基本信息,包括MySQLutility的安装位置,日志位置等等。[storage]里面是Fabric节点的相关信息,IP地址用户名和使用的fabric数据库名称。[servers]下面的三种用户对应上文提到的各个实例上的三个用户。 [protocol.xmlrpc]
按照默认的填写即可,需要给出一个管理用户名和密码。
[DEFAULT]
prefix = C:\MySQLUtilities
sysconfdir = C:\MySQLUtilities\etc\mysql
logdir = C:\DEMO\Fabric
[storage]
address = localhost:3310
user = root
password =
database = fabric
auth_plugin = mysql_native_password
connection_timeout = 6
connection_attempts = 6
connection_delay = 1
[servers]
user = root
password =
unreachable_timeout = 5
backup_user = root
backup_password =
restore_user = root
restore_password =
[protocol.xmlrpc]
address = localhost:32274
threads = 5
user = admin
password = 123654
disable_authentication = no
realm = MySQL Fabric
ssl_ca =
ssl_cert =
ssl_key =
[protocol.mysql]
address = localhost:32275
user = admin
password = 123654
disable_authentication = no
ssl_ca =
ssl_cert =
ssl_key =
[executor]
executors = 5
[logging]
level = INFO
url = C:\DEMO\Fabric\fabric.log
[sharding]
mysqldump_program =C:/DEMO/Fabric/MGM/bin/mysqldump.exe
mysqlclient_program =C:/DEMO/Fabric/MGM/bin/mysql.exe
prune_limit = 10000
[statistics]
prune_time = 3600
[failure_tracking]
notifications = 300
notification_clients = 50
notification_interval = 60
failover_interval = 0
detections = 3
detection_interval = 6
detection_timeout = 1
prune_time = 3600
[connector]
ttl = 1
[client]
password =
5)此外,包括Fabric管理节点在内,所有的MySQL实例均需要配置文件my.ini,这个文件的位置可以由用户自行决定,只需在启动MySQL服务的时候指定该文件位置即可。本例使用与data文件夹平行的路径,
例如: C:\DEMO\Fabric\HA1\MySQL11\my.ini
启动MySQL实例的命令为:
>mysqld –defaults-file= C:\DEMO\Fabric\HA1\MySQL11\my.ini
各个实例的配置文件请参照下例,注意更改一下端口号和服务器ID和文件路径即可:
(basedir使用的均为管理节点的MySQL,datadir是上面各个实例的数据文件位置)
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html
# *** DO NOT EDIT THIS FILE. It's a template which will be copied to the
# *** default location during install, and will be replaced if you
# *** upgrade to a newer version of MySQL.
[mysqld]
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
log_bin
gtid_mode=ON
log-slave-updates
enforce-gtid-consistency
# These are commonly set, remove the # and set as required.
basedir = C:\DEMO\Fabric\MGM
datadir = C:\DEMO\Fabric\HA1\MySQL11\data
port = 3311
server_id = 11
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
2、 数据库设置
Fabric的使用需要4种数据库用户,分别是:Backing store user 、Server user 、Backup user和Restore user。各个用户的权限不一样,详情请参照
http://dev.mysql.com/doc/mysql-utilities/1.6/en/fabric-create-user.html
除了管理节点用户需要在管理节点实例上建立,其余的3个用户需要在每台实例上分别建立。如果处于对fabric进行功能验证的目的,用一个统一的用户即可本例使用安装后默认的root。
用户设置好之后需要进行Fabric节点的数据安装,正常需要执行如下命令:>mysqlfabric manage setup --param=storage.user=fabric --param=storage.password=secret
但是本例中只使用了一个用户因此变成:
> C:\MySQLUtilities\mysqlfabric manage setup --param=storage.user=root
正常安装后,查看名为fabric的数据库即可看到如下结构:
+-------------------+
| Tables |
+-------------------+
| checkpoints |
| error_log |
| group_replication |
| groups |
| permissions |
| role_permissions |
| roles |
| servers |
| shard_maps |
| shard_ranges |
| shard_tables |
| shards |
| user_roles |
| users |
+-------------------+
四、高可用性功能测试
1、 启动所有的MySQL实例:
C:\DEMO\Fabric\MGM\bin\mysqld --defaults-file=C:\DEMO\Fabric\MGM\my.ini
C:\DEMO\Fabric\MGM\bin\mysqld --defaults-file=C:\DEMO\Fabric\HA1\MySQL11\my.ini
C:\DEMO\Fabric\MGM\bin\mysqld --defaults-file=C:\DEMO\Fabric\HA1\MySQL12\my.ini
C:\DEMO\Fabric\MGM\bin\mysqld --defaults-file=C:\DEMO\Fabric\HA1\MySQL13\my.ini
2、 建立高可用群
C:\MySQLUtilities\mysqlfabric group create my_group
C:\MySQLUtilities\mysqlfabric group add my_group localhost:3311
C:\MySQLUtilities\mysqlfabric group add my_group localhost:3312
C:\MySQLUtilities\mysqlfabric group add my_group localhost:3313
这四条命令的意思为建立一个名为my_group的群,然后向此群中加入3个服务器,localhost:3311即为服务器的地址。
建立好组群之后需要让Fabric来挑选一台服务器作为主服务器:
C:\MySQLUtilities\mysqlfabric group promote my_group
执行成功之后,可以选择执行下面的命令来让Fabric在主服务器发生故障时,自动进行切换
C:\MySQLUtilities\mysqlfabric group activate my_group
可以通过mysqlfabric group lookup_servers my_group 来查看该群的服务器状态。
至此,一个高可用的可以自动切换的MySQL主从服务器群就设置好了,大家可以使用下面的Pyhson代码来进行测试一下了。另外需要注意的一点是,当要对群里面的服务器进行停机维护的时候需要先将其从群主里面摘除,然后再进行维护,如果不这样Fabric将会认为该服务器已经坏掉,会自动切换。去除服务器可以执行下面的命令:
C:\MySQLUtilities\mysqlfabric group demote my_group
C:\MySQLUtilities\mysqlfabric group remove my_group 98d34488-c956-11e4-a915-f82fa8e5f8eb
后面的一长串是UUID各位在添加服务器的时候就会看到,删除服务器的时候选定对应的UUID即可。
import mysql.connector
from mysql.connector import fabric
def add_employee(conn, emp_no, first_name, last_name):
conn.set_property(group="my_group", mode=fabric.MODE_READWRITE)
cur = conn.cursor()
cur.execute("USE employees")
cur.execute(
"INSERT INTO employees VALUES (%s, %s, %s)",
(emp_no, first_name, last_name)
)
# We need to keep track of what we have executed in order to,
# at least, read our own updates from a slave.
cur.execute("SELECT @@global.gtid_executed")
for row in cur:
print ("Transactions executed on the master", row[0])
return row[0]
def find_employee(conn, emp_no, gtid_executed):
conn.set_property(group="my_group", mode=fabric.MODE_READONLY)
cur = conn.cursor()
# Guarantee that a slave has applied our own updates before
# reading anything.
cur.execute(
"SELECT WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS('%s', 0)" %
(gtid_executed, )
)
for row in cur:
print ("Had to synchronize", row, "transactions.")
cur.execute("USE employees")
cur.execute(
"SELECT first_name, last_name FROM employees "
"WHERE emp_no = %s", (emp_no, )
)
for row in cur:
print ("Retrieved", row)
# Address of the Fabric, not the host we are going to connect to.
conn = mysql.connector.connect(
fabric={"host" : "localhost", "port" : 32274,
"username": "admin", "password" : "123654"
},
user="root",
# password="123654",
autocommit=True
)
conn.set_property(group="my_group", mode=fabric.MODE_READWRITE)
cur = conn.cursor()
cur.execute("CREATE DATABASE IF NOT EXISTS employees")
cur.execute("USE employees")
cur.execute("DROP TABLE IF EXISTS employees")
cur.execute(
"CREATE TABLE employees ("
" emp_no INT, "
" first_name CHAR(40), "
" last_name CHAR(40)"
")"
)
gtid_executed = add_employee(conn, 12, "John", "Doe")
find_employee(conn, 12, gtid_executed)
各位可以将上面的代码保存为test_fabric_query.py ,
然后执行 >python test_fabric_query.py
结果为 (u'John', u'Doe')