1.環境說明
操作系統:centos7.7
主服務器:node2(192.168.1.102)
從服務器:node3(192.168.1.103)
keepalived中虛擬ip(VIP):192.168.1.100
2.準備事項
- 主庫和從庫數據庫的版本一致
- 把主庫的數據同步給從庫一份
#對主庫進行全局讀鎖定
FLUSH TABLES WITH READ LOCK ;
#在主服務器上把數據導出
mysqldump -udolphinscheduler -p dolphinscheduler_new > dolphinscheduler_new.sql
#在從服務器上進行數據導入
mysql -u root -p dolphinscheduler_new < dolphinscheduler_new.sql
3.主庫配置
3.1 編輯MySQL配置文件,開啟二進制日志
Mysql:
[root@node2 /]# vim /etc/my.cnf
Mariadb:
[root@node2 /]# vim /etc/my.cnf.d/server.cnf
在下面添加如下配置
binlog-do-db=testdb
binlog-ignore-db=mysql
#啟用二進制日志
log-bin=mysql-bin
#服務器唯一ID,與從數據庫不重復即可
server-id=2
說明:binlog-do-db 需要同步的數據庫 binlog-ignore-db 忽略同步的數據庫
如果需要同步兩個庫的話,需要在添加一行
binlog-do-db=testdb2
3.2 重啟mysql服務
Mysql:
[root@node2 /]# systemctl restart mysqld
Mariadb:
[root@node2 /]# systemctl restart mariadb
3.3 建立帳戶并授權slave
[root@node2 /]# mysql -u root -proot
查看mysql的binlog是否開啟
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row in set (0.00 sec)
賦予用戶FILE 權限,FILE 權限允許用戶執行文件操作,如導入和導出數據。
mysql> GRANT FILE ON *.* TO 'root'@'%' IDENTIFIED BY 'root';
REPLICATION SLAVE 權限允許用戶作為復制從服務器連接到主服務器并讀取二進制日志,REPLICATION CLIENT 權限允許用戶監控和管理復制過程
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* to 'root'@'%' identified by 'root';
刷新權限
mysql> FLUSH PRIVILEGES;
3.4 查詢master的狀態
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 863 | testdb | mysql | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
注意:File 與Position參數需要記錄下來,從數據庫配置需要使用
4.從數據庫配置
4.1 添加mysql配置
[root@node3 mysql]# vim /etc/my.cnf
在下面添加如下配置
server-id=3
說明:從數據庫只需要配置server-id 即可,從庫的server-id和主庫的server-id必須不一致
4.2 重啟mysql服務
[root@node3 mysql]# systemctl restart mysqld
4.3 配置從庫
[root@node3 mysql]# mysql -u root -proot
mysql>change master to master_host='192.168.1.102',master_port=3306,master_user='root',master_password='root',master_log_file='mysql-bin.000001',master_log_pos=863;
說明:
master_port: mysql服務器端口號
master_user: 執行同步操作的數據庫賬戶
master_password: 同步賬號的密碼
master_log_pos: 863 就是上面3.4
中主數據庫中 show master status 中的position對應的值
master_log_file: mysql-bin.000001 就是上面3.4
中主數據庫中 show master status中的file對應的值
4.4 啟動從庫復制功能
mysql> start slave;
4.5 檢查從庫復制功能狀態
mysql> show slave status \G;
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.1.102Master_User: rootMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000001Read_Master_Log_Pos: 863Relay_Log_File: node3-relay-bin.000002Relay_Log_Pos: 320Relay_Master_Log_File: mysql-bin.000001Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0Last_Error: Skip_Counter: 0Exec_Master_Log_Pos: 863Relay_Log_Space: 527Until_Condition: NoneUntil_Log_File: Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_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: NoLast_IO_Errno: 0Last_IO_Error: Last_SQL_Errno: 0Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 2Master_UUID: 393a9867-cc77-11ed-b111-000c29991e40Master_Info_File: /var/lib/mysql/master.infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Slave has read all relay log; waiting for more updatesMaster_Retry_Count: 86400Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version:
1 row in set (0.00 sec)
注意:Slave_IO_Running和Slave_SQL_Running這兩個服務必須保證正常
至此,Mysql主從復制的配置已完成,可進行測試
5.雙主雙從配置
- 把從庫當作主庫,在從庫(node3)上面執行主庫(node2)的操作配置,以上第3節
- 把主庫當作從庫,在主庫(node2)上面執行從庫(node3)的操作配置,以上第4節
6.高可用配置
??引入了keepalived,keepalived通過VIP虛擬IP的漂移實現高可用,在相同集群內發送組播包,master主通過VRRP協議發送組播包,告訴從主的狀態。
??當我們通過keepalived虛擬出一個ip服務192.168.1.100
,應用服務只需要將mysql配置信息更改為192.168.1.100
的配置信息,192.168.1.100
實際代理的實體服務器為192.168.1.102
或192.168.1.103
。
??當192.168.1.100
實際代理192.168.1.102
時,192.168.1.102
服務出現故障后,keepalived通過自身機制,自動將192.168.1.103
作為實際代理主服務器,不需要人工干預去修改mysql配置信息,從而實現了高可用
6.1 keepalived部署安裝(主從操作一樣)
[root@node2 software]$ wget -q http://www.keepalived.org/software/keepalived-1.2.13.tar.gz
[root@node2 software]$ tar xf keepalived-1.2.13.tar.gz
[root@node2 software]$ yum install -y gcc openssl-devel popt-devel
[root@node2 software]$ cd keepalived-1.2.13
[root@node2 keepalived-1.2.13]# ./configure && make && make install
[root@node2 keepalived-1.2.13]# cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
[root@node2 keepalived-1.2.13]# cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
[root@node2 keepalived-1.2.13]# mkdir /etc/keepalived
[root@node2 keepalived-1.2.13]# cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
[root@node2 keepalived-1.2.13]# cp /usr/local/sbin/keepalived /usr/sbin/
[root@node2 keepalived-1.2.13]# chkconfig --add keepalived
[root@node2 keepalived-1.2.13]# chkconfig --level 345 keepalived on
6.2 keepalived.conf配置
[root@node2 keepalived-1.2.13]# vim /etc/keepalived/keepalived.conf
6.2.1 主庫配置
global_defs {router_id Nginx_HA_1
}vrrp_script check_run {script "/home/mysql/mysql_check.sh"interval 60fall 3rise 1
}vrrp_sync_group VG1 {group {VI_1}
}vrrp_instance VI_1 {state MASTERinterface ens32virtual_router_id 12priority 100advert_int 1nopreempt#本機ip
unicast_src_ip 192.168.1.102
unicast_peer {#對象IP 發送vrrp包給備服務器192.168.1.103
}authentication {auth_type PASSauth_pass nginxha}track_script {check_run}virtual_ipaddress {192.168.1.100}
}
6.2.2 從庫配置
global_defs {router_id Nginx_HA_1
}vrrp_script check_run {script "/home/mysql/mysql_check.sh"interval 30rise 1fall 3
}vrrp_sync_group VG1 {group {VI_1}
}vrrp_instance VI_1 {state BACKUPinterface ens32virtual_router_id 12priority 50advert_int 1nopreempt#本機ip
unicast_src_ip 192.168.1.103
unicast_peer {#對象IP 發送vrrp包給備服務器192.168.1.102
}authentication {auth_type PASSauth_pass nginxha}track_script {check_run}virtual_ipaddress {192.168.1.100}
}
說明:
1.interface ens32 ->ens32是linux網卡名稱;
2.主服務 priority 參數必須大于從服務;
3.script “/home/mysql/mysql_check.sh” mysql_check.sh是檢測mysql是否正常的腳本 如果不正常就關閉keepalived;
4.interval 60:定義了檢查腳本執行的時間間隔,此處為60秒。意味著每隔60秒執行一次腳本檢查;
5.fall 3:指定在多少次檢查失敗后認定服務故障切換到備用服務器;
6.rise 1:指定在多少次檢查成功后切回到主服務器,表示在連續1次檢查成功后才會將服務恢復到主服務器。
6.3 編寫檢查Mysql腳本(mysql_check.sh)
[root@node2 keepalived-1.2.13]# vim /home/mysql/mysql_check.sh
#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
if [ "${counter}" -eq 0 ]; thenservice keepalived stop
fi
主服務器和從服務器節點都要一份
#授權與格式轉換
[root@node2 ~]# chmod -R 777 /home/mysql/mysql_check.sh
[root@node2 ~]# sed -i "s/\r//" /home/mysql/mysql_check.sh
6.4 啟動并測試
主從都啟動
[root@node2 ~]# systemctl start keepalived
啟動后可以進行狀態查看
[root@node2 ~]# service keepalived status
● keepalived.service - SYSV: Start and stop KeepalivedLoaded: loaded (/etc/rc.d/init.d/keepalived; bad; vendor preset: disabled)Active: active (running) since 一 2024-02-26 22:18:06 CST; 14s agoDocs: man:systemd-sysv-generator(8)Process: 2901 ExecStart=/etc/rc.d/init.d/keepalived start (code=exited, status=0/SUCCESS)Main PID: 2908 (keepalived)CGroup: /system.slice/keepalived.service├─2908 keepalived -D├─2910 keepalived -D└─2911 keepalived -D
查看vip綁定到哪臺機器上
[root@node2 /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:99:1e:40 brd ff:ff:ff:ff:ff:ffinet 192.168.1.102/24 brd 192.168.1.255 scope global noprefixroute ens32valid_lft forever preferred_lft foreverinet 192.168.1.100/32 scope global ens32valid_lft forever preferred_lft foreverinet6 fe80::348f:8ac3:b2c:809d/64 scope link noprefixroute valid_lft forever preferred_lft forever
[root@node3 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:8e:59:08 brd ff:ff:ff:ff:ff:ffinet 192.168.1.103/24 brd 192.168.1.255 scope global noprefixroute ens32valid_lft forever preferred_lft foreverinet6 fe80::d26d:7d7a:6daa:f99b/64 scope link noprefixroute valid_lft forever preferred_lft forever
至此,MySQL高可用配置完成,現在訪問虛擬IP(192.168.1.100)即可訪問到MySQL主節點(192.168.1.102)