Linux-基礎學習(五)-mariadb主從複製以及redis學習

開始今日份整理python

1.mariadb的主從複製

主從複製大體圖示:mysql

1554339353030

1.1 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

1.2 mysql的主從複製

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語句寫入到本身的數據庫, 兩邊的數據就一致了

1.3 mariadb主從複製實驗

實驗需求:準備兩臺數據庫服務器

主服務器: 192.168.1.44
從服務器:  192.168.1.121

1.3.1 在主服務器上操做

(1)中止主服務器mariadb數據庫服務

systemctl stop mariadb

(2)修改主服務器配置文件並從新啓動數據庫服務

1554341198593

在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;

記錄下主數據庫的寫入狀態和日誌文件的名字

1554341696398

(8)鎖表後,單獨在打開一個SSH窗口,導出數據庫的全部數據

注意,必定要單獨再打開一個SSH窗口!!!!!

1554341973575

1554342043868

1.3.2 在從庫上配置

(1)關閉數據庫服務

systemctl stop mariadb

(2)在從庫上配置數據庫服務

在從庫192.168.1.121 上打開/etc/my.cnf

1554342192798

[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;
注意: 若是看到Slave_IO_Running和Slave_SQL_Running這兩個參數都爲yes, 說明主從同步配置成功,不然須要檢查並從新配置

1554342819306

(8)測試主從是否同步後,須要將主庫的數據庫解鎖

須要知道的是這步是在主庫中敲

unlock tables

在主庫中新建數據庫後,從庫一樣會將數據庫同步過來

1.3.3 主從讀寫分離

上面同步後,此時主從同步就已經完成配置了,雙方都登陸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

最後,提示請看圖:

2.redis基礎學習

2.1 redis的編譯安裝

(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

2.2 yum安裝redis

#前提得配置好阿里雲yum源,epel源
#查看是否有redis包
yum list redis
#安裝redis
yum install redis -y
#安裝好,啓動redis
systemctl start redis

2.3 使用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"

2.4 redis數據結構

redis是一種高級的key:value存儲系統,其中value支持五種數據類型
字符串(strings)
散列(hashes)
列表(lists)
集合(sets)
有序集合(sorted sets)

數據結構示例

2.4.1 strings類型

  • set  設置key
  • get   獲取key
  • append  追加string
  • mset   設置多個鍵值對
  • mget   獲取多個鍵值對
  • del  刪除key
  • incr  遞增+1
  • decr  遞減-1
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"

2.4.2 list類型

  • lpush         從列表左邊插
  • rpush         從列表右邊插
  • lrange          獲取必定長度的元素  lrange key  start stop
  • ltrim               截取必定長度列表
  • lpop                 刪除最左邊一個元素
  • rpop                     刪除最右邊一個元素
  • lpushx/rpushx                key存在則添加值,不存在不處理
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 #刪除右邊的第一個

2.4.3 sets集合類型

redis的集合,是一種無序的集合,集合中的元素沒有前後順序。

集合相關的操做也很豐富,如添加新元素、刪除已有元素、取交集、取並集、取差集等。咱們來看例子:

  • sadd/srem   添加/刪除 元素
  • sismember   判斷是否爲set的一個元素
  • smembers    返回集合全部的成員
  • sdiff             返回一個集合和其餘集合的差別
  • sinter           返回幾個集合的交集
  • sunion          返回幾個集合的並集
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的並集,全部的不重複的元素

2.4.4 哈希數據結構

hashes即哈希。哈希是從redis-2.0.0版本以後纔有的數據結構。

hashes存的是字符串和字符串值之間的映射,hash特別適合用於存儲對象,好比一個用戶要存儲其全名、姓氏、年齡等等,就很適合使用哈希。

Redis 中每一個 hash 能夠存儲 232 - 1 鍵值對(40多億)。

  • hset 設置散列值
  • hget  獲取散列值
  • hgetall獲取在哈希表中指定 key 的全部字段和值
  • hmset  設置多對散列值
  • hmget  獲取多對散列值
  • hsetnx   若是散列已經存在,則不設置(防止覆蓋key)
  • hkeys     返回全部keys
  • hvals     返回全部values
  • hlen      返回散列包含域(field)的數量
  • hdel     刪除散列指定的域(field)
  • hexists    判斷是否存在
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

2.5 python操做redis

2.5.1 啓動redis

這裏注意對配置文件修改

打開註釋,否則py客戶端連不上  

守護模式不開就no  

指定配置文件進行啓動  

而後準備設置redis驗證密碼(否則py鏈接報錯)

退出,從新登陸redis  

2.5.2 python操做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'))

2.5.3 線程池操做redis

'''
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'))

a

相關文章
相關標籤/搜索