Ameba讀寫分離_mycat分庫分表_redis緩存
1 數據庫的讀寫分離
1.1 Amoeba實現讀寫分離
1.1.1 定義
Amoeba是一個以MySQL為底層數據存儲,並對應用提供MySQL協議接口的proxy
優點:
- 配置讀寫分離時較為簡單.配置文件編寫方便
- 可以做到整個數據庫的讀寫分離
- 占用的資源較少.
缺點:
- 不能實現高可用
- 現在不更新維護了
1.2 搭建amoeba
1.2.1 安裝JDK
說明:Amoeba的使用依賴於JDK.
1.2.2 安裝Amoeba
說明:將Amoeba文件拖入/usr/local/src/
將其解壓
1.2.3 使用工具修改xml
通過工具連接遠程的amoeba虛擬機
1.3 修改 DBServer.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不能正常啟動
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
jdbc.username=root
jdbc.password=root
1.8 錯誤集錦
1.8.1 關閉主庫和從庫的防火墻
說明:當虛擬機開機後,防火墻默認開啟了,需要再次手動關閉.
1.8.2 修改配置文件後沒有及時報錯
共修改2個配置文件dbServer.xml,amoeba.xml
需要通過工具進行下載和上傳/保證上傳的文件不錯.
1.8.3 報錯端口占用
- 關機重啟
- 查詢項目的進程後殺死進程
Kill -9 5652
- ./shutdown 關閉amoeba
- 修改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
默認的schemas是TextDB.需要手動修改
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 配置文件上傳是否正確
- 分別檢測server.xml和schema文件是否上傳成功
2.如果正確還是測試不成功,則先關閉mycat,控制臺通過rm -rf 命令將Mycat的2個配置文件刪除.之後通過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 緩存中遇到的問題
- 如果采用單臺緩存服務器,很容器出現宕機現象.如果緩存服務器宕機將直接影響整個服務.---解決方案部署緩存集群
- 如果實現緩存則需要實現數據的同步—配置主從
- 如果緩存服務器宕機.數據如何保存.應該將數據盡可能持久化
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 後臺啟動
- 解除IP綁定
- 關閉保護模式
- 開啟後臺運行
- 開啟後臺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緩存