開始今日份整理python
主從複製大體圖示:mysql
linux下的操做 1.啓動mysql systemctl start mariadb 2.linux客戶端鏈接本身 mysql -uroot -p -h 127.0.0.1 3.遠程連接mysql服務端 mysql -uroot -p -h 192.168.11.37 4.修改mysql密碼 MariaDB [(none)]> set password = PASSWORD('redhat123'); 5.建立mysql用戶 create user test1@'%' identified by 'xc666'; 6.查詢mysql庫中的用戶信息 use mysql; select host,user,password from user; 7.受權語句 給test1這個用戶,授予建立數據庫的權限 mysql使用grant命令對帳戶進行受權,grant命令常見格式以下 grant 權限 on 數據庫.表名 to 帳戶@主機名 對特定數據庫中的特定表受權 grant 權限 on 數據庫.* to 帳戶@主機名 對特定數據庫中的全部表給與受權 grant 權限1,權限2,權限3 on *.* to 帳戶@主機名 對全部庫中的全部表給與多個受權 grant all privileges on *.* to 帳戶@主機名 對全部庫和全部表受權全部權限 #授予test1建立的權限,對於全部的庫表生效 grant create on *.* to test1@"%" identified by 'xc666'; #授予test1用戶,只有建立mymysql數據庫的權限 grant create on mymysql.* to test1@"%" identified by 'xc666'; #授予用戶最大的權限,全部的權限 grant all privileges on *.* to username@'%' identified by 'password'; 8.移除權限 MariaDB [(none)]> revoke all privileges on *.* from test1@"%" identified by 'xc666'; 9.數據庫的備份與恢復 #備份 mysqldump -u root -p --all-databases > /tmp/db.sql #數據導入,方式有2種 source /tmp/db.sql; 第二種 mysql -uroot -p < /tmp/db.sql 第三種 navicat 第四種,若是你數據量特別大的話,使用第三方工具 xtrabackup
MySQL數據庫的主從複製方案,是其自帶的功能,而且主從複製並非複製磁盤上的數據庫文件,而是經過binlog日誌複製到須要同步的從服務器上。linux
MySQL數據庫支持單向、雙向、鏈式級聯,等不一樣業務場景的複製。在複製的過程當中,一臺服務器充當主服務器(Master),接收來自用戶的內容更新,而一個或多個其餘的服務器充當從服務器(slave),接收來自Master上binlog文件的日誌內容,解析出SQL,從新更新到Slave,使得主從服務器數據達到一致。redis
主從複製的邏輯有如下幾種sql
一主一從,單向主從同步模式,只能在Master端寫入數據數據庫
一主多從vim
雙主主複製邏輯架構,此架構能夠在Master1或Master2進行數據寫入,或者兩端同事寫入(特殊設置)安全
在生產環境中,MySQL主從複製都是異步的複製方式,即不是嚴格的實時複製,可是給用戶的體驗都是實時的。
MySQL主從複製集羣功能使得MySQL數據庫支持大規模高併發讀寫成爲可能,且有效的保護了服務器宕機的數據備份。服務器
應用場景:數據結構
利用複製功能當Master服務器出現問題時,咱們能夠人工的切換到從服務器繼續提供服務,此時服務器的數據和宕機時的數據幾乎徹底一致。
複製功能也可用做數據備份,可是若是人爲的執行drop,delete等語句刪除,那麼從庫的備份功能也就失效了.
主從機制實現原理
主從複製原理七步曲
1. 主數據庫寫入數據以後, 會有data changes(數據變化)記錄 2. 有變化記錄以後,將增刪改的一些sql語句記錄到本地的Binary log(二進制日誌)中 3. 從庫會一直開啓着一個線程 4. 經過線程去讀取這個二進制日誌的內容 5. 從庫會將數據寫入到本身的Relay log(中繼日誌)中 6. 從庫會將中繼日誌中的操做轉化爲SQL thread(SQL語句) 7. 經過轉化的SQL語句寫入到本身的數據庫, 兩邊的數據就一致了
實驗需求:準備兩臺數據庫服務器
主服務器: 192.168.1.44 從服務器: 192.168.1.121
(1)中止主服務器mariadb數據庫服務
systemctl stop mariadb
(2)修改主服務器配置文件並從新啓動數據庫服務
在mysqld中輸入上圖中倆句話
server -id=1 log-bin=qishi-login
(3)新建用於主從同步的用戶tiger,容許登陸的從庫是'192.168.1.121'
create user 'xiaochun'@'%' identified by 'xc666';
(4)給從庫帳號受權,說明給tiger從庫複製的權限,在192.168.1.121機器上覆制
grant replication slave on *.* to 'xiaochun'@'%';
(5)檢查主庫建立的複製帳號以及權限
select user,host from mysql.user; show grants for xiaochun@'192.168.1.121';
(6)實現對主數據庫鎖表只讀,防止數據寫入,數據複製失敗
flush table with read lock;
(7)檢查主庫的狀態, 並記錄下日誌文件的名字,和位置
MariaDB [(none)]> show master status;
記錄下主數據庫的寫入狀態和日誌文件的名字
(8)鎖表後,單獨在打開一個SSH窗口,導出數據庫的全部數據
(1)關閉數據庫服務
systemctl stop mariadb
(2)在從庫上配置數據庫服務
在從庫192.168.1.121 上打開/etc/my.cnf
[mysqld] server-id=3 read-only=true
(3)重啓數據庫
systemctl restart mariadb
(4)導入主庫傳過來的數據庫文件,保持從庫的數據與主庫一致
mysql -u root -p source /opt/masterdb.sql
(5)配置複製的參數,Slave從庫鏈接Master主庫的配置
###配置此處,須要根據以前主庫的內容 mysql > change master to master_host='192.168.1.121', master_user='test2', master_password='password-0', master_log_file='qishi-logbin.000002', master_log_pos=365;
(6)啓動從庫的同步開關,測試主從複製的狀況
start slave;
(7)查看複製狀態
show slave status\G;
(8)測試主從是否同步後,須要將主庫的數據庫解鎖
須要知道的是這步是在主庫中敲
unlock tables
在主庫中新建數據庫後,從庫一樣會將數據庫同步過來
上面同步後,此時主從同步就已經完成配置了,雙方都登陸xiaochun帳號,在主庫建立一個庫,再看從庫已經成功複製過來了,再到從庫上面嘗試建立庫或寫入數據,沒法寫入,由於從庫設置了只讀。
注:
注意此處還未配置從庫的只讀模式,只需在slave服務器上配置/etc/my.cnf,加上如下配置,而且在slave上建立普通用戶,使用普通用戶主從同步便可達到只讀的效果
若是用root用戶,沒法達到readonly,這是一個坑,必定要加上read-only =true
[mysqld] character-set-server=utf8 collation-server=utf8_general_ci log-error=/var/log/mysqld.log server-id=3 read-only=true [client] default-character-set=utf8 [mysql] default-character-set=utf8
最後,提示請看圖:
(1)下載redis源碼
(2)解壓縮
tar -zxf redis-4.0.10.tar.gz
(3)切換redis源碼目錄
cd redis-4.0.10
(4)編譯源文件
make
(5)編譯好後,src/目錄下有編譯好的redis指令
(6)make install 安裝到指定目錄,默認在/usr/local/bin
(7)在/opt下建立一個專門用來存放redis配置文件的目錄
mkdir /opt/redis_conf
(8)進入/opt/redis_conf目錄下
vim redis-6379.conf
寫入如下配置
#####須要注意的是:後面的中文不能夠複製進去!!!! port 6379 # 運行在6379的redis數據庫實例 daemonize yes # 後臺運行redis pidfile /data/6379/redis.pid # 存放redis pid的文件 loglevel notice # 日誌等級 logfile "/data/6379/redis.log" # 指定redis日誌文件的生成目錄 dir /data/6379 # 指定redis數據文件夾的目錄 protected-mode yes # 安全模式 requirepass haohaio # 設置redis的密碼
(9)啓動redis服務
redis-server /opt/redis_conf/redis-6379.conf
#前提得配置好阿里雲yum源,epel源 #查看是否有redis包 yum list redis #安裝redis yum install redis -y #安裝好,啓動redis systemctl start redis
使用redis客戶端
# 執行客戶端命令便可進入 ./redis-cli # 或指定參數 redis-cli -p 6380 -a zhuanqq -p 設置redis連接的端口 -a 顯示的填寫密碼 --raw 使用原始格式 # 測試是否鏈接上redis 127.0.0.1:6379 > ping 返回pong表明鏈接上了 # 用set來設置key、value 127.0.0.1:6379 > set name "tiger" OK # get獲取name的值 127.0.0.1:6379 > get name "tiger"
redis是一種高級的key:value存儲系統,其中value支持五種數據類型
字符串(strings)
散列(hashes)
列表(lists)
集合(sets)
有序集合(sorted sets)
數據結構示例
127.0.0.1:6379> set name 'tt' #設置key OK 127.0.0.1:6379> get name #獲取value "tt" 127.0.0.1:6379> set name 'tiger' #覆蓋key OK 127.0.0.1:6379> get name #獲取value "tiger" 127.0.0.1:6379> append name ' dsb' #追加key的string (integer) 10 127.0.0.1:6379> get name #獲取value "tiger dsb" 127.0.0.1:6379> mset user1 'alex' user2 'xiaopeiqi' #設置多個鍵值對 OK 127.0.0.1:6379> get user1 #獲取value "alex" 127.0.0.1:6379> get user2 #獲取value "xiaopeiqi" 127.0.0.1:6379> keys * #找到全部key 1) "user2" 2) "name" 3) "user1" 127.0.0.1:6379> mget user1 user2 name #獲取多個value 1) "alex" 2) "xiaopeiqi" 3) "tiger dsb" 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 #string類型實際上不只僅包括字符串類型,還包括整型,浮點型。redis可對整個字符串或字符串一部分進行操做,而對於整型/浮點型可進行自增、自減操做。 OK 127.0.0.1:6379> get num "10" 127.0.0.1:6379> incr num #給num string 加一 INCR 命令將字符串值解析成整型,將其加一,最後將結果保存爲新的字符串值,能夠用做計數器 (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> decr num #遞減1 (integer) 9 127.0.0.1:6379> get num "9"
lpush duilie 'alex' 'peiqi' 'ritian' #新建一個duilie,從左邊放入三個元素 llen duilie #查看duilie長度 lrange duilie 0 -1 #查看duilie全部元素 rpush duilie 'tiger' #從右邊插入tiger lpushx duilie2 'dsb' #key存在則添加 dsb元素,key不存在則不做處理 ltrim duilie 0 2 #截取隊列的值,從索引0取到2,刪除其他的元素 lpop #刪除左邊的第一個 rpop #刪除右邊的第一個
redis的集合,是一種無序的集合,集合中的元素沒有前後順序。
集合相關的操做也很豐富,如添加新元素、刪除已有元素、取交集、取並集、取差集等。咱們來看例子:
sadd zoo wupeiqi yuanhao #添加集合,有三個元素,不加引號就當作字符串處理
smembers zoo #查看集合zoo成員
srem zoo wupeiqi #刪除zoo裏面的alex
sismember zoo wupeiqi #返回改是不是zoo的成員信息,不存在返回0,存在返回1
sadd zoo wupeiqi #再把wupeiqi加入zoo
smembers zoo #查看zoo成員
sadd zoo2 wupeiqi mjj #添加新集合zoo2
sdiff zoo zoo2 #找出集合zoo中有的,而zoo2中沒有的元素
sdiff zoo2 zoo #找出zoo2中有,而zoo沒有的元素
sinter zoo zoo1 #找出zoo和zoo1的交集,都有的元素
sunion zoo zoo1 #找出zoo和zoo1的並集,全部的不重複的元素
hashes即哈希。哈希是從redis-2.0.0版本以後纔有的數據結構。
hashes存的是字符串和字符串值之間的映射,hash特別適合用於存儲對象,好比一個用戶要存儲其全名、姓氏、年齡等等,就很適合使用哈希。
Redis 中每一個 hash 能夠存儲 232 - 1 鍵值對(40多億)。
redis hash是一個string類型的field和value的映射表 語法 hset key field value hset news:1 title "first news title" #設置第一條新聞 news的id爲1,添加數據title的值是"first news title" hset news:1 content "news content" #添加一個conntent內容 hget news:1 title #獲取news:1的標題 hget news:1 content #獲取news的內容 hmget news:1 title content #獲取多對news:1的 值 hmset news:2 title "second news title" content "second Contents2" #設置第二條新聞news:2 多個field hmget news:2 title content #獲取news:2的多個值 hkeys news:1 #獲取新聞news:1的全部key hvals news:1 #獲取新聞news:1的全部值 hlen news:1 #獲取新聞news:1的長度 hdel news:1 title #刪除新聞news:1的title hlen news:1 #看下新聞news:1的長度 hexists news:1 title #判斷新聞1中是否有title,不存在返回0,存在返回1
這裏注意對配置文件修改
打開註釋,否則py客戶端連不上
守護模式不開就no
指定配置文件進行啓動
而後準備設置redis驗證密碼(否則py鏈接報錯)
退出,從新登陸redis
#!/usr/bin/env python # -*- coding:utf8 -*- import redis r = redis.Redis(host='192.168.11.122',password='123123',port=6379) r.set('foo', 'Bar') print (r.get('foo'))
''' redis-py 使用connection pool 來管理對一個redis server的全部鏈接,避免每次創建,釋放鏈接的開銷 默認 每一個redis實例都會維護一個本身的連接池,而後做爲參數redis,這樣就能夠實現多個redis 實例共享一個鏈接池 ''' import redis pool = redis.ConnectionPool(host='192.168.11.122',password='123123',port=6379) r = redis.Redis(connection_pool=pool) r.set('name','tiger') print(r.get('name'))