MHA+ProxySQL,mysql的高可用集羣+讀寫分離(一)GTID主從複製

01 前言 & 綜述

本次受邀爲一家小公司做技術顧問,然後提出了要做數據庫的高可用集羣與負載均衡方案。

主要步驟如下:

1、安裝mysql(本文省略)2、安裝主從3、安裝MHA4、安裝proxySQL5、數據遷移(本文省略)6、程序測試(本文省略)

詳細事項如下:

1、在A、B、C三臺機器上搭建三套mysql數據庫(5.7版本);2、搭建一主二從,使用半同步、GTID、從庫只讀等機制;3、搭建MHA,建立故障自動切換機制,建立VIP;4、搭建proxySQL,進行自動負載均衡操作,讀寫分離,讀操作自動分配到兩臺從庫上;5、從X機器(5.5版本)上導出數據,在A、B、C機器上恢復備份;怎麼不停機備份?或者停機快速備份?數據量大概有30多G。mysqldump? mysqlpump? mydupmer?xtrabackup?6、測試環境演練7、停機遷移

機器規劃:

機器 主從 名稱
172.31.145.39 node1
172.31.145.38 node2
172.31.145.40 node3

02 主要mysql配置

省略安裝mysql步驟。

實際上還有一步是掛載數據盤,也省略了。

主要配置:

# 編輯my.cnfvi /etc/my.cnf
# GTID 主從複製server-id = 3expire_logs_days = 7gtid_mode = onlog-bin = /data0/mysql/mysql-binlogbinlog_format = rowlog_slave_updates = 1

全部配置:

# For advice on how to change settings please see# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
[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## 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 = 2Mdatadir=/data0/mysqlsocket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security riskssymbolic-links=0
pid-file=/var/run/mysqld/mysqld.pid
# GTID 主從複製server-id = 3expire_logs_days = 7gtid_mode = onlog-bin = /data0/mysql/mysql-binlogbinlog_format = rowlog_slave_updates = 1

skip_name_resolve = 1open_files_limit = 65535back_log = 1024max_connections = 1000max_connect_errors = 1000000table_open_cache = 1024table_definition_cache = 1024table_open_cache_instances = 64thread_stack = 512Kexternal-locking = FALSEmax_allowed_packet = 32Msort_buffer_size = 4Mjoin_buffer_size = 4Mthread_cache_size = 768query_cache_size = 0query_cache_type = 0interactive_timeout = 600wait_timeout = 600tmp_table_size = 32Mmax_heap_table_size = 32Mslow_query_log = 1slow_query_log_file = /data0/mysql/slow.loglog-error = /data0/mysql/error.loglong_query_time = 2sync_binlog = 1binlog_cache_size = 4Mmax_binlog_cache_size = 1Gmax_binlog_size = 1Genforce_gtid_consistency = 1master_info_repository = TABLErelay_log_info_repository = TABLE
key_buffer_size = 32Mread_buffer_size = 8Mread_rnd_buffer_size = 4Mbulk_insert_buffer_size = 64M
relay_log_recovery = 1relay-log-purge = 1
lock_wait_timeout = 3600explicit_defaults_for_timestamp = 1
innodb_thread_concurrency = 0innodb_sync_spin_loops = 100innodb_spin_wait_delay = 30
innodb_buffer_pool_size = 1024Minnodb_buffer_pool_instances = 8innodb_buffer_pool_load_at_startup = 1innodb_buffer_pool_dump_at_shutdown = 1
transaction_isolation = REPEATABLE-READ
innodb_flush_log_at_trx_commit = 1innodb_log_buffer_size = 32Minnodb_log_file_size = 2Ginnodb_log_files_in_group = 2innodb_flush_neighbors = 0innodb_write_io_threads = 8innodb_read_io_threads = 8innodb_purge_threads = 8innodb_page_cleaners = 4innodb_open_files = 65535
innodb_flush_method = O_DIRECTinnodb_checksum_algorithm = crc32innodb_lru_scan_depth = 4000
innodb_lock_wait_timeout = 10innodb_rollback_on_timeout = 1innodb_print_all_deadlocks = 1innodb_file_per_table = 1innodb_online_alter_log_max_size = 4Ginternal_tmp_disk_storage_engine = InnoDBinnodb_stats_on_metadata = 0innodb_status_file = 1innodb_status_output = 0innodb_status_output_locks = 0performance_schema = 1performance_schema_instrument = '%=on'
# innodb monitorinnodb_monitor_enable="module_innodb"innodb_monitor_enable="module_server"innodb_monitor_enable="module_dml"innodb_monitor_enable="module_ddl"innodb_monitor_enable="module_trx"innodb_monitor_enable="module_os"innodb_monitor_enable="module_purge"innodb_monitor_enable="module_log"innodb_monitor_enable="module_lock"innodb_monitor_enable="module_buffer"innodb_monitor_enable="module_index"innodb_monitor_enable="module_ibuf_system"innodb_monitor_enable="module_buffer_page"innodb_monitor_enable="module_adaptive_hash"
[mysqldump]quickmax_allowed_packet = 32M

03 ssh互信

1、生成密鑰

ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa

2、拷貝到其他機器

# 主ssh-copy-id -i ~/.ssh/id_dsa.pub 172.31.145.39;# 從1ssh-copy-id -i ~/.ssh/id_dsa.pub 172.31.145.38;# 從2ssh-copy-id -i ~/.ssh/id_dsa.pub 172.31.145.40;

注意:在manager節點安裝在mysql主從複製集羣中的一臺服務器的前提下,一定要讓本機也可以免密ssh登錄本機。

三臺機器,以上命令都執行一遍。

3、添加hosts

sudo vi /etc/hosts
172.31.145.39 node1172.31.145.38 node2172.31.145.40 node3
sudo echo 172.31.145.39 node1 >> /etc/hostssudo echo 172.31.145.38 node2 >> /etc/hostssudo echo 172.31.145.40 node3 >> /etc/hosts

三臺機器,以上命令都執行一遍。

4、互信測試

ssh node1ssh node2ssh node3

三臺機器,以上命令都執行一遍。

成功信息如下:

[mysql@iZm5e2mylql8b8vqklsir7Z ~]$ ssh node1Last login: Mon Mar 30 21:50:50 2020 from 172.31.145.39
Welcome to Alibaba Cloud Elastic Compute Service !
[mysql@iZm5ebq5g3dxxlguud3akeZ ~]$ ssh node2Last login: Mon Mar 30 21:52:50 2020 from 172.31.145.40
Welcome to Alibaba Cloud Elastic Compute Service !
[mysql@iZm5e2mylql8b8vqklsir7Z ~]$ ssh node3Last login: Mon Mar 30 21:50:09 2020 from 172.31.145.38
Welcome to Alibaba Cloud Elastic Compute Service !
[mysql@iZm5eh3yfwvy52yb78f6obZ ~]$

可以看到實現了機器間的免密登錄,登錄後的主機名已經改變,如下所示:

[mysql@iZm5ebq5g3dxxlguud3akeZ ~]$
[mysql@iZm5e2mylql8b8vqklsir7Z ~]$
[mysql@iZm5eh3yfwvy52yb78f6obZ ~]$

03 主從

一主兩從 + replication slaveGTID + row

主要配置

# 編輯my.cnfvi /etc/my.cnf
# GTID 主從複製server-id = 3expire_logs_days = 7gtid_mode = onlog-bin = /data0/mysql/mysql-binlogbinlog_format = rowlog_slave_updates = 1

連接數據庫,創建主從複製賬號

mysql -u root -p

所有機器都執行以下語句

# 賬號創建create user 'repl'@'172.31.145.%' identified by 'replZw@1987';
# 創建複製權限grant replication slave on *.* to 'repl'@'172.31.145.%';
# 刷新權限flush privileges;
# 創建MHA管理賬號create user 'zs'@'172.31.145.%' identified by 'adminZw@1987';
# 賦權grant all privileges on *.* to 'zs'@'172.31.145.%';
# 刷新權限flush privileges;

執行完成後,導出dump。

由於是GTID方式,不需要添加--master-data參數,命令如下:

mysqldump --set-gtid-purged=off --single-transaction -u root -p --all-databases > all_0331.sql

推送到從庫

scp all_0331.sql node2:/home/mysql/scp all_0331.sql node3:/home/mysql/

在從庫恢復

mysql -u root -p < all_0331.sql

在所有從庫都要執行,剛剛在主庫創建的repl賬號

# 注意大寫CHANGE MASTER TO MASTER_HOST='172.31.145.39',MASTER_USER='repl',MASTER_PASSWORD='replZw@1987',MASTER_AUTO_POSITION=1;
start slave;
show slave status \G;

04 GTID不成功、GTID 事務衝突 等問題

1、在主庫查看權限對不對

show grants for 'repl'@'172.31.145.%';
mysql> show grants for 'repl'@'172.31.145.%';+---------------------------------------------------------+| Grants for repl@172.31.145.% |+---------------------------------------------------------+| GRANT REPLICATION SLAVE ON *.* TO 'repl'@'172.31.145.%' |+---------------------------------------------------------+1 row in set (0.00 sec)

2、 在從庫連接主庫,測試repl賬號密碼對不對

mysql -urepl -h node1 -p -P3306

3、重新設置GTID、賬號密碼

主庫查詢GTID

show global variables like '%gtid%'\G;
……*************************** 3. row ***************************Variable_name: gtid_executed Value: 1b083812-71db-11ea-ad0c-00163e0a2908:1-19,89b2f4fc-7299-11ea-942c-00163e08f16f:1-10……

從庫執行,主要獲取gtid_purged在從庫重置:

stop slave;
reset slave;
reset master;
set global gtid_purged='1b083812-71db-11ea-ad0c-00163e0a2908:1-18';
# 注意大寫CHANGE MASTER TO MASTER_HOST='172.31.145.39',MASTER_USER='repl',MASTER_PASSWORD='replZw@1987',MASTER_AUTO_POSITION=1;
start slave;
show slave status \G;

05 第一篇完結

陸陸續續花了一個星期,搭建了基於GTID的主從複製、MHA的高可用架構、proxySQL的讀寫分離。

本文是第一篇,大概會用三篇左右的篇幅將這套架構怎麼搭建的說完。

參考書籍:《mysql技術內幕:第5版》、《mysql王者晉級之路》、《跟老男孩學Linux運維:mysql入門與提高實踐》


本文分享自微信公衆號 - 架構師之殤(ysistrue)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章