1. 程式人生 > >Ameba讀寫分離_mycat分庫分表_redis緩存

Ameba讀寫分離_mycat分庫分表_redis緩存

veth user 3.4 結果 部署 字符 不成功 inter 判斷

1 數據庫的讀寫分離

1.1 Amoeba實現讀寫分離

1.1.1 定義

Amoeba是一個以MySQL為底層數據存儲,並對應用提供MySQL協議接口的proxy

優點:

  1. 配置讀寫分離時較為簡單.配置文件編寫方便
  2. 可以做到整個數據庫的讀寫分離
  3. 占用的資源較少.

缺點:

  1. 不能實現高可用
  2. 現在不更新維護了

1.2 搭建amoeba

1.2.1 安裝JDK

說明:Amoeba的使用依賴於JDK.

1.2.2 安裝Amoeba

說明:Amoeba文件拖入/usr/local/src/

將其解壓

1.2.3 使用工具修改xml

通過工具連接遠程的amoeba虛擬機

1.3 修改
D
BServer.xml

1.3.1 修改用戶名和密碼

1.3.2 配置數據庫服務

說明:定義主數據庫的IP地址

1.3.3 定義讀操作策略

1.4 Amoeba配置

1.4.1 修改Amoeba.xml文件

說明:

默認的amoeba訪問主庫.

如果配置了讀寫分離則采用讀寫分離的操作數據庫

所有的寫庫操作訪問主數據庫.

所有的讀操作,訪問multiPool負載均衡後的數據庫slave,master,salve

Amoeba默認的訪問端口是8066

1.5 修改JVM內存

1.5.1 修改內存

說明:

說明:原因的jvm配置文件大小只有256M太小,amoeba不能正常啟動

,需要修改JVM大小.

1.6 Amoeba啟動

1.6.1 啟動Amoeba

說明:進入到bin目錄下執行啟動命令

/usr/local/src/amoeba-mysql-3.0.4-BETA/bin

./launcher 啟動

./shutdown 停止

1.7 Amoeba測試

1.7.1 連接Amoeba

說明:通過工具連接遠程Amoeba.切記關閉防火墻

1.7.2 代碼測試

說明:通過京淘後臺管理修改數據源配置,通過代碼測試Amoeba

jdbc.driver=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql://192.168.126.139:8066/jtdb

?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true

jdbc.username=root

jdbc.password=root

1.8 錯誤集錦

1.8.1 關閉主庫和從庫的防火墻

說明:當虛擬機開機後,防火墻默認開啟了,需要再次手動關閉.

1.8.2 修改配置文件後沒有及時報錯

共修改2個配置文件dbServer.xml,amoeba.xml

需要通過工具進行下載和上傳/保證上傳的文件不錯.

1.8.3 報錯端口占用

  1. 關機重啟
  2. 查詢項目的進程後殺死進程

Kill -9 5652

  1. ./shutdown 關閉amoeba
  2. 修改JVM內存

2 Mycat介紹

2.1 Mycat下載

2.1.1 下載地址

官網地址: http://www.mycat.io/

2.1.2 安裝JDK

2.2 MyCat安裝

2.2.1 解壓文件

tar -xvf Mycat………

2.2.2 編輯schemas.xml文件

2.2.3 定義負載策略:

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"

writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">

<heartbeat>select 1</heartbeat>

<!--配置第一臺主機主要進行寫庫操作,在默認的條件下Mycat主要操作第一臺主機

在第一臺主機中已經實現了讀寫分離.

因為默認寫操作會發往137的數據庫.

讀的操作默認發往141.如果從節點比較忙,則主節點分擔部分壓力.

-->

<writeHost host="hostM1" url="192.168.126.137:3306" user="root" password="root">

<!--讀數據庫-->

<readHost host="hostS1" url="192.168.126.141:3306" user="root" password="root" />

</writeHost>

<!--定義第二臺主機 由於數據庫內部已經實現了雙機熱備.

Mycat實現高可用.當第一個主機137宕機後.mycat會自動發出心跳檢測.檢測3.如果主機137沒有給Mycat響應則判斷主機死亡.則啟動第二臺主機繼續為用戶提供服務.

如果137主機恢復之後則處於等待狀態.如果141宕機則137再次持續為用戶提供服務.

前提:實現雙機熱備.

-->

<writeHost host="hostM2" url="192.168.126.141:3306" user="root" password="root">

<readHost host="hostS1" url="192.168.126.137:3306" user="root" password="root" />

</writeHost>

</dataHost>

2.2.4 修改server.xml

默認的schemasTextDB.需要手動修改

2.2.5 啟動Mycat

說明:進入根目錄cd /usr/local/src/bin

./mycat start 啟動

./mycat stop關閉mycat

2.2.6 測試

2.3 報錯說明

2.3.1 IP錯誤

檢測IP地址和自己的機器是否匹配

192.168.126.137

2.3.2 配置文件上傳是否正確

  1. 分別檢測server.xml和schema文件是否上傳成功

2.如果正確還是測試不成功,則先關閉mycat,控制臺通過rm -rf 命令將Mycat2個配置文件刪除.之後通過FZ工具上傳修改後的配置文件.之後重啟mycat

2.3.3 檢測日誌是否啟動成功

cd /usr/local/src/mycat/logs/ cat wrapper.log

2.3.4 關於getByte報錯

由於Mycat中解析配置文件時會出現報錯信息,

所以將每行註釋都添加<!—註釋-->

3 Redis學習

3.1 傳統框架中的瓶頸

3.1.1 緩存機制

緩存機制其實就是降低了客戶端訪問真實數據源的訪問頻次.緩存中的數據就是數據源就數據的備份.如果數據源數據發生改變.緩存數據需要及時更新.

3.1.2 緩存中遇到的問題

  1. 如果采用單臺緩存服務器,很容器出現宕機現象.如果緩存服務器宕機將直接影響整個服務.---解決方案部署緩存集群
  2. 如果實現緩存則需要實現數據的同步—配置主從
  3. 如果緩存服務器宕機.數據如何保存.應該將數據盡可能持久化

3.1.3 Redis內存數據庫

說明:redis現階段所有企業中使用最多的內存數據庫.其中主要采用key-value的形式保存數據.並且提供很多實用的數據類型.String/list/set/hash.

Redis底層通過C編輯,可以每秒支持110000次的集合運算.並且在內存中運行.

Redis底層實現時自動支持數據的持久化.如果reids重啟會自動的掃描持久化文件之後恢復數據.

3.1.4 Redis的下載

http://www.redis.net.cn/

Window版本不建議使用

因為官方沒有提供window版本,window版本是微軟自己研發.穩定性不強

3.1.5 緩存架構

3.1.6 解壓redis

tar -xvf redis-3.2.8.tar.gz

3.1.7 編譯redis

在根目錄下執行 /usr/local/src/redis-3.2.8 執行make指令

make

生成可執行文件

3.1.8 安裝redis

make install

4 Redis操作

4.1 啟動redis

4.1.1 直接啟動

命令:redis-server

說明:默認端口都是6379

問題:通過redis-server啟動時,之後不能編寫linux命令,需要再次創建鏈接.造成編碼不便

4.1.2 後臺啟動

  1. 解除IP綁定

  1. 關閉保護模式

  1. 開啟後臺運行

  1. 開啟後臺redis

redis-server redis.conf

ps -ef |grep redis

root 5847 1 0 01:45 ? 00:00:00 redis-server *:6379

root 5852 2571 0 01:45 pts/1 00:00:00 grep redis

4.2 操作redis

4.2.1 進入客戶端

執行命令:redis-cli

4.3 Redis的操作命令

4.3.1 String 類型操作

指令

說明

案例

set

設定key的值

set name tom

get

獲取指定 key 的值

get name

strlen

獲取key值的長度

strlen name

exists

檢查給定 key 是否存在

exists name 返回1存在 0不存在

del

刪除指定的key/key1 key2

del name1 name2

keys

命令用於查找所有符合給定模式 pattern 的 key

Keys * 查詢全部的key值

Keys n?me 占位符

Keys name* 以name開頭的key

mset

賦值多個key-value

mset key1 value1 key2 value2 key3 value3

同時賦值多個值

mget

獲取多個key

Mget key1 key2 key3

append

對指定的key進行追加

append key 123456 value123456

append key " 123456" value 123456中間多一個空格

Type

查看key的類型

Type key1

127.0.0.1:6379> TYPE key1string

Flushdb

清空當前數據庫

Flushdb 清空數據庫

Select

切換數據庫

Select 0-15 redis一共有16個數據庫

FLUSHALL

清空全部數據庫數據

flushall

Incr

自動增長1

Incr num 數據會自動加1

Incr string 數據庫會報錯

Decr

自動減1

Decr name 數據會自動減1

incrby

指定步長自增

Incrby 2 每次自增2

Decrby

指定步長自減

Decrby 2每次減2

Expire

指定key的失效時間單位是秒(s)

EXPIRE name1 5 5秒後數據失效

Ttl

查看key的剩余存活時間

Ttl name

-2表示失效

-1沒有失效時間

Pexpire

設置失效時間(毫秒)

Pexpire name 1000 用於秒殺業務

Persist

撤銷失效時間

撤銷失效時間

指令

說明

案例

hset

Hset key值 屬性名 屬性值

Hset user id 1

Hset user name tom

設置id和name的屬性值

hget

獲取指定 key的屬性值

Hget user name 獲取name屬性值

hmset

Hmset user key value1 key2 value2

hmset user id 1 name tom age 18

hmget

hmget user id name age

hmget user id name age 獲取user對象的id,name,age的屬性值

hgetall

取出key的全部字段值和屬性值

HGETALL user

hdel

刪除key的指定字段

刪除key的指定字段

Hkeys

查看key的全部字段

HKEYS user

hvals

查看key的全部值

Hvals user

hlen

查看key的字段數

Hlen user 查看user的字段數

4.3.2 Redis集合數據類型

1.字符串類型 String

2.散列類型 hash

3.列表類型 list

4.集合類型 set

5.有序集合類型

1.散列類型

可以通過散列類型用來保存對象和屬性的值

例如:user對象 {id:2,name:小明,age:19}

通過散列類型賦值不需要{}

4.3.3 List列表類型

List列表類型(list)是一個存儲有序的元素的集合類型.List數據類型底層是一個雙端列表.可以從左右分別進行寫入操作

指令

說明

案例

lpush

將一個或多個值插入到列表左部插入

LPUSH list1 1 2 3 4

rpush

在列表中添加一個或多個從列表右側插入

RPUSH list1 5 6 7 8

lpop

從列表左側移除元素,並且返回結果

LPOP list1

rpop

從列表右側移除元素,並且返回結果

RPOP list1

llen

獲取list集合的元素個數

Llen list1

Lrange

獲取指定區間內的片段值

LRANGE list1 0 3

獲取從左數第1個到第4個值

LRANGE list1 -3 -1

從右數第三個到第一個數據

Lrange list1 0 -1 查詢全部列表數據

Lrem

刪除列表中指定的值

Irem key count value

當count>0,從左開始刪除前count個值為value的元素

當count<0,從右側開始刪除前count個值為value的元素

當count=0時,刪除所有value的元素

LREM list1 2 2

從左數前2個為2的元素

LREM list1 -2 3

從右數前2個為3的元素

LREM list1 0 4

刪除全部為4的元素

Lindex

根據指定索引值查詢元素

LINDEX list1 0 查找索引值為0的值

LINDEX list1 -1 查詢最右邊的值

Lset

為指定索引賦值

LSET list1 0 10

LINSERT

LINSERT key before value1 value2

在value1之前插入value2

LINSERT list1 after 1 2

LINSERT list1 before 10 100

從左數第一個為10的元素前插入100

LINSERT list1 after 1 2

從左數第一個為1的值之後插入2

雙端列表的數據特點:查詢兩端數據時速度較快,查詢中間數據較慢.

4.3.4 redis集合類型

redis支持集合類型,並且每個集合的元素類型都可以不同,並且集合時無序的.

指令

說明

案例

sadd

向集合添加一個或多個成員

sadd set a b c

scard

獲取集合的成員數

SCARD set

srem

刪除集合的指定元素

SREM set a 刪除set中的a元素

smembers

查看集合的所有元素

SMEMBERS set

Sismember

查看元素是否屬於集合

SISMEMBER set a 查看a是否屬於set集合

sdiff

返回給定所有集合的差集

sinter

返回給定所有集合的交集

sunion

返回所有給定集合的並集

A={1,2,3} B={2,3,4}

SUNION a b = 1,2,3,4

Ameba讀寫分離_mycat分庫分表_redis緩存