MySQL雙主配置mysql
環境準備:git
OS: CentOS7 master:192.168.1.10 backup:192.168.1.20 VIP:192.168.1.30
1、安裝MySQL數據庫.sql
在master 和 backup 上安裝mysql,安裝完後自動啓動,mysql root密碼爲123456數據庫
2、修改MySQL配置文件:vim
1.master端配置文件以下:bash
1.master端配置文件以下: # vim /etc/my.cnf #添加 server_id = 1 #backup上設置爲2 log-bin = /data/mysql/mysql-bin log-bin-index=/data/mysql/my-bin.index binlog-ignore-db = mysql,information_schema #忽略寫入binlog日誌的庫 auto-increment-increment = 2 #字段變化增量值 auto-increment-offset = 1 #初始字段ID爲1 slave-skip-errors = all #忽略全部複製產生的錯誤 # systemctl restart mysqld
2. backup端配置文件以下:服務器
master端和backup端配置只有server_id不同,別的都一致.網絡
3、建立數據同步用戶並查看log bin日誌和pos位置:ide
1.> master上建立 mysql 同步帳號並查看log bin日誌和pos位置:oop
# mysql -uroot -p123456 mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.%' IDENTIFIED BY 'repl'; mysql> flush privileges; mysql> show master status; +------------------+----------+--------------+--------------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+--------------------------+-------------------+ | mysql-bin.000001 | 618 | | mysql,information_schema | | +------------------+----------+--------------+--------------------------+-------------------+
master配置以下:
# mysql -uroot -p123456 mysql> change master to -> master_host='192.168.1.20', #這裏填backup的IP -> master_user='repl', -> master_password='repl', -> master_log_file='mysql-bin.000001', -> master_log_pos=618; mysql> start slave;
2.> backup上建立mysql同步帳號配置以下:
# mysql -uroot -p123456 mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.%' IDENTIFIED BY 'repl'; mysql> flush privileges; mysql> change master to -> master_host='192.168.1.10', #這裏填master的IP -> master_user='repl', -> master_password='repl', -> master_log_file='mysql-bin.000001', -> master_log_pos=618; mysql> start slave; ---------------------
分別查看同步狀態:
master查看:
mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.1.20 Master_User: replication Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 1082 Relay_Log_File: test2-relay-bin.000002 Relay_Log_Pos: 784 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes ---------------------
backup查看:
mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.1.10 Master_User: replication Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 618 Relay_Log_File: test3-relay-bin.000002 Relay_Log_Pos: 320 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes ---------------------
Slave_IO和Slave_SQL是YES說明主主同步成功。
4、MySQL主主同步測試
master上插入數據測試:
mysql> create database testdb; mysql> use testdb; mysql> create table user (number INT(10),name VARCHAR(255)); mysql> insert into user values(01,'testid'); mysql> show tables; +----------------+ | Tables_in_test | +----------------+ | user | +----------------+ ---------------------
backup上查看:
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | testdb | +--------------------+ mysql> use testdb; mysql> show tables; +----------------+ | Tables_in_test | +----------------+ | user | +----------------+ mysql> select number,name from user; +--------+------+ | number | name | +--------+------+ | 1 | testid | +--------+------+ ---------------------
能夠看到已經成功同步過去,一樣在backup插入到user表數據,同樣同步過去,雙主配置沒有問題。
5、配置keepalived實現雙機熱備
1.master安裝keepalived並配置:
# yum install -y keepalived # vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { admin@test.com } notification_email_from admin@test.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id MYSQL_HA } vrrp_instance VI_1 { state BACKUP interface eth0 #根據實際網絡接口進行更改 virtual_router_id 51 priority 100 #優先級,master設置爲100 advert_int 1 nopreempt #不主動搶佔資源,只在master上設置 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.30 } } virtual_server 192.168.1.30 3306 { delay_loop 2 #lb_algo rr #lb_kind NAT persistence_timeout 50 protocol TCP real_server 192.168.1.10 3306 { #檢測本地mysql weight 3 notify_down /tmp/mysql.sh #當mysql服務down時,執行此腳本,殺死keepalived實現切換 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
backup安裝keepalived並配置:
# yum install -y keepalived # vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { admin@test.com } notification_email_from admin@test.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id MYSQL_HA } vrrp_instance VI_1 { state BACKUP interface eth0 #根據實際網絡接口進行更改 virtual_router_id 51 priority 90 #優先級,backup設置爲90 advert_int 1 #nopreempt #主動搶佔資源 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.30 } } virtual_server 192.168.1.30 3306 { delay_loop 2 #lb_algo rr #lb_kind NAT persistence_timeout 50 protocol TCP real_server 192.168.1.20 3306 { #檢測本地mysql weight 3 notify_down /tmp/mysql.sh #當mysql服務down時,執行此腳本,殺死keepalived實現切換 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
master 和 backup上編輯mysql.sh
# vim /tmp/mysql.sh #!/bin/bash pkill keepalived # chmod +x !$ # systemctl start keepalived
兩臺mysql服務器受權容許root遠程登陸:
# mysql -uroot -p123456789 mysql> grant all on *.* to 'root'@'192.168.1.%' identified by '123456'; mysql> flush privileges;
測試高可用
經過mysql客戶端經過VIP鏈接,看是否鏈接成功。
這裏我用同網段的另外一臺機器,鏈接測試:
# mysql -h192.168.1.30 -uroot -p123456 Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> select * from test.user; +--------+------+ | number | name | +--------+------+ | 1 | testid | +--------+------+ 1 row in set (0.01 sec) ---------------------
能夠看到,鏈接成功,且查詢數據沒有問題,中止master上mysql服務,是否能正常切換到backup上,可使用 ip addr命令來查看VIP在哪臺服務器上。
master上查看是否有VIP,能夠看到VIP在master上
# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:cf:ab:c4 brd ff:ff:ff:ff:ff:ff inet 192.168.1.10/24 brd 192.168.1.255 scope global noprefixroute eth0 valid_lft forever preferred_lft forever inet 192.168.1.30/32 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::fe8e:3c2f:4d32:e9fd/64 scope link noprefixroute valid_lft forever preferred_lft forever ---------------------
停掉master上mysql服務:
# systemctl stop mysqld # ps axu |grep keepalived root 11074 0.0 0.0 112708 988 pts/1 S+ 15:28 0:00 grep --color=autokeepalived # ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:cf:ab:c4 brd ff:ff:ff:ff:ff:ff inet 192.168.1.10/24 brd 192.168.1.255 scope global noprefixroute eth0 valid_lft forever preferred_lft forever inet6 fe80::fe8e:3c2f:4d32:e9fd/64 scope link noprefixroute valid_lft forever preferred_lft forever ---------------------
能夠看到,keepalived在mysql服務停掉以後也被停掉,VIP不在master上。
backup上查看是否有VIP,能夠看到VIP在backup上。
# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:33:80:d5 brd ff:ff:ff:ff:ff:ff inet 192.168.1.20/24 brd 192.168.1.255 scope global noprefixroute eth0 valid_lft forever preferred_lft forever inet 192.168.1.30/32 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::4b20:2e16:a957:f9a1/64 scope link noprefixroute valid_lft forever preferred_lft forever ---------------------
查看/var/log/messages日誌,能夠看到主備切換過程:
Apr 8 15:27:16 hosts systemd: Stopping MySQL Server... Apr 8 15:27:16 hosts Keepalived_healthcheckers[11048]: TCP connection to [192.168.1.10]:3306 failed. Apr 8 15:27:19 hosts Keepalived_healthcheckers[11048]: TCP connection to [192.168.1.10]:3306 failed. Apr 8 15:27:19 hosts Keepalived_healthcheckers[11048]: Check on service [192.168.1.10]:3306 failed after 1 retry. Apr 8 15:27:19 hosts Keepalived_healthcheckers[11048]: Removing service [192.168.1.10]:3306 from VS [192.168.1.30]:3306 Apr 8 15:27:19 hosts Keepalived_healthcheckers[11048]: IPVS (cmd 1160, errno 2): No such destination Apr 8 15:27:19 hosts Keepalived_healthcheckers[11048]: Executing [/tmp/mysql.sh] for service [192.168.1.10]:3306 in VS [192.168.1.30]:3306 Apr 8 15:27:19 hosts Keepalived_healthcheckers[11048]: Lost quorum 1-0=1 > 0 for VS [192.168.1.30]:3306 Apr 8 15:27:19 hosts Keepalived_healthcheckers[11048]: Remote SMTP server [127.0.0.1]:25 connected. Apr 8 15:27:19 hosts Keepalived_vrrp[11049]: VRRP_Instance(VI_1) sent 0 priority Apr 8 15:27:19 hosts Keepalived_vrrp[11049]: VRRP_Instance(VI_1) removing protocol VIPs. Apr 8 15:27:19 hosts Keepalived[11047]: Stopping Apr 8 15:27:19 hosts Keepalived_healthcheckers[11048]: IPVS (cmd 1156, errno 2): No such file or directory Apr 8 15:27:19 hosts Keepalived_healthcheckers[11048]: Stopped Apr 8 15:27:20 hosts Keepalived_vrrp[11049]: Stopped Apr 8 15:27:20 hosts Keepalived[11047]: Stopped Keepalived v1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2 Apr 8 15:27:27 hosts systemd: Stopped MySQL Server. ---------------------
恢復master服務器故障,看是否主動搶佔資源,成爲活動服務器。
master上啓動mysql服務和keepalived服務:
# systemctl start mysqld # systemctl start keepalived # ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:cf:ab:c4 brd ff:ff:ff:ff:ff:ff inet 192.168.1.10/24 brd 192.168.1.255 scope global noprefixroute eth0 valid_lft forever preferred_lft forever inet6 fe80::fe8e:3c2f:4d32:e9fd/64 scope link noprefixroute valid_lft forever preferred_lft forever ---------------------
能夠看到,即便master故障恢復,也沒有搶佔資源,VIP仍然在backup上,這是由於以前已經配置了master爲非搶佔模式(nopreempt)。
不過須要注意的是:
nopreempt這個參數只能用於state爲BACKUP的狀況,因此在配置的時候要把master和backup的state都設置成BACKUP,這樣纔會實現keepalived的非搶佔模式!
也就是說:
* 當state狀態一個爲MASTER,一個爲BACKUP的時候,加不加nopreempt這個參數都是同樣的效果。即都是根據priority優先級來決定誰搶佔vip資源的,是搶佔模式!
* 當state狀態都設置成BACKUP,若是不配置nopreempt參數,那麼也是看priority優先級決定誰搶佔vip資源,即也是搶佔模式。
* 當state狀態都設置成BACKUP,若是配置nopreempt參數,那麼就不會去考慮priority優先級了,是非搶佔模式!即只有vip當前所在機器發生故障,另外一臺機器才能接管vip。
即便優先級高的那一臺機器恢復正常後也不會主動搶回vip,只能等到對方發生故障,纔會將vip切回來。
關閉主從複製:
登陸到從庫服務器進行配置
關閉複製
mysql> STOP SLAVE;
重置,清除複製信息,這樣再啓動時就不會進行復制了。
mysql> RESET SLAVE ALL;
參考文檔:https://blog.csdn.net/miss1181248983/article/details/89139951