keepalive原理+redis+mysql

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章