1. 程式人生 > 實用技巧 >Mysql2 分庫分表(mycat), centos7安裝jdk

Mysql2 分庫分表(mycat), centos7安裝jdk

0Centos7 安裝jdk1.8

一 下載linux版jdk

地址:https://www.oracle.com/java/technologies/oracle-java-archive-downloads.html

找到對應版本

下載:需要賬號(從網上找個別人的賬號或者註冊一個即可:賬號[email protected],密碼Oracle123)

二 解壓

# 建立目錄
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分庫分表方案

# 1  單表資料量到達千萬級  (分庫:一個庫有table1,table2表,另一個庫有table3,table4表)

# 2 分表方案
  -垂直分表:把原來一個大表,做成一對一關係
  
-水平分表:水平切,假設把2000萬的資料,分到兩個表中(按id分,按hash分)#可能會有熱點問題,活躍的使用者都在第一張表上,用hash分表會均勻的落在兩個表中 # 備註: # 先讀寫分離,再搭叢集(提高查詢效能),(單表資料量過了千萬級,若果是innodb資料引擎,查詢基本就廢了。即便做了叢集,也需要分表)再做分庫分表 # 大公司真正資料量大的東西(上億級)不會放在mysql中, 用es,hadoop,mongodb

2 分庫分表實戰

mycat原理圖

# 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(缺一部分資料---》把這部分資料重放回來)