keepalive的故障切換原理
keepalive對負載均衡集羣可以實現高可用
主機與備機共用一個vip的情況下,當主機宕機時,通過VRRP協議連接的心跳檢測會中斷,當超過限定時間後備機則判定主機掛掉,此時主機的ip和資源漂移到備機上,接替主機工作,當主機恢復後,備機再將ip和資源漂移到主機上,等待下次接替,來實現高可用
redis+哨兵模式工作原理
1、多個sentinel發現並確認master有問題
2、選舉出一個sentinel作爲領導
3、選出一個slave作爲master
4、通知其餘slave成爲新的master的slave
5、通知客戶端主從變化
6、等待老的master復活成爲新master的slave
sentinel的任務:
監控: Sentinel 會通過ping指令不斷地檢查你的主服務器和從服務器是否運作正常。
提醒: 當被監控的某個 Redis 服務器出現問題時,Sentinel 可以通過 API 向管理員或者其他應用程序發送通知。
自動故障遷移:新的master會替換掉舊的master,等舊的master復活後加入slave
redis持久化存儲方式
RDB方式原理:當redis需要做持久化時(執行SAVA或者BGSAVA命令,或者是達到配置條件時執行),redis會fork一個子進程,子進程將數據寫到磁盤上一個臨時RDB文件中,當子進程完成寫臨時文件後,將原來的RDB替換掉(默認文件名爲dump.rdb)【細節】
一句話總結:在不同的時間點,將redis存儲的數據生成快照並存儲到磁盤等介質上
AOF方式原理:AOF可以做到全程持久化,Redis每執行一個修改數據的命令,都會把這個命令添加到AOF文件中,當Redis重啓時,將會讀取AOF文件進行“重放”以恢復到Redis關閉前的最後時刻。由於os會在內核中緩存write做的修改,所以可能不是立即寫到磁盤上。這樣aof方式的持久化也還是有可能會丟失部分修改。不過我們可以通過配置文件告訴redis我們想要通過fsync函數強制os寫入到磁盤的時機。【細節】
一句話總結:將redis執行過的所有寫指令記錄下來,在下次redis重新啓動時,將指令從前到後再重複執行一遍,實現數據恢復
redis主從同步原理
從服務器會向主服務器發出SYNC指令,當主服務器接到此命令後,就會調用BGSAVE指令來創建一個子進程專門進行數據持久化工作,也就是將主服務器的數據寫入RDB文件中。在數據持久化期間,主服務器將執行的寫指令都緩存在內存中。
在BGSAVE指令執行完成後,主服務器會將持久化好的RDB文件發送給從服務器,從服務器接到此文件後會將其存儲到磁盤上,然後再將其讀取到內存中。這個動作完成後,主服務器會將這段時間緩存的寫指令再以redis協議的格式發送給從服務器。
集羣:主做讀寫,從做讀,主從異步,只有從開啓持久化
mysql主從複製(AB複製)原理
1、主服務器上面的任何修改都會通過自己的 I/O tread(I/O 線程)保存在二進制日誌 Binary log 裏面。
2、從服務器上面也啓動一個 I/O thread,通過配置好的用戶名和密碼, 連接到主服務器上面請求讀取二進制日誌,然後把讀取到的二進制日誌寫到本地的一個Realy log(中繼日誌)裏面。
3、從服務器上面同時開啓一個 SQL thread 定時檢查 Realy log(這個文件也是二進制的),如果發現有更新立即把更新的內容在本機的數據庫上面執行一遍
mysql實戰
用戶
創建用戶
create user '用戶名'@'客戶端來源IP地址' identified by '密碼';
刪除用戶
drop user '用戶名'@'客戶端來源IP地址';
修改用戶
rename user '用戶名'@'客戶端來源IP地址' to '新用戶名'@'客戶端來源IP地址' ;
修改密碼
alter user '用戶名'@'客戶端來源IP地址' identified by '新密碼';
忘記密碼
update mysql.user SET authentication_string=password('QFedu123!') WHERE user='root' and host='localhost';
授權:
查看授權信息
show grants for '用戶'@'客戶端來源IP地址';
權限管理
grant 權限 on 數據庫.表 to '用戶'@'客戶端來源IP地址' identified by '密碼'; -- 授權並設置密碼
revoke 權限 on 數據庫.表 from '用戶'@'客戶端來源IP地址' -- 取消權限
所有庫和表
select * from mysql.user where user='shark'\G
單庫【mysql.db】
select * from mysql.db where user='shark'\G
單表【mysql.tables_priv】
select * from mysql.tables_priv where user='shark'\G
權限
all privileges 除grant外的所有權限
select 僅查權限
select,insert 查和插入權限
Example
1、
create user 'shark'@'%';
grant all privileges on *.* to 'shark'@'%' identified by '123';
2、
grant select on *.* /*設置查詢數據的權限在所有的庫和表*/
to 'shark_2'@"%" /*指定用戶名和來源 ip*/
identified by '123'; /*設置密碼*/
庫
創建:
create database 庫名
刪除:
drop database 庫名
修改:
alter database 庫名
使用:
use 庫名
查看:
show database 庫名
···查看當前庫:select database();
表
創建表結構:
id | name | age | phone |
---|
create table class (
id int not null auto_increment,
name varchar(10) ,
age int ,
phone char(11) ,
primary key (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
增:
insert into 表 (列名,列名…) values (值,值,值…),(值,值,值…)
id | name | age | phone |
---|---|---|---|
1 | 王麻子 | 32 | 13141098899 |
2 | 九筒 | 32 | 13721096541 |
3 | 六子 | 18 | 13139192657 |
4 | 馬邦德 | 37 | 15855996688 |
insert into student (name, age, phone) values('王麻子', 32, '13141098899');
insert into student (
id,name, age, phone
) values(
2,'九筒', 32, '13721096541'),
(3,'六子', 18, '13139192657'),
(4,'馬邦德', 37, '15855996688');
刪:
delete from 表名 where id = 數字;
改:
update 表名 set 字段名1=值表達式1,字段名2=值表達式2,....[where條件] [order排序] [limit限定];
查:
分組
select age,id from 表 where id > 10 group by age,id order by id desc