MySQL Fabric使用介紹01——高可用性HA

hxw2ljj發表於2015-10-30

MySQL Fabric使用介紹01——高可用性HA

 

MySQL FabricMySQL推出的用來管理一“群”伺服器的系統,可以非常簡單地用來部署管理MySQL的資料分片(Shading)和高可用性(High Availability)功能。

在這裡首先介紹一下高可用性功能的部署和使用。這裡用Windows平臺的MySQL為例。

一、需要的軟體

使用MySQLFabric功能需要下載如下軟體:

 

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

本例使用的是Python3.4.1

 

二、軟體安裝

Windows的軟體安裝都比較簡單,除了MySQL Server以外按照安裝嚮導一直下一步即可,需要注意記住安裝路徑就可以了。

MySQL Server由於是壓縮版的,各位可以把它解壓在任何路徑下。因為MySQL Fabric是用來管理伺服器群的系統,在本例中我們需要使用4MySQL Server例項來模擬4臺伺服器進行演示,因此將MySQL Server解壓後,需要將裡面的data資料夾複製3份放到不同的路徑下面,詳細設定請參照下一節。

 

三、系統環境設定

1、 檔案設定

MySQL Fabric構成裡面需要一個Fabric管理節點,官方稱之為backing store.,另外需要3MySQL Server伺服器用來構成一主二從的高可用構成,一主二從主要利用了MySQL的複製功能,如果對MySQL的複製功能不瞭解,請參照

http://dev.mysql.com/doc/refman/5.6/en/replication.html

因此各個檔案的路徑如下:

1Fabric管理節點(backing storeC:\DEMO\Fabric\MGM

2)將前一節提到的data資料夾分別複製到下面3個路徑,同時分別做成3my.inidata資料夾放在同一路徑下

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

3MySQL Utilities的安裝路徑為C:\MySQLUtilities

4MySQL 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使用的均為管理節點的MySQLdatadir是上面各個例項的資料檔案位置)

# 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 userRestore 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')

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/18796236/viewspace-1818791/,如需轉載,請註明出處,否則將追究法律責任。

相關文章