MySQL高可用(Galera Cluster)
Galera Cluster是集成了Galera插件的MySQL集群,是一種新型的,數據不共享的,高度冗余的高可用方案,目前Galera Cluster有兩個版本,分別是Percona Xtradb Cluster和MariaDB Cluster,Galera本時是具有多主特性,即采用Multi-master的集群架構,是一個即穩健,又在數據一致性、完整性及高性能方面有出色表現的高可用解決方案
Galera Cluster內部機制
Galera Cluster種每個MySQLServer之間相互為主主的關系,當客戶端發送指令到一個數據庫時,數據庫將數據修改後返回一個OK,表示用戶的請求已經被收到,但是事務並沒有結束依舊可以撤銷。當事務結束時用戶發送一個commit(提交),服務器收到後會將數據的更新發送給其他的MySQLServer,此時會開啟一個全局性的事務ID給組內的其他服務器,其他服務器會查看是否有事務沖突,如果沒有沖突就確認更改成功。
Galera Cluster特點
- 多主架構:真正的多點讀寫的集群,在任何時候讀寫數據都是最新的
- 同步復制:集群不同節點之間數據同步,沒有延遲,在數據庫掛掉之後,數據不會丟失
- 並發復制:從節點APPLY數據時,支持並行執行有更好的性能。
- 故障切換:數據庫故障時,因為支持多點寫入,切換容易
- 熱插拔:在服務期間,如果數據庫掛了,只要監控程序發現的夠快,不可服務的時間就會非常少。在節點故障期間,節點本身對集群的影響非常小
- 自動節點克隆: 在新增節點,或者停機維護時,增量數據或者基礎數據不需要人工手動備份提供,Galera Cluster會自動拉取在線節點數據,最終集群會變為一直
- 對應用透明:集群的維護,對應用程序是透明的
Galera Cluster搭建
環境準備
準備3臺msyql服務器 |
主機名 | ip地址 |
---|---|---|
node1 | 192.168.73.110 | |
node2 | 192.168.73.111 | |
node3 | 192.168.73.112 |
一、配置YUM源
在每個節點上配置YUM源
[[email protected] ~]# vim /etc/yum.repos.d/mysql.repo [mysql] name=galera cluster baseurl=http://mirrors.neusoft.edu.cn/mariadb//mariadb-10.0.38/yum/centos7-amd64/ gpgcheck=0
二、安裝MariaDB-Galera-server
在每個節點上安裝MariaDB-Galera-server
[[email protected] ~]# yum install MariaDB-Galera-server -y
三、修改配置文件
配置文件在/etc/my.cnf.d/server.cnf,有必須設置和可選設置兩個配置
# Mandatory settings #這裏的項目為必填
wsrep_provider= #添加模塊路徑
wsrep_cluster_address= #添加所有服務器的地址gcomm服務器間代替通訊協議
binlog_format=row #啟用二進制日誌
# Optional setting #以下項為可選項
#wsrep_slave_threads=1
#innodb_flush_log_at_trx_commit=0
#wsrep_cluster_name=‘testcluster‘ #集群的名稱
#wsrep_node_name=‘node1‘ #當前節點的名稱
#wsrep_node_address=‘192.168.73.110‘ #當前節點的地址
對每個節點配置文件進行修改,此處以node1為例
[[email protected] ~]# vim /etc/my.cnf.d/server.cnf
[galera]
# Mandatory settings
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.73.110,192.168.73.111,192.168.73.112"
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
四、啟動服務
第一個啟動的節點需要添加--wsrep-new-cluster選項,說明這是一個新的集群,其余節點啟動服務無需添加參數
[[email protected] ~]# service mysql start --wsrep-new-cluster
node2節點啟動服務
[[email protected] ~]# service mysql start
node3節點啟動服務
[[email protected] ~]# service mysql start
五、測試
1.測試同步
從node1導入數據庫
[[email protected] ~]# mysql < hellodb_innodb.sql
node2查看
[[email protected] ~]# mysql -e "SHOW DATABASES;"
+--------------------+
| Database |
+--------------------+
| hellodb |
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
node3查看
[[email protected] ~]# mysql -e "SHOW DATABASES;"
+--------------------+
| Database |
+--------------------+
| hellodb |
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
2.測試沖突
同時在3節點創建表
在node2節點成功,其余節點都失敗
[[email protected] ~]# mysql -e "CREATE TABLE hellodb.test(id int auto_increment primary key,name char(20));"
[[email protected] ~]#
node1節點
[[email protected] ~]# mysql -e "CREATE TABLE hellodb.test(id int auto_increment primary key,name char(20));"
ERROR 1050 (42S01) at line 1: Table ‘test‘ already exists
node3節點
[[email protected] ~]# mysql -e "CREATE TABLE hellodb.test(id int auto_increment primary key,name char(20));"
ERROR 1050 (42S01) at line 1: Table ‘test‘ already exists
其他
Galera Cluster系統和狀態變量
1.查看狀態變量:SHOW STATUS LIKE ‘wsrep_%‘
MariaDB [(none)]> SHOW STATUS LIKE ‘wsrep_%‘;
+------------------------------+-------------------------------------------------------------+
| Variable_name | Value |
+------------------------------+-------------------------------------------------------------+
| wsrep_local_state_uuid | e9f07cd3-7253-11e9-b27e-174ea2b4587d |
| wsrep_protocol_version | 9 |
| wsrep_last_committed | 38 |
| wsrep_replicated | 36 |
| wsrep_replicated_bytes | 18960 |
| wsrep_repl_keys | 144 |
| wsrep_repl_keys_bytes | 2016 |
| wsrep_repl_data_bytes | 14522 |
| wsrep_repl_other_bytes | 0 |
| wsrep_received | 12 |
| wsrep_received_bytes | 1782 |
| wsrep_local_commits | 6 |
| wsrep_local_cert_failures | 0 |
| wsrep_local_replays | 0 |
| wsrep_local_send_queue | 0 |
| wsrep_local_send_queue_max | 1 |
| wsrep_local_send_queue_min | 0 |
| wsrep_local_send_queue_avg | 0.000000 |
| wsrep_local_recv_queue | 0 |
| wsrep_local_recv_queue_max | 1 |
| wsrep_local_recv_queue_min | 0 |
| wsrep_local_recv_queue_avg | 0.000000 |
| wsrep_local_cached_downto | 1 |
| wsrep_flow_control_paused_ns | 0 |
| wsrep_flow_control_paused | 0.000000 |
| wsrep_flow_control_sent | 0 |
| wsrep_flow_control_recv | 0 |
| wsrep_cert_deps_distance | 1.000000 |
| wsrep_apply_oooe | 0.000000 |
| wsrep_apply_oool | 0.000000 |
| wsrep_apply_window | 1.000000 |
| wsrep_commit_oooe | 0.000000 |
| wsrep_commit_oool | 0.000000 |
| wsrep_commit_window | 1.000000 |
| wsrep_local_state | 4 |
| wsrep_local_state_comment | Synced |
| wsrep_cert_index_size | 82 |
| wsrep_causal_reads | 0 |
| wsrep_cert_interval | 0.026316 |
| wsrep_open_transactions | 0 |
| wsrep_open_connections | 0 |
| wsrep_incoming_addresses | 192.168.73.110:3306,192.168.73.111:3306,192.168.73.112:3306 |
| wsrep_cluster_weight | 3 |
| wsrep_desync_count | 0 |
| wsrep_evs_delayed | |
| wsrep_evs_evict_list | |
| wsrep_evs_repl_latency | 0/0/0/0/0 |
| wsrep_evs_state | OPERATIONAL |
| wsrep_gcomm_uuid | e9efec79-7253-11e9-8e15-9f3e0cc2d8a1 |
| wsrep_cluster_conf_id | 3 |
| wsrep_cluster_size | 3 |
| wsrep_cluster_state_uuid | e9f07cd3-7253-11e9-b27e-174ea2b4587d |
| wsrep_cluster_status | Primary |
| wsrep_connected | ON |
| wsrep_local_bf_aborts | 0 |
| wsrep_local_index | 0 |
| wsrep_provider_name | Galera |
| wsrep_provider_vendor | Codership Oy <[email protected]> |
| wsrep_provider_version | 25.3.25(r3836) |
| wsrep_ready | ON |
| wsrep_thread_count | 2 |
+------------------------------+-------------------------------------------------------------+
2.查看系統變量:SHOW VARIABLES like ‘wsrep_%‘\G;
MariaDB [(none)]> SHOW VARIABLES like ‘wsrep_%‘\G;
*************************** 1. row ***************************
Variable_name: wsrep_auto_increment_control
Value: ON
*************************** 2. row ***************************
Variable_name: wsrep_causal_reads
Value: OFF
*************************** 3. row ***************************
Variable_name: wsrep_certification_rules
Value: strict
*************************** 4. row ***************************
Variable_name: wsrep_certify_nonpk
Value: ON
*************************** 5. row ***************************
Variable_name: wsrep_cluster_address
Value: gcomm://192.168.73.110,192.168.73.111,192.168.73.112
*************************** 6. row ***************************
Variable_name: wsrep_cluster_name
Value: testcluster
*************************** 7. row ***************************
Variable_name: wsrep_convert_lock_to_trx
Value: OFF
*************************** 8. row ***************************
Variable_name: wsrep_data_home_dir
Value: /var/lib/mysql/
*************************** 9. row ***************************
Variable_name: wsrep_dbug_option
Value:
*************************** 10. row ***************************
Variable_name: wsrep_debug
Value: OFF
*************************** 11. row ***************************
Variable_name: wsrep_desync
Value: OFF
*************************** 12. row ***************************
Variable_name: wsrep_dirty_reads
Value: OFF
*************************** 13. row ***************************
Variable_name: wsrep_drupal_282555_workaround
Value: OFF
*************************** 14. row ***************************
Variable_name: wsrep_forced_binlog_format
Value: NONE
*************************** 15. row ***************************
Variable_name: wsrep_load_data_splitting
Value: ON
*************************** 16. row ***************************
Variable_name: wsrep_log_conflicts
Value: OFF
*************************** 17. row ***************************
Variable_name: wsrep_max_ws_rows
Value: 0
*************************** 18. row ***************************
Variable_name: wsrep_max_ws_size
Value: 2147483647
*************************** 19. row ***************************
Variable_name: wsrep_mysql_replication_bundle
Value: 0
*************************** 20. row ***************************
Variable_name: wsrep_node_address
Value: 192.168.73.110
*************************** 21. row ***************************
Variable_name: wsrep_node_incoming_address
Value: AUTO
*************************** 22. row ***************************
Variable_name: wsrep_node_name
Value: node1
*************************** 23. row ***************************
Variable_name: wsrep_notify_cmd
Value:
*************************** 24. row ***************************
Variable_name: wsrep_on
Value: ON
*************************** 25. row ***************************
Variable_name: wsrep_osu_method
Value: TOI
*************************** 26. row ***************************
Variable_name: wsrep_provider
Value: /usr/lib64/galera/libgalera_smm.so
*************************** 27. row ***************************
Variable_name: wsrep_provider_options
Value: base_dir = /var/lib/mysql/; base_host = 192.168.73.110; base_port = 4567; cert.log_conflicts = no; cert.optimistic_pa = yes; debug = no; evs.auto_evict = 0; evs.causal_keepalive_period = PT1S; evs.debug_log_mask = 0x1; evs.delay_margin = PT1S; evs.delayed_keep_period = PT30S; evs.inactive_check_period = PT0.5S; evs.inactive_timeout = PT15S; evs.info_log_mask = 0; evs.install_timeout = PT7.5S; evs.join_retrans_period = PT1S; evs.keepalive_period = PT1S; evs.max_install_timeouts = 3; evs.send_window = 4; evs.stats_report_period = PT1M; evs.suspect_timeout = PT5S; evs.use_aggregate = true; evs.user_send_window = 2; evs.version = 0; evs.view_forget_timeout = P1D; gcache.dir = /var/lib/mysql/; gcache.keep_pages_size = 0; gcache.mem_size = 0; gcache.name = /var/lib/mysql//galera.cache; gcache.page_size = 128M; gcache.recover = no; gcache.size = 128M; gcomm.thread_prio = ; gcs.fc_debug = 0; gcs.fc_factor = 1.0; gcs.fc_limit = 16; gcs.fc_master_slave = no; gcs.max_packet_size = 64500; gcs.max_throttle = 0.25; gcs.recv_q_hard_limit = 9223372036854775807; gcs.recv_q_soft_limit = 0.25; gcs.sync_donor = no; gmcast.listen_addr = tcp://0.0.0.0:4567; gmcast.mcast_addr = ; gmcast.mcast_ttl = 1; gmcast.peer_timeout = PT3S; gmcast.segment = 0; gmcast.time_wait = PT5S; gmcast.version = 0; ist.recv_addr = 192.168.73.110; pc.announce_timeout = PT3S; pc.checksum = false; pc.ignore_quorum = false; pc.ignore_sb = false; pc.linger = PT20S; pc.npvo = false; pc.recovery = true; pc.version = 0; pc.wait_prim = true; pc.wait_prim_timeout = PT30S; pc.weight = 1; protonet.backend = asio; protonet.version = 0; repl.causal_read_timeout = PT30S; repl.commit_order = 3; repl.key_format = FLAT8; repl.max_ws_size = 2147483647; repl.proto_max = 9; socket.checksum = 2; socket.recv_buf_size = 212992;
*************************** 28. row ***************************
Variable_name: wsrep_recover
Value: OFF
*************************** 29. row ***************************
Variable_name: wsrep_replicate_myisam
Value: OFF
*************************** 30. row ***************************
Variable_name: wsrep_restart_slave
Value: OFF
*************************** 31. row ***************************
Variable_name: wsrep_retry_autocommit
Value: 1
*************************** 32. row ***************************
Variable_name: wsrep_slave_fk_checks
Value: ON
*************************** 33. row ***************************
Variable_name: wsrep_slave_threads
Value: 1
*************************** 34. row ***************************
Variable_name: wsrep_slave_uk_checks
Value: OFF
*************************** 35. row ***************************
Variable_name: wsrep_sst_auth
Value:
*************************** 36. row ***************************
Variable_name: wsrep_sst_donor
Value:
*************************** 37. row ***************************
Variable_name: wsrep_sst_donor_rejects_queries
Value: OFF
*************************** 38. row ***************************
Variable_name: wsrep_sst_method
Value: rsync
*************************** 39. row ***************************
Variable_name: wsrep_sst_receive_address
Value: AUTO
*************************** 40. row ***************************
Variable_name: wsrep_start_position
Value: 00000000-0000-0000-0000-000000000000:-1
*************************** 41. row ***************************
Variable_name: wsrep_sync_wait
Value: 0
41 rows in set (0.00 sec)
MySQL高可用(Galera Cluster)