Innodb Cluster叢集部署配置
一.簡介
MySQL InnoDB Cluster提供了一個整合的,本地的,HA解決方案,由以下幾部分組成:
MySQL Servers with Group Replication:向叢集的所有成員複製資料,同時提供容錯、自動故障轉移和彈性。
MySQL Router:確保客戶端請求是負載平衡的,並在任何資料庫故障時路由到正確的伺服器。
MySQL Shell:通過內建的管理API建立及管理Innodb叢集。
各個元件的關係如下圖所示:
每臺伺服器例項都執行MySQL Group Replication (冗餘複製機制,內建failover)
MGR有兩種模式,一種是Single-Primary,一種是Multi-Primary,即單主或者多主。
注意:模式Multi-Primary中,所有的節點都是主節點,都可以同時被讀寫,看上去這似乎更好,但是因為多主的複雜性,在功能上如果設定了多主模式,則會有一些使用的限制,比如不支援Foreign Keys with Cascading Constraints。
二.環境宣告
環境:
ubuntu 16.4
mysql-5.7
多主模式
機器:
192.168.1.1 mysql-1
192.168.1.2 mysql-2
192.168.1.3 mysql-3
三.部署
安裝(均操作)
1.下載deb
wget https://repo.mysql.com//mysql-apt-config_0.8.10-1_all.deb
按第一個,然後根據需要選擇版本,這裡選擇mysql-5.7,選擇後他會返回到第一頁,這時候選擇ok即可,會發現第一個的引數變成了5.7了
dpkg -i mysql-apt-config_0.8.10-1_all.deb
更新源
apt-get update
2.安裝MySQL及元件,不要加-y,其中會彈出一個mysql設定密碼的框,填寫即可
apt-get install mysql-server mysql-shell mysql-router
3.新增MySQL使用者和許可權,預設安裝完mysql就是啟動的,賬號密碼根據情況設定,每個節點要一致,可以將root改為其它使用者。
mysql -u root -p
grant all privileges on *.* to 'root'@'%' identified by 'password';
GRANT ALL PRIVILEGES ON mysql_innodb_cluster_metadata.* TO root@'%' WITH GRANT OPTION;
GRANT RELOAD,SHUTDOWN,PROCESS,FILE, SUPER,REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO root@'%' WITH GRANT OPTION;
GRANT SELECT ON *.* TO root@'%' WITH GRANT OPTION;
4.修改/etc/hosts
vim /etc/hosts
192.168.1.1 mysql-1
192.168.1.2 mysql-2
192.168.1.3 mysql-3
配置(均操作)
1.修改配置檔案,主要修改server_id和local_address
vim /etc/mysql/my.cnf
[mysqld]
#mysql自身配置,這裡預設即可
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
server_id = 1 #2,3 要每臺不一樣
gtid_mode = ON #開啟gitd複製
log_bin = bilog
log_slave_updates = ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
transaction_write_set_extraction = XXHASH64
enforce_gtid_consistency = ON
slave_preserve_commit_order = ON #確保GR_applier按照一致的順序復現事務
binlog_checksum = NONE
loose-group_replication_group_name = a38e32fd-5fb6-11e8-ad7a-00259015d941 #UUID號,叢集中要一致
loose-group_replication_local_address= "192.168.1.1:13306" #本地叢集埠
loose-group_replication_group_seeds= "192.168.1.1:13306,192.168.1.2:13306,192.168.1.3:13306"
loose-group_replication_start_on_boot = OFF #預設關閉, 防止重啟後自動建立新的Group
loose-group_replication_bootstrap_group = OFF #預設關閉, 防止自動建立新的Group
loose-group_replication_allow_local_disjoint_gtids_join = ON
loose-group_replication_single_primary_mode = OFF ##在單主模式中為ON,在多主模式中為OFF
loose-group_replication_enforce_update_everywhere_checks = ON
重啟
systemctl restart mysql
2.檢查配置,進入mysql-js shell,user是剛才配置的賬號,登陸後可以按y儲存密碼,以後登陸js不需要密碼
mysqlsh [email protected]:3306
過一會返回一個"status": "ok"則是叢集配置正確了
mysql-js> dba.configureLocalInstance('root@localhost:3306');
如果返回error就往上翻,會有提示配置錯誤的部分
開啟group_replication(均操作)
1.為之前建立的叢集使用者,新增許可權
change master to master_user='root',master_password='password' for channel 'group_replication_recovery';
2.安裝group_replication
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
啟動group_replication
1.第一臺機器操作
set global group_replication_bootstrap_group=on;
start group_replication;
set global group_replication_bootstrap_group=off;
如果上述命令報錯3098,在多主模式下登陸資料庫做如下操作:
進入資料庫,查詢叢集庫的表名
use mysql_innodb_cluster_metadata
show databases;
查詢建立表語句,找到CONSTRAINT開頭的部分,每個表都要找
show create table 表名\G;
CONSTRAINT `外來鍵名` FOREIGN KEY (`xxxx`) REFERENCES `xxxxxx` (`id`)
刪除外來鍵,多主模式叢集不支援外來鍵,刪除每個有外來鍵的表
alter table 表名 drop foreign key 外來鍵名;
再操作一遍如下即可
set global group_replication_bootstrap_group=on;
start group_replication;
`set global group_replication_bootstrap_group=off;
2.其它節點機器操作
start group_replication;
建立叢集(在mysql-1執行)
1.建立,進入js後操作,單主模式叢集執行var cluster = dba.createCluster('mysqlCluster')
mysqlsh [email protected]:3306
當前多主機模式執行操作,按y確定
mysql-js> var cluster = dba.createCluster('mycluster',{force:1})
如果是單機模式,執行如下
mysql-js> var cluster = dba.createCluster('mysqlCluster')
應當返回如下
Cluster successfully created based on existing replication group.Cluster successfully created based on existing replication group.
2.新增其它節點,如果報錯已經添加了,則不用新增
mysql-js> cluster.addInstance('[email protected]:3306')
mysql-js> cluster.addInstance('[email protected]:3306')
3.檢視叢集狀態,會返回一個列表
mysql-js>cluster.status();
建立Mysql-router(在mysql-1執行)
1.新增路由,按提示輸入密碼
mysqlrouter --bootstrap [email protected]:3306 --user mysqlrouter
2.啟動路由
systemctl start mysqlrouter
systemctl enable mysqlrouter
3.檢視埠
netstat -unltp | grep 6446
4.登陸路由,
mysql -u root -h 127.0.0.1 -P 6446 -p
select @@port;
select @@hostname;
然後業務就可以使用router伺服器的地址和6446埠來連線使用mysql叢集,從而實現負載均衡了,不要再直接連三臺msyql伺服器,連線router會自動處理負載均衡,推薦使用多個router節點做備用,防止單個節點掛掉,官方建議router節點可以部署在應用伺服器或者其內網
節點故障重啟後,需要手動加入,示例主節點故障,通過router連線的叢集依然可以正常工作(當然由於少了一臺mysql伺服器,叢集負載能力會相應下降)
cluster.rejoinInstance('[email protected]:3306')
四.維護
如何將Multi-Primary改為Single-Primary?
1.解散原來的叢集
mysql-js> cluster.dissolve({force: true})
2.每臺主機MySQL修改如下配置
mysql> set global group_replication_enforce_update_everywhere_checks=OFF;
mysql> set global group_replication_single_primary_mode=ON;
3.重新建立叢集
mysql-js> var cluster = dba.createCluster('mysqlCluster');
mysql-js> cluster.addInstance('user@svr2:3306');
mysql-js> cluster.addInstance('user@svr3:3306');
五.報錯處理
MEMBER_STATE為RECOVERING
執行如下命令應該都顯示ONLINE,這裡顯示RECOVERING
SELECT * FROM performance_schema.replication_group_members;
解決辦法:
修改/etc/hosts,將主機名和ip對應,然後進到每臺mysql中,操作如下sql即可
主伺服器
set global group_replication_bootstrap_group=on;
start group_replication;
`set global group_replication_bootstrap_group=off;
其它節點:
start group_replication;
3098
報錯資訊:
panic: The table does not comply with the requirements by an external plugin. (errno 3098) (sqlstate HY000)
解決辦法:
意思是表中有外來鍵,多主模式是不支援外來鍵的,但是使用者的mysql即使是第一次安裝也會報這個錯誤;
其實是dba.createCluster()會建立叢集庫mysql_innodb_cluster_metadata,在該庫中會建立五個表,其中四個表有外來鍵!!
不明白官方為什麼留這麼大的一個坑,總之,把表中的外來鍵全部刪除,再次執行就成功了。
3092
報錯資訊:
ERROR 3092 (HY000): The server is not configured properly to be an active member of the group. Please see more details on error log.
解決辦法:
檢視每臺機器的配置檔案這2行是否正確
loose-group_replication_local_address
loose-group_replication_group_seeds
檢視是否啟動了local_address所寫的埠
netstat -unltp