Mysql2 分庫分表(mycat), centos7安裝jdk
阿新 • • 發佈:2020-12-09
找到對應版本
# 建立目錄 mkdir /usr/local/java # 將下載的tar.gz 解壓到當前路徑下 tar -zxvf jdk-8u241-linux-x64.tar.gz rm -f jdk-8u241-linux-x64.tar.gz #刪除壓縮包 ''' 命令介紹: tar 備份檔案 -zxvf -z 通過gzip指令處理備份檔案 -x 從備份檔案中還原檔案 -v 顯示指令執行過程 -f 指定備份檔案 jdk-8u241-linux-x64.tar 檔名 ''' # 進入bin檔案,輸入./java -version可以看到java版本,如果想直接使用,需要將命令加入環境變數
三 配置環境變數
# vim 開啟profile vim /etc/profile # 在最後一行輸入export JAVA_HOME=/usr/local/java/jdk1.8.0_241 export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar export PATH=$PATH:${JAVA_HOME}/bin # 使配置生效 source /etc/profile # 檢查 java -version
# 1 單表資料量到達千萬級 (分庫:一個庫有table1,table2表,另一個庫有table3,table4表) # 2 分表方案 -垂直分表:把原來一個大表,做成一對一關係-水平分表:水平切,假設把2000萬的資料,分到兩個表中(按id分,按hash分)#可能會有熱點問題,活躍的使用者都在第一張表上,用hash分表會均勻的落在兩個表中 # 備註: # 先讀寫分離,再搭叢集(提高查詢效能),(單表資料量過了千萬級,若果是innodb資料引擎,查詢基本就廢了。即便做了叢集,也需要分表)再做分庫分表 # 大公司真正資料量大的東西(上億級)不會放在mysql中, 用es,hadoop,mongodb
# 1 通過mycat資料庫中介軟體實現(生根於阿里) 拓展:支援高併發,就是儘量讓請求少往後走(寫伺服器中介軟體,不重要的或者處理不了的請求直接返回回去,或者放佇列裡做快取),或者是非同步。 # mycat官網:http://www.mycat.org.cn/ ##右邊有下載地址,上邊有github地址 # mycat作用:支援多種資料庫,讀寫分離,自動故障切換(高可用),mysql主從.基於nio(Java)解決高併發問題(IO多路複用,非同步io目前還沒有成熟的解決方案)。支援跨庫分頁,聚合函式。。。mycat監控參考官網
mycat高可用方案
# 2 基於java開發,需要安裝jdk # 3 實現了 MySQL 公開的二進位制傳輸協議,巧妙地將自己偽裝成一個 MySQL Server,目前市面上絕大多數 MySQL 客戶端工具和應用都能相容 # 4 javase(基礎,io,網路,併發) javaee(web相關) javame # 5 需要有兩臺伺服器(docker模擬兩個mysql) ## 使用docker啟動多個數據庫 docker run -di --name=test1_mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 docker run -di --name=test2_mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# 分庫:mycat兩種方式都支援 垂直分庫:(使用者相關表,訂單相關表,支付相關表) 水平分庫 :(使用者表拆到了不同的庫中)
分庫垂直切分分庫水平切分
## mycat分片策略 如圖,一個庫有表A和表B,mycat把表根據分片規則(id和hash值)拆分成兩個節點,分別放在兩臺機器上
# 6 安裝mycat -1 安裝jdk8以上(必須1.8及以上版本) -2 下載,解壓即可(安裝完成,不需要編譯) # 此處從官網下載1.6.7.5版本 # 放到~路徑下,解壓出mycat資料夾 tar -xzf Mycat-server-1.6.7.5-release-20200410174409-linux.tar.gz -3 cd到bin路徑下,啟動 ./mycat start stop console(前臺執行,可以檢視日誌) # ./mycat start啟動mycat # 返回Starting Mycat-server... ,代表啟動了 # mycat的預設埠為8066 # ./mycat stop #停止mycat # ./mycat console #啟動,前臺一直hang著 可以看到日誌,報錯資訊 # 7 mycat安裝完,需要關注的幾個檔案 ##都在mycat/conf中 server.xml:綜合配置資料庫的相關資訊,埠,記憶體佔用,建立賬號,密碼 schema.xml:對資料庫表結構的定義#mycat連線後面的資料在,顯示出來表結構 rule.xml:指定相關演算法,來實現不同的分片資料庫#來定義按id分,還是hash分 ## 推薦使用Sublime Text編輯(啟用後,看是否有sftp功能。若無則設定channel_v3.json地址不翻牆,裝sftp外掛)。本地改完(edit編輯,Chmod改變許可權,ctrl+s自動儲存上去),遠端同步過去。比直接vim修改體驗好 ## server.xml大概配置講解,一般不需要動,除非加個使用者 具體看文件 106行 <user name="root" defaultAccount="true"> # 配置一個使用者(navicat連線使用) <property name="password">123456</property> # 配置密碼 <property name="schemas">TESTDB</property> # 資料庫 <property name="defaultSchema">TESTDB</property>#預設能看到的資料庫(Navicat連線就能看到的庫) 123行 <user name="user"> <property name="password">user</property> <property name="schemas">TESTDB</property> <property name="readOnly">true</property> # 只有讀的許可權 <property name="defaultSchema">TESTDB</property> </user> 44行 <!-- # 預設引數配置,想修改只要解開埠號修改即可 預設埠8066 <property name="serverPort">8066</property> <property name="managerPort">9066</property> <property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property> <property name="dataNodeIdleCheckPeriod">300000</property> 5 * 60 * 1000L; //連線空閒檢查 <property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> --> # 8 id分表規則配置 -shema.xml # schema name和server.xml中的<property name="schemas">TESTDB</property>名字對上 <schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="dn1"> # name指定表名,dataNode指定節點,rule指定分片規則(水平分表的規則),auto-sharding-long通過id來分片 ##————在mycat上的user表會分表,經測試沒配置的表不能在mycat上修改 <table name="user" primaryKey="id" dataNode="dn1,dn2" rule="auto-sharding-long" autoIncrement="true" fetchStoreNodeByJdbc="true"> </table> # 上面的dataNode="dn1,dn2" 跟這個地方對應,dataHost在下面配置,database資料庫名,name隨意(這裡的db1就要在對應的地址建db1庫) <dataNode name="dn1" dataHost="localhost1" database="db1" /> <dataNode name="dn2" dataHost="localhost2" database="db1" /> # 在這配置跟上面對應,主機的地址和埠,連線mysql服務端的使用者名稱和密碼 # maxCon最多連線數,minCon最小連線數,dbType資料庫型別 <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat># 用心跳監測是否還有連線,有響應說明還沒掛 <!-- can have multi write hosts --> # 地址為本地3306埠,本地跑不用改 <writeHost host="hostM1" url="jdbc:mysql://localhost:3306" user="root" password="123456"> </writeHost> <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> --> </dataHost> <dataHost name="localhost2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> <writeHost host="hostM1" url="jdbc:mysql://localhost:3307" user="root" password="123456"> </writeHost> <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> --> </dataHost> # 9 配置規則 auto-sharding-long---》rule.xml # shema.xml中設定分片規則在rule.xml中配的 <tableRule name="auto-sharding-long"> <rule> <columns>id</columns> <algorithm>rang-long</algorithm> </rule> </tableRule> # rang-long ##全文查詢rang-long,下面對應java的類,對應一個txt <function name="rang-long" class="io.mycat.route.function.AutoPartitionByLong"> <property name="mapFile">autopartition-long.txt</property> </function> # autopartition-long.txt ## 在conf資料夾中開啟autopartition-long.txt檔案,內容如下 # range start-end ,data node index # K=1000,M=10000. 0-500M=0 # id號為0---5000000的資料落在 0庫上 500M-1000M=1 # id號為5000000---10000000的資料落在 1庫上 意味著id最大1千萬,超了會報錯 # 10 啟動mycat cd bin/ ./mycat console啟動看看會不會報錯 # 11 遠端連線,需要在3306和3307庫上創建出db1資料庫(名字是shema.xml裡設的) # 12 遠端連線到mycat,建立表(配置過的表),插入資料,如果是不通範圍的id會落到不同庫上 ##通過Navicat在mycat庫中直接建user表,會報錯連線的庫裡沒表(沒事),兩個連結的庫會自動建立表(正常操作是三個庫都先建表。如果連線庫原本沒表,用mycat直接建表,所有連線庫表名都會大寫)
navicat連線mycat效果mycat插入資料
庫1user表庫2user表
## 通過hash方式實現水平分表 -只需要修改shema.xml(新增下表,sharding-by-murmur代表hash分表) #相當於再新增article表,按照sharding-by-murmur方法做,其他配置之前已經配好了(該配置規則不需要修改配置) <table name="article" primaryKey="id" dataNode="dn1,dn2" rule="sharding-by-murmur"> </table> -重啟mycat -在客戶端測試,建立article表。插入資料,會均勻的散落在兩個庫上
mycat表表1表2
# 原來由於我的設計,沒有考慮到分表的情況(單資料---》資料量越來越大,要分表了?) -起一個從庫,把原來的業務資料同步過來---》操作從庫---》通過mycat從庫分表--》再練mycat(缺一部分資料---》把這部分資料重放回來)