Galera Cluster
Galera本質是一個wsrep提供者(provider),運行依賴於wsrep的API接口。Wsrep API定義了一系列應用回調和複製調用庫,來實現事務數據庫同步寫集(writeset)複製以及相似應用。目的在於從應用細節上實現抽象的,隔離的複製。雖然這個接口的主要目標是基於認證的多主複製,但同樣適用於異步和同步的主從複製。
Galera Cluster號稱是世界上最先進的開源數據庫集羣方案,mysql構建在Galera之上,當有新的寫操作產生時,數據庫之間的複製並不是通過mysql的複製線程來請求二進制日誌實現數據的重放,而是通過wsrep API調用galera replication庫來實現文件的同步複製,並在每個服務器上執行一遍,要不所有服務器都執行成功,要不就所有都回滾,保證所有服務的數據一致性,而且所有服務器同步實時更新。
Galera的架構:
優點:真正的多主服務模式:多個服務能同時被讀寫,不像Fabric那樣某些服務只能作備份用同步複製:無延遲複製,不會產生數據丟失熱備用:當某臺服務器當機後,備用服務器會自動接管,不會產生任何當機時間自動擴展節點:新增服務器時,不需手工複製數據庫到新的節點支持InnoDB引擎對應用程序透明:應用程序不需作修改
缺點:由於同一個事務需要在集羣的多臺機器上執行,因此網絡傳輸及併發執行會導致性能上有一定的消耗。所有機器上都存儲着相同的數據,全冗餘。若一臺機器既作爲主服務器,又作爲備份服務器,出現樂觀鎖導致rollback的概率會增大,編寫程序時要小心。
不支持的SQL:LOCK / UNLOCK TABLES / GET_LOCK(), RELEASE_LOCK()…不支持XA Transaction
實驗準備:
三臺虛擬機 172.18.250.77 172.18.250.78 172.18.250.79 CentOS 7
一、安裝galera cluster
mysql支持galera cluster的三種方法:
1、mysql官方提供支持galera cluster的版本
2、percona-cluster支持的mysql版本
3、Mariadb-Cluster
]# yum -y install MariaDB-Galera-server MariaDB-shared MariaDB-client MariaDB-common galera ]# rpm -ql MariaDB-Galera-server /etc/init.d/mysql //啓動文件 /etc/logrotate.d/mysql /etc/my.cnf.d /etc/my.cnf.d/server.cnf //配置文件
配置Galera Cluster:每臺節點都配置相同的配置文件
]# vim /etc/my.cnf.d/server.cnf [galera] # Mandatory settings wsrep_provider = /usr/lib64/galera/libgalera_smm.so //實現galera集羣的提供者 wsrep_cluster_address= "gcomm://172.18.250.77,172.18.250.78,172.18.250.79" //wsrep的IP地址, gcomm表示提供組會話 binlog_format=row //二進制日誌的格式 default_storage_engine=InnoDB //默認存儲引擎 innodb_autoinc_lock_mode=2 //鎖格式 bind-address=0.0.0.0 //wsrep工作時監聽在哪個地址上 wsrep_cluster_name = 'mycluster' //wsrep的名稱 # Optional setting wsrep_slave_threads=1 //從服務器線程數 innodb_flush_log_at_trx_commit=0 //事務提交時是否刷新日誌
配置各節點的主機名: 每天節點上都需要操作
172.18.250.77 node1.baidu.com 172.18.250.78 node2.baidu.com 172.18.250.79 node3.baidu.com ]# systemctl stop firewalld.service //關閉防火牆,以免影響 ]# setenforce 0 //關閉selinux
啓動mysql:
]# /etc/init.d/mysql start --wsrep-new-cluster //首次啓動時,需要初始化集羣,在其中一個節點上執行 ]# service mysql start //其它兩節點正常啓動 ]# service mysql start Starting MySQL...SST in progress, setting sleep higher. //顯示這個表示集羣配置成功 ]# ss -tan //查看啓動端口 State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 50 *:3306 *:* LISTEN 0 128 *:4567 *:*
在其中一臺創建數據庫,看是否能正常複製到其它兩節點
MariaDB [(none)]> create database hellodb; MariaDB [(none)]> show databases; //在其它兩節點上查看 +--------------------+ | Database | +--------------------+ | information_schema | | hellodb | //數據庫複製成功 | mysql | | performance_schema | | test | +--------------------+ 5 rows in set (0.23 sec)
創建表,添加數據:
MariaDB [hellodb]> create table students (id int unsigned auto_increment not null primary key,name char(30) not null,age tinyint unsigned,gender enum('f','m')); Query OK, 0 rows affected (0.92 sec) MariaDB [hellodb]> insert into students (name) values ("Hi"); //在一臺節點上添加數據 Query OK, 1 row affected (0.01 sec) MariaDB [hellodb]> insert into students (name) values ("Hello"); Query OK, 1 row affected (0.01 sec) MariaDB [hellodb]> select * from students; +----+-------+------+--------+ | id | name | age | gender | +----+-------+------+--------+ | 1 | Hi | NULL | NULL | | 4 | Hello | NULL | NULL | //如果字段時自動增加的話,則時按集羣的節點數顯示下一個數據 +----+-------+------+--------+ 2 rows in set (0.00 sec) 解決辦法: 1、設定一個全局分配ID生成器,解決數據插入時ID順序不一致 2、手動指定id號,不能自動生成
停止一臺節點上的mysql:
]# service mysql stop Shutting down MySQL.......... SUCCESS! MariaDB [hellodb]> insert into students (name) values ("World"); //一節點插入數據 Query OK, 1 row affected (0.12 sec) MariaDB [hellodb]> select * from students; +----+-------+------+--------+ | id | name | age | gender | +----+-------+------+--------+ | 1 | Hi | NULL | NULL | | 4 | Hello | NULL | NULL | | 6 | World | NULL | NULL | +----+-------+------+--------+ 3 rows in set (0.00 sec)
在啓動節點上的mysq:
]# service mysql start Starting MySQL.........SST in progress, setting sleep higher. MariaDB [hellodb]> select * from students; +----+-------+------+--------+ | id | name | age | gender | +----+-------+------+--------+ | 1 | Hi | NULL | NULL | | 4 | Hello | NULL | NULL | | 6 | World | NULL | NULL | //數據自動同步 +----+-------+------+--------+ 3 rows in set (0.01 sec)
HMA:
MHA(Master HA)是一款開源的MySQL的高可用程序,它爲MySQL主從複製架構提供了automating master failover功能。MHA在監控到master節點故障時,會提升其中擁有最新數據的slave節點稱爲新的master節點,在此期間,MHA會通過於其它從節點獲取額外信息來避免一致性方面的問題。MHA還提供了master節點的在線切換功能,即按需切換master/slave節點。
MHA服務有兩種角色,MHA Manager(管理節點)和MHA Node(數據節點):
MHA Manager:通常單獨不熟在一臺獨立機器上管理多個master/slave集羣,每個master/slave集羣稱作一個application;
MHA node:運行在每臺MySQL服務器上(master/slave/manager),它通過監控具備解析和清理logs功能的腳本來家客故障轉移。
MHA架構:
實驗準備:
1、虛擬機 172.18.250.77 CentOS 7 MHA Manger
2、虛擬機 172.18.250.78 CentOS 7 MHA Node mysql主
3、虛擬機 172.18.250.79 172.18.250.80 CentOS 7 MHA Node mysql從
一、安裝MHA
]# yum -y install mha4mysql-manager-0.56-0.el6.noarch.rpm ]# yum -y install mha4mysql-node-0.56-0.el6.noarch.rpm mariadb-server //mysql服務器上安裝
配置管理主節點:
]# rpm -ql mha4mysql-manager /usr/bin/masterha_check_repl //檢測MySQL複製集羣的連接配置參數是否正常; /usr/bin/masterha_check_ssh //檢測各節點ssh通信是否正常 /usr/bin/masterha_check_status //顯示mysql主節點 /usr/bin/masterha_conf_host //刪除或添加配置的節點 /usr/bin/masterha_manager //啓動manager /usr/bin/masterha_master_monitor //監控mysql主節點可用性 /usr/bin/masterha_master_switch //master節點切換工具 /usr/bin/masterha_stop //關閉MHA服務的工具
Manager節點需要爲每個監控的master/slave集羣提供一個專用的配置文件,而所有的master/slave集羣也可共享全局配置。全局配置文件默認爲/etc/masterha_default .cnf,其爲可選配置。如果僅監控一組master/slave集羣,也可直接通過application的配置來提供各服務器的默認配置信息。而每個application的配置文件路徑爲自定義。
]# mkdir /etc/masterha ]# vim /etc/masterha/app1.cnf [server default] user=hauser //MHA登錄mysql的賬號 password=hauser manager_workdir=/data/masterha/app1 //MHA工作目錄 manager_log=/data/masterha/app1/manager.log //MHA日誌文件 remote_workdir=/data/masterha/app1 //存儲到其它節點的文件信息 ssh_user=root //基於哪個用戶遠程 repl_user=admin //mysql複製二進制用戶 repl_password=admin ping_interval=1 //多長時間掃描一次mysql節點 [server1] hostname=172.18.250.78 //節點主機名稱,可以是IP和主機名 candidate_master=1 //如果mysql主節點故障提升爲主節點 [server2] hostname=172.18.250.79 candidate_master=1 [server3] hostname=172.18.250.80
配置各節點環境:
MHA集羣中的各節點彼此之間是通過SSH通信,以實現遠程控制及數據管理 ,基於密鑰方式通信就無需輸入遠程賬號密碼
]# ssh-keygen -t rsa -P '' //生成密鑰對 ]# cat .ssh/id_rsa.pub >.ssh/authorized_keys //把公鑰保存在認證文件中 ]# chmod 600 .ssh/authorized_keys ]# scp -p .ssh/id_rsa .ssh/authorized_keys [email protected]:/root/.ssh/ ]# scp -p .ssh/id_rsa .ssh/authorized_keys [email protected]:/root/.ssh/ ]# scp -p .ssh/id_rsa .ssh/authorized_keys [email protected]:/root/.ssh/ //複製私鑰和認證文件到其它節點上 ]# systemctl stop firewalld.service ]# setenforce 0 //關閉防火牆和selinux
配置mysql:
]# vim /etc/my.cnf //mysql主服務器上配置 skip_name_resolve=ON innodb_file_per_table=ON log-bin=master-bin relay-log=relay-log ]# vim /etc/my.cnf //mysql從服務器上配置 skip_name_resolve=ON innodb_file_per_table=ON log-bin=master-bin relay-log=relay-log read-only=1 //mha通過這來判斷哪個是mysql主服務器 relay-log-purge=0 ]# service mariadb start
配置mysql複製所需的環境:
主服務器上: MariaDB [(none)]> grant all on *.* to 'hauser'@'172.18.250.%' identified by 'hauser'; //授權mha能登錄mysql MariaDB [(none)]> grant replication slave,replication client on *.* to 'admin'@'172.18.250.%' identified by 'admin'; // 授權mysql從服務器能遠程登錄複製 從服務器上: MariaDB [(none)]> change master to master_host='172.18.250.78', master_user='admin', master_password='admin', master_log_file='master-bin.000003', master_log_pos=558; MariaDB [(none)]> start slave; Query OK, 0 rows affected (0.02 sec) MariaDB [(none)]> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 172.18.250.78 Master_User: admin Master_Port: 3306 Connect_Retry: 60 Master_Log_File: master-bin.000004 Read_Master_Log_Pos: 245 Relay_Log_File: relay-log.000003 Relay_Log_Pos: 530 Relay_Master_Log_File: master-bin.000004 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 245 Relay_Log_Space: 1103 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 1 row in set (0.05 sec)
在MHA管理節點上檢測ssh,repl等是否正常:
]# masterha_check_ssh --conf=/etc/masterha/app1.cnf
]# masterha_check_repl --conf=/etc/masterha/app1.cnf
啓動manager:
]# masterha_manager --conf=/etc/masterha/app1.cnf Thu Jun 9 14:17:49 2016 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping. Thu Jun 9 14:17:49 2016 - [info] Reading application default configuration from /etc/masterha/app1.cnf.. Thu Jun 9 14:17:49 2016 - [info] Reading server configuration from /etc/masterha/app1.cnf.. manger處於前臺工作,一直檢測中
停止主服務器上的mysql,看是否會把從節點提升爲主節點,形成高可用:
]# masterha_manager --conf=/etc/masterha/app1.cnf Thu Jun 9 14:17:49 2016 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping. Thu Jun 9 14:17:49 2016 - [info] Reading application default configuration from /etc/masterha/app1.cnf.. Thu Jun 9 14:17:49 2016 - [info] Reading server configuration from /etc/masterha/app1.cnf.. Creating /data/masterha/app1 if not exists.. ok. Checking output directory is accessible or not.. ok. Binlog found at /var/lib/mysql, up to master-bin.000004 Thu Jun 9 14:20:01 2016 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping. Thu Jun 9 14:20:01 2016 - [info] Reading application default configuration from /etc/masterha/app1.cnf.. Thu Jun 9 14:20:01 2016 - [info] Reading server configuration from /etc/masterha/app1.cnf.. manger立馬停止 ]# tail /data/masterha/app1/manager.log Started automated(non-interactive) failover. //啓動主服務器流動 The latest slave 172.18.250.79(172.18.250.79:3306) has all relay logs for recovery. Selected 172.18.250.79(172.18.250.79:3306) as a new master. 172.18.250.79(172.18.250.79:3306): OK: Applying all logs succeeded. 172.18.250.80(172.18.250.80:3306): This host has the latest relay log events. Generating relay diff files from the latest slave succeeded. 172.18.250.80(172.18.250.80:3306): OK: Applying all logs succeeded. Slave started, replicating from 172.18.250.79(172.18.250.79:3306) 172.18.250.79(172.18.250.79:3306): Resetting slave info succeeded. Master failover to 172.18.250.79(172.18.250.79:3306) completed successfully. //172.18.250.79已成爲主服務器
MariaDB [(none)]> show slave status\G; //在250.80從服務器上看主節點已變更 *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 172.18.250.79 Master_User: admin Master_Port: 3306 Connect_Retry: 60 Master_Log_File: master-bin.000002 Read_Master_Log_Pos: 245 Relay_Log_File: relay-log.000002 Relay_Log_Pos: 530 Relay_Master_Log_File: master-bin.000002 Slave_IO_Running: Yes Slave_SQL_Running: Yes
注意:主服務器故障下線時,修復後不能立即讓主服務器上線,需要修改配置讓主服務器變成從服務,以防集羣腦裂。
]# service mariadb start MariaDB [(none)]> change master to master_host='172.18.250.79', master_user='admin', master_password='admin', master_log_file='master-bin.000002', master_log_pos=245; MariaDB [(none)]> start slave; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 172.18.250.79 Master_User: admin Master_Port: 3306 Connect_Retry: 60 Master_Log_File: master-bin.000002 Read_Master_Log_Pos: 245 Relay_Log_File: relay-log.000002 Relay_Log_Pos: 530 Relay_Master_Log_File: master-bin.000002 Slave_IO_Running: Yes Slave_SQL_Running: Yes
再次通過manger檢測複製功能:
]# masterha_check_repl --conf=/etc/masterha/app1.cnf
這就是MHA的高可用mysql集羣的流程。
配置MHA還需注意幾點:
1、masterha_manager 運行時是工作於前臺的(可以放到後臺工作),而且不能斷開,一旦進行主節點切換後,就停止工作,得手動在把masterha_manager啓動起來,這時需要腳本實現
2、提供額外檢測機制,以免對master的監控做出誤判
3、在master節點上提供虛擬IP地址向外提供服務,以免主節點改變時還需要到分離器上修改IP
4、進制故障轉移時對原有master節點執行stonith操作以避免腦裂,可通過指定shutdown_script實現
5、必要時,進行在線master節點轉換