日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

mysql主从复制、redis基础、持久化和主从复制

發(fā)布時(shí)間:2025/7/25 数据库 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql主从复制、redis基础、持久化和主从复制 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、mysql(mariadb)基礎(chǔ)

1、基礎(chǔ)命令(centos7操作系統(tǒng)下)

1.啟動(dòng)mysql systemctl start mariadb 2.linux客戶(hù)端連接自己 mysql -uroot -p -h 127.0.0.1-u 用戶(hù)-p 密碼驗(yàn)證-h 連接的主機(jī)地址3.遠(yuǎn)程鏈接mysql服務(wù)端 mysql -uroot -p -h 192.168.3.1154.修改mysql密碼 # 修改當(dāng)前用戶(hù)的密碼 set password = PASSWORD('mariadb123');# 修改其他用戶(hù)的密碼 set password for 'username'@'host' = PASSWORD('newpassword') 5.創(chuàng)建mysql用戶(hù) create user xiaoming@'%' identified by 'xm666';6.查詢(xún)mysql庫(kù)中的用戶(hù)信息 use mysql; # mysql是默認(rèn)存在的庫(kù),儲(chǔ)存著用戶(hù)的信息,密碼之類(lèi)的 select host,user,password from user;7.授權(quán)語(yǔ)句 給小明這個(gè)用戶(hù),授予創(chuàng)建數(shù)據(jù)庫(kù)的權(quán)限 mysql中使用grant命令對(duì)賬戶(hù)進(jìn)行授權(quán),grant命令常見(jiàn)格式如下grant 權(quán)限 on 數(shù)據(jù)庫(kù).表名 to 賬戶(hù)@主機(jī)名 對(duì)特定數(shù)據(jù)庫(kù)中的特定表授權(quán) grant 權(quán)限 on 數(shù)據(jù)庫(kù).* to 賬戶(hù)@主機(jī)名 對(duì)特定數(shù)據(jù)庫(kù)中的所有表給與授權(quán) grant 權(quán)限1,權(quán)限2,權(quán)限3 on *.* to 賬戶(hù)@主機(jī)名  對(duì)所有庫(kù)中的所有表給與多個(gè)授權(quán) grant all privileges on *.* to 賬戶(hù)@主機(jī)名    對(duì)所有庫(kù)和所有表授權(quán)所有權(quán)限# 授予小明創(chuàng)建的權(quán)限,對(duì)于所有的庫(kù)表生效 grant create on *.* to xiaoming@"%";# 創(chuàng)建用戶(hù)并授予用戶(hù)只有創(chuàng)建test數(shù)據(jù)庫(kù)的權(quán)限 grant create on test.* to xiaoming2@"%" identified by 'xm2666';# 授予用戶(hù)最大的權(quán)限,所有的權(quán)限 grant all privileges on *.* to username@'%' identified by 'password';# 刷新權(quán)限 flush privileges; # 刷新使授權(quán)立即生效# 查看用戶(hù)權(quán)限 show grants for 'xiaoming'@'%';8.移除權(quán)限 revoke all privileges on *.* from xiaoming@"%";

?

2、數(shù)據(jù)庫(kù)的備份與恢復(fù)

# 備份 mysqldump -u root -p --all-databases > /tmp/db.sql# 數(shù)據(jù)導(dǎo)入,方式有幾種 第一種 source /tmp/db.sql;第二種 mysql -uroot -p < /tmp/db.sql 第三種 使用navicat工具第四種,如果你數(shù)據(jù)量特別大的話 使用第三方工具 xtrabackup

?

二、mysql主從復(fù)制

1、mysql主從復(fù)制背景

1.如果你是單點(diǎn)數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)掛了,你整個(gè)項(xiàng)目就掛了

2.如果你是主備數(shù)據(jù)庫(kù),掛了一臺(tái)主庫(kù),我可能還有千千萬(wàn)萬(wàn)個(gè)備用的數(shù)據(jù)庫(kù)

3.原理
MySQL數(shù)據(jù)庫(kù)的主從復(fù)制是其自帶的功能,主從復(fù)制并不是復(fù)制磁盤(pán)上的數(shù)據(jù)庫(kù)文件,而是通過(guò)主庫(kù)的binlog日志復(fù)制到需要同步的從服務(wù)器上。
在復(fù)制的過(guò)程中,一臺(tái)服務(wù)器充當(dāng)主服務(wù)器(Master),接收來(lái)自用戶(hù)的內(nèi)容更新,而一個(gè)或多個(gè)其他的服務(wù)器充當(dāng)從服務(wù)器(slave),接收來(lái)自Master上binlog文件的日志內(nèi)容,解析出SQL,重新更新到Slave,使得主從服務(wù)器數(shù)據(jù)達(dá)到一致。

主從復(fù)制的邏輯有以下幾種
一主一從,單向主從同步模式,只能在Master端寫(xiě)入數(shù)據(jù)

?

一主多從

?

?

雙主主復(fù)制邏輯架構(gòu),此架構(gòu)可以在Master1或Master2進(jìn)行數(shù)據(jù)寫(xiě)入,或者兩端同時(shí)寫(xiě)入(特殊設(shè)置)

?

4.應(yīng)用場(chǎng)景
利用復(fù)制功能當(dāng)Master服務(wù)器出現(xiàn)問(wèn)題時(shí),我們可以人工的切換到從服務(wù)器繼續(xù)提供服務(wù),此時(shí)服務(wù)器的數(shù)據(jù)和宕機(jī)時(shí)的數(shù)據(jù)幾乎完全一致。
復(fù)制功能也可用作數(shù)據(jù)備份,但是如果人為的執(zhí)行drop,delete等語(yǔ)句刪除,那么從庫(kù)的備份功能也就失效了

?

2、mysql主從復(fù)制主庫(kù)的配置步驟

1.在matser(192.168.3.115)主庫(kù)上的操作,開(kāi)啟主庫(kù)功能 # 先把主數(shù)據(jù)庫(kù)停了 systemctl stop mariadb # 編輯數(shù)據(jù)庫(kù)的配置文件 /etc/my.cnf ,寫(xiě)入如下信息 [mysqld] server-id=6 # 這個(gè)server-id只要與你從庫(kù)的server-id不一樣即可 log-bin=master-logbin # 生成二進(jìn)制日志,記錄數(shù)據(jù)的變化# 重啟數(shù)據(jù)庫(kù) systemctl start mariadb2.在主庫(kù)創(chuàng)建用戶(hù),用于同步數(shù)據(jù) create user xiaoming@'%' identified by 'xm666';授予用戶(hù),slave從庫(kù)的身份 grant replication slave on *.* to 'xiaoming'@'%';3.鎖定數(shù)據(jù)庫(kù)的庫(kù)表,禁止寫(xiě)入 這個(gè)命令是全局讀鎖定,執(zhí)行了命令之后所有庫(kù)所有表都被鎖定只讀。一般都是用在數(shù)據(jù)庫(kù)聯(lián)機(jī)備份,這個(gè)時(shí)候數(shù)據(jù)庫(kù)的寫(xiě)操作將被阻塞,讀操作順利進(jìn)行。 解鎖語(yǔ)句是:UNLOCK TABLES; flush table with read lock;記錄下主庫(kù)的狀態(tài),記錄下,日志文件的名字,和位置 show master status; 4.導(dǎo)出主庫(kù)的數(shù)據(jù) mysqldump -u root -p --all-databases > /tmp/db.sql5.遠(yuǎn)程傳輸主庫(kù)的數(shù)據(jù),給從庫(kù),進(jìn)行導(dǎo)入 scp /tmp/db.sql root@192.168.3.27:/tmp/6.解鎖主庫(kù)的鎖,寫(xiě)入數(shù)據(jù),查看從庫(kù)是否同步 unlock tables;

?

3、從庫(kù)slave(192.168.3.27)機(jī)器的配置步驟

1.在從庫(kù)的 /etc/my.cnf中添加參數(shù),添加只讀參數(shù) [mysqld] server-id=3 read-only=true2.重啟數(shù)據(jù)庫(kù) systemctl restart mariadb 在從庫(kù)中導(dǎo)入主庫(kù)的數(shù)據(jù) mysql -uroot -p < /tmp/db.sql 3.一條語(yǔ)句,開(kāi)啟主從之間的復(fù)制關(guān)系 用root用戶(hù),進(jìn)入mysql數(shù)據(jù)庫(kù),輸入命令: change master to master_host='192.168.3.115', # 主數(shù)據(jù)庫(kù)的ip master_user='xiaoming', # 普通用戶(hù)的用戶(hù)名 master_password='xm666', # 普通用戶(hù)的密碼 master_log_file='master-logbin.000002', # 主庫(kù)show master status;日志文件的名字 master_log_pos=492; # 主庫(kù)show master status;記錄的位置4.開(kāi)啟slave同步功能 start slave;5.檢查slave機(jī)器的主從是否正確 show slave status\G 查看主從同步是否正確確保如下兩條參數(shù),是yes,即主從復(fù)制正確 Relay_Master_Log_File: master-logbin.000002Slave_IO_Running: YesSlave_SQL_Running: Yes6.此時(shí)mariadb數(shù)據(jù)庫(kù),請(qǐng)退出root用戶(hù),使用普通用戶(hù)配置,因?yàn)閞oot身份權(quán)限太大,無(wú)法達(dá)到read-only效果 6.此時(shí)mariadb數(shù)據(jù)庫(kù),請(qǐng)退出root用戶(hù),使用普通用戶(hù)配置,因?yàn)閞oot身份權(quán)限太大,無(wú)法達(dá)到read-only效果 6.此時(shí)mariadb數(shù)據(jù)庫(kù),請(qǐng)退出root用戶(hù),使用普通用戶(hù)配置,因?yàn)閞oot身份權(quán)限太大,無(wú)法達(dá)到read-only效果7.登錄一個(gè)普通用戶(hù)
mysql -u xiaoming -p 8.此時(shí)在主庫(kù)寫(xiě)入數(shù)據(jù),查看從庫(kù)是否正確同步9.從庫(kù)無(wú)法寫(xiě)入數(shù)據(jù),即為正常10.完成主從同步,讀寫(xiě)分離實(shí)驗(yàn)

?

三、redis基礎(chǔ)

redis是一種高級(jí)的key:value存儲(chǔ)系統(tǒng),其中value支持五種數(shù)據(jù)類(lèi)型
String: 字符串
Hash: 散列
List: 列表
Set: 集合
Sorted Set: 有序集合

?我的另一篇redis博客

1、strings類(lèi)型

操作

set    設(shè)置key get 獲取key append 追加string mset 設(shè)置多個(gè)鍵值對(duì) mget 獲取多個(gè)鍵值對(duì) del 刪除key incr 遞增+1 decr 遞減-1

?

示例

127.0.0.1:6379> set name 'dog' # 設(shè)置key OK 127.0.0.1:6379> get name # 獲取value "dog" 127.0.0.1:6379> set name 'BigDog' # 覆蓋key OK 127.0.0.1:6379> get name # 獲取value "BigDog" 127.0.0.1:6379> append name ' is you' # 向name這個(gè)key追加 (integer) 13 127.0.0.1:6379> get name # 獲取value "BigDog is you" 127.0.0.1:6379> mset age 18 hight 180 long 18.8 # 一次性設(shè)置多個(gè)鍵值對(duì) OK 127.0.0.1:6379> mget age hight long # 一次性獲取多個(gè)鍵的值 1) "18" 2) "180" 3) "18.8" 127.0.0.1:6379> get age # 獲取value "18" 127.0.0.1:6379> keys * # 找到所有key 1) "long" 2) "hight" 3) "age" 4) "name" 127.0.0.1:6379> del name # 刪除key (integer) 1 127.0.0.1:6379> get name # 獲取不存在的value,為nil (nil) 127.0.0.1:6379> set num 10 OK 127.0.0.1:6379> get num "10" 127.0.0.1:6379> incr num # 遞增+1 (integer) 11 127.0.0.1:6379> get num "11" 127.0.0.1:6379> decr num # 遞減-1 (integer) 10 127.0.0.1:6379> get num "10"

?

2、list類(lèi)型

操作

lpush 從列表左邊插 rpush 從列表右邊插 lrange 獲取一定長(zhǎng)度的元素 lrange key start stop(相當(dāng)于獲取切片的內(nèi)容) ltrim 截取一定長(zhǎng)度列表 lpop 刪除最左邊一個(gè)元素 rpop 刪除最右邊一個(gè)元素 lpushx/rpushx key存在則添加值,不存在不處理

?

示例

127.0.0.1:6379> lpush list1 'a' 'b' 'c' 'd' # 新建一個(gè)list1,從左邊放入四個(gè)元素 (integer) 4 127.0.0.1:6379> llen list1 # 查看list1的長(zhǎng)度 (integer) 4 127.0.0.1:6379> lrange list1 0 -1 # 查看list所有元素 1) "d" 2) "c" 3) "b" 4) "a" 127.0.0.1:6379> rpush list1 'haha' # 從右邊插入haha (integer) 5 127.0.0.1:6379> lrange list1 0 -1 1) "d" 2) "c" 3) "b" 4) "a" 5) "haha" 127.0.0.1:6379> lpushx list3 'xixi' # list3存在則添加元素,不存在則不作處理 (integer) 0 127.0.0.1:6379> ltrim list1 0 3 # 截取隊(duì)列的值,從索引0取到3,刪除其余的元素 OK 127.0.0.1:6379> lrange list1 0 -1 1) "d" 2) "c" 3) "b" 4) "a" 127.0.0.1:6379> lpop list1 # 刪除左邊的第一個(gè) "d" 127.0.0.1:6379> lrange list1 0 -1 1) "c" 2) "b" 3) "a" 127.0.0.1:6379> rpop list1 # 刪除右邊的第一個(gè) "a" 127.0.0.1:6379> lrange list1 0 -1 1) "c" 2) "b"

?

3、set集合類(lèi)型

redis的集合,是一種無(wú)序的集合,集合中的元素沒(méi)有先后順序,且集合成員是唯一的。

操作

sadd/srem 添加/刪除 元素 sismember 判斷是否為set的一個(gè)元素 smembers 返回集合所有的成員 sdiff 返回一個(gè)集合和其他集合的差異 sinter 返回幾個(gè)集合的交集 sunion 返回幾個(gè)集合的并集

?

示例

127.0.0.1:6379> sadd school class1 class2 # 添加一個(gè)名叫school的集合,有2個(gè)元素,不加引號(hào)就當(dāng)做字符串處理 (integer) 2 127.0.0.1:6379> smembers school # 查看集合school成員 1) "class1" 2) "class2" 127.0.0.1:6379> srem school class1 # 刪除school的class1成員 (integer) 1 127.0.0.1:6379> smembers school 1) "class2" 127.0.0.1:6379> sismember school class1 # 是否是school的成員,不是返回0,是返回1 (integer) 0 127.0.0.1:6379> sadd school class3 # 給school添加一個(gè)新成員 (integer) 1 127.0.0.1:6379> smembers school 1) "class3" 2) "class2" 127.0.0.1:6379> sadd school2 class3 class4 # 添加一個(gè)名叫school2的集合,有2個(gè)元素 (integer) 1 127.0.0.1:6379> smembers school2 1) "class3" 2) "class4" 127.0.0.1:6379> sdiff school school2 # 找出集合school中有的,而school2中沒(méi)有的元素 1) "class2" 127.0.0.1:6379> sdiff school2 school # 找出集合school2中有的,而school中沒(méi)有的元素 1) "class4" 127.0.0.1:6379> sinter school school2 # 找出school和school2的交集 1) "class3" 127.0.0.1:6379> sunion school school2 # 找出school和school2的并集(自動(dòng)去重) 1) "class3" 2) "class4" 3) "class2"

?

4、哈希數(shù)據(jù)結(jié)構(gòu)

hashes即哈希。哈希是從redis-2.0.0版本之后才有的數(shù)據(jù)結(jié)構(gòu)。

hashes存的是字符串和字符串值之間的映射,比如一個(gè)用戶(hù)要存儲(chǔ)其全名、姓氏、年齡等等,就很適合使用哈希。

操作

hset 設(shè)置散列值 hget 獲取散列值 hmset 設(shè)置多對(duì)散列值 hmget 獲取多對(duì)散列值 hsetnx 如果散列已經(jīng)存在,則不設(shè)置(防止覆蓋key) hkeys 返回所有keys hvals 返回所有values hlen 返回散列包含域(field)的數(shù)量 hdel 刪除散列指定的域(field) hexists 判斷是否存在

?

注意

Hash不支持多次嵌套,即 "key": {'field': '不能再對(duì)應(yīng)字典'}"key": {'field': {...}} --> 錯(cuò)誤 若想嵌套字典,可以json.dumps后存入,取出數(shù)據(jù)的時(shí)候可以json.loads

?

語(yǔ)法

hset key field value 結(jié)構(gòu)如下key: {field1: value1,field2: value2,}

?

示例

127.0.0.1:6379> hset school name 'ChinaSchool' # 創(chuàng)建一個(gè)key為school的哈希數(shù)據(jù) (integer) 1 127.0.0.1:6379> hget school name # 獲取school的name的值 "ChinaSchool" 127.0.0.1:6379> hmset school age 100 area 2000 # 給school批量設(shè)置鍵值對(duì) OK 127.0.0.1:6379> hmget school name age area # 批量獲取school的鍵對(duì)應(yīng)的值 1) "ChinaSchool" 2) "100" 3) "2000" 127.0.0.1:6379> hkeys school # 獲取school的所有key 1) "name" 2) "age" 3) "area" 127.0.0.1:6379> hvals school # 獲取school的所有值 1) "ChinaSchool" 2) "100" 3) "2000" 127.0.0.1:6379> hlen school # 獲取school的長(zhǎng)度 (integer) 3 127.0.0.1:6379> hexists school name # 判斷school中是否有name這個(gè)鍵,有就返回1,沒(méi)有就返回0 (integer) 1 127.0.0.1:6379> hdel shcool area # 刪除school中的area鍵值對(duì) (integer) 1

?

5、額外的危險(xiǎn)操作(慎用)

獲取redis數(shù)據(jù)庫(kù)中所有的鍵(這個(gè)不危險(xiǎn)) keys *刪除所有Key,可以使用Redis的flushdb和flushall命令(危險(xiǎn)慎用) # 刪除當(dāng)前數(shù)據(jù)庫(kù)中的所有Key flushdb# 刪除所有數(shù)據(jù)庫(kù)中的key flushall

?

四、redis發(fā)布者訂閱者

發(fā)布者: PUBLISH channel msg將信息 message 發(fā)送到指定的頻道 channel頻道 channel 自定義頻道的名字訂閱者: SUBSCRIBE channel [channel ...]訂閱頻道,可以同時(shí)訂閱多個(gè)頻道UNSUBSCRIBE [channel ...]取消訂閱指定的頻道, 如果不指定頻道,則會(huì)取消訂閱所有頻道PSUBSCRIBE pattern [pattern ...]訂閱一個(gè)或多個(gè)符合給定模式的頻道(正則匹配),每個(gè)模式以 * 作為匹配符,比如 it* 匹配所有以 it 開(kāi)頭的頻道( it.news 、 it.blog 、 it.tweets 等等), news.* 匹配所有以 news. 開(kāi)頭的頻道( news.it 、 news.global.today 等等),諸如此類(lèi)PUNSUBSCRIBE [pattern [pattern ...]]退訂指定的規(guī)則, 如果沒(méi)有參數(shù)則會(huì)退訂所有規(guī)則PUBSUB subcommand [argument [argument ...]]查看訂閱與發(fā)布系統(tǒng)狀態(tài)注意:使用發(fā)布訂閱模式實(shí)現(xiàn)的消息隊(duì)列,當(dāng)有客戶(hù)端訂閱channel后只能收到后續(xù)發(fā)布到該頻道的消息,之前發(fā)送的不會(huì)緩存,必須Provider和Consumer同時(shí)在線

?

五、redis數(shù)據(jù)持久化

redis的缺點(diǎn):
  redis數(shù)據(jù)放在內(nèi)存中
  重啟服務(wù)器丟失數(shù)據(jù)
  重啟redis服務(wù)丟失數(shù)據(jù)
  斷電丟失數(shù)據(jù)

為了防止redis數(shù)據(jù)丟失,進(jìn)行持久化,將數(shù)據(jù),寫(xiě)入到一個(gè)文件中

?

1、redis持久化之RDB

redis提供了RDB持久化的功能,這個(gè)功能可以將redis在內(nèi)存中的的狀態(tài)保存到硬盤(pán)中,它可以手動(dòng)執(zhí)行。
也可以再redis.conf中配置,定期執(zhí)行。
RDB持久化產(chǎn)生的RDB文件是一個(gè)經(jīng)過(guò)壓縮的二進(jìn)制文件,這個(gè)文件被保存在硬盤(pán)中,redis可以通過(guò)這個(gè)文件還原數(shù)據(jù)庫(kù)當(dāng)時(shí)的狀態(tài)。

RDB的原理是
  基于內(nèi)存的數(shù)據(jù)快照
  定期執(zhí)行數(shù)據(jù)快照
  手動(dòng)觸發(fā)數(shù)據(jù)快照
  Redis會(huì)將數(shù)據(jù)集的快照dump到dump.rdb文件中
  可以通過(guò)配置文件來(lái)修改Redis服務(wù)器dump快照的頻率

RDB優(yōu)點(diǎn):
  速度快,適合做備份,主從復(fù)制就是基于RDB持久化功能實(shí)現(xiàn)
  rdb通過(guò)在redis中使用save命令觸發(fā) rdb

?

1. 配置rdb數(shù)據(jù)持久化

1.在配置文件中,添加rdb持久化參數(shù) vim redis-6379.conf 寫(xiě)入如下配置 port 6379 daemonize yes pidfile /data/6379/redis.pid loglevel notice logfile "/data/6379/redis.log" protected-mode yes dir /data/6379 # 定義持久化文件存儲(chǔ)位置(rdb和aof) dbfilename dbmp.rdb # rdb持久化文件 save 900 1 # rdb機(jī)制 每900秒 如果至少有1個(gè)key發(fā)生變化,則dump內(nèi)存快照(相當(dāng)于手動(dòng)save觸發(fā)rdb持久化文件) save 300 10 # 在300秒(5分鐘)之后,如果至少有10個(gè)key發(fā)生變化,則dump內(nèi)存快照。 save 60 10000 # 在60秒(1分鐘)之后,如果至少有10000個(gè)key發(fā)生變化,則dump內(nèi)存快照。2.觸發(fā)rdb持久化,可以手動(dòng)save命令,生成 dump.rdb持久化文件3.重啟redis,數(shù)據(jù)不再丟失4. 測(cè)試 進(jìn)入redis客戶(hù)端 redis-cli127.0.0.1:6379> set age 18 OK 127.0.0.1:6379> save OK5.進(jìn)入/data/6379查看是否生成了 dbmp.rdb 持久化文件 注意:rdb數(shù)據(jù)文件是二進(jìn)制文件,人為的看不懂6.kill掉redis進(jìn)程,再重啟,進(jìn)入redis keys * 查看數(shù)據(jù)是否還在

?

2、redis持久化之a(chǎn)of

AOF(append-only log file)
記錄服務(wù)器執(zhí)行的所有變更操作命令(例如set del等),并在服務(wù)器啟動(dòng)時(shí),通過(guò)重新執(zhí)行這些命令來(lái)還原數(shù)據(jù)集


AOF 文件中的命令全部以redis協(xié)議的格式保存,新命令追加到文件末尾。
優(yōu)點(diǎn):最大程序保證數(shù)據(jù)不丟
缺點(diǎn):日志記錄非常大

?

1. 配置方式

?

1,在配置文件中,添加aof參數(shù) 參數(shù)解釋: appendonly yes # 開(kāi)啟aof功能# appendfsync選擇一個(gè)策略寫(xiě)入配置文件即可,這里使用每分鐘 appendfsync everysec # 每秒鐘同步一次,該策略為AOF的缺省策略。 appendfsync always # 每次有數(shù)據(jù)修改發(fā)生時(shí)都會(huì)寫(xiě)入AOF文件。 appendfsync no # 從不同步。高效但是數(shù)據(jù)不會(huì)被持久化 配置如下: port 6379 daemonize yes pidfile /data/6379/redis.pid loglevel notice logfile "/data/6379/redis.log" protected-mode yes dir /data/6379 dbfilename dbmp.rdb save 900 1 save 300 10 save 60 10000appendonly yes appendfsync everysec2,重啟redis數(shù)據(jù)庫(kù),加載aof功能 會(huì)在/data/6379目錄下生成 appendonly.aof 文件3,appendonly.aof 文件是人可以看懂的記錄了sql操作的文件4,測(cè)試 進(jìn)入redis客戶(hù)端 redis-cli127.0.0.1:6379> set long 18 OK5,進(jìn)入/data/6379查看appendonly.aof 文件的內(nèi)容6,kill掉redis進(jìn)程,再重啟,進(jìn)入redis keys * 查看數(shù)據(jù)是否還在

?

?

3、在不重啟redis的情況下,切換rdb數(shù)據(jù)到aof數(shù)據(jù)中

?

1.配置redis支持rdb持久化2.啟動(dòng)redis客戶(hù)端,通過(guò)命令,臨時(shí)切換到aof模式 127.0.0.1:6379> CONFIG set appendonly yes # 開(kāi)啟AOF功能 OK 127.0.0.1:6379> CONFIG SET save "" # 關(guān)閉RDB功能 OK3.檢查此時(shí)的數(shù)據(jù)持久化方式是rdb,還是aof,檢查appendonly.aof文件,數(shù)據(jù)變動(dòng) tail -f appendonly.aof4.此時(shí)aof還未永久生效,寫(xiě)入?yún)?shù)到配置文件 編輯redis-6379.conf 添加如下參數(shù) appendonly yes appendfsync everysec

?

4、redis持久化方式有什么區(qū)別

rdb:基于快照的持久化,速度更快,一般用作備份,主從復(fù)制也是依賴(lài)于rdb持久化功能

aof:以追加的方式記錄redis操作日志的文件。可以最大程度的保證redis數(shù)據(jù)安全,類(lèi)似于mysql的binlog

?

六、redis主從同步實(shí)現(xiàn)

原理:
1. 從服務(wù)器向主服務(wù)器發(fā)送 SYNC 命令。
2. 接到 SYNC 命令的主服務(wù)器會(huì)調(diào)用BGSAVE 命令,創(chuàng)建一個(gè) RDB 文件,并使用緩沖區(qū)記錄接下來(lái)執(zhí)行的所有寫(xiě)命令。
3. 當(dāng)主服務(wù)器執(zhí)行完 BGSAVE 命令時(shí),它會(huì)向從服務(wù)器發(fā)送 RDB 文件,而從服務(wù)器則會(huì)接收并載入這個(gè)文件。
4. 主服務(wù)器將緩沖區(qū)儲(chǔ)存的所有寫(xiě)命令發(fā)送給從服務(wù)器執(zhí)行。

小知識(shí):
1. 在開(kāi)啟主從復(fù)制的時(shí)候,使用的是RDB方式的,同步主從數(shù)據(jù)的
2. 同步開(kāi)始之后,通過(guò)主庫(kù)命令傳播的方式,主動(dòng)的復(fù)制方式實(shí)現(xiàn)
3. 2.8以后實(shí)現(xiàn)PSYNC的機(jī)制,實(shí)現(xiàn)斷線重連

?

1、使用配置文件進(jìn)行redis主從同步配置

準(zhǔn)備三個(gè)redis數(shù)據(jù)庫(kù),redis支持多實(shí)例
三個(gè)配置文件,僅僅是端口的不同

在三個(gè)配置文件中,添加主從同步的參數(shù),
三個(gè)配置文件參數(shù)是一樣的,唯一不同的是,
在從庫(kù)中需要指定它的主庫(kù)是誰(shuí)即可,
例如6380的配置
slaveof 127.0.0.1 6379 代表這個(gè)redis庫(kù)是6379的從庫(kù)

?

1. 三個(gè)配置文件參信息如下 # redis-6379.conf(主redis) port 6379 daemonize yes pidfile /data/6379/redis.pid loglevel notice logfile "/data/6379/redis.log" dir /data/6379 protected-mode yes dbfilename dbmp.rdb save 900 1 save 300 10 save 60 10000# redis-6380.conf(從redis) port 6380 daemonize yes pidfile /data/6380/redis.pid loglevel notice logfile "/data/6380/redis.log" dir /data/6380 protected-mode yes dbfilename dbmp.rdb save 900 1 save 300 10 save 60 10000 slaveof 127.0.0.1 6379# redis-6381.conf(從redis) port 6381 daemonize yes pidfile /data/6381/redis.pid loglevel notice logfile "/data/6381/redis.log" dir /data/6381 protected-mode yes dbfilename dbmp.rdb save 900 1 save 300 10 save 60 10000 slaveof 127.0.0.1 63792.啟動(dòng)三個(gè)redis實(shí)例 redis-server redis-6379.conf redis-server redis-6380.conf redis-server redis-6381.conf3.查看主從同步身份 1,redis-cli -p 6379 info replication # Replication role:master connected_slaves:2 slave0:ip=127.0.0.1,port=6380,state=online,offset=28,lag=1 slave1:ip=127.0.0.1,port=6381,state=online,offset=28,lag=12,redis-cli -p 6380 info replication # Replication role:slave master_host:127.0.0.1 master_port:63793,redis-cli -p 6381 info replication # Replication role:slave master_host:127.0.0.1 master_port:63794.測(cè)試 # 在6379主庫(kù) redis-cli -p 6379127.0.0.1:6379> set uzi good OK# 在6380從庫(kù) redis-cli -p 6380127.0.0.1:6380> get uzi "good"# 在6381從庫(kù) redis-cli -p 6381127.0.0.1:6381> get uzi "good"

?

2、使用命令行進(jìn)行redis主從同步配置

1. 6380/6381命令行 redis-cli -p 6380 127.0.0.1:6380> SLAVEOF 127.0.0.1 6379 #指明主庫(kù)的地址 redis-cli -p 6381 127.0.0.1:6381> SLAVEOF 127.0.0.1 6379 #指明主庫(kù)的地址2. 檢查主從狀態(tài) 主庫(kù): 127.0.0.1:6379> info replication從庫(kù): 127.0.0.1:6380> info replication 127.0.0.1:6381> info replication

?

3、如果我主庫(kù)掛了怎么辦

解決方案:手動(dòng)切換主從身份,選舉一個(gè)新的主庫(kù) 1.干掉6379主庫(kù) redis-cli -p 6379 shutdown2.在6380上關(guān)閉自己的slave身份 127.0.0.1:6380> slaveof no one 3.在6381上給與新的主人身份 127.0.0.1:6381> salveof 127.0.0.1 6380 4.修改完畢,還得修改配置文件,永久生效

?

轉(zhuǎn)載于:https://www.cnblogs.com/Zzbj/p/10274367.html

總結(jié)

以上是生活随笔為你收集整理的mysql主从复制、redis基础、持久化和主从复制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。