LVS+MYCAT讀寫分離+MYSQL同步部署+故障自動轉移
1 配置MYSQL主備同步
1.1 測試環境
mysql版本:5.6.24;
操作系統內核版本:Linux-3.13-0-32
主資料庫IP:192.168.10.3;
主資料庫名:db351353;
備用資料庫IP:192.168.10.4;
備用資料庫名:db351353。
1.2 配置主資料庫
1.2.1 編輯my.cnf文件
#伺服器唯一ID,一般取IP最後一段
server_id = 3
#啟用二進位日誌
log_bin=mysql_bin
#需要備份的資料庫名 多個庫以逗號分隔
Binlog_do_db =db351353
#若涉及及同步函數或者存儲過程需要配置,否則主備會產生異常不能同步
log_bin_trust_function_creators=TRUE
1.2.2 重啟資料庫
# service myql.server restart
1.3 鎖定主資料庫DDL操作
mysql> flush tables with read lock;
1.4 主備已有數據同步
用navicat for mysql將主資料庫數據同步到備資料庫
1.5 停止從服務
mysql>stop slave;
1.6 配置備用資料庫
1.6.1 編輯my.cnf文件
#伺服器唯一ID,一般取IP最後一段
server_id = 4
1.6.2登錄主資料庫查看master狀態
mysql>show master status;
1.6.3 執行change master to系列命令
mysql> change master to
master_host=』192.168.10.3′,
master_user=』iom』,–該用戶要有Repl_slave_priv許可權,沒有可用grant replication slave on *.* to 『iom』@』%』 identified by 『xf4851213』授權
master_password=』123』,
master_log_file=』mysql_bin.000005』, –根據主伺服器show master status出來的File結果填寫
master_log_pos=1192; –根據主伺服器show master status出來的Position結果填寫
1.7 重啟從服務
mysql>start slave;
1.8 解鎖主資料庫
mysql> unlock tables;
1.9 驗證主從同步
在備份資料庫上執行
mysql>show slave status;
slave_IO_running和slave_SQL_running 為yes。
主資料庫新建一個表,往表裡插入幾條數據,備份資料庫可以同步過來表和表中的數據。
2 配置MYSQL主主同步
2.1 測試環境
mysql版本:5.6.24;
操作系統內核版本:Linux-3.13-0-32
資料庫A IP:192.168.10.3;
資料庫B IP:192.168.10.4;
要同步的資料庫名:db351353;db352354
2.2 編輯配置文件
2.2.1 A機配置文件
# vi my.cnf
#伺服器唯一ID,一般取IP最後一段
server_id = 3
#啟用二進位日誌
log_bin=mysql_bin
#需要備份的資料庫名
binlog_do_db =db351353
binlog_do_db =db352354
binlog_ignore_db=mysql
#若涉及同步函數或者存儲過程需要配置,否則主備會產生異常不能同步
log_bin_trust_function_creators=TRUE
#同步參數:
#保證slave掛在任何一台master上都會接收到另一個master的寫入信息
log_slave_updates
sync_binlog=1
# auto_increment_offset表示自增長欄位從哪個數開始,兩主機應一個奇數一個偶數。
auto_increment_offset=1
#auto_increment_increment表示自增長欄位每次增長几位數,兩主機應該一模一樣
auto_increment_increment=2
#過濾掉一些沒啥大問題的錯誤
slave_skip_errors=all
#需要進行同步的資料庫.如果有多個資料庫可使用多個replicate_do_db選項
replicate_do_db = db351353
replicate_do_db = db352354
#不需要同步的資料庫.如果有多個資料庫可使用多個replicate_ignore_db選項
replicate_ignore_db = mysql
replicate_ignore_db = information_schema
2.2.2 B機配置文件
# vi my.cnf
server_id = 4
log_bin=mysql_bin
binlog_do_db = db351353
binlog_do_db = db352354
binlog_ignore_db=mysql
replicate_do_db = db351353
replicate_do_db = db352354
log_bin_trust_function_creators=TRUE
replicate_ignore_db = mysql
replicate_ignore_db = information_schema
log_slave_updates
sync_binlog=1
auto_increment_offset=2 –此處與另一台機子不同
auto_increment_increment=2
slave_skip_errors=all
2.2.3 配置好my.cnf後,重啟資料庫A和B。
mysql>service mysql.server restart
2.3 執行配置命令
2.3.1 設置同步帳戶
創建帳戶並賦權
A機執行:
mysql> grant replication slave on *.* to 『iomsync』@』192.168.10.4』 identified by 『123』;
B機執行:
mysql> grant replication slave on *.* to 『iomsync』@』192.168.10.3』 identified by 『123』;
2.3.2 鎖定資料庫,查看主機服務狀態
分別在A,B上執行:
mysql>flush tables with read lock;#防止進入新的數據
mysql>show master status;#查看主機服務狀態
2.3.3 同步已有數據
使用navicat的數據傳輸功能同步數據,把源和目標兩屬性填寫正確,左下角的資料庫對象選擇全選,點開始。
注意:同步時目標mysql必須先建好要同步的資料庫。
2.3.4 指定同步位置
master_log_file和master_log_pos 兩個參數根據2.4.2的show master status命令結果填寫,master_log_file對應File,master_log_pos對應Position。
A上執行:
mysql>change master to master_host=』192.168.10.4』,master_user=』iomsync』,master_password=』123』, master_log_file=』mysql_bin.000024』,master_log_pos=3946;–填B機上的show master status結果
B上執行:
mysql>change master to
master_host=』192.168.10.3』,master_user=』 iomsync』,master_password=』123』, master_log_file=』mysql_bin.000008′,master_log_pos=8538;– 填A機上的show master status結果
2.3.5 解鎖資料庫
在A,B上分別執行
mysql> unlock tables;
2.3.6 啟動從伺服器線程
在A,B上分別執行
mysql> start slave;
如果啟動報錯:Slave failed to initialize relay log info structure from the repository,可以先執行mysql> reset slave;指令,然後再執行2.4.3指令。
2.3.7 查看從服務狀態
在A,B上分別執行
mysql> show slave status;
結果集中Slave_IO_Running: Yes ,Slave_SQL_Running: Yes,就標識從服務啟動成功。
2.4 執行配置命令(故障重啟)
一般情況下,不論是mysql進程突然終止還是正常關閉,雙主機部署可以在重啟mysql後正常同步關機期間另一台主機上執行的寫操作。但某些情況例外,比如Linux主機非正常關閉。例如A,B兩台伺服器主主同步,A伺服器因掉電直接停機,A修復故障開機後,A機能正常同步B機的數據,但B機無法正常同步A機數據(B無法同步A對實際生產不會造成任何影響,因為此時客戶端寫操作都是在B上執行),A機上也沒有Binlog Dump線程(見2.6.1),此時在B機上重新執行slave指令即可。
重啟後的機子沒有Binlog Dump線程,在另一台機上執行
mysql>stop slave;
mysql>start slave;
2,重啟後的機子有Binlog Dump線程,不需做任何操作。
2.5 查看同步狀態
2.5.1 查看同步線程
在A,B上分別執行
mysql> show processlist;
這兩個是slave伺服器與master伺服器同步數據的線程,一個負責讀取master的 Binlog Dump 線程發送的語句,並且把它們拷貝到其數據目錄下的中繼日誌(relay logs)中,另一個負責讀取中繼日誌,然後執行它們來更新數據。time欄位顯示最近的一次跟新離語句執行時的間隔時間,默認單位是秒。
這個線程是master伺服器的Binlog Dump線程,負責給slave伺服器發送更新日誌。
2.5.2 強制數據同步
如果A機數據比B機新,要想讓B機完全同步A機,可按如下操作:
在A機上執行:
mysql> flush tables with read lock;
mysql> show master status
記錄下show語句輸出中的複製坐標的值。
在 B機上執行:(參數使用上一步獲得的值)
mysql> select master_pos_wait(『log_name』, log_pos)
這個select語句會保持運行,直到slave根據指定的日誌文件和位置完成和master的同步,然後該select語句返回。
在master執行:(解除更新限制)
mysql> unlock tables;
2.6 使用GTID同步
mysql在5.6版本後,加入了gtid同步功能,使用gtid同步,可以在執行change master to指令時不用手工指定master_log_file和master_log_pos,方便日常維護。
2.6.1 GTID配置步驟:
鎖定表,A,B兩機上執行(首次執行)
mysql>flush tables with read lock ;
A,B兩機上編輯my.cnf文件,在原有主主配置基礎上增加
gtid_mode=ON
enforce_gtid_consistency=ON
指定主庫
A機:
mysql>change master to master_host=』192.168.10.4′,master_port=3306,master_user=』iomsync』,master_password=』123′,master_auto_position=1;
— master_port參數不能加單引號,否則會報語法錯誤。
B機:
mysql>change master to master_host=』192.168.10.3′,master_port=3306,master_user=』iomsync』,master_password=』123′,master_auto_position=1;
開啟slave服務,A,B都執行
mysql>start slave;
查看同步狀態
mysql>show slave status;
如果Auto_Position欄位值為1,則已開啟gtid複製。
2.6.2 GTID同步問題
不能使用下列語句:
mysql> create table test as select * from so where 1=1;
1786 – CREATE TABLE … SELECT is forbidden when @@GLOBAL.ENFORCE_GTID_CONSISTENCY = 1;.
事務內部不能執行創建刪除臨時表語句,但可以在事務外執行,且必須設置set autocommit = 1;
在同一事務中更新事務表與非事務表將導致多個GTID分配給同一事務;
2.7 一些問題
使用replicate_do_db和replicate_ignore_db時有一個隱患,跨庫更新時會出錯,如B機設置 replicate_do_db=db351353,在A機執行use mysql; update db351353.so set ……,B機不會同步這條update語句。網上介紹replicate_wild_do_table=db351353.%可解決此問題,但我機子上測試沒解決。
MySQL官方文檔Reference Manual,版本6.10關於主主複製問題描述:MySQL複製當前不支持master和slave之間的任何鎖定協議來保證跨伺服器分發更新的原子性。(原子性:作為事務一部分的所有步驟或者都發生,或者都不發生。) 舉例來說,客戶端A在master1上作了一個更新,與此同時,在這個更新傳播到master2前,客戶端B在master2上也作了一個與客戶端A不同的更新,因此,當客戶端A的更新到達master2,它要處理的表數據將不同於在master1上的,master2上的更新傳播到master1上,也會面臨同樣的問題。這意味著,除非你確定你的更新與次序無關,或者在客戶端代碼中採取某些方法處理無序的更新,否則你不能把兩個伺服器連在一起做成雙向複製。
這就決定我們在配置mycat時需將客戶端的寫請求分發到同一個資料庫實例。
3 MYCAT安裝與配置
3.1 MYCAT安裝
解壓mycat壓縮包
#tar –xzvf Mycat-server-XXX-linux.tar.gz /usr/local/mycat
3.2 參數設置
重點介紹rule.xml schema.xml router.xml server.xml log4j.xml
3.2.1 rule.xml
分片規則配置文件,mycat支持的所有分片規則都在這個文件里。定義一個規則需要兩個節點,一個是tableRule,一個是function。
以一致性哈希分片為例,function節點定義了分片規則的實現類與初始化參數和分片規則的演算法名稱。
屬性name為規則演算法名稱
class為規則實現類
property子節點為初始化規則的參數,使用seed count virtualBucketTimes就可初始化一致性哈希規則
<function name=」murmur」 class=」org.opencloudb.route.function.PartitionByMurmurHash」>
<property name=」seed」>0</property><!– 默認是0–>
<property name=」count」>2</property><!– 要分片的資料庫節點數量,必須指定,否則沒法分片–>
<property name=」virtualBucketTimes」>160</property><!– 一個實際的資料庫節點被映射為這麼多虛擬節點,默認是160倍,也就是虛擬節點數是物理節點數的160倍–>
</function>
tableRule節點定義了分片規則名(注意此處是規則名,前面的function節點的name屬性是演算法名)rule子節點指定用來分片的資料庫表欄位和分片演算法名,也就是前面的function節點的name屬性。
<tableRule name=」sharding-by-murmur」>
<rule>
<columns>id</columns>
<algorithm>murmur</algorithm>
</rule>
</tableRule>
任何自定義的分片規則也可以這樣配置
3.2.2 server.xml
此文件用來配置mycat全局參數
<system>節點
<property name=」defaultSqlParser」>druidparser</property>,指定SQL解析器,默認是fdbparser,經測試druidparser效率更高
<property name=」sequnceHandlerType」>1</property>,指定mycat自動序列號生成方式。0:在藉助本地文件生成序列號,1:藉助資料庫生成序列號,更多信息請參考Mycat in action
<property name=」serverPort」>8066</property>指定mycat服務埠號,mycat通過這個埠接收資料庫客戶端的訪問請求。
另外還有一個9066埠沒有出現在配置文件中,用來接收mycat監控命令、查詢mycat運行狀況、重新載入配置文件等。更多信息請參考Mycat in action。
<user>節點
name屬性指定mycat用戶名
<property name=」password」>password</property><!—用戶密碼–>
<property name=」schema」>database_name</property><!—資料庫名,用客戶端建立連接後要操作的資料庫名 –>
<property name=」readOnly」>false</property><!—指定是不是只讀庫–>
可以有多個user節點。
3.2.3 router.xml
<queryRouter schema=」schema」><!—沒太搞清楚這個文件的意義,我把schema屬性、<name>、<queryNode>都配置成了一樣的,而且都與要連接的資料庫名保持一致 –>
<!—schema的值會在schema.xml用到 –>
<dataNode>
<name>dataNodeName</name>
<queryNode>queryNode</queryNode>
</dataNode>
</queryRouter>
3.2.4 schema.xml
<schema name=」TESTDB」 checkSQLschema=」true」 sqlMaxLimit=」100″>
其中checkSQLschema表明是否檢查並過濾SQL中包含schema的情況,如邏輯庫為 TESTDB,則可能寫為select * from TESTDB.aaa,此時會自動過濾TESTDB,SQL變為select * from aaa,若不會出現上述寫法,則可以關閉屬性為false
<schema name=」schema」><!—就是router.xml命名的schema–>
<table name=」table_name」 <!—要與它代理的資料庫物理表名一致–>
primaryKey=」pk」 <!—被用作主鍵的欄位名–>
dataNode=」dataNodeName」 <!—下面將會出現的dataNode節點–>
rule=」sharding-by-murmur」<!—rule.xml的tableRule節點name屬性值,指定這個節點表示用這個規則執行分片–>
authIncrement=」true」><!—插入數據時是否由mycat自動生成分片,指定true時,如果insert sql內沒有指定主鍵的值,而主鍵又是自增長的,mycat會自動插入生成主鍵的代碼,並在生成主鍵時按照指定的分片規則將數據保存到資料庫–>
<!—mycat有自己的自增序列命令,更多信息請參考Mycat in action–>
<!—此處可以指定多個table子節點,一個table節點表示一張表–>
</schema>
<dataNode name=」dataNodeName」 dataHost=」localhost「 database=」database」/>
<!—分別是節點名,就是schema節點裡的table子節點dataNode屬性
dataHost是節點主機名,在下面要出現的dataHost定義
database資料庫名
–>
<dataHost name=」localhost」 maxCon=」1000」 minCon=」10」 balance=」0」
writeType=」0」 dbType=」mysql」 dbDriver=」native>
<!—name屬性是dataHost名
maxCon minCon分別是連接到物理資料庫的最大最小連接數
balance 0表示不開啟讀寫分離,1 表示除主寫入節點外其它節點都參與讀操作,2表示所有節點都參與寫入操作
writetype 0表示當一個寫節點失效,會自動切換到另一個,1表示隨機分配寫節點,如果某個寫節點宕機,不影響服務,如果其恢復,會自動重新加入寫節點集群。
dbType指定資料庫類型
dbDriver只有兩個取值,分別是native和jdbc。native為mycat自帶驅動,只支持mysql,jdbc為使用jdbc實現連接資料庫,指定什麼資料庫的jdbc驅動就可以訪問什麼資料庫,更靈活,但效率不如native
可以有多個dataHost節點
–>
<heartbeat>select 1</heartbeat><!—保持連接不斷的心跳sql–>
<writeHost host=」hostM1」 url=」localhost:3306」 user=」user」 password=」password」>
<reeadHost host=」hostS1」 url=」localhost:3306″ user=」root」 password=」123456″/>
</writeHost>
<!—可以有多個writeHost,一個writeHost里可以有多個readHost–>
</dataHost>
3.3 啟動和使用MyCat
3.3.1 啟動MyCat
注意:一定要先啟動資料庫,再啟動mycat,否則mycat中配置的主從機順傳會混亂
# mycat console
3.3.2 訪問MyCat
訪問MyCat同訪問MySQL的方式完全相同, 常用訪問方式如下:
mysql –h 127.0.0.1 –u test –p test -P8066 –DTESTDB
3.3.3 自測
可以自己編寫一些語句進行測試,看是否按規則進行分配。
4 KEEPALIVED配置
編輯/etc/keepalived/keepalived.cnf文件,紅色字體是為mycat新加的
global_defs {
router_id LVS_MASTER #BACKUP上修改為LVS_BACKUP
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.252/24 #virtual server
192.168.10.253/24 #mycat
}
}
virtual_server 192.168.10.252 8080 {
delay_loop 6
lb_algo rr
lb_kind DR
#lb_kind NAT
# persistence_timeout 3
protocol TCP
real_server 192.168.10.3 8080 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 8080
}
}
real_server 192.168.10.4 8080 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 8080
}
}
}
virtual_server 192.168.10.253 8066 {
delay_loop 6
lb_algo rr
lb_kind DR
#lb_kind NAT
# persistence_timeout 3
protocol TCP
real_server 192.168.10.3 8066 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 8066
}
}
。
real_server 192.168.10.4 8066 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 8066
}
}
}
5 mycat伺服器執行腳本
lvs_mycat.sh腳本內容:
#!/bin/bash
VIP=192.168.10.253
case 「$1」 in
start)
ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
/sbin/route add -host $VIP dev lo:0
echo 「1」 >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo 「2」 >/proc/sys/net/ipv4/conf/lo/arp_announce
echo 「1」 >/proc/sys/net/ipv4/conf/all/arp_ignore
echo 「2」 >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null 2>&1
echo 「lvs_vip server start ok!」;;
stop)
ifconfig lo:0 down
/sbin/route del $VIP >/dev/null 2>&1
echo 「0」 >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo 「0」 >/proc/sys/net/ipv4/conf/lo/arp_announce
echo 「0」 >/proc/sys/net/ipv4/conf/all/arp_ignore
echo 「0」 >/proc/sys/net/ipv4/conf/all/arp_announce
echo 「lvs_vip server stoped.」;;
*)
echo 「arg start|stop.」
exit 1
esac
exit 0
在腳本所在目錄執行#./lvs_mycat.sh start;腳本主要作用是為伺服器的迴環介面設定虛擬IP,並屏蔽該IP的arp請求和應答。
6 總體測驗
6.1 網路架構圖
主mycat和mysql1在同一個伺服器上,IP為:192.168.10.3
從mycat和mysql2在同一個伺服器上,IP為:192.168.10.4
mysql1上創建兩個資料庫db351353(主),db352354(備),mysql2上創建兩個資料庫db352354(主),db351353(備);mysql2上db351353是mysql1上db351353的備用庫,mysql1上的db352354是mysql2上db352354的備用庫。
6.2 客戶機測試環境
安裝navicat for mysql,創建5個數據連接:
直連mysql1資料庫 連接名:mysql1 ip:168.10.3 埠:3306
直連mysql2資料庫 連接名:mysql2 ip:168.10.4 埠:3306
直連主mycat 連接名:mycat1 ip:168.10.3 埠:8066
直連從myca2 連接名:mycat2 ip:168.10.4 埠:8066
連接lvs 連接名:keepalived ip:168.10.253 埠:8066
6.3 MYSQL主備同步測試
在mysql1上的db351353 添加數據:
DROP TABLE IF EXISTS `so`;
CREATE TABLE `so` (
`so_nbr` int(8) NOT NULL DEFAULT 『0』,
`local_net_id` int(8) DEFAULT NULL,
`proc_inst_id` int(8) DEFAULT NULL,
`prod_id` varchar(8) DEFAULT NULL,
PRIMARY KEY (`so_nbr`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `so` VALUES (『1』, 『351』, null, null);
在mysql2上的db352354添加數據:
DROP TABLE IF EXISTS `so`;
CREATE TABLE `so` (
`so_nbr` int(8) NOT NULL DEFAULT 『0』,
`local_net_id` int(8) DEFAULT NULL,
`proc_inst_id` int(8) DEFAULT NULL,
`prod_id` varchar(8) DEFAULT NULL,
PRIMARY KEY (`so_nbr`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `so` VALUES (『2』, 『352』, null, null);
在各自的備份庫上能查到對應的數據,可參考1.9
6.4 MYSQL主主同步測試
在mysql1上的db351353 添加數據:
DROP TABLE IF EXISTS `so`;
CREATE TABLE `so` (
`so_nbr` int(8) NOT NULL DEFAULT 『0』,
`local_net_id` int(8) DEFAULT NULL,
`proc_inst_id` int(8) DEFAULT NULL,
`prod_id` varchar(8) DEFAULT NULL,
PRIMARY KEY (`so_nbr`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `so` VALUES (『1』, 『351』, null, null);
在mysql2上的db352354添加數據:
DROP TABLE IF EXISTS `so`;
CREATE TABLE `so` (
`so_nbr` int(8) NOT NULL DEFAULT 『0』,
`local_net_id` int(8) DEFAULT NULL,
`proc_inst_id` int(8) DEFAULT NULL,
`prod_id` varchar(8) DEFAULT NULL,
PRIMARY KEY (`so_nbr`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `so` VALUES (『2』, 『352』, null, null);
查詢mysql2的db351353,看是否和mysql1的db351353一樣。
查詢mysql1的db352354,看是否和mysql2的db352354一樣。
6.5 MYCAT測試
6.5.1 配置mycat主從策略和分片策略
按so表本地網水平分片,351和353兩個地市的放到節點dn1,352和354兩個地市的放到節點dn2。
6.5.1.1 schema.xml內容:
紅色字體為注釋,實際文件里沒有,注意dn2節點的主從連接庫順序,按說明應該配在前面的寫入資料庫為主資料庫,後面的寫入資料庫為從資料庫,但dn2節點卻正好相反,原因待查。
<?xml version=」1.0″?>
<!DOCTYPE mycat:schema SYSTEM 「schema.dtd」>
<mycat:schema xmlns:mycat=」http://org.opencloudb/」>
<schema name=」TESTDB」 checkSQLschema=」false」 sqlMaxLimit=」100″>
<table name=」prod」 primaryKey=」prod_id」 type=」global」 dataNode=」dn1,dn2″ />
<table name=」so」 primaryKey=」so_nbr」 dataNode=」dn1,dn2″
rule=」sharding-by-intfile」>
</table>
</schema>
<dataNode name=」dn1″ dataHost=」hostdn1″ database=」db351353″ />
<dataNode name=」dn2″ dataHost=」hostdn2″ database=」db352354″ />
<dataHost name=」hostdn1″ maxCon=」1000″ minCon=」10″ balance=」1″
writeType=」0″ dbType=」mysql」 dbDriver=」native」>
<heartbeat>select user()</heartbeat>
<!– can have multi write hosts –>
<writeHost host=」hostM1″ url=」192.168.10.3:3306″ user=」iom」–dn1節點主連接庫
password=」123″>
<!– <readHost host=」hostS1″ url=」192.168.10.4:3306″ user=」iom」 password=」123″ /> –>
</writeHost>
<writeHost host=」hostM2″ url=」192.168.10.4:3306″ user=」iom」–dn1節點從連接庫
password=」123″/>
</dataHost>
<dataHost name=」hostdn2″ maxCon=」1000″ minCon=」10″ balance=」1″
writeType=」0″ dbType=」mysql」 dbDriver=」native」>
<heartbeat>select user()</heartbeat>
<writeHost host=」host2M1″ url=」192.168.10.4:3306″ user=」iom」 –dn2節點主連接庫
password=」xf4851213″>
<!– <readHost host=」hostS1″ url=」192.168.0.3:3306″ user=」iom」 password=」123″ />–>
</writeHost>
<writeHost host=」host2M2″ url=」192.168.10.4:3306″ user=」iom」–dn2節點從連接庫
password=」123″/>
</dataHost>
</mycat:schema>
6.5.1.2 rule.xml內容
紅色字體為注釋,實際文件里沒有。
<?xml version=」1.0″ encoding=」UTF-8″?>
<!–
–
– Licensed under the Apache License, Version 2.0 (the 「License」);
– you may not use this file except in compliance with the License.
– You may obtain a copy of the License at
–
– http://www.apache.org/licenses/LICENSE-2.0
–
– Unless required by applicable law or agreed to in writing, software
– distributed under the License is distributed on an 「AS IS」 BASIS,
– WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
– See the License for the specific language governing permissions and
– limitations under the License.
–>
<!DOCTYPE mycat:rule SYSTEM 「rule.dtd」>
<mycat:rule xmlns:mycat=」http://org.opencloudb/」>
<tableRule name=」rule1″>
<rule>
<columns>id</columns>
<algorithm>func1</algorithm>
</rule>
</tableRule>
<tableRule name=」rule2″>
<rule>
<columns>user_id</columns>
<algorithm>func1</algorithm>
</rule>
</tableRule>
<tableRule name=」sharding-by-intfile」>
<rule>
<columns>local_net_id</columns> –按本地網分片
<algorithm>hash-int</algorithm>
</rule>
</tableRule>
<tableRule name=」auto-sharding-long」>
<rule>
<columns>id</columns>
<algorithm>rang-long</algorithm>
</rule>
</tableRule>
<tableRule name=」mod-long」>
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<tableRule name=」sharding-by-murmur」>
<rule>
<columns>id</columns>
<algorithm>murmur</algorithm>
</rule>
</tableRule>
<function name=」murmur」 class=」org.opencloudb.route.function.PartitionByMurmurHash」>
<property name=」seed」>0</property><!– 默認是0–>
<property name=」count」>2</property><!– 要分片的資料庫節點數量,必須指定,否則沒法分片–>
<property name=」virtualBucketTimes」>160</property><!– 一個實際的資料庫節點被映射為這麼多虛擬節點,默認是160倍,也就是虛擬節點數是物理節點數的160倍–>
<!–
<property name=」weightMapFile」>weightMapFile</property>
節點的權重,沒有指定權重的節點默認是1。以properties文件的格式填寫,以從0開始到count-1的整數值也就是節點索引為key,以節點權重值為值。所有權重值必須是正整數,否則以1代替 –>
<!–
<property name=」bucketMapPath」>/etc/mycat/bucketMapPath</property>
用於測試時觀察各物理節點與虛擬節點的分布情況,如果指定了這個屬性,會把虛擬節點的murmur hash值與物理節點的映射按行輸出到這個文件,沒有默認值,如果不指定,就不會輸出任何東西 –>
</function>
<function name=」hash-int」 class=」org.opencloudb.route.function.PartitionByFileMap」>
<property name=」mapFile」>partition-hash-int.txt</property>
</function>
<function name=」rang-long」 class=」org.opencloudb.route.function.AutoPartitionByLong」>
<property name=」mapFile」>autopartition-long.txt</property>
</function>
<function name=」mod-long」 class=」org.opencloudb.route.function.PartitionByMod」>
<!– how many data nodes –>
<property name=」count」>3</property>
</function>
<function name=」func1″ class=」org.opencloudb.route.function.PartitionByLong」>
<property name=」partitionCount」>8</property>
<property name=」partitionLength」>128</property>
</function>
</mycat:rule>
6.5.1.3 partition-hash-int內容:
紅色字體為注釋,實際文件里沒有。
351=0 –分配到dn1節點
352=1 –分配到dn2節點
353=0
354=1
6.5.2 測試mycat連接
客戶機navicat打開mycat1連接,能看到一個資料庫TESTDB,資料庫中能查到db351353和db352354兩個資料庫的所有數據。mycat2連接亦同。
6.5.3 測試mycat讀寫分離
測試目的:由4.4.1.1可知,dn1連接的主資料庫是mysql1的db351353,從資料庫是mysql2的db351353,balance值為1,此模式下從資料庫也為讀資料庫。mycat增刪改操作應通過mysql1的db351353進行,讀操作應通過mysql2的db351353進行。
測試方法:客戶機通過navicat的mysql2連接更改db351353的so表記錄,這樣db351353在mysql1和mysql2上有兩份不同的數據,在客戶機navicat的mycat1連接上查看so表本地網為351的數據是否與mysql2相同,如相同則測試通過。測試過後要恢復mysql2上db351353的數據,以免影響剩餘的測試。
6.5.4 測試mycat數據節點容錯
測試目的:由4.4.1.1可知,dn1連接的主資料庫是mysql1的db351353,從資料庫是mysql2的db351353,如果mysql1服務掛掉,dn1節點的增刪改操作應自動切換到mysql2的db351353。
測試方法:在mysql1主機上執行 #service mysql.server stop; 在客戶機navicat的mycat1連接上看是否能正常查詢so表數據,如果查詢正常,修改so表本地網為351的數據,在客戶機navicat的mysql2連接上查看db351353的so表數據是否和修改的一樣,如果一樣則測試通過。
注意:如果mysql1服務重新啟動,則mysql1的db351353為從資料庫,不會重新變為主資料庫。
6.5.5 測試mycat節點容錯
測試目的:mycat1和mycat2單個節點宕掉,不影響客戶機使用資料庫。
測試方法:客戶機navicat使用keepalived連接,能正常查詢和增刪改數據。在mycat1上執行#mycat stop;客戶機keepalived連接仍能正常使用。mycat1上執行#mycat console,mycat2上執行#mycat stop,客戶機keepalived連接能正常使用。mycat2上執行#mycat console,客戶機keepalived連接能正常使用,且數據請求路由和keepalived所配lb_algo策略相同。
※powerdesigner16鏈接mysql5
※whose view is not in the window hierarchy的解決辦法
TAG:程序員小新人學習 |