MyCat-MySQL讀寫分離安裝配置(單例實驗篇)
前言
編寫日期:2020-06
操作系統信息:建議CenterOS 7.x(6.x很容易出現問題,而且自啓可能無法成功)
1.MyCat安裝
1.1 解壓安裝包
安裝包:Mycat-server-1.6.7.5-release-20200422133810-linux.tar.gz
安裝包下載路徑:https://github.com/MyCATApache/Mycat-Server/releases/tag/Mycat-server-1675-release
存放目錄:/root/Downloads
解壓到/usr/local目錄下(解壓後得到/usr/local/mycat):
# tar -zxvf Mycat-server-1.6.7.5-release-20200422133810-linux.tar.gz -C /usr/local/
檢查一下是否解壓成功
# cd /usr/local/mycat
1.2 添加用戶組
僅開發或實驗可跳過該步驟
# useradd mycat
# chown -R mycat.mycat /usr/local/mycat
改密碼
# passwd mycat
1.3 配置環境變量
修改配置文件
# vi /etc/profile
底部加入以下內容:
export MYCAT_HOME=/usr/local/mycat
刷新環境變量:
# source /etc/profile
1.4 配置主機名
# vi /etc/hosts
在清單中加入當前主機名,比如:hello
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 hello
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 hello
172.168.2.138 hello # 上面是本地,再加一個真實內網的ip
1.5 配置軟連接
# ln -s /usr/local/mycat/bin/mycat /etc/init.d/mycat
1.6 設置開機自啓
1.6.1 驗證服務命令是否正常
# service mycat start
1.6.2 設置開機自啓
# chkconfig --add mycat
1.6.3 驗證是否自啓(該步驟最好等到mycat和mysql連通後再進行)
# 先重啓
# reboot
# 重連後查看進程狀態
# service mycat status
# Mycat-server is running 表示自啓配置成功。
1.7 防火牆設置
修改iptables文件
# vi /etc/sysconfig/iptables
添加以下內容(mycat默認端口是8066)
iptables -t filter -I INPUT 5 -m state --state NEW -m tcp -p tcp --dport 8066 -j ACCEPT
讓配置生效
# service iptables save
如果沒有iptables就安裝一下,一般CenterOs7是用firewall,個人習慣iptables
# 停止firewall
# systemctl stop firewalld.service
# 禁止firewall開機啓動
# systemctl disable firewalld.service
# 安裝iptables
# yum install iptables-services
# 開機啓動
# systemctl enable iptables.service
2. MyCat配置
僅供參考,詳細配置解析見官網。
2.1 schema.xml
2.1.1 定義邏輯庫
<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">
<!-- 本手冊僅作讀寫分離,不含其他複雜邏輯,包括主鍵也沒有使用數據庫自增 -->
</schema>
2.1.2 定義數據節點
<dataNode name="dn1" dataHost="web" database="physicial_database_name" />
name
與中的dataNode
對應。- dataHost與下面的數據源名稱對應。
- database一般設置與物理數據庫名稱一致即可。
2.1.3 定義數據源
<dataHost name="web" maxCon="1050" minCon="100" balance="2"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="120">
<heartbeat>select 1</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="172.168.2.190:3306" user="root" password="123456">
<!-- can have multi read hosts -->
<readHost host="hostS2" url="172.168.2.191:3306" user="root" password="123456"/>
</writeHost>
</dataHost>
name
與數據節點的dataHost
對應。maxCon
表示最大連接數。minCon
表示最小活躍連接數,初始化連接池的大小。balance
表示read請求的負載均衡方式:- “0” 不開啓讀寫分離,所有請求發送到可用的主節點上;
- “1” 全部read節點與接收請求的主節點都參與select負載均衡(雙主雙從);
- “2” 所有讀請求隨機分發到所有節點上;
- “3” 所有讀請求隨機分發到write節點的read節點上,writer不負擔read壓力。
dbType
指定後端連接的數據庫類型:mysql、mongodb、oracle、spark等。writeType
寫操作負載均衡,只能寫"0",第一個主節點掛了自動切換到第二個,重啓後以最新的爲準。dbDriver
數據庫驅動,有JDBC
和native
兩種。switchType
主從切換方式:- “-1” 不自動切換;
- “1” 默認值,自動切換;
- “2” 基於mysql主從狀態決定是否切換,心跳語句爲 show slave status;
- “3” 基於於 MySQL galary cluster 的切換機制(適合集羣),心跳語句爲 show status like ‘wsrep%’。
<heartbeat>
利用sql語句進行心跳檢查;<writeHost>
主節點信息,從節點是在主節點下的;- 一個writeHost下可以定義多個readHost,但是如果writeHost宕機了,那麼writeHost和readHost都將不能使用,通過自動檢測,可以切換到備機上。
<readHost>
從節點,只讀。- 這裏補充一個
weight
屬性,僅配置在read節點,作爲讀節點的權重。
- 這裏補充一個
2.2 server.xml
2.2.1 系統參數配置
該配置文件裏已經有很多設好的屬性了,以下主要點出幾個比較重要的屬性,其他的不在此贅述。
fakeMySQLVersion
設置模擬的MySQL版本號,一般設置爲實驗用的MySQL版本;useZKSwitch
關閉zookeeper的協調切換(不作集羣沒必要用),值false。
2.2.2 定義訪問賬戶
<!-- 該標籤在</mycat:server>前,默認是在配置文件的最底部,多餘的user標籤刪掉 -->
<user name="user">
<property name="password">password</property>
<property name="schemas">TESTDB</property>
</user>
- 應用程序連接Mycat的配置:
- 用戶名爲
<user>
標籤中的name屬性值; - 密碼爲name="password"屬性標籤的內的值;
- 數據庫名爲name="schemas"屬性標籤內的值;該標籤對應的是schema.xml中
<schema>
標籤所定義的name屬性值。
- 用戶名爲
3. 問題記錄與解決
3.1. 問題一
-
出現場景:CenterOS6.5
-
異常描述:啓動mycat後,無法連通,到日誌中查看,看到如下內容
java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException:主機名
-
問題解決:
該問題是操作系統的問題導致,在CenterOS 6.x下,需要將/etc/sysconfig/network裏面的內容刪掉(暫不知有什麼影響)
# vi /etc/sysconfig/network
正常裏面是有以下兩行內容:
NETWORKING=YES
HOSTNAME=主機名
- 如果刪除上述兩行內容並重啓mycat還是不能解決,就重啓服務器再試一下。(還是不行就沒轍了,百度吧)
3.2. 問題二
- 出現場景:CenterOS6.5
- 異常描述:按照本文描述配置,並遍歷博客,開機自啓始終失敗。
- 有成功的夥伴可以給我留言,謝謝。