mysql服務
1 主從復制
集群:多主機集群【復制】
負載過大解決方案:橫向擴展[增加服務器節點分散負載]、縱向擴展[提升單機硬件性能]
復制工作原理:
前提:基礎數據一樣,主節點上有同步數據用的賬號
主角色【二進制日志、binlog dump】、從角色【中繼日志、IO線程、sql線程】


????????mysql架構:

? ? 主節點只要負責正常運行,保證有二進制日志可以被復制,為復制這項功能開啟一個專門的用戶賦予復制權限可以讓從節點用此用戶登錄主節點來實現復制。
①創建存放二進制文件的目錄[mkdir -pv /data/mysql/logbin],并基于mysql的運行方式賦予目錄mysql的屬主屬組[chown -R mysql:mysql /data/mysql]
②修改mysql-server.conf配置文件,給自己添加server-id:標識自己主機身份的id(為了從節點準確找到自己);并在配置文件里指定自己二進制文件路徑log_bin=/data/mysql/logbin/mysql-bin(mysql-bin是binlog文件的前綴)
③創建用于復制的用戶[create user repluser@'10.0.0.%' identified by '123456';],并賦予他可以復制的權限[grant replication slave on *.* to repluser@'10.0.0.%';]
? ? 從節點是實現主從集群復制的主動方,做好一系列環境準備后,運行命令開啟主從復制。
①環境準備:包括創建存放二進制文件的目錄,修改mysql-server.conf等
②需要在主節點運行命令:show master status;查看從節點需要復制的二進制日志數據的開始位置
③從節點配置對接主節點的配置參數,配置完執行show slave status查看從節點是否根據配置參數找到了主節點
④如果show slave status的返回結果正確且Slave_IO_Running 和 Slave_SQL_Running 是兩個No,說明主從已經配置好了,只是沒有開啟,接下來可以開啟主從復制了:start slave

2 中間件實踐
定位:通過數據庫中間件減少程序端的復雜邏輯,讓應用層更專注于業務
方案:mycat
核心配置文件:server.xml-定義用戶權限、系統參數
schema.xml-定義邏輯庫、分片規則、數據節點
3 高可用方案
mgr官方的解決方案【基礎環境很重要,必須開啟GTID gtid_mode=ON】
實踐:零數據一主一從實踐[熟練]
1 環境準備:
主master-rocky10.0.0.12-mysql8.0.41
從slave-rocky10.0.0.15-mysql8.0.41
#rocky環境關閉selinux、firewalld
vim /etc/selinux/config
SELINUX=disabled
systemctl disable --now firewalld.service
reboot2 主節點配置
(1)準備mysql環境
yum install mysql-server -y
(2)目錄環境準備
#創建目錄
mkdir -pv /data/mysql/logbin
#修改屬主屬組
chown -R mysql:mysql /data/mysql
(3)主節點mysql配置
#修改mysql配置文件
[root@rocky9-12 ~]# vim /etc/my.cnf.d/mysql-server.cnf
[mysqld] #指定服務端配置
server-id=177 #指定server-id
log_bin=/data/mysql/logbin/mysql-bin #指定二進制文件路徑
default_authentication_plugin=mysql_native_password # 避免出現認證問題
#重啟mysql服務
systemctl restart mysqld
#查看二進制日志
ll /data/mysql/logbin
(4)登錄到mysql確認效果
[root@rocky9-12 ~]# mysql
mysql> show master logs;
(5)創建賬號并授權
mysql> create user repluser@'10.0.0.%' identified by '123456';
mysql> grant replication slave on *.* to repluser@'10.0.0.%';(replication slave 是一種特殊的權限,用于允許從庫(Slave)連接到主庫(Master)并同步數據)
mysql> flush privileges;3 從節點配置
(1)準備mysql環境
yum install mysql-server -y
(2)目錄環境準備
#創建目錄
mkdir -pv /data/mysql/logbin
#修改屬主屬組
chown -R mysql:mysql /data/mysql
(3)從節點mysql配置
#修改mysql配置文件
[root@rocky9-15 ~]# vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
server-id=183 #指定server-id
read-only #只讀模式
log-bin=/data/mysql/logbin/mysql-bin #指定二進制文件路徑
default_authentication_plugin=mysql_native_password # 避免出現認證問題
#重啟mysql服務
systemctl restart mysqld
#查看二進制日志
ll /data/mysql/logbin
(4)登錄到mysql確認效果
[root@rocky9-12 ~]# mysql
mysql> show slave status;
此時從節點為空Empty set,......4 從角色配置數據同步角色
#master主機確認數據效果
mysql> show master status;
結果顯示-要同步的數據在mysql-bin.000002,數據位置在879
#查看從節點狀態
mysql> show slave status;
此時從節點為空Empty set,......
#從節點上配置賬號級別的主從同步
mysql> CHANGE MASTER TO MASTER_HOST='10.0.0.12',MASTER_USER='repluser',MASTER_PASSWORD='123456',MASTER_PORT=3306,MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=849;
#查看從節點狀態
mysql> show slave status\G;
結果顯示-Slave_IO_Running 和 Slave_SQL_Running 是兩個No,說明主從已經配置好了,只是沒有啟動而已5 啟動同步操作
#從節點啟動slave
mysql> start slave;
#從節點再次查看狀態,同步需要一段時間,不是說會立刻同步過來
mysql> show slave status\G;
結果顯示-Slave_IO_State: Waiting for source to send event # 等待數據發送過來Master_Host: 10.0.0.12Master_User: repluserMaster_Port: 3306Connect_Retry: 60 #當從節點與主節點的連接中斷時,每隔60秒嘗試重新連接主節點Master_Log_File: mysql-bin.000002Read_Master_Log_Pos: 849 #主節點二進制日志大小Relay_Log_File: rocky9-relay-bin.000002 #中繼日志發生了變化Relay_Log_Pos: 326Relay_Master_Log_File: mysql-bin.000002Slave_IO_Running: Yes #線程都啟動了Slave_SQL_Running: Yes #線程都啟動了......Seconds_Behind_Master: 0 #主從節點數據時間差,0表示己經完全同步
#從節點驗證數據同步效果
mysql> select User,host from mysql.user;6 數據同步測試
#主節點上寫入數據,創建數據庫,創建數據表,添加數據
mysql> create database db1;
mysql> use db1;
mysql> CREATE TABLE `student` (`id` int unsigned NOT NULL AUTO_INCREMENT,`name` varchar(20) NOT NULL,`age` tinyint unsigned DEFAULT NULL,`gender` enum('M','F') DEFAULT 'M',PRIMARY KEY (`id`)) ENGINE=InnoDB;
mysql> insert into student (name,age,gender)values('user1',10,'M'),('user2',20,'F'),('user3',30,'M');
#在從節點查看數據,都同步過來了
mysql> show databases;
mysql> use db1;
mysql> show tables;
mysql> select * from student;
實踐:有數據一主一從實踐[熟練]
1 環境準備:
主master-rocky10.0.0.12-mysql8.0.41
從slave-rocky10.0.0.15-mysql8.0.41
目前master節點是有數據的,我們可以將從節點環境清空,從而實現,兩者環境的不一致效果
#從節點環境清空[root@rocky9-15 ~]
systemctl stop mysqld
rm -rf /var/lib/mysql/* #刪除MySQL數據庫文件
rm -rf /data/mysql/logbin/* #刪除MySQL二進制日志
systemctl start mysqld
#主節點重置二進制日志,如果從當前使用位置開始同步,則原有數據無法同步
mysql> reset master;
mysql> show master status;
結果顯示-mysql-bin.000001,數據位置1572 全量數據同步
#用全量備份的方式導出所有己有數據,并刷新二進制日志
[root@rocky9-12 ~]# mysqldump -A -F --source-data=1 --single-transcaction > all.sql
(-A mysqldump備份MySQL服務器上的所有數據庫;-F 在執行備份之前,MySQL服務器刷新并重置它的日志文件;--source-data=1的作用是,在導出數據的時候記錄二進制位置;--single-transaction:mysqldump創建一個單獨的事務來導出數據,從而不需要鎖定表)
#確認效果
[root@rocky9-12 ~]# ll all.sql
#主節點確認日志效果,日志被刷新
mysql> show master status;
結果顯示-mysql-bin.000002,數據位置157
#查看備份文件
[root@rocky9-12 ~]# more all.sql
......
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=157; ?# 非注釋的第一行
#同步文件到從主機
[root@rocky9-12 ~]# scp all.sql 10.0.0.15: (同步到遠程主機 10.0.0.15的當前用戶的家目錄,如果當前用戶是root,則路徑為 /root/all.sql)3 同步賬號授權
#主節點創建賬號并授權
mysql> create user repluser@'10.0.0.%' identified by '123456';
mysql> grant replication slave on *.* to repluser@'10.0.0.%';
#確認效果
mysql> select user,host from mysql.user;4 從節點配置
#配置文件定制
[root@rocky9-15 ~]# vim /etc/my.cnf.d/mysql-sever.cnf
[mysqld]
server-id=183
read-only
log-bin=/data/mysql/logbin/mysql-bin
default_authentication_plugin=mysql_native-password #避免出現認證問題
#修改備份文件
[root@rocky9-15 ~]# vim all.sql
...
# CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=157;
# 將此句補全為如下樣式
CHANGE MASTER TO
MASTER_HOST='10.0.0.12',
MASTER_USER='repluser',
MASTER_PASSWORD='123456',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=157;
#從節點加載語句
mysql> set sql_log_bin=0;(因為是導數據,所以需要關閉二進制日志,否則可能會導致當從節點作為其他實例的主節點時,這些SQL會再次傳回主節點,導致數據重復執行,如同一條INSERT被執行兩次,導致數據出現混亂)
#開始導入數據
mysql> source /root/all.sql
#檢查主從狀態
mysql> show slave status\G;
結果顯示-Slave_IO_Running: No Slave_SQL_Running: No# 主從環境導入成功5 啟動同步操作
#從節點啟動slave
mysql> start slave;
#從節點再次查看狀態
mysql> show slave status\G;
結果顯示-Slave_IO_State: Waiting for source to send eventMaster_Host: 10.0.0.12Master_User: repluserMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000002Read_Master_Log_Pos: 157Relay_Log_File: rocky9-relay-bin.000002Relay_Log_Pos: 326Relay_Master_Log_File: mysql-bin.000002Slave_IO_Running: Yes # 主從環境恢復了Slave_SQL_Running: Yes......
#從節點恢復二進制日志
mysql> set @@sql_log_bin=1;
#查詢
mysql> use db1;
mysql> select * from student;6 數據同步測試
#主節點新增數據
mysql> insert into student (name,age,gender)values('user4',40,'M');
#從節點確認效果
mysql> select * from student;