Mysql - 配置Mysql主從復制-keepalived高可用-讀寫分離集群

目錄

高可用:

為什么需要高可用呢?

高可用的主要作用:

keepalived是什么?它用在哪里?

什么是VRRP協議,它的作用是什么?

搭建一個基于keepalived的高可用Mysql主從復制讀寫分離集群

一、項目中的IP地址配置表:

二、項目拓撲圖:

項目步驟:(主從復制、讀寫分離、單vip高可用、雙vip高可用)

1、搭建Mysql的主從復制功能:

2、使用Mysqlrouter搭建MySQL的讀寫分離功能

3、安裝配置keepalived服務

4、修改keepalived的配置文件(從36行以下的全部都不需要)(配置單vip的高可用服務)

5、模擬測試:如果master掛掉了,那么vip是否會轉移到backup上去呢?

7、外部連接測試keepalived實現的高可用效果:

8、配置雙vip實現keepalived配置(跟MySQL的主主復制十分相似)

9、?負載均衡器的使用

10、進行Mysql的壓力測試:

腦裂現象

腦裂有沒有危害?

什么時候keepalived會產生腦裂現象呢?

情況一:vrid不一樣

情況二:防火墻攔截了vrrp報文通信

?情況三:修改認證密碼,查看是否出現腦裂現象


高可用:

高可用性(High Availability,HA)是指系統或功能提供者在經過設計后,該系統或功能能夠長時間的保持在正常狀態運行的能力。在現代信息化的環境中,高可用性已經成為了一個必不可少的概念。

為什么需要高可用呢?

防止出現單點故障,主要是因為現代IT系統對于穩定性具有較高的要求,一旦系統出現故障(出現單點故障),將會影響到業務的正常運轉,甚至會導致數據丟失等重大問題,從而造成嚴重的損失。所以,必須確保系統能夠盡可能地持續穩定地運行,保證了業務的連續性與數據的可靠性。

高可用的主要作用:

高可用的主要作用包括:

  1. 提高系統的穩定性:高可用架構通過冗余、備份、災備等措施,可以避免單點故障,提高系統的穩定性和可用性,保證服務的連續性。

  2. 提高業務的可靠性:高可用架構可以保證業務的可靠性,避免因為系統故障導致的數據丟失等問題,從而保證業務的正常運轉。

  3. 改善用戶體驗:高可用架構可以提高系統的性能和響應速度,改善用戶的體驗,同時還可以提高系統的擴展性和可靠性。

  4. 降低維護成本:通過高可用架構降低應用程序的停機時間和維護成本,避免出現服務中斷而導致的維護費用增加。

總之,高可用性是一種確保業務連續性的重要手段,它可以避免因為單點故障而帶來的損失,并且可以保證業務的持續穩定運行。

keepalived是什么?它用在哪里?

keepalived的官方網站:Keepalived for Linux

keepalived是一種開源軟件,它提供了一個簡單而高效的方式來實現負載均衡和故障轉移。keepalived能夠監視可用服務器的狀態,并確保將請求路由到可用服務器上,同時在服務器故障時能夠及時切換到備用服務器,以保證服務的高可用性。

keepalived主要用于以下幾個方面:

  1. 實現負載均衡:keepalived能夠使用不同的算法,例如輪詢(Round Robin)、加權輪詢、最少連接數等,將客戶端請求平均地分配到多個后端服務器上,以達到負載均衡的目的。

  2. 提高系統的可用性:keepalived可以對多臺服務器進行監視,并自動切換到另一個可用的節點來避免單點故障。通過自動檢測和切換,keepalived可以確保應用程序始終處于可用狀態,從而提高系統的可用性。

  3. 構建高可用性架構:通過配合其他技術,例如虛擬IP地址(Virtual IP address)、虛擬路由器冗余協議(VRRP)等,keepalived可以幫助構建高可用性架構,從而保證服務的連續性和穩定性。

總之,keepalived是一款功能強大的開源軟件,它可以幫助構建高可用性、可伸縮性和安全性的應用程序。它在各種Web應用程序、負載均衡設備、郵件服務器等系統中得到了廣泛的應用。

什么是VRRP協議,它的作用是什么?

VRRP(Virtual Router Redundancy Protocol,虛擬路由器冗余協議)是一種網絡協議用于提高路由器系統的可用性和可靠性。它通過將多個路由器組合成一個虛擬路由器,只有一個路由器處于活動狀態,其他路由器都是備份狀態,從而達到提供冗余和故障轉移的目的。

vip:virtual ip 虛擬IP地址,這個地址是對外提供服務的

參考文檔:VRRP原理及配置 - 榕霖 - 博客園 (cnblogs.com)

具體來說,VRRP的作用包括:

  1. 提供冗余:通過將多個路由器組合成一個虛擬路由器,只有一個路由器處于活動狀態,其他路由器都是備份狀態,當活動路由器出現故障時,備用路由器可以自動接管其工作,確保網絡服務不中斷。

  2. 提高可用性:由于VRRP使用了路由器的冗余,所以即使在單個設備或鏈路出現故障時,也能夠保持網絡的連通性,從而提高了網絡的可用性和可靠性。

  3. 支持負載均衡:當多個路由器同時處于活動狀態時,VRRP可以自動將流量分布到各個路由器之間,實現負載均衡。

總之,VRRP協議是一種非常有效的網絡協議,主要用于提供網絡冗余和故障轉移,提高網絡的可用性和可靠性。它被廣泛應用于企業內部網絡、互聯網服務提供商(ISP)等各種網絡環境中。

vid:虛擬ip地址,這個地址是對外提供服務的

搭建一個基于keepalived的高可用Mysql主從復制讀寫分離集群

一、項目中的IP地址配置表:

中間件:安裝mysqlrouter 和 keepalived

master:192.168.2.181

backup:192.168.2.182

vip:192.168.2.221

Linux客戶機:192.168.2.43

Mysql服務器:安裝Mysql數據庫

master:192.168.2.150

slave-1:192.168.2.151

slave-2:192.168.2.152

二、項目拓撲圖:

項目步驟:(主從復制、讀寫分離、單vip高可用、雙vip高可用)

1、搭建Mysql的主從復制功能:

參考:Mysql - 主從復制介紹_Claylpf的博客-CSDN博客

?1、修改主機名

[root@web-3 ~]# hostnamectl set-hostname mysql-3
[root@web-3 ~]# su -
上一次登錄:五 8月 11 13:28:25 CST 2023從 192.168.2.7pts/0 上
[root@mysql-3 ~]# 

2、安裝Mysql

參考:Mysql的介紹和軟件環境的部署_mysql有軟件嗎_Claylpf的博客-CSDN博客

編輯一鍵成功安裝mysql腳本 onekey_install_mysql_binary.sh


[root@web ~]# cat onekey_install_mysql_binary.sh 
#!/bin/bash#步驟:
#解決軟件依賴關系
yum install cmake ncurses-devel gcc gcc-c++ vim lsof bzip2 openssl-devel -y#解壓二進制安裝包
tar xf mysql-5.7.41-linux-glibc2.12-x86_64.tar.gz#移動mysql解壓文件到/usr/local下,改名為mysql
mv mysql-5.7.41-linux-glibc2.12-x86_64 /usr/local/mysql#新建組和用戶 mysql
groupadd mysql#mysql這個用戶的shell 是/bin/false 無法被調用 表示系統用戶 屬于mysql這個組
useradd -r -g mysql -s /bin/false mysql#進入/usr/local/mysql
cd /usr/local/mysql#關閉firewalld防火墻服務,并且設置開機不啟動
service firewalld stop
systemctl disable firewalld #臨時關閉selinux,永久關閉selinux
setenforce 0
sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config#mysql初始化操作
#創建/data/mysql文檔用于存放數據使用
mkdir /data/mysql -p
#修改文件權限和組別,這樣mysql用戶可以對這個文件夾進行讀寫操作了
chown mysql:mysql /data/mysql/
chmod 750 /data/mysql/#進入/usr/local/mysql/bin目錄下進行初始化操作
cd /usr/local/mysql/bin
#設置啟動用戶為mysql base目錄為/usr/local/mysql/ data目錄為/data/mysql   &>passwd.txt目的是將生成的臨時密碼存入passwd.txt文件中
./mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/data/mysql &>passwd.txt #讓mysql支持ssl方式登錄的設置
./mysql_ssl_rsa_setup --datadir=/data/mysql/#獲得臨時密碼
tem_passwd=$(cat passwd.txt| grep "temporary" | awk '{print $NF}')
#$NF表示最后一個字段#修改環境變量,添加我們編譯安裝的mysql的可執行命令的路徑
#臨時修改PATH變量的值
export PATH=/usr/local/mysql/bin/:$PATH
#永久修改
echo "PATH=/usr/local/mysql/bin:$PATH" >>/root/.bashrc#刷新/root/.bashrc文檔
source ~/.bashrc#復制support-files里的mysql.server文件到/etc/init.d目錄下叫mysqld
cp ../support-files/mysql.server  /etc/init.d/mysqld#修改/etc/init.d/mysqld內的第70行的內容(datadir目錄的值)
sed -i '70c  datadir=/data/mysql' /etc/init.d/mysqld#生成/etc/my.cnf配置文件
cat  >/etc/my.cnf  <<EOF
[mysqld_safe]
[client]
socket=/data/mysql/mysql.sock
[mysqld]
socket=/data/mysql/mysql.sock
port = 3306
open_files_limit = 8192
innodb_buffer_pool_size = 512M
character-set-server=utf8
[mysql]
auto-rehash
prompt=\\u@\\d \\R:\\m  mysql>
EOF#啟動mysqld服務
service mysqld start#將mysqld添加到linux系統里的服務管理名單里
chkconfig --add mysqld
#設置mysqld服務開機啟動
/sbin/chkconfig mysqld on#登錄重新設置初始密碼為123456
#初次修改密碼需要使用 --connect-expired-password 選項
#-e 后面接的命令是表示我們需要在mysql里執行的命令
#set password='123456'; 表示修改root用戶的密碼為:123456 
mysql -uroot -p$tem_passwd --connect-expired-password -e "set password='123456';"#建議修改密碼是否修改成功
mysql -uroot -p123456 -e 'show databases;' && echo "database is installed success" [root@web ~]#

3、在master服務器上開啟二進制日志配置server_id=1,并且在從服務器上配置server_id=2

master上?

[root@mysql-1 ~]# cat /etc/my.cnf
[mysqld_safe][client]
socket=/data/mysql/mysql.sock[mysqld]
socket=/data/mysql/mysql.sock
log-error=/data/mysql/mysql_error.log     #表示設置Mysql的error日志的路徑
slow_query_log = 1      #表示開啟Mysql慢日志
long_query_time = 0.001  #表示設置慢日志的閾值為0.001毫秒
general_log            #我們不需要添加路徑了,因為Mysql會自動幫助我們添加通用日志的路徑和日志文件,表示打開了通用日志
log_bin                #表示我們開啟了二進制日志
server_id = 1          #給我們的Mysql服務器進行編號
expire_logs_days = 7   #表示二進制日志文件過 7天 自動清除port = 3306
open_files_limit = 8192
innodb_buffer_pool_size = 512M
character-set-server=utf8[mysql]
auto-rehash
prompt=\u@\d \R:\m  mysql>
[root@mysql-1 ~]# 

slave上:

[root@mysql-2 ~]# cat /etc/my.cnf
[mysqld_safe][client]
socket=/data/mysql/mysql.sock[mysqld]
socket=/data/mysql/mysql.sock
log-error=/data/mysql/mysql_error.log     #表示設置Mysql的error日志的路徑
server_id = 2          #給我們的Mysql服務器進行編號port = 3306
open_files_limit = 8192
innodb_buffer_pool_size = 512M
character-set-server=utf8[mysql]
auto-rehash
prompt=\u@\d \R:\m  mysql>
[root@mysql-2 ~]# 

重啟master和slave的Mysql數據庫服務

[root@mysql-1 ~]# systemctl restart mysqld

4、在master上創建可以給slave服務器過來復制二進制日志文件的用戶

[root@mysql-1 ~]# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.41 MySQL Community Server (GPL)Copyright (c) 2000, 2023, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.#創建sc_slave用戶,允許任意網段訪問
root@(none) 15:40  mysql>create user 'sc_slave'@'%' identified by '123456';
Query OK, 0 rows affected (0.01 sec)#賦予該用戶允許復制二進制日志文件的權限
root@(none) 15:40  mysql>grant replication slave on *.* to 'sc_slave'@'%';
Query OK, 0 rows affected (0.00 sec)#重新加載用戶權限表
root@(none) 15:40  mysql>FLUSH PRIVILEGES;  

5、在master上做一個全備,導出數據,導入到slave上,保持master和slave上的數據是一致的。

#為master上的數據做全備,并導出
[root@localhost /]# mkdir /backup
[root@localhost /]# mysqldump -uroot -p'123456' --all-databases > /backup/all_db.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.

6、再將導出的數據傳出到slave服務器上去,并將該sql文件導入Mysql數據庫中

[root@mysql-1 ~]# scp /backup/all_db.sql root@192.168.2.151:/root
The authenticity of host '192.168.2.151 (192.168.2.151)' can't be established.
ECDSA key fingerprint is SHA256:5T9UOchKhhnoIu0w3essfdXjciGmtmWYTSS/XBnZasM.
ECDSA key fingerprint is MD5:d4:bb:9a:9e:00:17:06:f7:6d:bd:e5:04:71:f5:b3:29.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.2.151' (ECDSA) to the list of known hosts.
root@192.168.2.151's password: 
all_db.sql                                                                                                                                                 100%  866KB  18.9MB/s   00:00    
[root@mysql-1 ~]# scp /backup/all_db.sql root@192.168.2.152:/root
The authenticity of host '192.168.2.152 (192.168.2.152)' can't be established.
ECDSA key fingerprint is SHA256:k1RjBZPXEHcDY+5UaqCp7ZdyW0e1daRrc1m+GVoZ5fc.
ECDSA key fingerprint is MD5:e6:1f:62:65:8e:66:9c:b2:8e:a1:40:c3:57:ad:e5:ab.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.2.152' (ECDSA) to the list of known hosts.
root@192.168.2.152's password: 
all_db.sql                                                                                                                                                 100%  866KB  58.2MB/s   00:00    
[root@mysql-1 ~]# 

將該sql文件導入Mysql數據庫中

[root@mysql-2 ~]# mysql -uroot -p'123456'  < all_db.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@mysql-2 ~]# 

檢查我們的slave的Mysql數據是否與master的Mysql數據一致

7、在slave上配置master上拉取的二進制日志用戶名和密碼和日志文件名稱和位置號和端口等信息

在master上查看二進制日志文件和位置號:

[root@mysql-1 ~]# mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.41-log MySQL Community Server (GPL)Copyright (c) 2000, 2023, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.# 刷新二進制文件
root@(none) 15:51  mysql>flush logs;
Query OK, 0 rows affected (0.01 sec)# 查看位置號
root@(none) 15:51  mysql>show master status;
+--------------------+----------+--------------+------------------+-------------------+
| File               | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+--------------------+----------+--------------+------------------+-------------------+
| mysql-1-bin.000002 |      154 |              |                  |                   |
+--------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)root@(none) 15:51  mysql>

上圖所示,我通過flush logs命令刷新了二進制日志,產生了一個新的二進制日志文件,位置號為:154。

在slave上配置關于master的配置并上拉取二進制日志的用戶信息和日志文件的名稱和位置號

root@(none) 15:31  mysql>CHANGE MASTER TO MASTER_HOST='192.168.2.150',-> MASTER_USER='sc_slave',-> MASTER_PASSWORD='123456',-> MASTER_PORT=3306,-> MASTER_LOG_FILE='mysql-1-bin.000002',-> MASTER_LOG_POS=154;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

當我們的信息配置完成后,查看slave服務器狀態

root@(none) 15:21  mysql>show slave status\G;
*************************** 1. row ***************************Slave_IO_State: Master_Host: 192.168.2.149Master_User: sc_slaveMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000006Read_Master_Log_Pos: 154Relay_Log_File: mysql-2-relay-bin.000001Relay_Log_Pos: 4Relay_Master_Log_File: mysql-bin.000006Slave_IO_Running: NoSlave_SQL_Running: NoReplicate_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: 154Relay_Log_Space: 154Until_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: NULL
Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error: Last_SQL_Errno: 0Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 0Master_UUID: Master_Info_File: /data/mysql/master.infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Master_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: 

9、在master和slave上都關閉防火墻和selinux(可以防止我們的端口信息備防火墻攔截了)

[root@mysql-2 ~]# service firewalld stop
Redirecting to /bin/systemctl stop firewalld.service
[root@mysql-2 ~]# systemctl disable firewalld
[root@mysql-2 ~]# 

10、啟動slave服務器,查看IO線程和SQL線程是否正常啟動

直接使用start slave命令

如果啟動了,可以查看如下:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes?

如果出現了上述內容,說明Mysql的主從復制功能成功的搭建了

root@(none) 15:32  mysql>start slave;
Query OK, 0 rows affected (0.01 sec)root@(none) 15:32  mysql>show slave status\G;
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.2.150Master_User: sc_slaveMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-1-bin.000002Read_Master_Log_Pos: 154Relay_Log_File: mysql-2-relay-bin.000002Relay_Log_Pos: 322Relay_Master_Log_File: mysql-1-bin.000002Slave_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: 154Relay_Log_Space: 531Until_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: 1Master_UUID: 692c05f7-3819-11ee-b41f-000c292d4c72Master_Info_File: /data/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)ERROR: 
No query specifiedroot@(none) 15:32  mysql>

2、使用Mysqlrouter搭建MySQL的讀寫分離功能

參考:Mysql - 讀寫分離_mysql讀寫分離的工具_Claylpf的博客-CSDN博客?

mysqlrouter.conf 配置文件配置:(mysqlrouter必須綁定到vip上或者使用任意地址0.0.0.0

(切記不能添加注釋,我添加是為了方便解釋,否則會報錯)

[root@mysqlrouter-1 mysqlrouter]# cat mysqlrouter.conf 
# Copyright (c) 2015, 2023, Oracle and/or its affiliates.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License, version 2.0,
# as published by the Free Software Foundation.
#
# This program is also distributed with certain software (including
# but not limited to OpenSSL) that is licensed under separate terms,
# as designated in a particular file or component or in included license
# documentation.  The authors of MySQL hereby grant you an additional
# permission to link the program and your derivative works with the
# separately licensed software that they have included with MySQL.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License, version 2.0, for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA#
# MySQL Router configuration file
#
# Documentation is available at
#    http://dev.mysql.com/doc/mysql-router/en/[DEFAULT]
logging_folder = /var/log/mysqlrouter
runtime_folder = /run/mysqlrouter
config_folder = /etc/mysqlrouter[logger]
level = INFO# If no plugin is configured which starts a service, keepalive
# will make sure MySQL Router will not immediately exit. It is
# safe to remove once Router is configured.
[keepalive]
interval = 60[routing:read_write]
bind_address = 192.168.2.221  #vip地址  虛擬IP地址,可以在keepalived配置之前確定 當然我們可以使用0.0.0.0(任意IP地址),那么不管是vip還是本機的ip地址所對應的7001端口都能訪問到     
bind_port= 7001               #自己的端口號      
destinations = 192.168.2.150:3306   #設置目的機器IP地址,可以填master的IP,端口為mysqld運行的端口    
mode = read-write             #設置目的機器IP地址,可以填master的IP,端口為mysqld運行的端口        
max_connections = 65535
max_connect_errors = 100
client_connect_timeout = 9[routing:read_only_1]
bind_address = 192.168.2.221        
bind_port= 7002                     
destinations = 192.168.2.151:3306   #設置目的機器IP地址,可以填master的IP,端口為mysqld運行的端口
mode = read-only                    
max_connections = 65535
max_connect_errors = 100
client_connect_timeout = 9[routing:read_only_2]
bind_address = 192.168.2.221        
bind_port= 7003                     
destinations = 192.168.2.152:3306   #設置目的機器IP地址,可以填master的IP,端口為mysqld運行的端口
mode = read-only                    
max_connections = 65535
max_connect_errors = 100
client_connect_timeout = 9
[root@mysqlrouter-1 mysqlrouter]# 

成功刷新mysqlrouter服務

[root@mysqlrouter-1 mysqlrouter]# service mysqlrouter restart
Redirecting to /bin/systemctl restart mysqlrouter.service
[root@mysqlrouter-1 mysqlrouter]# 

查看端口:

[root@mysqlrouter-1 mysqlrouter]# netstat -anpult |grep mysqlrouter
tcp        0      0 192.168.2.221:7001      0.0.0.0:*               LISTEN      42847/mysqlrouter   
tcp        0      0 192.168.2.221:7002      0.0.0.0:*               LISTEN      42847/mysqlrouter   
tcp        0      0 192.168.2.221:7003      0.0.0.0:*               LISTEN      42847/mysqlrouter   
[root@mysqlrouter-1 mysqlrouter]# 

3、安裝配置keepalived服務

下載keepalived服務:

[root@mysqlrouter-1 mysqlrouter]# yum install keepalived -y
已安裝:keepalived.x86_64 0:1.3.5-19.el7                                                                                                                                                           作為依賴被安裝:lm_sensors-libs.x86_64 0:3.4.0-8.20160601gitf9185e5.el7                net-snmp-agent-libs.x86_64 1:5.7.2-49.el7_9.2                net-snmp-libs.x86_64 1:5.7.2-49.el7_9.2               完畢!

4、修改keepalived的配置文件(從36行以下的全部都不需要)(配置單vip的高可用服務)

master上的配置

global_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1smtp_connect_timeout 30router_id LVS_DEVELvrrp_skip_check_adv_addr
#   vrrp_strict       # 這一行需要注釋:原因是因為會在iptables里添加一條規則,會阻止網絡通信,導致出現腦裂現象vrrp_garp_interval 0vrrp_gna_interval 0
}vrrp_instance VI_1 {    # 定義一個vrrp協議的實例 名字是VI_1 表示第一個vrrp實例state MASTER        # 做master角色interface ens33     # 指定監聽網絡的接口,其實就是vip綁定到那個網絡接口上virtual_router_id 81  # 虛擬路由器ID 81表示的是編號,另外一臺機器上的配置也必須是81priority 160          # 優先級 數字越大就越容易成為masteradvert_int 1          # 宣告消息的時間間隔 為1sauthentication {auth_type PASS    # 密碼認證 passwordauth_pass 1111    # 具體密碼 可以不用修改}virtual_ipaddress {   # vip 虛擬ip地址 可以配置多個192.168.2.221     # 配置的vip#192.168.200.17#192.168.200.18}
}

backup上的配置

[root@mysqlrouter-2 keepalived]# cat keepalived.conf 
global_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1smtp_connect_timeout 30router_id LVS_DEVELvrrp_skip_check_adv_addr# vrrp_strict       # 這一行需要注釋:原因是因為會在iptables里添加一條規則,會阻止網絡通信,導致出現腦裂現象vrrp_garp_interval 0vrrp_gna_interval 0
}vrrp_instance VI_1 {    # 定義一個vrrp協議的實例 名字是VI_1 表示第一個vrrp實例state BACKUP        # 做backup角色interface ens33     # 指定監聽網絡的接口,其實就是vip綁定到那個網絡接口上virtual_router_id 81  # 虛擬路由器ID 81表示的是編號,另外一臺機器上的配置也必須是81priority 100          # 優先級 數字越大就越容易成為masteradvert_int 1          # 宣告消息的時間間隔 為1sauthentication {auth_type PASS    # 密碼認證 passwordauth_pass 1111    # 具體密碼 可以不用修改}virtual_ipaddress {   # vip 虛擬ip地址 可以配置多個192.168.2.221     # 配置的vip 必須與master配置的vip是一樣的#192.168.200.17#192.168.200.18}
}
[root@mysqlrouter-2 keepalived]# 

重新啟動keepalived服務

[root@mysqlrouter-1 keepalived]# service keepalived restart
Redirecting to /bin/systemctl restart keepalived.service
[root@mysqlrouter-1 keepalived]# 

查看效果:

[root@mysqlrouter-1 keepalived]# ip add
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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:90:87:dc brd ff:ff:ff:ff:ff:ffinet 192.168.2.181/24 brd 192.168.2.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet 192.168.2.221/32 scope global ens33valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe90:87dc/64 scope link valid_lft forever preferred_lft forever
[root@mysqlrouter-1 keepalived]# 

5、模擬測試:如果master掛掉了,那么vip是否會轉移到backup上去呢?

我們將master上的keepalived關閉,查看backup上的ip地址

[root@mysqlrouter-1 keepalived]# service keepalived stop
Redirecting to /bin/systemctl stop keepalived.service
[root@mysqlrouter-1 keepalived]# 

backup上的IP地址

[root@mysqlrouter-2 keepalived]# ip add
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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:a9:7f:87 brd ff:ff:ff:ff:ff:ffinet 192.168.2.182/24 brd 192.168.2.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet 192.168.2.221/32 scope global ens33valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fea9:7f87/64 scope link valid_lft forever preferred_lft forever
[root@mysqlrouter-2 keepalived]# 

成功觀察到我們想要的效果,vip真的漂移到了backup上了

當我們重啟master,vip又會從backup上漂移到master上去的

[root@mysqlrouter-1 keepalived]# service keepalived start
Redirecting to /bin/systemctl start keepalived.service
[root@mysqlrouter-1 keepalived]# ip add
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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:90:87:dc brd ff:ff:ff:ff:ff:ffinet 192.168.2.181/24 brd 192.168.2.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet 192.168.2.221/32 scope global ens33valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe90:87dc/64 scope link valid_lft forever preferred_lft forever
[root@mysqlrouter-1 keepalived]# 

7、外部連接測試keepalived實現的高可用效果:

當我通過Linux上訪問192.168.2.221:7001端口的時候,他會訪問到我們的master機器的3306端口上去(Mysql數據庫的默認端口是3306)

[root@mysql-2 ~]#  mysql -h 192.168.2.221 -P 7001 -u claylpf -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 21
Server version: 5.7.41-log MySQL Community Server (GPL)Copyright (c) 2000, 2023, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.claylpf@(none) 18:54  mysql>exit
Bye
[root@test ~]# [root@mysql-2 ~]#  mysql -h 192.168.2.221 -P 7002 -u claylpf -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 20
Server version: 5.7.41 MySQL Community Server (GPL)Copyright (c) 2000, 2023, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.claylpf@(none) 19:15  mysql>

8、配置雙vip實現keepalived配置(跟MySQL的主主復制十分相似)

雙 VIP 可以用于實現高可用性架構。在一個服務器出現故障時,流量可以被自動切換到另一個服務器,從而保持服務的連續性。這在負載均衡、高可用的網絡應用中特別有用。

master配置文件:

[root@mysqlrouter-1 keepalived]# cat keepalived.conf 
global_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1smtp_connect_timeout 30router_id LVS_DEVELvrrp_skip_check_adv_addr# vrrp_strict       vrrp_garp_interval 0vrrp_gna_interval 0
}vrrp_instance VI_1 {    state MASTER        interface ens33     virtual_router_id 81  priority 160          advert_int 1          authentication {auth_type PASS    auth_pass 1111   }virtual_ipaddress {   192.168.2.221     }
}vrrp_instance VI_2 {    state BACKUP        interface ens33     virtual_router_id 101  priority 100          advert_int 1          authentication {auth_type PASS    auth_pass 1111   }virtual_ipaddress {   192.168.2.201     }
}
[root@mysqlrouter-1 keepalived]# 

backup配置文件:

[root@mysqlrouter-2 keepalived]# cat keepalived.conf 
global_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1smtp_connect_timeout 30router_id LVS_DEVELvrrp_skip_check_adv_addr# vrrp_strict       # 這一行需要注釋:原因是因為會在iptables里添加一條規則,會阻止網絡通信,導致出現腦裂現象vrrp_garp_interval 0vrrp_gna_interval 0
}vrrp_instance VI_1 {    # 定義一個vrrp協議的實例 名字是VI_1 表示第一個vrrp實例state BACKUP        # 做backup角色interface ens33     # 指定監聽網絡的接口,其實就是vip綁定到那個網絡接口上virtual_router_id 81  # 虛擬路由器ID 81表示的是編號,另外一臺機器上的配置也必須是51priority 100          # 優先級 數字越大就越容易成為masteradvert_int 1          # 宣告消息的時間間隔 為1sauthentication {auth_type PASS    # 密碼認證 passwordauth_pass 1111    # 具體密碼 可以不用修改}virtual_ipaddress {   # vip 虛擬ip地址 可以配置多個192.168.2.221     # 配置的vip 必須與master配置的vip是一樣的}
}vrrp_instance VI_2 {    # 定義一個vrrp協議的實例 名字是VI_1 表示第一個vrrp實例state MASTER        # 做backup角色interface ens33     # 指定監聽網絡的接口,其實就是vip綁定到那個網絡接口上virtual_router_id 101  # 虛擬路由器ID 101表示的是編號,另外一臺機器上的配置也必須是101priority 120          # 優先級 數字越大就越容易成為masteradvert_int 1          # 宣告消息的時間間隔 為1sauthentication {auth_type PASS    # 密碼認證 passwordauth_pass 1111    # 具體密碼 可以不用修改}virtual_ipaddress {   # vip 虛擬ip地址 可以配置多個192.168.2.201     # 配置的vip 必須與master配置的vip是一樣的}
}
[root@mysqlrouter-2 keepalived]# 

查看master和backup的IP地址

9、?負載均衡器的使用

配置負載均衡器來實現流量的合理分配:

我們可以通過DNS域名解析來配置負載均衡器或者是通過nginx來配置負載均衡器

10、進行Mysql的壓力測試:

Mysql壓力測試工具:Mysqlslap、Sysbench(數據庫專用測試工具)

可以模擬每秒鐘處理完的請求數,每秒處理事務處,一次請求所需的平均數,系統內處理的并發請求數。

腦裂現象

腦裂有沒有危害?

"腦裂"(Brain Split)通常用于指代分布式計算系統中的一個問題,特別是在集群環境下,其中集群中的節點在某種情況下無法與其他節點進行通信,導致節點之間的數據不一致。腦裂問題可能會導致嚴重的系統故障和數據損壞。

腦裂問題的危害在于:

  1. 數據不一致性:腦裂可能導致節點之間的數據不一致。如果在腦裂發生時,某些節點認為其他節點不可用,從而導致不同節點之間的數據更新沒有被正確傳播,最終導致數據不一致。

  2. 故障和系統崩潰:腦裂可能導致系統中的節點以不同的狀態運行,從而影響整個系統的穩定性。這可能導致故障和系統崩潰,因為無法在節點之間協調操作。

  3. 無法達成共識:分布式系統通常需要在節點之間達成共識以進行操作,例如領導選舉、數據復制等。腦裂可能會破壞共識機制,導致系統無法正常運行。

什么時候keepalived會產生腦裂現象呢?

腦裂現象:

1、vrid不一樣的時候會產生

2、中間存在防火墻,阻止了網絡之間的keepalived的master和backup的選舉過程,vrrp報文無法通信(網絡通信出現錯誤)

3、認證密碼不一樣也會出現腦裂現象

情況一:vrid不一樣

當我們的master的vrid是82,而backup上的vrid是81,那么會產生腦裂現象

master上和backup上都出現了vip,這說明出現了腦裂現象?

?

情況二:防火墻攔截了vrrp報文通信

添加iptables防火墻規則

除了22號端口(ssh協議)能夠通信,其他端口都不能通信

查看?master上和backup上是否都出現了vip,發現都出現了,說明產生了腦裂現象

??

最后去除防火墻規則

?情況三:修改認證密碼,查看是否出現腦裂現象

查看?master上和backup上是否都出現了vip,發現都出現了,說明產生了腦裂現象

??

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/39511.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/39511.shtml
英文地址,請注明出處:http://en.pswp.cn/news/39511.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MongoDB-yum安裝修改數據目錄后啟動失敗

# 問題 mongodb 進程權限默認會被 SELinux 管理&#xff0c;修改配置中默認 storage.dbPath 、systemLog.path 造成啟動失敗。 # 解決方案 ① 修改為默認路徑或重新安裝 /var/lib/mongo /var/log/mongodb/mongod.log② 臨時關閉 SELINUX 權限控制 setenforce 0③ 永久關閉 SE…

Vue Baidu Map--自定義點圖標bm-marker

自定義點圖標 將準備好的圖標放到項目中 使用import引入&#xff0c; 并在data中進行聲明 <script> import mapIconRed from ./vue-baidu-map/img/marker_red_sprite.png export default {data() {return {mapIconRed,}}, } </script>在<bm-marker>中加入參…

【Linux】進程的基本屬性|父子進程關系

個人主頁&#xff1a;&#x1f35d;在肯德基吃麻辣燙 我的gitee&#xff1a;Linux倉庫 個人專欄&#xff1a;Linux專欄 分享一句喜歡的話&#xff1a;熱烈的火焰&#xff0c;冰封在最沉默的火山深處 文章目錄 前言進程屬性1.進程PID和PPID2.fork函數創建子進程1&#xff09;為什…

C語言學習筆記---數據的存儲詳解

C語言程序設計筆記---015 C語言數據的存儲1、數據類型的意義1.1、unsigned與signed數據類型例程11.2、補碼與原碼相互轉換例程2 2、大小端的介紹2.1、大小端的例程12.2、大小端的例程2 --- 判斷當前編譯器環境屬于大端或小端 3、綜合練習題探究數據的存儲3.1、練習題13.2、練習…

自動化安裝系統(一)

系統安裝過程 加載boot loader加載啟動安裝菜單加載內核和initrd文件加載根系統運行anaconda的安裝向導 安裝光盤中與安裝相關的文件 安裝autofs啟動后會自動出現/misc目錄。 在虛擬機設置中添加CD/DVD&#xff0c;使用系統ISO文件&#xff0c;登錄系統后mount /dev/cdrom …

青翼科技自研2路250MSPS DA回放FMC子卡模塊

FMC150_V30是一款基于VITA57.1規范的2路125MSPS采樣率16位分辨率AD采集、2路250MSPS采樣率16位分辨率DA回放FMC子卡模塊。該模塊遵循VITA57.1規范&#xff0c;可直接與符合VITA57.1規范的FPGA載卡配合使用&#xff0c;板卡ADC器件采用ADI公司的AD9268芯片&#xff0c;板卡DAC器…

機器學習理論筆記(一):初識機器學習

文章目錄 1 前言&#xff1a;藍色是天的機器學習筆記專欄1.1 專欄初衷與定位1.2 本文主要內容 2 機器學習的定義2.1 機器學習的本質2.2 機器學習的分類 3 機器學習的基本術語4 探索"沒有免費的午餐"定理&#xff08;NFL&#xff09;5 結語 1 前言&#xff1a;藍色是天…

mac安裝vscode 配置git

1、安裝vscode 官網地址 下載mac穩定版安裝很慢的解決辦法 (轉自) mac電腦如何解決下載vscode慢的問題 選擇谷歌瀏覽器右上角的3個點&#xff0c;選擇下載內容&#xff0c;右鍵選擇復制鏈接地址&#xff0c;在新窗口粘貼地址&#xff0c; 把地址中的一段替換成下面的vscode.cd…

項目配置中心介紹

目錄 什么是配置中心 為什么要有配置中心 配置中心的做法&#xff08;讀取和通知&#xff09; 配置中心優點: 常用的配置中心中間件 什么是配置中心 配置中心就是用來管理項目當中所有配置的系統&#xff0c;也是微服務系統當中不可或缺的一部分。項目的配置文件不放到本地…

Servlet+JDBC實戰開發書店項目講解第四篇:登錄實現

ServletJDBC 實戰開發書店項目講解第四篇&#xff1a;登錄注冊實現 在本篇博客中&#xff0c;我們將繼續講解 ServletJDBC 實戰開發書店項目。這次我們將重點講解如何實現登錄和注冊功能。 1. 創建數據庫表 首先&#xff0c;我們需要在數據庫中創建兩個表&#xff0c;一個用…

[C++] 模板template

目錄 1、函數模板 1.1 函數模板概念 1.2 函數模板格式 1.3 函數模板的原理 1.4 函數模板的實例化 1.4.1 隱式實例化 1.4.2 顯式實例化 1.5 模板參數的匹配原則 2、類模板 2.1 類模板的定義格式 2.2 類模板的實例化 講模板之前呢&#xff0c;我們先來談談泛型編程&am…

Qt讀寫Excel--QXlsx編譯為靜態庫2

1、概述&#x1f954; 在使用QXlsx時由于源碼文件比較多&#xff0c;如果直接加載進項目里面&#xff0c;會增加每次編譯的時間&#xff1b; 直接將源碼加載進項目工程中&#xff0c;會導致項目文件非常多&#xff0c;結構變得更加臃腫&#xff1b; 所以在本文中將會將QXlsx編譯…

骨傳導耳機頭暈是怎么回事?骨傳導耳機好不好

骨傳導耳機在音頻傳輸上采用了不同于傳統耳機的方式。它們通過將聲音振動傳遞到顳骨&#xff0c;然后通過骨骼傳導到內耳&#xff0c;從而使用戶能夠聽到音樂或聲音。 然而&#xff0c;有些人在使用骨傳導耳機時可能會感到頭暈。這可能與以下幾個原因有關&#xff1a; 1、剛開…

prometheusalert區分告警到不同釘釘群

方法一 修改告警規則 - alert: cpu使用率大于88%expr: instance:node_cpu_utilization:ratio * 100 > 88for: 5mlabels:severity: criticallevel: 3kind: CpuUsageannotations:summary: "cpu使用率大于85%"description: "主機 {{ $labels.hostname }} 的cp…

99%的Python用戶都不知道的f-string隱秘技巧

f-string想必很多Python用戶都基礎性的使用過&#xff0c;作為Python3.6版本開始引入的特性&#xff0c;通過它我們可以更加方便地向字符串中嵌入自定義內容&#xff0c;但f-string真正蘊含的功能遠比大多數用戶知道的要豐富&#xff0c;今天我們就來一起get它們~ 「最基礎用法…

ajax解析

Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;是一種用于在不重新加載整個頁面的情況下與服務器交換數據的技術。它通過異步的方式發送請求和接收響應&#xff0c;能夠實現在后臺與服務器進行數據交互&#xff0c;然后更新頁面的部分內容&#xff0c;從而提升用…

【CI/CD】基于 Jenkins+Docker+Git 的簡單 CI 流程實踐(上)

基于 JenkinsDockerGit 的簡單 CI 流程實踐&#xff08;上&#xff09; 在如今的互聯網時代&#xff0c;隨著軟件開發復雜度的不斷提高&#xff0c;軟件開發和發布管理也越來越重要。目前已經形成一套標準的流程&#xff0c;最重要的組成部分就是 持續集成 及 持續交付、部署。…

GPU編程基礎-CUDA實現圖像處理

GPU編程基礎-CUDA實現圖像處理 1. 相關基礎概念1.1 Host和Device程序1.2 Kernel程序1.3 SIMT和SIMD1.4 GPU計算的 Occupancy指標1.5 GPU計算的基本流程2. GPU計算框架與過程說明3. 一個基于CUDA的圖像處理例子4. 一些報錯解決1. 相關基礎概念 1.1 Host和Device程序 在CPU上運行…

Effective C++學習筆記(7)

目錄 條款41&#xff1a;了解隱式接口和編譯多態條款42&#xff1a;了解typename的雙重意義條款43&#xff1a;學習處理模板化基類內的名稱條款44&#xff1a;將與參數無關的代碼抽離templates條款45&#xff1a;運用成員函數模板接受所有兼容類型條款46&#xff1a;需要類型轉…

opencv,opengl,osg,vulkan,webgL,opencL,cuda,osg,vtk,ogre的區別

OpenCV OpenCV是一個基于BSD許可&#xff08;開源&#xff09;發行的跨平臺計算機視覺和機器學習軟件庫&#xff0c;可以運行在Linux、Windows、Android和Mac OS操作系統上。 它輕量級而且高效——由一系列 C 函數和少量 C 類構成&#xff0c;同時提供了Python、Ruby、MATLAB等…