mysql叢集方案
上一篇文章提到 MySQL 叢集方案,除了(分散式系統的ID)裡提到的通過 ID 分片外,官方有許多叢集方案,這篇文章介紹幾個。
InnoDB Cluster (MySQL 7+)
MySQL Router
之前的文章mysql配置主從分離 但是沒有說怎麼做高可用,MySQL Router 即是扮演這個角色,在 master 不可用的時候,選擇一臺 slaver 充當主。MySQL Router 原理類似 LVS,有一個 VIP 暴露給應用層,而應用層不需要知道內部資料庫伺服器的增減。注意 Router 本身不提供高可用,可以通過 keepalived 提供。
配置檔案如下:
[mysql@hdp2~]$more /etc/mysqlrouter.conf [DEFAULT] # 日誌路徑 logging_folder = /home/mysql/mysql-router-2.1.6/log # 外掛路徑 plugin_folder = /home/mysql/mysql-router-2.1.6/lib/mysqlrouter # 配置路徑 config_folder = /home/mysql/mysql-router-2.1.6/config # 執行時狀態路徑 runtime_folder = /home/mysql/mysql-router-2.1.6/run # 資料檔案路徑 data_folder = /home/mysql/mysql-router-2.1.6/data [logger] # 日誌級別 level = INFO # 以下選項可用於路由標識的策略部分 [routing:basic_failover] # Router地址 bind_address = 172.16.1.125 # Router埠 bind_port = 7001 # 讀寫模式 mode = read-write # 目標伺服器 destinations = 172.16.1.126:3306,172.16.1.127:3306 # routing:名稱沒有要求 [routing:load_balance] bind_address = 172.16.1.125 bind_port = 7002 mode = read-only destinations = 172.16.1.126:3306,172.16.1.127:3306
配置欄位[routing:basic_failover]部分對應寫伺服器(master)規則,對應SQL: INSERT, UPDATE…,[routing:load_balance]部分對應讀伺服器(slave)規則,對應SQL: SELECT。如果有其他叢集,還可以繼續配置。
mode欄位可選值有 read-write和read-only
read-write 表示前一個伺服器失敗後,按照順序啟用後一個伺服器。所有的請求都集中在一個伺服器。如果前一個伺服器恢復了,也不會加回到路由表。只能重啟 Router。
read-only 表示一個伺服器失敗後,會按照順序啟用後一個伺服器。所有的請求會按照順序分配到各個伺服器。如果前一個伺服器恢復了,可以加回到路由表。
由此可知,寫服務只能選擇 read-write。如果讀服務對一致性有高要求,也應該選擇 read-write,如果沒有高要求,可以選擇 read-only。
檢視路由
C:\WINDOWS\system32>mysql -utest -p123456 -h172.16.1.125 -P7001 -e "show variables like 'server_id'" mysql: [Warning] Using a password on the command line interface can be insecure. +---------------+-------+ | Variable_name | Value | +---------------+-------+ | server_id| 127| +---------------+-------+
叢集配置
- 伺服器(至少3臺):svr1, svr2, svr3
配置檔案 my.cnf
- 修改不同機器的名稱或IP;
- server_id使用不同編號;
- loose-group_replication_group_name使用UUID形式,叢集中機器使用同一個UUID;
- loose-group_replication_single_primary_mode在單主模式中為ON,在多主模式中為OFF。
[mysqld] # server configuration pid-file= /var/run/mysqld/mysqld.pid socket= /var/run/mysqld/mysqld.sock datadir= /var/lib/mysql log-error= /var/log/mysql/error.log bind-address= 0.0.0.0 # Disabling symbolic-links is recommended to prevent assorted security risks #symbolic-links = 0 # Replication configuration parameters server_id = 1 #2,3 gtid_mode = ON enforce_gtid_consistency = ON master_info_repository = TABLE relay_log_info_repository = TABLE transaction_write_set_extraction = XXHASH64 binlog_checksum = NONE log_slave_updates = ON log_bin = binlog binlog_format = ROW relay-log = svr-relay-bin # # Group Replication configuration loose-group_replication_group_name = a38e32fd-5fb6-11e8-ad7a-00259015d941 loose-group_replication_start_on_boot = OFF loose-group_replication_local_address = svr1:33061 loose-group_replication_group_seeds = svr1:33061,svr2:33061,svr3:3306 loose-group_replication_bootstrap_group = OFF loose-group_replication_allow_local_disjoint_gtids_join = ON # Group Replication configuration multi-primary mode loose-group_replication_single_primary_mode = OFF loose-group_replication_enforce_update_everywhere_checks = ON
建立叢集
$ sudo -i mysqlsh --uri=user@svr1:3306 mysql-js> dba.checkInstanceConfiguration('user@svr1:3306') #檢查配置 #建立叢集 mysql-js> var cluster = dba.createCluster('mysqlCluster')# 單主模式叢集 mysql-js> var cluster = dba.createCluster('mysqlCluster', {multiMaster:true})# 多主模式叢集 mysql-js> cluster.addInstance('user@svr2:3306') mysql-js> cluster.addInstance('user@svr3:3306') #檢視狀態 mysql-js> var cluster = dba.getCluster() mysql-js> cluster.status();
NDB Cluster
NDB Cluster 的採用的是 NDB 引擎,和InnoDB最大的區別是隔離級別只支援 Read Committed。因為InnoDB的預設隔離級別是 Repeatable Read,所以在設計資料庫和遷移資料庫的時候要格外注意這點。NDB Cluster 官方提供了專門的安裝引導,這裡就不詳細說明了。
PS 其實是看到 MySQL Fabric 方案才想寫這篇文章的,不過從官方網站上看,好像 Fabric 方案已經被廢棄了。