Mycat節點擴縮容及高可用集群方案


數據遷移與擴容實踐: 

   工具目前從 mycat1.6,准備工作:1、mycat 所在環境安裝 mysql 客戶端程序。 2、mycat 的 lib 目錄下添加 mysql 的 jdbc 驅動包。 3、對擴容縮容的表所有節點數據進行備份,以便遷移失敗后的數據恢復。

  步驟:

1、復制 schema.xml、rule.xml 並重命名為 newSchema.xml、newRule.xml 放於 conf 目錄下。

2、修改 newSchema.xml 和 newRule.xml 配置文件為擴容縮容后的 mycat 配置參數(表的節點數、 數據源、路由規則)。由於我原先只有138,139兩個節點,現在選擇進行擴容,以一個節點為例。我們先修改 rule.xml,將原先的取模算法中對 2 取模改成對 3 取模,接下去我新增的節點在另外的主機上。所以在 newSchema.xml上加入以下信息:

<dataNode name="db_user_dataNode3" dataHost="db_userHOST3" database="db_user" />
<dataHost name="db_userHOST3" maxCon="1000" minCon="10" balance="0"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="userHost3" url="192.168.254.137:3306" user="root"  password="wuzhenzhao">
        </writeHost>
</dataHost>

  加完以后,在對應分區的 schema 標簽中將原先的 dataNode="db_user_dataNode$1-2" 修改為 dataNode="db_user_dataNode$1-3"。

3、修改 conf 目錄下的 migrateTables.properties 配置文件,告訴工具哪些表需要進行擴容或縮 容,沒有出現在此配置文件的 schema 表不會進行數據遷移,格式: 

4、修改 bin 目錄下的 dataMigrate.sh 腳本文件,參數如下:

tempFileDir 臨時文件路徑,目錄不存在將自動創建
isAwaysUseMaster 默認 true:不論是否發生主備切換,都使用主數據源數據,false:使用當前數據源
mysqlBin:mysql bin 路徑
cmdLength mysqldump 命令行長度限制 默認 110k 110*1024。在 LINUX 操作系統有限制單條命令行的長度是 128KB,也就是
131072 字節,這個值可能不同操作系統不同內核都不一樣,如果執行遷移時報 Cannot run program "sh": error=7, Argument list too long
說明這個值設置大了,需要調小此值。
charset 導入導出數據所用字符集 默認 utf8
deleteTempFileDir 完成擴容縮容后是否刪除臨時文件 默認為 true threadCount 並行線程數(涉及生成中間文件和導入導出數據)默認為遷移程序所在主機環境的 cpu 核數*2
delThreadCount 每個數據庫主機上清理冗余數據的並發線程數,默認為當前腳本程序所在主機 cpu 核數/2
queryPageSize 讀取遷移節點全部數據時一次加載的數據量 默認 10w 條

5、停止 mycat 服務(如果可以確保擴容縮容過程中不會有寫操作,也可以不停止 mycat 服 務)。

6、通過 crt 等工具進入 mycat 根目錄,執行 bin/ dataMigrate.sh 腳本,開始擴容/縮容過程:

7、擴容縮容成功后,將 newSchema.xml 和 newRule.xml 重命名為 schema.xml 和 rule.xml 並替 換掉原文件,重啟 mycat 服務,整個擴容縮容過程完成。

  以下就是我遷移過后的數據信息。符合我們的預期:

 注意事項:

  1) 保證拆分表遷移數據前后路由規則一致。

  2) 保證拆分表遷移數據前后拆分字段一致。

  3) 全局表將被忽略。

  4) 不要將非拆分表配置到 migrateTables.properties 文件中。

  5) 暫時只支持拆分表使用 mysql 作為數據源的擴容縮容。

優化 :

  dataMigrate.sh 腳本中影響數據遷移速度的有 4 個參數,正式遷移數據前可以先進行一次測 試,通過調整以下參數進行優化獲得一個最快的參數組合。

  threadCount 腳本執行所在主機的並行線程數(涉及生成中間文件和導入導出數據)默認為遷移程序所在主機環境的 cpu 核數*2 。

  delThreadCount 每個數據庫主機上清理冗余數據的並發線程數,默認為當前腳本程序所在主機 cpu 核數/2,同一主機上並發刪 除數據操作線程數過多可能會導致性能嚴重下降,可以逐步提高並發數,獲取執行最快的線程個數。

  queryPageSize 讀取遷移節點全部數據時一次加載的數據量 默認 10w 條 。

  cmdLength mysqldump 命令行長度限制 默認 110k 110*1024。盡量讓這個值跟操作系統命令長度最大值一致,可以通過以下過程 確定操作系統命令行最大長度限制:

  逐步減少 100000,直到不再報錯 /bin/sh -c "/bin/true $(seq 1 100000)" 獲取不報錯的值,通過 wc –c 統計字節數,結果即操作系統命令行最大長度限制(可能稍微小一些)。

Mycat 里的數據庫事務:

  Mycat 目前沒有出來跨分片的事務強一致性支持,目前單庫內部可以保證事務的完整性,如果跨庫事務, 在執行的時候任何分片出錯,可以保證所有分片回滾,但是一旦應用發起 commit 指令,無法保證所有分片都成 功,考慮到某個分片掛的可能性不大所以稱為弱 xa。

Mycat之mysqldump方式進行快速移植:

  如果將現有的數據快速整合到 mycat 中?將老庫備份成 sql 文件,再到mycat 中一執行就完事。前提要保證mycat分片規則等都運行正常。 

  mysqldump方式:
  1.導出數據:
    mysqldump -uroot -p123456 -h192.168.8.137 -c db_user_old users > users.sql
  2.ER子表:
    mysqldump -uroot -p123456 -h192.168.8.137 -c --skip-extended-insert db_user_old user_address > userAddress.sql
  3.導入:
    mysql -h192.168.8.151 -uroot -p123456 -P8066  -f db_user < users.sql
    mysql -h192.168.8.151 -uroot -p123456 -P8066  -f db_user < userAddress.sql

Mycat 高可用方案:

  單節點 mycat 的部署指的是只部署一台 mycat 服務器,它與 mycat 集群部署是相對的,如果這台 mycat 服 務器宕機了,mycat 就不可用了。高可用通常也叫 HA(High Available)。指的是,一台服務器宕機了,照樣能對外提供服務。常用的高可用 軟件方案有:LVS、keepalived、Heartbeat、roseHA(roseHA 為收費軟件)等。 Mycat 本身是無狀態的,可以用 HAProxy 或四層交換機等設備組成 Mycat 的高可用集群,后端 MySQL 則 配置為主從同步,此時整個系統就是高可用的,下圖是一個典型的 Mycat 系統高可用的方案:

haproxy + keepalived + mycat 高可用與負載均衡集群配置:

集群部署圖的理解:

  1、keepalived 和 haproxy 必須裝在同一台機器上(如 192.168.254.138 機器上,keepalived 和 haproxy 都要安裝),keepalived 負責為該服務器搶占 vip(虛擬 ip),搶占到 vip 后,對該主機的訪問可以通 過原來的 ip(192.168.254.138)訪問,也可以直接通過 設置好的 vip(例如:192.168.254.233)訪問。

  2、192.168.254.139 上的 keepalived 也會去搶占 vip,搶占 vip 時有優先級,配置 keepalived.conf 中的 (priority 150 #數值愈大,優先級越高,192.168.254.139 上改為 120,master 和 slave 上該值配置不同)決 定。 但是一般哪台主機上的 keepalived 服務先啟動就會搶占到 vip,即使是 slave,只要先啟動也能搶到。

  3、haproxy 負責將對 vip 的請求分發到 mycat 上。起到負載均衡的作用,同時 haproxy 也能檢測到 mycat 是否存活,haproxy 只會將請求轉發到存活的 mycat 上。

  4、如果一台服務器(keepalived+haproxy 服務器)宕機,另外一台上的 keepalived 會立刻搶占 vip 並接 管服務。 如果一台 mycat 服務器宕機,haporxy 轉發時不會轉發到宕機的 mycat 上,所以 mycat 依然可用。

haproxy 安裝:

1.下載tar.gz包  http://www.haproxy.org/download/1.8/src/haproxy-1.8.12.tar.gz 。

2.解壓並安裝haproxy

  解壓

  tar -zxvf haproxy-1.8.12.tar.gz

  安裝

  cd haproxy-1.8.12  

  將haproxy應用程序安裝在/usr/local/haproxy 下

  make TARGET=linux26 PREFIX=/usr/local/haproxy ARCH=x86_64  (TARGET=linux26 內核版本使用uname -r查看內核,如:2.6.18-371.el5,此時該參數就為linux26;kernel 大於2.6.28的用:TARGET=linux2628,ARCH=x86_64#系統位數)

  make install PREFIX=/usr/local/haproxy

3.編輯配置文件 vim  /usr/local/haproxy/haproxy.cfg 並賦予執行權限chmod +x /usr/local/haproxy/haproxy.cfg 

global
    log         127.0.0.1 local2
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    daemon
defaults
    log global
    option dontlognull
    retries 3
    option redispatch
    maxconn 2000
    timeout connect 5000
    timeout client 50000
    timeout server 50000

listen admin_status
    bind 0.0.0.0:1080 
    stats uri /admin ##haproxy自帶的管理頁面通過http://ip:port/admin訪問
    stats auth admin:admin  ##管理頁面的用戶名和密碼
    mode http
    option httplog

listen allmycat_service
    bind 0.0.0.0:8096 ##轉發到 mycat 的 8066 端口,即 mycat 的服務端口
    mode tcp
    option tcplog
    option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www
    balance roundrobin #負載均衡算法規則                      
    server mycat_138 192.168.254.138:8066 check port 48700 inter 5s rise 2 fall 3
    server mycat_139 192.168.254.139:8066 check port 48700 inter 5s rise 2 fall 3
    timeout server 20000

listen allmycat_admin
    bind 0.0.0.0:8097 ##轉發到 mycat 的 9066 端口,即 mycat 的管理控制台端口
    mode tcp
    option tcplog
    option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www
    balance roundrobin                            
    server mycat_138 192.168.254.138:9066 check port 48700 inter 5s rise 2 fall 3
    server mycat_139 192.168.254.139:9066 check port 48700 inter 5s rise 2 fall 3
            timeout server 20000

4.haproxy 記錄日志:

  默認 haproxy 是不記錄日志的,為了記錄日志還需要配置 syslog 模塊,在 linux 下是 rsyslogd 服務,可通過rpm -qa|grep rsyslog 命令判斷有沒有安裝,沒有安裝自行安裝(yum 方式簡單明了)先安裝 rsyslog。

  yum –y install rsyslog  

  find / -name 'rsyslog.conf' 找到rsyslog的配置文件

  vi rsyslog.conf

  將#$ModLoad imudp   

    #$UDPServerRun 514  注釋解開

  找到 Save boot messages also to boot.log 在這一行下面加入

  local2.*  /var/log/haproxy.log 保存退出

  重啟rsyslog    service rsyslog restart

5.啟動haproxy   /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg

此時出現:

  proxy allmycat_service has no server available!

  proxy allmycat_admin has no server available!

  因為他的check方案沒有通過

  option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www

  check port 48700 inter 5s rise 2 fall 3

  上面的配置的意思是,通過http檢測的方式進行服務的檢測,5s檢測一次。2次通過證明存活,3次失敗則死亡。為此需要用到 xinetd,xinetd 為 linux 系統的基礎服務。

  通過Xinetd 提供48700端口的http服務來讓haproxy進行服務的檢測。在mycat的服務器上安裝xinetd,查看是否安裝:rpm -q xinetd。安裝命令:yum install xinetd

  找到xinetd的配置文件 cat /etc/xinetd.conf 找到 includedir /etc/xinetd.d  進入該目錄cd /etc/xinetd.d  並新建 mycat_status  shell腳本,vim mycat_status內容如下:

service mycat_status {  #代表被托管服務的名稱
 flags = REUSE
 socket_type = stream  # socket連接方式
 port = 48700  # 服務監聽的端口
 wait = no  # 是否並發
 user = root  # 以什么用戶進行啟動
 server =/usr/local/bin/mycat_status  # 被托管服務的啟動腳本
 log_on_failure += USERID  # 設置失敗時,UID添加到系統登記表
 disable = no         #是否禁用托管服務,no表示開啟托管服務
} #最好手打,復制會出問題。我就遇到了這個問題
service mycat_status
{
        flags = REUSE
        socket_type = stream
        port = 48700
        wait = no
        user = root
        server =/usr/local/bin/mycat_status
        log_on_failure += USERID
        disable = no
}

  保存退出。並賦予執行權限chmod +x mycat_status

  創建托管服務啟動腳本/usr/local/bin/mycat_status 。編輯 :vim /usr/local/bin/mycat_status 內容如下:

#!/bin/bash
mycat=`/root/mycat/bin/mycat status |grep 'not running'| wc -l` if [ "$mycat" = "0" ]; then /bin/echo -e "HTTP/1.1 200 OK\r\n" else /bin/echo -e "HTTP/1.1 503 Service Unavailable\r\n" fi

  保存退出 並賦予執行權限chmod +x /usr/local/bin/mycat_status。驗證腳本的正確性 sh mycat_status 如果返回 200OK字樣說明成功:

  加入mycat_status服務 vi /etc/services。在末尾加入以下內容:

   mycat_status 48700/tcp # mycat_status 。保存退出,重啟xinetd服務,  service xinetd restart 。驗證服務是否啟動成功 :netstat -antup|grep 48700,如果出現 tcp6 請先關閉 ivp6

  再調用 telnet 192.168.254.13 48700 出現下圖說明一切OK了

  此時重啟haproxy服務即正常。

  然后測試連接數據庫:

  由於根據 haproxy 做了mycat 的請求分發,也就是mycat的高可用,但是對於整個架構來說,此刻 haproxy是單節點狀態。再根據前文說的高可用與負載均衡集群配置,這里需要引入keepalive(官方推薦)。這樣子的話,我們需要在 192.168.254.138與139 上面都配置上 haproxy 跟keepalive。

keepalive:

  keepalive安裝  (192.168.254.138 -> MASTER   192.168.254.139 -> BACKUP

  安裝:yum install  keepalived

  find / -name 'keepalived.conf'。修改配置文件:vi /etc/keepalived/keepalived.conf 內容如下:

! Configuration File for keepalived
vrrp_instance VI_1 {
    state MASTER            #192.168.254.139 上改為 BACKUP
    interface ens33         #對外提供服務的網絡接口
    virtual_router_id 100   #VRRP 組名,兩個節點的設置必須一樣,以指明各個節點屬於同一 VRRP 組
    priority 150            #數值愈大,優先級越高,192.168.254.139 上改為比150小的正整數
    advert_int 1            #同步通知間隔
    authentication {        #包含驗證類型和驗證密碼。類型主要有 PASS、AH 兩種,通常使用的類型為 PASS,據說AH 使用時有問題
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress { #vip 地址    ens33  通過ifconfig獲取
        192.168.254.233 dev ens33 scope global
    }
}

  編輯保存啟動keepalived,執行命令 service keepalived start

   我通過 Navicat 訪問192.168.254.233, 端口8096,賬號 root,密碼 123456.即訪問搶占了vip192.168.254.233)的物理機(192.168.254.138)。

通過上面的配置,我們可以將前端的請求轉到搶占了vip192.168.8.233)的物理機(192.168.254.138)。但是沒有通過監聽haproxy的服務,或者說我們沒有根據haproxy服務來進行vip的降級。keepalived提供了很多的配置來做服務的檢測和降級,但是我們今天不學keepalived的方式我們采用一種定時任務(linux自帶的crontab)的方式來做。在nginx學習的時候會采用keepalive腳本方式。

  1.創建check_haproxy.sh 並編輯內容  vi /root/script/check_haproxy.sh 內容如下:

#!/bin/bash
LOGFILE='/root/log/checkHaproxy.log'
date >> $LOGFILE
count=`ps aux | grep -v grep | grep /usr/local/haproxy/sbin/haproxy | wc -l`
if [ $count = 0 ];
then
echo 'first check fail , restart haproxy !' >> $LOGFILE
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg
else
exit 0
fi
 
sleep 3
count=`ps aux | grep -v grep | grep /usr/local/haproxy/sbin/haproxy | wc -l` if [ $count = 0 ]; then echo 'second check fail , stop keepalive service !' >> $LOGFILE service keepalived stop else echo 'second check success , start keepalive service !' >> $LOGFILE keepalived=` ps aux | grep -v grep | grep /usr/sbin/keepalived | wc -l` if [ $count = 0 ]; then service keepalived start fi exit 0 fi

  2.執行 crontab -e 編輯定時任務 每一分鍾檢測haproxy服務存活,如果服務啟動不了,停掉keepalived服務, vip即轉發至backup192.168.254.139 的機器  .* * * * * sh /root/script/check_haproxy.sh。保存即執行,如果想實10分鍾檢測,那么久寫6個 * * * * * sleep 1;sh /root/script/check_haproxy.sh。后面分別是11,21.。實現秒寫60個。以此類推。高可用方案完畢。

總結:

*  單表數據達到多少的時候會影響數據庫的查詢性能?為什么?

  由於查詢性能關乎多方因素,sql語句,硬件資源等,只能大概的根據工作經驗評估。在單表數量不是特別大,字段不是特別多的情況下,基本撐個8000萬-1億的數據量。查詢維度比較單一,索引建立得當。單表數據達為什么會影響數據庫性能呢? 是因為索引命中問題,索引如果命中不了,就會導致全表掃描。一旦全表掃描勢必導致性能問題,而數據庫 B樹的索引原理不是內存級別的索引,而是基於硬盤級別的。他需要通過IO去加載索引,查找索引要從根節點去找到葉節點,當這棵樹越來越大的時候就會導致IO讀寫的頻繁。而加載索引也是一部分一部分去加載處理的,當數據體量達到一定數值,則IO讀寫性能會成倍往下降。
*  主從復制機制的原理概述是怎樣的?常見的存在形式有哪些?

  1.  master將操作記錄到二進制日志(binary log)中(這些記錄叫做二進制日志事件,binary logevents)
  2. Slave通過I/O Thread異步將master的binary logevents拷貝到它的中繼日志(relay log);
  3. Slave執行relay日志中的事件,匹配自己的配置將需要執行的數據,在slave服務上執行一遍從而達到復制數據的目的。

 

基於 SQL 語句的復制(statement-based replication, SBR);
基於行的復制(row-based replication, RBR(binlog));
混合模式復制(mixed-based replication, MBR);
基於 SQL 語句的方式最古老的方式,也是目前默認的復制方式,后來的兩種是 MySQL 5 以后才出現的復制方式。

*  分庫分表中解釋一下垂直和水平2種不同的拆分?

  垂直拆分是根據業務的角度去進行拆分,根據不同的業務領域的粘合度去拆分成新的小庫,比如用戶,訂單,庫存,類似如此的。

  水平拆分主要是解決一張表的大數據量拆分成多個小表。

*  分庫分表中垂直分庫方案會帶來哪些問題?

  分布式事務以及系統的復雜度等相關問題。

*  分布式數據存儲中間件如mycat的核心流程是什么?

  解析sql--數據源管理--數據源分配--請求響應---結果整合

*  概述一下mycat?

  1. 一個徹底開源的,基於Cobar的,面向企業應用開發的大數據庫集群
  2. 支持事務、ACID、可以替代MySQL的加強版數據庫
  3. 一個可以視為MySQL集群的企業級數據庫,用來替代昂貴的Oracle集群
  4. 一個融合內存緩存技術、NoSQL技術、HDFS大數據的新型SQL Server
  5. 結合傳統數據庫和新型分布式數據倉庫的新一代企業級數據庫產品
  6. 一個新穎的數據庫中間件產品

*  解釋一下全局表,ER表,分片表?

分片表 :

  是指那些原有的很大數據的表,需要切分到多個數據庫的表,這樣,每個分片都有一部分數據,所 有分片構成了完整的數據。 例如在 mycat 配置中的 t_node 就屬於分片表,數據按照規則被分到 dn1,dn2 兩個分片節點(dataNode) 上。

ER 表 :

  關系型數據庫是基於實體關系模型(Entity-Relationship Model)之上,通過其描述了真實世界中事物與關 系,Mycat 中的 ER 表即是來源於此。根據這一思路,提出了基於 E-R 關系的數據分片策略,子表的記錄與所關 聯的父表記錄存放在同一個數據分片上,即子表依賴於父表,通過表分組(Table Group)保證數據 Join 不會跨 庫操作。 表分組(Table Group)是解決跨分片數據 join 的一種很好的思路,也是數據切分規划的重要一條規則。 如用戶的地址表,用戶表對應的用戶可能有多個地址,在進行分片后所對應的地址表也應該放入相同分區。

全局表 :

  一個真實的業務系統中,往往存在大量的類似字典表的表,這些表基本上很少變動,字典表具有以下幾個特 性: • 變動不頻繁; • 數據量總體變化不大; • 數據規模不大,很少有超過數十萬條記錄。 對於這類的表,在分片的情況下,當業務表因為規模而進行分片以后,業務表與這些附屬的字典表之間的關 聯,就成了比較棘手的問題,所以 Mycat 中通過數據冗余來解決這類表的 join,即所有的分片都有一份數據的拷 貝,所有將字典表或者符合字典表特性的一些表定義為全局表。 數據冗余是解決跨分片數據 join 的一種很好的思路,也是數據切分規划的另外一條重要規則。

*  Mycat的在分庫分表之后,它是怎么支持聯表查詢的?

  全局表與er表從存在就是為了解決聯表查詢問題的。mycat注解 /*!mycat:catlet=io.mycat.catlets.ShareJoin */

*  進行庫表拆分時,拆分規則怎么取舍? 

  數據特點:活躍的數據熱度較高規模可以預期,增長量比較穩定,首選 固定數量的離散分片規

  數據特點:活躍的數據為歷史數據,熱度要求不高。規模可以預期,增長量比較穩定. 優勢可定時清理或者遷移,連續分規則優先。

*  Mycat中全局ID方案有哪些?程序自定義全局ID的方案有哪些?

  1. sequnceHandlerType =0 為本地文件方式,服務不能重啟,一重啟就會回到初始值。
  2. 1 為數據庫方式,模擬oracle的方式,采用函數方式。
  3. 2 為時間戳序列方式,采用64位二進制的方式
  4. 3 為分布式 ZK ID 生成器,
  5. 4 為 zk 遞增 id 生成。
  6. 程序方式:snowflake,UUID,redis 等方案。

*  簡述一下一致性hash的原理?這樣設計的好處是什么?

  一致性hash,把整個數據及節點看成一個環。0-2^32 的一個環,每一個節點先落到的這個環上的一個點,移植性高

*  4層負載和7層負載誰性能更高?為什么?這2者區別是什么?

  所謂四層負載均衡,也就是主要通過報文中的目標地址和端口,再加上負載均衡設備設置的服務器選擇方式,決定最終選擇的內部服務器。他不會與前端產生連接。

   所謂七層負載均衡,也稱為“內容交換”,也就是主要通過報文中的真正有意義的應用層內容,再加上負載均衡設備設置的服務器選擇方式,決定最終選擇的內部服務器。

  兩者可以看成是傳達室大爺和公司前台,一個只會告訴你找的人在哪你自己去,而一個會與你建立通訊並由他去傳達你需要傳送的信息,

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM