MYSQL高可用方案主要分爲兩大類,一類是前置管理,一類是後置管理。
前置管理的思想是利用各類前置管理工具,動態切換或者分發請求到不一樣的實例並切換master,如keepalived、MHA、packmaker+Corosync、MySQLProxy等,通常經過暴露VIP將整個MYQL集羣隱藏起來,其中Proxy主要用以讀寫分離。後置管理則是利用共享存儲的思想,如NDB方案。因爲咱們的用戶尚不足百萬,因此一開始的計劃是選擇最簡單的前置管理模式-雙主+keepalived方案,後來由於阿里雲停用了VIP服務,因而購買了其提供的負載均衡SLB服務(替代keepalived使用),最終完成了雙主+VIP的搭建。無論怎樣,keepalived的思想仍是比較經典的,因此也作了簡單記錄。node
#查詢已經存在的mysql並刪除mysql
rpm -qa |grep mysql rpm -qa |grep mariadb
#刪除已經存在的mysqlsql
rpm -e --nodeps mariadbxxxx rpm -e --nodeps mysqlxxxx
#下載解壓並copy到/usr/local/mysql
#建立mysql數據日誌目錄數據庫
mkdir -p /data/mysql/data mkdir -p /data/mysql/log mkdir -p /data/mysql/bak
#初始化my.cnfvim
[mysql] default-character-set=utf8 [mysqld] character_set_server=utf8 default-storage-engine=INNODB datadir=/data/mysql/data #socket=/data/mysql/data/mysql.sock port=3306 symbolic-links=0 log-error=/data/mysql/log/mysqld.log pid-file=/data/mysql/mysqld.pid
###將support-files的mysql.server copy 到etc/init.d/以開機啓動bash
cd /usr/local/mysql/support-files/ cp mysql.server /etc/init.d/mysql
#修改mysql默認配置服務器
vim /etc/init.d/mysql basedir=/usr/local/mysql datadir=/data/mysql/data
#建立mysql系統用戶並受權到mysql啓動網絡
groupadd mysql useradd -r -g mysql mysql passwd mysql mysqlpwd chown -R mysql:mysql /usr/local/mysql/ chown -R mysql:mysql /data/mysql/
#將mysqlbin目錄添加到環境變量負載均衡
echo 'export PATH=/usr/local/mysql/bin:$PATH' >> /etc/profile source /etc/profile
#初始化mysql數據庫socket
yum install libaio-devel.x86_64 mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql/data
#獲取初始密碼
tail -f /data/mysql/log/mysql.log [Note] A temporary password is generated for root@localhost: im>wqfae&7tY
#給數據庫加密
mysql_ssl_rsa_setup --datadir=/data/mysql/data chown -R mysql:mysql /data/mysql/
##設置開機自動重啓
chkconfig --add mysql chkconfig mysql on
##查看、中止、重啓mysql
systemclt status mysql.service systemctl start mysql.service systemctl stop mysql.service systemctl restart mysql.service
#啓動mysql服務systemctl start mysql.service
#使用初始密碼登陸mysql -uroot -p --socket=/data/mysql/data/mysql.sock
#設置新密碼,受權root用戶訪問
set password=password('*******'); grant all privileges on *.* to root@'%' identified by '('*******');'; flush privileges;
1. 配置master1和master2 binlog
#master1配置
[mysqld] log-bin=mysql-bin server-id=70 gtid_mode = on enforce_gtid_consistency = 1 log_slave_updates=1 #binlog-ignore=mysql #binlog-ignore=information_schema #replicate-do-db=platform88
#master2配置
[mysqld] log-bin=mysql-bin server-id=71 gtid_mode = on enforce_gtid_consistency = 1 log_slave_updates=1 #binlog-ignore=mysql #binlog-ignore=information_schema #replicate-do-db=platform88 #read_only=1
###備註:手動切換主庫
mysql> stop slave; #千萬不要執行 reset master,不然會從最早的GTID上開始執行。 mysql> change master to master_host='127.0.0.1',master_user='rep',master_password='rep',master_port=3307,master_auto_position=1; #指定到另外一個比較接近主的從上。 mysql> start slave;
2. 建立可互相訪問的用戶
#master1配置
CREATE USER 'ms_repl_usr'@'172.26.27.71' IDENTIFIED BY 'ms_repl_pwd'; GRANT REPLICATION SLAVE ON *.* TO 'ms_repl_usr'@'172.26.27.71'; FLUSH PRIVILEGES;
#master2配置
CREATE USER 'ms_repl_usr'@'172.26.27.70' IDENTIFIED BY 'ms_repl_pwd'; GRANT REPLICATION SLAVE ON *.* TO 'ms_repl_usr'@'172.26.27.70'; FLUSH PRIVILEGES;
查看binlog及位移show master status \G
#master1配置
CHANGE MASTER TO MASTER_HOST='172.26.27.71', MASTER_PORT=30468, MASTER_USER='ms_repl_usr', MASTER_PASSWORD='ms_repl_pwd', MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=1459;
或者:change master to master_host='172.26.27.71',master_user='ms_repl_usr',master_password='ms_repl_pwd', master_auto_position=1;
#master2配置
CHANGE MASTER TO MASTER_HOST='172.26.27.70', MASTER_PORT=30468, MASTER_USER='ms_repl_usr', MASTER_PASSWORD='ms_repl_pwd', MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=2086;
或者:change master to master_host='172.26.27.70'',master_user='ms_repl_usr',master_password='ms_repl_pwd', master_auto_position=1;
#分別重啓master1和master2
查看 salve statusshow slave status \G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
3. keepalived 配置
keepalived主要用檢測對方服務的狀態,並經過關閉或者重啓自身服務達到切換VIP優先級的效果。keepalived能夠監控4層或者7層網絡,4層經過配置虛擬服務實現,本例子中使用7層監控。
#master1 配置
vrrp_script chk_mysql { script "/etc/keepalived/check_mysql.sh" interval 30 #設置檢查間隔時長,可根據本身的需求自行設定 } vrrp_instance VI_1 { state BACKUP #經過下面的priority來區分MASTER和BACKUP,也只有如此,底下的nopreempt纔有效 interface eth0 virtual_router_id 51 priority 100 advert_int 1 nopreempt #防止切換到從庫後,主keepalived恢復後自動切換回主庫 authentication { auth_type PASS auth_pass PWD } track_script { chk_mysql } virtual_ipaddress { 192.168.72.109 } }
#master2配置
! Configuration File for keepalived vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass PWD } notify_master /etc/keepalived/notify_master_mysql.sh #此條指令告訴keepalived發現本身轉爲MASTER後執行的腳本 virtual_ipaddress { 192.168.72.109 } }
#check_mysql.sh主要用來監聽或者連接mysql實例,若是發現mysql沒法鏈接,則直接重啓keepalived,或者中止keepalived,讓虛擬IP漂移到另外一臺服務器上。這裏以監聽端口爲例:
#!/bin/bash #This scripts is check for Mysql Slave status echo 'testing...' counter=`netstat -luntp|grep 3306|wc -l` echo 'after counting...' if [ "$counter" -eq 0 ]; then echo "3306 is down..." systemctl stop keepalived else echo '3306 is working..' fi
check腳本中常常遇到的一個問題是,命令須要用全路徑,如mysql登陸,/usr/local/mysql/bin/mysql -uroot -pxxxx --port 3306
修改keepalived的日誌輸出,默認輸出在/var/log/message。從keepalived的日誌中能夠看到,master切換的過程。
vim /etc/rsyslog.conf keepalived -S 0 local0.* /var/log/keepalived.log
#經過負載均衡管理界面建立主備服務器組
#添加雙主實例
這樣就完成了阿里雲雙主的搭建,從這個結構延伸開來,能夠分別爲兩個主節點添加slave節點,行程4或者6節點結構。若是須要讀寫分離,提升資源的利用率,能夠經過前置mysqlproxy來將讀寫分開。