日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql 高可用工具_MySQL Utilities 高可用工具体验

發布時間:2024/10/5 数据库 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 高可用工具_MySQL Utilities 高可用工具体验 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

MySQL Utilities 高可用工具體驗

MySQL Utilities是MySQL官方的工具集,其中包括高可用相關的幾個工具。 以下是對當前最新版本1.6的使用體驗。

前提條件

MySQL Server 5.6+

基于GTID的復制

Python 2.6+

Connector/Python 2.0+

環境準備

在1臺機器準備3個不同端口的MySQL實例用于測試

192.168.107.211:9001(master)

192.168.107.211:9002(slave1)

192.168.107.211:9003(slave2)

軟件

OS: CentOS 7.1

MySQL: Percona Server 5.7.19

Python: 2.7.5

Connector/Python:2.1.7

mysql-utilities:1.6.5

創建MySQL實例1

生成實例1的配置文件my1.cnf

su - mysql

vi my1.cnf

[mysqld]

port=9001

datadir=/var/lib/mysql/data1

socket=/var/lib/mysql/data1/mysql.sock

basedir=/usr/

innodb_buffer_pool_size=128M

explicit_defaults_for_timestamp

skip-name-resolve

lower-case-table-names

expire-logs-days=7

plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"

rpl_semi_sync_master_wait_point=AFTER_SYNC

rpl_semi_sync_master_wait_no_slave=ON

rpl_semi_sync_master_enabled=ON

rpl_semi_sync_slave_enabled=ON

rpl_semi_sync_master_timeout=5000

server-id=9001

log_bin=binlog

gtid-mode=ON

enforce-gtid-consistency=ON

log-slave-updates=ON

master-info-repository=TABLE

relay-log-info-repository=TABLE

report-host=192.168.107.211

log-error=/var/lib/mysql/data1/mysqld.log

pid-file=/var/lib/mysql/data1/mysqld.pid

general-log=ON

general-log-file=/var/lib/mysql/data1/node1.log

[mysqld_safe]

pid-file=/var/lib/mysql/data1/mysqld.pid

socket=/var/lib/mysql/data1/mysql.sock

nice = 0

創建MySQL實例

mysqld --defaults-file=my1.cnf --initialize-insecure

mysqld --defaults-file=my1.cnf &

mysql -S data1/mysql.sock -uroot -e "set sql_log_bin=OFF;GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' IDENTIFIED BY '12345' WITH GRANT OPTION"

創建MySQL實例2

sed s/9001/9002/g my1.cnf | sed s/data1/data2/g >my2.cnf

mysqld --defaults-file=my2.cnf --initialize-insecure

mysqld --defaults-file=my2.cnf &

mysql -S data2/mysql.sock -uroot -e "set sql_log_bin=OFF;GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' IDENTIFIED BY '12345' WITH GRANT OPTION"

創建MySQL實例3

sed s/9001/9003/g my1.cnf | sed s/data1/data3/g >my3.cnf

mysqld --defaults-file=my3.cnf --initialize-insecure

mysqld --defaults-file=my3.cnf &

mysql -S data3/mysql.sock -uroot -e "set sql_log_bin=OFF;GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' IDENTIFIED BY '12345' WITH GRANT OPTION"

利用mysqlreplicate建立復制

-bash-4.2$ mysqlreplicate --master=admin:12345@192.168.107.211:9001 --slave=admin:12345@192.168.107.211:9002 --rpl-user=repl:repl -v

WARNING: Using a password on the command line interface can be insecure.

# master on 192.168.107.211: ... connected.

# slave on 192.168.107.211: ... connected.

# master id = 9001

# slave id = 9002

# master uuid = b8ca6259-ab80-11e7-91fc-000c296dd240

# slave uuid = d842240c-ab80-11e7-960f-000c296dd240

# Checking InnoDB statistics for type and version conflicts.

# Checking storage engines...

# Checking for binary logging on master...

# Setting up replication...

# Granting replication access to replication user...

# Connecting slave to master...

# CHANGE MASTER TO MASTER_HOST = '192.168.107.211', MASTER_USER = 'repl', MASTER_PASSWORD = 'repl', MASTER_PORT = 9001, MASTER_AUTO_POSITION=1

# Starting slave from master's last position...

# IO status: Waiting for master to send event

# IO thread running: Yes

# IO error: None

# SQL thread running: Yes

# SQL error: None

# ...done.

除去各種檢查,mysqlreplicate真正做的事很簡單。如下

先在master上創建復制賬號

CREATE USER 'repl'@'192.168.107.211' IDENTIFIED WITH 'repl'

GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.107.211' IDENTIFIED WITH 'repl'

mysqlreplicate會為每個Slave創建一個復制賬號,除非通過以下SQL發現該賬號已經存在。

SELECT * FROM mysql.user WHERE user = 'repl' and host = '192.168.107.211'

然后在slave上設置復制

CHANGE MASTER TO MASTER_HOST = '192.168.107.211', MASTER_USER = 'repl', MASTER_PASSWORD = 'repl', MASTER_PORT = 9001, MASTER_AUTO_POSITION=1

在啟用GTID的情況的下,從哪兒開始復制完全由GTID決定,所以mysqlreplicate中的那些和復制起始位點相關的參數,比如-b,統統被無視,其效果相當于-b。

注意:mysqlreplicate不會理會當前的復制拓撲,所以如果把master和slave對調再執行一次,就變成主主復制了。

slave1的復制配置好后,用同樣的方法配置slave2的復制

mysqlreplicate --master=admin:12345@192.168.107.211:9001 --slave=admin:12345@192.168.107.211:9003 --rpl-user=repl:repl -v

通過mysqlrplshow查看復制拓撲

-bash-4.2$ mysqlrplshow --master=admin:12345@192.168.107.211:9001 --discover-slaves-login=admin:12345 -v

WARNING: Using a password on the command line interface can be insecure.

# master on 192.168.107.211: ... connected.

# Finding slaves for master: 192.168.107.211:9001

# Replication Topology Graph

192.168.107.211:9001 (MASTER)

|

+--- 192.168.107.211:9002 [IO: Yes, SQL: Yes] - (SLAVE)

|

+--- 192.168.107.211:9003 [IO: Yes, SQL: Yes] - (SLAVE)

mysqlrplshow通過在master上執行SHOW SLAVE HOSTS發現初步的復制拓撲。 由于Slave停止復制或改變復制源時不能立刻反應到master的SHOW SLAVE HOSTS上,所以初步獲取的復制拓撲可能存在冗余, 因此,mysqlrplshow還會再連到slave上執行SHOW SLAVE STATUS進行確認。

通過mysqlrpladmin檢查集群健康狀態

-bash-4.2$ mysqlrpladmin --master=admin:12345@192.168.107.211:9001 --slaves=admin:12345@192.168.107.211:9002,admin:12345@192.168.107.211:9003 health

WARNING: Using a password on the command line interface can be insecure.

# Checking privileges.

#

# Replication Topology Health:

+------------------+-------+---------+--------+------------+---------+

| host | port | role | state | gtid_mode | health |

+------------------+-------+---------+--------+------------+---------+

| 192.168.107.211 | 9001 | MASTER | UP | ON | OK |

| 192.168.107.211 | 9002 | SLAVE | UP | ON | OK |

| 192.168.107.211 | 9003 | SLAVE | UP | ON | OK |

+------------------+-------+---------+--------+------------+---------+

# ...done.

通過mysqlrpladmin elect挑選合適的新主

-bash-4.2$ mysqlrpladmin --master=admin:12345@192.168.107.211:9001 --slaves=admin:12345@192.168.107.211:9002,admin:12345@192.168.107.211:9003 elect

WARNING: Using a password on the command line interface can be insecure.

# Checking privileges.

# Electing candidate slave from known slaves.

# Best slave found is located on 192.168.107.211:9002.

# ...done.

然而,elect只是從slaves中選出第一個合格的slave,并不考慮復制是否已停止,以及哪個節點的日志更全。

下面把slave1的復制停掉

mysql -S data2/mysql.sock -uroot -e "stop slave"

再在master執行一條SQL

mysql -S data1/mysql.sock -uroot -e "create database test"

現在slave1上少了一個事務

-bash-4.2$ mysqlrpladmin --master=admin:12345@192.168.107.211:9001 --slaves=admin:12345@192.168.107.211:9002,admin:12345@192.168.107.211:9003 gtid

WARNING: Using a password on the command line interface can be insecure.

# Checking privileges.

#

# UUIDS for all servers:

+------------------+-------+---------+---------------------------------------+

| host | port | role | uuid |

+------------------+-------+---------+---------------------------------------+

| 192.168.107.211 | 9001 | MASTER | 5daf1e10-ac41-11e7-bcc4-000c296dd240 |

| 192.168.107.211 | 9002 | SLAVE | fe084f45-ac43-11e7-a343-000c296dd240 |

| 192.168.107.211 | 9003 | SLAVE | d0af3a6a-ac41-11e7-85e0-000c296dd240 |

+------------------+-------+---------+---------------------------------------+

#

# Transactions executed on the server:

+------------------+-------+---------+-------------------------------------------+

| host | port | role | gtid |

+------------------+-------+---------+-------------------------------------------+

| 192.168.107.211 | 9001 | MASTER | 5daf1e10-ac41-11e7-bcc4-000c296dd240:1-3 |

| 192.168.107.211 | 9002 | SLAVE | 5daf1e10-ac41-11e7-bcc4-000c296dd240:1-2 |

| 192.168.107.211 | 9003 | SLAVE | 5daf1e10-ac41-11e7-bcc4-000c296dd240:1-3 |

+------------------+-------+---------+-------------------------------------------+

# ...done.

但elect仍然會選slave1

-bash-4.2$ mysqlrpladmin --master=admin:12345@192.168.107.211:9001 --slaves=admin:12345@192.168.107.211:9002,admin:12345@192.168.107.211:9003 elect

WARNING: Using a password on the command line interface can be insecure.

# Checking privileges.

# Electing candidate slave from known slaves.

# Best slave found is located on 192.168.107.211:9002.

# ...done.

通過mysqlrpladmin switchover在線切換主備

-bash-4.2$ mysqlrpladmin --master=admin:12345@192.168.107.211:9001 --slaves=admin:12345@192.168.107.211:9002,admin:12345@192.168.107.211:9003 --new-master=admin:12345@192.168.107.211:9002 switchover

WARNING: Using a password on the command line interface can be insecure.

# Checking privileges.

# Performing switchover from master at 192.168.107.211:9001 to slave at 192.168.107.211:9002.

# Checking candidate slave prerequisites.

# Checking slaves configuration to master.

# Waiting for slaves to catch up to old master.

Slave 192.168.107.211:9002 did not catch up to the master.

ERROR: Slave 192.168.107.211:9002 did not catch up to the master.

switchover會連接到每一個節點并等待所有slave回放完日志才執行切換,因此有任何一個節點故障或任何一個slave復制故障都不會執行switchover。

啟動剛才停掉的slave1的復制

mysql -S data2/mysql.sock -uroot -e "start slave"

再次執行switchover,成功

-bash-4.2$ mysqlrpladmin --master=admin:12345@192.168.107.211:9001 --slaves=admin:12345@192.168.107.211:9002,admin:12345@192.168.107.211:9003 --new-master=admin:12345@192.168.107.211:9002 --demote-master switchover

WARNING: Using a password on the command line interface can be insecure.

# Checking privileges.

# Performing switchover from master at 192.168.107.211:9001 to slave at 192.168.107.211:9002.

# Checking candidate slave prerequisites.

# Checking slaves configuration to master.

# Waiting for slaves to catch up to old master.

# Stopping slaves.

# Performing STOP on all slaves.

# Demoting old master to be a slave to the new master.

# Switching slaves to new master.

# Starting all slaves.

# Performing START on all slaves.

# Checking slaves for errors.

# Switchover complete.

#

# Replication Topology Health:

+------------------+-------+---------+--------+------------+---------+

| host | port | role | state | gtid_mode | health |

+------------------+-------+---------+--------+------------+---------+

| 192.168.107.211 | 9002 | MASTER | UP | ON | OK |

| 192.168.107.211 | 9001 | SLAVE | UP | ON | OK |

| 192.168.107.211 | 9003 | SLAVE | UP | ON | OK |

+------------------+-------+---------+--------+------------+---------+

# ...done.

執行switchover時,有一段Waiting for slaves to catch up to old master.,如果任何一個slave有故障無法同步到和master相同的狀態,switchover會失敗。即switchover的前提條件是所有節點(包括master和所有salve)都是OK的。

通過mysqlrpladmin failover故障切換主備

-bash-4.2$ mysqlrpladmin --slaves=admin:12345@192.168.107.211:9001,admin:12345@192.168.107.211:9003 failover

WARNING: Using a password on the command line interface can be insecure.

# Checking privileges.

# Performing failover.

# Candidate slave 192.168.107.211:9001 will become the new master.

# Checking slaves status (before failover).

# Preparing candidate for failover.

# Creating replication user if it does not exist.

# Stopping slaves.

# Performing STOP on all slaves.

# Switching slaves to new master.

# Disconnecting new master as slave.

# Starting slaves.

# Performing START on all slaves.

# Checking slaves for errors.

# Failover complete.

#

# Replication Topology Health:

+------------------+-------+---------+--------+------------+---------+

| host | port | role | state | gtid_mode | health |

+------------------+-------+---------+--------+------------+---------+

| 192.168.107.211 | 9001 | MASTER | UP | ON | OK |

| 192.168.107.211 | 9003 | SLAVE | UP | ON | OK |

+------------------+-------+---------+--------+------------+---------+

# ...done.

failover時要求所有slave的SQL線程都是正常的,IO線程可以停止或異常。 如果未指定--candidates,一般會以slaves中第1個slave作為新主。 如果新主的binlog不是最新的,會先向擁有最新日志的slave復制,并等到binlog追平了再切換。

小結

從上面操作過程來看,借助MySQL Utilities管理MySQL集群還比較簡便,但結合代碼考慮到各種場景,這套工具和MHA比起來還不夠嚴謹。

沒有把從庫的READ_ONLY設置集成到腳本里

switchover時沒有終止運行中的事務,實際也沒有有效的手段阻止新的寫事務在舊master上執行。

failover不檢查master死活,需要DBA在調用failover前自己檢查,否則會引起腦裂。

總結

以上是生活随笔為你收集整理的mysql 高可用工具_MySQL Utilities 高可用工具体验的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。