本文先配置了一個雙master環境,互為主從,然後通過Keepalive配置了一個虛擬IP,客戶端通過虛擬IP連線master1,當master1當機,自動切換到master2。一次只能連線其中一個master進行讀寫,所以是active-passive模式。
一 Mysql主主複製搭建
1.1 實驗環境
兩臺機器事先都已經裝好了mysql單例項。
二者的埠號需要保持一致,否則在最後用vip連線的時候,不能使用相同埠號連線。
1.2 實驗步驟
1.2.1 修改配置檔案
修改master1:
在[mysqld]下面新增:
server-id = 1
relay-log=/data/server/mysql_3307/binlog/ZabbixServer-relay-bin
relay-log-index=/data/server/mysql_3307/binlog/ZabbixServer-relay-bin.index
auto-increment-offset = 1
auto-increment-increment = 2
log-slave-updates=true
修改master2:
在[mysqld]下面新增:
server-id = 3
relay-log =/data/server/mysql/binlog/single-relay-bin
relay-log-index=/data/server/mysql/binlog/single-relay-bin.index
auto-increment-offset = 2
auto-increment-increment = 2
log-slave-updates=true
新增auto-increment-offset那兩項,是為了避免在MySQL INSERT時主鍵衝突。
修改完後記得重啟mysql
1.2.2 建複製使用者
分別在兩臺mysql上執行
GRANT REPLICATION SLAVE ON *.* TO 'RepUser'@'%'identified by 'beijing';
1.2.3 指向master
兩臺伺服器均為新建立,且無其它寫入操作,各伺服器只需記錄當前自己二進位制日誌檔案及事件位置,以之作為另外的伺服器複製起始位置即可。否則,需要先備份主庫,在備庫進行恢復,從而保持資料一致,然後再指向master。
Master1:
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 302| | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
Master2:
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 120 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
#Master1指向Master2
- CHANGE MASTER TO MASTER_USER='RepUser',MASTER_HOST='192.168.1.21',MASTER_PASSWORD='beijing',MASTER_PORT=3307,MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=120;
#Master2指向Master1
- CHANGE MASTER TO MASTER_USER='RepUser',MASTER_HOST='192.168.1.22',MASTER_PASSWORD='beijing', MASTER_PORT=3307,MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=302;
1.2.4 分別啟動slave
start slave ;
確保show slave status
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
測試兩邊是否同步,略。
二:配置keepalived
1 keepalive安裝
分別在master1,master2上安裝keepalive
- yum install -y popt-devel
- cd /usr/local/src
- wget http://www.keepalived.org/software/keepalived-1.2.2.tar.gz
- tar zxvf keepalived-1.2.2.tar.gz
- cd keepalived-1.2.2
- ./configure --prefix=/
- make
- make install
#假如在執行./configure --prefix=/時報錯: OpenSSL is not properly installed on your system !!!Can notinclude OpenSSL headers files,則yum install openssl-devel -y
2 分別在master1,master2上新建檢查mysql指令碼
vi /root/check_mysql.sh
內容如下
chmod +x /root/check_mysql.sh
3 修改配置檔案
vi /etc/keepalived/keepalived.conf
master1和master2配置檔案內容相同。
內容:
這裡state不配置MASTER,且優先順序一樣,是期望在MASTER1當機後再恢復時,不主動將MASTER狀態搶過來,避免MySQL服務的波動。
由於不存在使用lvs進行負載均衡,不需要配置虛擬伺服器virtual server,下同。
4 vi /etc/sysconfig/iptables
#注意,在兩臺機器上都要修改。
新增:
-A INPUT -d 192.168.1.60/32 -j ACCEPT
-A INPUT -d 224.0.0.18 -j ACCEPT #新增VRRP通訊支援
注意:第一行中的192.168.1.60需要改成你自己的vip。
service iptables restart
5 啟動keepalived
在master1、master2上分別啟動:
service keepalived start
分別執行ip addr命令,可以在其中一臺機器上看到虛擬IP.如:
[root@slave1 keepalived]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_faststate UP qlen 1000
link/ether 08:00:27:04:05:16 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.22/24 brd 192.168.1.255 scope global eth0
inet 192.168.1.60/32 scope global eth0
inet6 fe80::a00:27ff:fe04:516/64 scope link tentativedadfailed
valid_lft forever preferred_lft forever
說明虛擬vip連在了master1這臺機器上。
如果自動只連線到了master2,關閉master2的keepalived,再啟動,自動就連線到master1了。
現在都可以ping通虛擬ip了。
6 測試
停止master1伺服器keepalived,檢查VIP是否切換到master2伺服器(用ip addr命令驗證即可);
三 測試高可用環境是否配置成功
3.1 建允許遠端訪問的使用者
在master1,master2建立允許遠端訪問的使用者:
grant select,update,delete,insert on *.* to 'dandan' identified by 'dandan';
3.2 訪問虛擬IP
用一臺同網段的機器訪問通過vip訪問資料庫:
mysql -u dandan-pdandan -h 192.168.1.60 --port 3307
停止master1伺服器的mysql,VIP切換到了master2伺服器。
在master2上檢視:
- mysql> showprocesslist;
- +----+-------------+--------------------+------+---------+------+-----------------------------------------------------------------------------+------------------+
- | Id | User | Host | db | Command | Time | State | Info |
- +----+-------------+--------------------+------+---------+------+-----------------------------------------------------------------------------+------------------+
- | 3 | root | localhost | dba | Query | 0 | init | show processlist |
- | 14 | systemuser | | NULL |Connect | 247 | Reconnecting after afailed master event read | NULL |
- | 15 | systemuser | | NULL |Connect | 207 | Slave has read all relaylog; waiting for the slave I/O thread to update it | NULL |
- | 90 |dandan | 192.168.1.60:39995 |dba | Sleep | 8| | NULL |
- +----+-------------+--------------------+------+---------+------+-----------------------------------------------------------------------------+------------------+
看到了dandan的連線資訊。