MyCat 是一款開源(遵循 Apache License 2.0 協(xié)議)的大數(shù)據(jù)庫集群中間件,用于搭建 MySQL 數(shù)據(jù)庫的分布式集群驯杜,實(shí)現(xiàn)分庫分表功能,解決數(shù)據(jù)庫中海量數(shù)據(jù)存儲和查詢性能的問題。MyCat 還是一個 MySQL 數(shù)據(jù)庫的集群中間件,主要實(shí)現(xiàn) RDBMS 數(shù)據(jù)庫集群的故障轉(zhuǎn)移姻报、負(fù)載均衡、讀寫分離等功能间螟。MyCat 2.0 使用了全新架構(gòu)吴旋。
Keepalived 是一款基于 VRRP 協(xié)議的輕量級服務(wù)高可用和負(fù)載均衡方案,提供避免服務(wù)器單點(diǎn)故障和請求分流的能力寒亥。
本方案基于CentOS8系統(tǒng)設(shè)計邮府,建議在RedHat/CentOS系統(tǒng)中使用荧关。部署數(shù)據(jù)庫集群使用服務(wù)器及網(wǎng)絡(luò)資源較多溉奕,建議在實(shí)施前做好規(guī)劃工作,有利于部署工作順利忍啤、有序進(jìn)行加勤。
目錄
1.前言
2.集群部署拓?fù)鋱D
3.MySQL8 + Replication 主備庫部署方案
4.MyCat 集群中間件的安裝和配置
5.Keepalived 高可用中間件的安裝和配置
6.MyCat 監(jiān)控中間件的安裝和配置
1.前言
1、分庫分表
MyCat 的關(guān)鍵技術(shù)是分庫分表同波,它通過將 MySQL 數(shù)據(jù)庫中物理表中的數(shù)據(jù)切分成多個表分片鳄梅,并將表分片存儲在多個數(shù)據(jù)庫節(jié)點(diǎn)上,從而構(gòu)建分布式存儲架構(gòu)未檩,提升巨表關(guān)聯(lián)戴尸、排序、分組聚合等 OLAP 的能力冤狡。
分庫分表的工作原理:攔截客戶端提交的SQL語句并進(jìn)行分析(如:分片分析孙蒙、路由分析项棠、讀寫分離分析、緩存分析等)挎峦,然后將此SQL發(fā)往后端的真實(shí)數(shù)據(jù)庫香追,并將返回的結(jié)果處理(如:數(shù)據(jù)合并)后再返回給客戶端。如下圖:
2坦胶、讀寫分離集群
MyCat 還是一個位于 MySQL 數(shù)據(jù)庫和客戶端之間透典,主要實(shí)現(xiàn)讀寫分離功能的集群中間件。主要解決在業(yè)務(wù)系統(tǒng)存在大量的讀并發(fā)時顿苇,通過負(fù)載均衡提高查詢請求吞吐量峭咒,并將多個數(shù)據(jù)庫節(jié)點(diǎn)集群化管理,在多主集群中單點(diǎn)數(shù)據(jù)庫故障時候選主節(jié)點(diǎn)切換纪岁。
3讹语、運(yùn)維監(jiān)控
MyCat 提供運(yùn)維監(jiān)控系統(tǒng),能夠?qū)崿F(xiàn)對 MyCat 的 JVM蜂科、線程顽决、后端 RDBMS 數(shù)據(jù)庫、服務(wù)器(CPU导匣、內(nèi)存才菠、磁盤、網(wǎng)絡(luò))的監(jiān)控服務(wù)贡定。
4赋访、應(yīng)用場景
1)適用于 MySQL 數(shù)據(jù)庫集群的讀寫分離、候選主節(jié)點(diǎn)切換缓待、負(fù)載均衡等高可用模式蚓耽;
2)適用于 MySQL 數(shù)據(jù)庫集群的分表分庫,對于單表數(shù)據(jù)超過1000 萬的物理表進(jìn)行分片旋炒,最大支持1000億數(shù)據(jù)的單表分片步悠;
3)適用于多租戶應(yīng)用,通過分庫分表實(shí)現(xiàn)應(yīng)用數(shù)據(jù)按照租戶劃分物理數(shù)據(jù)庫存儲瘫镇。從租戶的角度來看鼎兽,個人應(yīng)用的數(shù)據(jù)集約存儲在獨(dú)立的空間,從應(yīng)用角度看铣除,分布式數(shù)據(jù)庫有利于海量數(shù)據(jù)的分析和查詢谚咬;
4)適用于海量數(shù)據(jù)的統(tǒng)計、分析尚粘、研判等 OLAP 能力的支撐數(shù)據(jù)庫择卦,分庫分表能夠快速完成巨表關(guān)聯(lián)、排序、分組聚合等數(shù)據(jù)計算功能秉继;
5) 適用于海量數(shù)據(jù)的實(shí)時查詢潘明,如:百億數(shù)據(jù)頻繁查詢的記錄需要在3秒內(nèi)反饋結(jié)果,包括主鍵查詢秕噪、范圍查詢或其他屬性查詢的情況钳降;
6)不適用物理表無法分片、分布式事務(wù)強(qiáng)一致性腌巾、分布式數(shù)據(jù) JOIN 查詢的應(yīng)用場景遂填。
5、關(guān)鍵特性
- 支持 SQL92 標(biāo)準(zhǔn)澈蝙;
- 支持 MySQL吓坚、Oracle、DB2灯荧、SQL Server礁击、PostgreSQL 等 DB 的常見 SQL 語法;
- 遵守 MySQL 原生協(xié)議逗载,跨語言哆窿,跨平臺,跨數(shù)據(jù)庫的通用中間件代理厉斟;
- 基于心跳的自動故障切換挚躯,支持讀寫分離,支持 MySQL 主從庫擦秽,以及 Galera Cluster 集群码荔;
- 支持 Galera for MySQL 集群,Percona Cluster 或者 MariaDB cluster感挥;
- 基于 Nio 實(shí)現(xiàn)缩搅,有效管理線程,解決高并發(fā)問題触幼;
- 支持?jǐn)?shù)據(jù)的多片自動路由與聚合硼瓣,支持 sum、count域蜗、max 等常用的聚合函數(shù),支持跨庫分頁巨双;
- 支持單庫內(nèi)部任意 JOIN噪猾,支持跨庫2表 JOIN霉祸,甚至基于 Caltlet 的多表 JOIN;
- 支持通過全局表袱蜡,ER 關(guān)系的分片策略丝蹭,實(shí)現(xiàn)了高效的多表 JOIN 查詢;
- 支持多租戶方案坪蚁;
- 支持 XA 分布式事務(wù)(1.6.5)奔穿;
- 支持全局序列號镜沽,解決分布式下的主鍵生成問題;
- 分片規(guī)則豐富贱田,插件化開發(fā)缅茉,易于擴(kuò)展;
- 強(qiáng)大的 Web 監(jiān)控系統(tǒng)男摧,命令行監(jiān)控蔬墩;
- 支持前端作為 MySQL 通用代理,后端 JDBC 方式支持 Oracle耗拓、DB2拇颅、SQL Server 、 MongoDB 乔询、巨杉樟插;
- 支持密碼加密;
- 支持服務(wù)降級竿刁;
- 支持 IP 白名單黄锤;
- 支持 SQL 黑名單、SQL 注入攻擊攔截食拜;
- 支持 Prepare 預(yù)編譯指令(1.6)猜扮;
- 支持非堆內(nèi)存(Direct Memory)聚合計算(1.6);
- 支持 PostgreSQL 的 Native 協(xié)議(1.6)监婶;
- 支持 MySQL 和 Oracle 存儲過程旅赢,out 參數(shù)、多結(jié)果集返回(1.6)惑惶;
- 支持 Zookeeper 協(xié)調(diào)主從切換煮盼、zk 序列、配置 zk 化(1.6)带污;
- 支持庫內(nèi)分表(1.6)僵控;
- 集群基于 ZooKeeper 管理,在線升級鱼冀,擴(kuò)容报破,智能優(yōu)化,大數(shù)據(jù)處理(2.0開發(fā)版)千绪。
6充易、基本概念
1)物理庫和物理表:在數(shù)據(jù)庫實(shí)例上部署的物理數(shù)據(jù)庫(如:MySQL 數(shù)據(jù)庫)和庫中的表;
2)邏輯表:MyCat 定義的表荸型,MyCat 將邏輯表的操作解釋為物理庫表的操作盹靴,一個邏輯表可能對應(yīng)多個物理庫表;
3)邏輯庫:MyCat 定義的邏輯表集合。
2.數(shù)據(jù)庫集群部署拓?fù)鋱D
網(wǎng)絡(luò)資源規(guī)劃:
1稿静、MySQL 主從庫
節(jié)點(diǎn)名 | 主機(jī)名 | IP:PORT | 程序 | 操作系統(tǒng) |
---|---|---|---|---|
數(shù)據(jù)庫-1 | DB-M | 192.168.0.20:3306 | MySQL 8 | CentOS8 |
數(shù)據(jù)庫-2 | DB-S1 | 192.168.0.21:3306 | MySQL 8 | CentOS8 |
數(shù)據(jù)庫≥3 | DB-S2 | 192.168.0.22:3306 | MySQL 8 | CentOS8 |
2梭冠、MyCat + Keepalived 高可用集群
節(jié)點(diǎn)名 | 主機(jī)名 | IP:PORT | 程序 | 操作系統(tǒng) |
---|---|---|---|---|
集群節(jié)點(diǎn)-1 | CLS-1 | 192.168.0.31:8066 / 112 | MyCat / Keepalived | CentOS8 |
集群節(jié)點(diǎn)≥2 | CLS-2 | 192.168.0.32:8066 / 112 | MyCat / Keepalived | CentOS8 |
Keepalived Virtual IP:192.168.0.30。
3改备、MyCat 監(jiān)控節(jié)點(diǎn)
- 主機(jī)名:Monitor
- IP 地址:192.168.0.40:8082
- 程序:MyCat-Web控漠,Zookeeper
- 系統(tǒng):CentOS8
4、客戶端:同一網(wǎng)段計算機(jī)悬钳,部署 HeidiSQL 或應(yīng)用系統(tǒng)的調(diào)用程序模塊润脸。
3.MySQL8 + Replication 主備庫部署方案
1、在 MySQL 主從庫的節(jié)點(diǎn)上安裝 MySQL8 數(shù)據(jù)庫他去。
有關(guān)如何安裝 MySQL8 數(shù)據(jù)庫毙驯,請閱讀文章《RedHat/CentOS8【MySQL8】安裝、配置和管理》灾测,文章地址【http://www.reibang.com/p/b68e2120a068】爆价。
2、部署 MySQL 主從庫媳搪。
有關(guān)如何部署 MySQL8 主從數(shù)據(jù)庫铭段,請閱讀文章《數(shù)據(jù)庫架構(gòu)之【MySQL8+Replication】RDBMS 主從庫讀寫分離方案》,文章地址【http://www.reibang.com/p/af9d16ce00f9】秦爆。
4.MyCat 集群中間件的安裝和配置
以 "MyCat + Keepalived 高可用集群" 中的 "集群節(jié)點(diǎn)-1" 為例:
1序愚、安裝 OpenJDK 1.8 或 OracleJDK 1.8。
1)使用 YUM 源安裝OpenJDK 1.8等限。
[centos@CLS-1 ~]$ sudo dnf install java-1.8.0-openjdk
2)驗(yàn)證Java運(yùn)行環(huán)境爸吮。
[centos@CLS-1 ~]$ java -vserion
openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-b09)
OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)
2、打開 MyCat 下載頁面【http://dl.mycat.org.cn/】望门,下載 MyCat 的編譯程序 tar 包到用戶主目錄中形娇。
3筹误、解壓縮編譯程序 tar 包到"/usr/local"目錄中桐早。
[centos@CLS-1 ~]$ sudo tar xvf mycat2-1.11-05.tar.gz -C /usr/local
[centos@CLS-1 ~]$ ll /usr/local
drwxr-xr-x. 7 root root 67 5月 11 22:31 mycat
4、創(chuàng)建 MyCat 管理用戶和組厨剪,并設(shè)置為程序安裝目錄的擁有者哄酝。
[centos@CLS-1 ~]$ sudo id mycat
id: “mycat”:無此用戶
[centos@CLS-1 ~]$ sudo groupadd mycat
[centos@CLS-1 ~]$ sudo useradd -g mycat -s /bin/false mycat
[centos@CLS-1 ~]$ sudo chown -R mycat:mycat /usr/local/mycat
5、設(shè)置 MyCat 的配置文件參數(shù)祷膳。
使用文本編輯器打開配置文件:
[centos@CLS-1 ~]$ sudo gedit /usr/local/mycat/conf/mycat.yml
修改或驗(yàn)證文件中的以下參數(shù)并保存:
# 元數(shù)據(jù)
metadata:
# 邏輯庫陶衅,可以設(shè)置多個邏輯庫
schemas: [ {
# 邏輯庫名稱
schemaName: 'db',
# 邏輯庫映射的數(shù)據(jù)源或讀寫分離集群
targetName: 'repli',
# 定義全局表(各個節(jié)點(diǎn)的數(shù)據(jù)是一致的,主要用于讀寫分離)
globalTables: {
# 全局表名稱
tbl_global: {
# 建庫腳本(用于 MyCat 分析數(shù)據(jù)結(jié)構(gòu))
createTableSQL: 'CREATE TABLE `tbl_global` (`uid` INT NOT NULL AUTO_INCREMENT,`name` VARCHAR(50) NOT NULL,PRIMARY KEY (`uid`))',
# 全局表映射的數(shù)據(jù)源節(jié)點(diǎn)集合
#【targetName】全局表映射的數(shù)據(jù)源名稱
#【schemaName】全局表映射的物理數(shù)據(jù)庫名稱
#【tableName】全局表映射的物理表名稱
dataNodes: [
{ targetName: 'ds1',schemaName: 'testdb', tableName: 'tbl_global' }
]
}
},
# 定義分片表(數(shù)據(jù)分布存儲在各個節(jié)點(diǎn)的同構(gòu)表中钾唬,主要用于并發(fā)計算)
# MyCat 提供按固定万哪、枚舉侠驯、時間抡秆、范圍等十余種分片規(guī)則奕巍,以下只示例了固定分片和枚舉分片規(guī)則,更多規(guī)則可參見:
# https://github.com/MyCATApache/Mycat2/blob/master/doc/17-partitioning-algorithm.md
shadingTables: {
# 固定分片
tbl_shad: {
# 分片規(guī)則:
#【columnName】用于劃分?jǐn)?shù)據(jù)分片的字段
#【shardingType】分片的類型:NATURE_DATABASE_TABLE 表示固定分片儒士,即根據(jù)一列(支持)或者多個列(暫不支持)的值映射成一個值,再根據(jù)該值通過單維度的分片算法計算出數(shù)據(jù)分片范圍的止;
#【function】PartitionByLong 分片算法:
# 分片長度是分片范圍的一種度量,總量是1024着撩,每個 dataNode (分片節(jié)點(diǎn))可以占有一個范圍的分片長度诅福。
# 其中:partitionCount 是分片數(shù)量的數(shù)組,partitionLength 是每個分片長度的數(shù)組拖叙。
# 本例:1024 = 2X256+1X512
columns: [ {
columnName: 'uid',
shardingType: 'NATURE_DATABASE_TABLE',
function: { clazz: 'io.mycat.router.function.PartitionByLong', name: 'partitionByLong', properties: {partitionCount: '1,2', partitionLength: '512,256'}, ranges: {}}
} ],
# 建庫腳本(用于 MyCat 分析數(shù)據(jù)結(jié)構(gòu))
createTableSQL: 'CREATE TABLE `tbl_shad` (`uid` INT NOT NULL AUTO_INCREMENT,`name` VARCHAR(50) NOT NULL,PRIMARY KEY (`uid`))',
# 分片表映射的數(shù)據(jù)源節(jié)點(diǎn)集合
#【targetName】分片表映射的數(shù)據(jù)源名稱
#【schemaName】分片表映射的物理數(shù)據(jù)庫名稱
#【tableName】分片表映射的物理表名稱
dataNodes: [
{ targetName: 'ds1',schemaName: 'shaddb1', tableName: 'tbl_shad' },
{ targetName: 'ds1',schemaName: 'shaddb2', tableName: 'tbl_shad' },
{ targetName: 'ds1',schemaName: 'shaddb3', tableName: 'tbl_shad' }
]
},
# 枚舉分片
tbl_shad_em: {
# 分片規(guī)則:
#【columnName】用于劃分?jǐn)?shù)據(jù)分片的字段
#【function】PartitionByFileMap 分片算法:
# 按照指定的數(shù)據(jù)字典進(jìn)行分片路由氓润,一般應(yīng)用于按照租戶賬號或區(qū)域的方式計算數(shù)據(jù)分片范圍。
# 其中:type 是分片字段的類型薯鳍,可以是:Integer,Byte,Char,String,Long,Double,Float,Short,Boolean,BigInteger,BigDecimal咖气;
# defaultNode 是無匹配字典時默認(rèn)路由的分片,<0表示不進(jìn)行路由挖滤;
# ranges 是字段值對應(yīng)的 dataNodes 數(shù)組序號
# 本例:當(dāng) shad 字段的值是 10001 時崩溪,將此腳本路由到 shaddb1 庫的 tbl_shad_em 表上。
columns: [ {
columnName: 'shad',
function: { clazz: 'io.mycat.router.function.PartitionByFileMap', name: 'PartitionByFileMap', properties: { type: Integer, defaultNode: -1 }, ranges: { 10001: 0, 10002: 1, 10003: 2 }}
} ],
createTableSQL: 'CREATE TABLE `tbl_shad_em` (`uid` INT NOT NULL AUTO_INCREMENT,`name` VARCHAR(50) NOT NULL,`shad` INT NOT NULL, PRIMARY KEY (`uid`))',
dataNodes: [
{ targetName: 'ds1',schemaName: 'shaddb1', tableName: 'tbl_shad_em' },
{ targetName: 'ds1',schemaName: 'shaddb2', tableName: 'tbl_shad_em' },
{ targetName: 'ds1',schemaName: 'shaddb3', tableName: 'tbl_shad_em' }
]
}
}
} ]
# 用戶認(rèn)證和SQL腳本匹配攔截器
interceptors: [ {
# 用戶攔截器
#【ip】客戶端IP斩松,支持正則表達(dá)式
#【username】登錄用戶
#【password】登錄用戶口令
user:{ ip: '.',username: 'root',password: 'password' },
# 事務(wù)模式伶唯,可選項(xiàng)為:xa 和 proxy,默認(rèn)是 proxy
# transactionType: proxy
} ]
# 數(shù)據(jù)源
datasource:
# 數(shù)據(jù)源集合
datasources: [{
# 數(shù)據(jù)源名稱
name: 'ds1',
# 數(shù)據(jù)庫IP地址
ip: '192.168.0.20',
# 數(shù)據(jù)庫服務(wù)端口
port: '3306',
# 數(shù)據(jù)庫登錄用戶
user: 'root',
# 數(shù)據(jù)庫登錄用戶口令
password: 'password',
# 最大連接數(shù)
maxCon: 10000,
# 最小連接數(shù)
minCon: 0,
# 連接重試次數(shù)
maxRetryCount: 3,
# 連接超時時間惧盹,單位:毫秒
maxConnectTimeout: 10000,
# 數(shù)據(jù)庫類型乳幸,可選項(xiàng):mysql 或 jdbc
dbType: 'mysql',
# 數(shù)據(jù)庫連接字符串
url: 'jdbc:mysql://192.168.0.20:3306?characterEncoding=utf8&useSSL=true&allowMultiQueries=true',
# 負(fù)載均衡權(quán)重
weight: 1,
# 與后端數(shù)據(jù)庫建立連接后執(zhí)行的初始化 SQL 腳本,如:"use mysql"
initSqls: [],
# READ,WRITE,READ_WRITE ,集群信息中是主節(jié)點(diǎn),則默認(rèn)為讀寫,副本則為讀,此屬性可以強(qiáng)制指定可寫
instanceType: ,
# JDBC 每次獲取連接是否都執(zhí)行 initSqls 腳本
initSqlsGetConnection: true
},
{
name: 'ds2',
ip: '192.168.0.21',
port: '3306',
user: 'root',
password: 'password',
maxCon: 10000,
minCon: 0,
maxRetryCount: 3,
maxConnectTimeout: 10000,
dbType: 'mysql',
url: 'jdbc:mysql://192.168.0.21:3306?characterEncoding=utf8&useSSL=true&allowMultiQueries=true',
weight: 1,
initSqls: [],
instanceType: ,
initSqlsGetConnection: true
},
{
name: 'ds3',
ip: '192.168.0.22',
port: '3306',
user: 'root',
password: 'password',
maxCon: 10000,
minCon: 0,
maxRetryCount: 3,
maxConnectTimeout: 10000,
dbType: 'mysql',
url: 'jdbc:mysql://192.168.0.22:3306?characterEncoding=utf8&useSSL=true&allowMultiQueries=true',
weight: 1,
initSqls: [],
instanceType: ,
initSqlsGetConnection: true
} ]
# MyCat 數(shù)據(jù)源實(shí)現(xiàn)類
datasourceProviderClass: 'io.mycat.datasource.jdbc.datasourceProvider.AtomikosDatasourceProvider'
# 心跳定時器钧椰,表示 MyCat 啟動后反惕,延遲 initialDelay 秒后連接后端數(shù)據(jù)源。
timer: {initialDelay: 0, period: 3, timeUnit: 'SECONDS'}
# 讀寫分離集群
cluster:
# 關(guān)閉集群心跳,此時集群認(rèn)為所有數(shù)據(jù)源都是可用的演侯,可以通過 MyCat 提供的外部接口設(shè)置數(shù)據(jù)源可用信息達(dá)到相同效果
close: true
# 集群集合
clusters: [ {
# 集群名稱
name: 'repli',
# 集群類型:SINGLE_NODE(單一節(jié)點(diǎn))姿染,MASTER_SLAVE(主從集群) ,GARELA_CLUSTER(多主集群)
replicaType: 'MASTER_SLAVE',
# 切換類型:NOT_SWITCH(不進(jìn)行主從切換)秒际,SWITCH(進(jìn)行主從切換)
switchType: 'SWITCH',
# 查詢請求的負(fù)載均衡類型悬赏,BALANCE_ALL(所有數(shù)據(jù)源參與負(fù)載均衡),BALANCE_ALL_READ(從庫數(shù)據(jù)源參與負(fù)載均衡)娄徊,BALANCE_NONE:(無負(fù)載均衡)
readBalanceType: 'BALANCE_ALL',
# 查詢請求的負(fù)載均衡插件
readBalanceName: 'BalanceRoundRobin',
# 修改請求的負(fù)載均衡插件
writeBalanceName: 'BalanceRoundRobin',
# 主節(jié)點(diǎn)列表,普通主從,當(dāng)主失去連接后,依次選擇列表中存活的作為主節(jié)點(diǎn)
masters: [ 'ds1', 'ds2' ],
# 從節(jié)點(diǎn)列表
replicas: [ 'ds3' ],
# 集群最占用大連接限制
maxCon: ,
# 心跳設(shè)置
heartbeat: {
# 心跳重試次數(shù)
maxRetry: 3,
# 最小主從切換間隔
minSwitchTimeInterval: 120000,
# 心跳超時值闽颇,單位(毫秒)
heartbeatTimeout: 100000,
# MySQL 二進(jìn)制日志(binlog)延遲值
slaveThreshold: 0,
# 進(jìn)行心跳的方式,mysql或者jdbc兩種
requestType: 'mysql'
}
} ]
timer: { initialDelay: 10, period: 5, timeUnit: 'SECONDS' }
# 插件
plug:
# 負(fù)載均衡算法實(shí)現(xiàn)類
# BalanceLeastActive
# 最少正在使用的連接數(shù)的 MySQL 數(shù)據(jù)源被選中,如果連接數(shù)相同寄锐,則從連接數(shù)相同的數(shù)據(jù)源中的隨機(jī)兵多,使慢的機(jī)器收到更少尖啡。
# BalanceRandom
# 利用隨機(jī)算法產(chǎn)生隨機(jī)數(shù),然后從活躍的mysql數(shù)據(jù)源中進(jìn)行選取剩膘。
# BalanceRoundRobin
# 加權(quán)輪訓(xùn)算法衅斩,記錄輪訓(xùn)的權(quán)值,每次訪問加一怠褐,得到n畏梆,然后對 MySQL 數(shù)據(jù)源進(jìn)行輪訓(xùn),如果權(quán)值已經(jīng)為零奈懒,則跳過奠涌,如果非零則減一,n減1磷杏,直n為零則選中的節(jié)點(diǎn)就是需要訪問的mysql數(shù)據(jù)源節(jié)點(diǎn)溜畅。
# BalanceRunOnReplica
# 把請求盡量發(fā)往從節(jié)點(diǎn),不會把請求發(fā)到不可讀(根據(jù)延遲值判斷)與不可用的從節(jié)點(diǎn)
loadBalance:
defaultLoadBalance: 'balanceRandom'
loadBalances: [
{ name: 'BalanceRunOnMaster', clazz: 'io.mycat.plug.loadBalance.BalanceRunOnMaster' },
{ name: 'BalanceLeastActive', clazz: 'io.mycat.plug.loadBalance.BalanceLeastActive' },
{ name: 'BalanceRoundRobin', clazz: 'io.mycat.plug.loadBalance.BalanceRoundRobin' },
{ name: 'BalanceRunOnReplica', clazz: 'io.mycat.plug.loadBalance.BalanceRunOnReplica' },
{ name: 'BalanceRunOnRandomMaster', clazz: 'io.mycat.plug.loadBalance.BalanceRunOnRandomMaster' }
]
# 服務(wù)器
server:
# 監(jiān)聽 IP 地址
ip: 0.0.0.0
# 監(jiān)控服務(wù)端口
port: 8066
reactorNumber: 1
properties:
key: 'value'
#lib start
#lib end
MyCat 配置相關(guān)資料:
https://gitee.com/cos9527/Mycat2/blob/master/doc/00-mycat-readme.md
https://www.ctolib.com/MyCATApache-Mycat2.html#articleHeader7
https://github.com/MyCATApache/Mycat2/blob/master/doc
6、配置 MyCat 服務(wù)開機(jī)自啟動极祸。
使用文本編輯器創(chuàng)建配置文件:
[centos@CLS-1 ~]$ sudo gedit /usr/lib/systemd/system/mycat.service
編寫文件內(nèi)容并保存如下:
[Unit]
Description=MyCat2 Server
After=syslog.target network.target
[Service]
Type=forking
User=mycat
Group=mycat
ExecStart=/usr/local/mycat/bin/mycat start
ExecStop=/usr/local/mycat/bin/mycat stop
ExecReload=/usr/local/mycat/bin/mycat restart
[Install]
WantedBy=multi-user.target
設(shè)置開機(jī)啟動:
[centos@CLS-1 ~]$ sudo systemctl daemon-reload
[centos@CLS-1 ~]$ sudo systemctl enable mycat.service
7慈格、啟動 MyCat 服務(wù)。
[centos@CLS-1 ~]$ sudo systemctl start mycat.service
8贿肩、設(shè)置防火墻端口(CentOS8默認(rèn)安裝firewall防火墻)峦椰,允許"8066"端口(MyCat 默認(rèn)端口)訪問服務(wù)器。
[centos@CLS-1 ~]$ sudo firewall-cmd --zone=public --add-port=8066/tcp --permanent
[centos@CLS-1 ~]$ sudo firewall-cmd --reload
注意:其他"MyCat + Keepalived 高可用集群"節(jié)點(diǎn)上全部需要按照以上步驟配置汰规。
9汤功、MyCat 運(yùn)維管理
1)啟動 MyCat 服務(wù)(任選一種方式)
[centos@CLS-1 ~]$ sudo systemctl start mycat.service
或者
[centos@CLS-1 ~]$ sudo -u mycat /usr/local/mycat/bin/mycat start
2)停止 MyCat 服務(wù)(任選一種方式)
[centos@CLS-1 ~]$ sudo systemctl stop mycat.service
或者
[centos@CLS-1 ~]$ sudo -u mycat /usr/local/mycat/bin/mycat stop
3)重啟 MyCat 服務(wù)
[centos@CLS-1 ~]$ sudo systemctl restart mycat.service
或者
[centos@CLS-1 ~]$ sudo -u mycat /usr/local/mycat/bin/mycat restart
4)查看 MyCat 服務(wù)狀態(tài)
[centos@CLS-1 ~]$ sudo systemctl status mycat.service
或者
[centos@CLS-1 ~]$ sudo netstat -ntap | grep 8066
tcp6 0 0 :::8066 :::* LISTEN 9688/java
5)啟動 MyCat 服務(wù)開機(jī)自啟動
[centos@CLS-1 ~]$ sudo systemctl enable mycat.service
6)禁用 MyCat 服務(wù)開機(jī)自啟動
[centos@CLS-1 ~]$ sudo systemctl disable mycat.service
5.Keepalived 高可用中間件的安裝和配置
以 "MyCat + Keepalived 高可用集群" 中的 "集群節(jié)點(diǎn)-1" 為例:
1、安裝 EPEL 的 Yum源溜哮。
使用文本編輯器創(chuàng)建倉庫配置文件:
[centos@CLS-1 ~ ]$ sudo gedit /etc/yum.repos.d/epel.repo
在文件中編寫以下內(nèi)容并保存:
[epel-modular]
name=Extra Packages for Enterprise Linux Modular $releasever - $basearch
baseurl=http://mirrors.aliyun.com/epel/$releasever/Modular/$basearch
enabled=1
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-8
[epel]
name=Extra Packages for Enterprise Linux $releasever - $basearch
baseurl=http://mirrors.aliyun.com/epel/$releasever/Everything/$basearch
enabled=1
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-8
更新 Yum 源:
[centos@CLS-1 ~]$ sudo dnf clean all
[centos@CLS-1 ~]$ sudo dnf makecache
Extra Packages for Enterprise Linux Modular 8 - 429 kB/s | 118 kB 00:00
Extra Packages for Enterprise Linux 8 - x86_64 3.7 MB/s | 6.9 MB 00:01
元數(shù)據(jù)緩存已建立滔金。
EPEL(Extra Packages for Enterprise Linux)是企業(yè)級 Linux 操作系統(tǒng)的擴(kuò)展包倉庫,為 Redhat/CentOS系統(tǒng)提供大量的額外軟件包茂嗓。
2餐茵、安裝 Keepalived。
[centos@CLS-1 ~]$ sudo dnf install keepalived
程序安裝目錄是"/usr/sbin"述吸,配置文件目錄是"/etc/keepalived"忿族。
3、設(shè)置 Keepalived 配置文件參數(shù)蝌矛。
使用文本編輯器打開配置文件:
[centos@CLS-1 ~ ]$ sudo gedit /etc/keepalived/keepalived.conf
在文件中編寫以下內(nèi)容并保存:
# 定義全局配置
global_defs {
# 本地節(jié)點(diǎn) ID 標(biāo)識道批,一般設(shè)置為主機(jī)名。
router_id mycat-1
}
# 定義周期性執(zhí)行的腳本入撒,腳本的退出狀態(tài)碼會被調(diào)用它的所有的 vrrp_instance 記錄隆豹。
vrrp_script chk_mycat {
# 執(zhí)行腳本的路徑。
script "/etc/keepalived/mycat_check.sh"
# 腳本執(zhí)行的間隔(單位是秒)茅逮。默認(rèn)為1s璃赡。
interval 2
# 當(dāng)腳本調(diào)整優(yōu)先級判哥,從 -254 到 254。默認(rèn)為2碉考。
# 1. 如果腳本執(zhí)行成功(退出狀態(tài)碼為0)塌计,weight大于0,則priority增加豆励。
# 2. 如果腳本執(zhí)行失敗(退出狀態(tài)碼為非0)夺荒,weight小于0瞒渠,則priority減少良蒸。
# 3. 其他情況下,priority不變伍玖。
weight -20
# 當(dāng)腳本執(zhí)行超過時長(單位是秒)則被認(rèn)為執(zhí)行失敗嫩痰。
# 運(yùn)行腳本的用戶和組。
user root root
# timeout 30
# 當(dāng)腳本執(zhí)行成功到設(shè)定次數(shù)時窍箍,才認(rèn)為是成功串纺。
# rise 1
# 當(dāng)腳本執(zhí)行失敗到設(shè)定次數(shù)時,才認(rèn)為是失敗椰棘。
# fall 3
}
# 定義虛擬路由纺棺,可以定義多個。
vrrp_instance VI_1 {
# 本地節(jié)點(diǎn)初始狀態(tài)邪狞,包括 MASTER(主節(jié)點(diǎn)) 和 BACKUP (備節(jié)點(diǎn))祷蝌。
state MASTER
# 本地節(jié)點(diǎn)綁定虛擬 IP 的網(wǎng)絡(luò)接口。
interface ens33
# 本地節(jié)點(diǎn)優(yōu)先級帆卓,優(yōu)先級高的節(jié)點(diǎn)將動態(tài)變成 MASTER 節(jié)點(diǎn)巨朦,接管 VIP 。初始狀態(tài)下剑令,MASTER 節(jié)點(diǎn)的優(yōu)先級必須高于 BACKUP 節(jié)點(diǎn)糊啡。
priority 100
# VRRP 實(shí)例 ID,范圍是0-255吁津。同一集群的所有節(jié)點(diǎn)應(yīng)設(shè)置一致的值棚蓄。
virtual_router_id 216
# 組播信息發(fā)送時間間隔。同一集群的所有節(jié)點(diǎn)必須設(shè)置一樣碍脏,默認(rèn)為1秒梭依。
advert_int 1
# 設(shè)置驗(yàn)證信息。同一集群的所有節(jié)點(diǎn)必須一致
authentication {
# 指定認(rèn)證方式潮酒。PASS 表示簡單密碼認(rèn)證(推薦)睛挚;AH:IPSEC認(rèn)證(不推薦)。
auth_type PASS
# 指定認(rèn)證所使用的密碼急黎,最多8位扎狱。
auth_pass 1111
}
# 聲明調(diào)用已定義的 vrrp_script 腳本侧到。
track_script {
chk_mycat
}
# 定義虛擬 IP 地址。
virtual_ipaddress {
192.168.0.30
}
}
# 定義對外提供服務(wù) LVS (負(fù)載均衡)的 VIP 和 端口(當(dāng)端口號設(shè)置為【0】時淤击,表示所有端口)匠抗,只實(shí)現(xiàn)高可用時可不配置。
virtual_server 192.168.0.30 8066 {
# 設(shè)置健康檢查時間污抬,單位是秒
delay_loop 6
#負(fù)載均衡調(diào)度算法
lb_algo rr
# 設(shè)置LVS實(shí)現(xiàn)負(fù)載的機(jī)制汞贸,有NAT、TUN印机、DR三個模式
lb_kind DR
# VIP 子網(wǎng)掩碼
nat_mask 255.255.255.0
# 會話保持時間,一定時間之內(nèi)用戶無響應(yīng)則下一次用戶請求時需重新路由矢腻,一般設(shè)為0,表示不需要
persistence_timeout 0
# 網(wǎng)絡(luò)協(xié)議
protocol TCP
# 定義后端 RealServer 的真實(shí)服務(wù)器屬性射赛,IP 地址和端口(當(dāng)端口號設(shè)置為【0】時多柑,表示所有端口)
real_server 192.168.0.31 8066 {
# 配置節(jié)點(diǎn)權(quán)值,數(shù)字越大權(quán)重越高
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 8066
}
}
real_server 192.168.0.32 8066 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 8066
}
}
}
初始化的主節(jié)點(diǎn)和備節(jié)點(diǎn)的區(qū)別體現(xiàn)在以下參數(shù)中:
- 初始主節(jié)點(diǎn)
vrrp_instance VI_1 {
# 必須設(shè)置為 MASTER 楣责。
state MASTER
# 必須設(shè)置為最大值竣灌。
priority 100
}
- 初始備節(jié)點(diǎn)
vrrp_instance VI_1 {
# 必須設(shè)置為 BACKUP 。
state BACKUP
# 必須設(shè)置為小于主節(jié)點(diǎn)的值秆麸。
priority 90
}
4初嘹、創(chuàng)建或編輯 MyCat 檢測腳本文件。文件路徑對應(yīng)配置文件中 vrrp_script 的 script 設(shè)置值沮趣。
使用文本編輯器創(chuàng)建腳本文件:
[centos@CLS-1 ~ ]$ sudo gedit /etc/keepalived/mycat_check.sh
在腳本文件中編寫以下內(nèi)容并保存:
#!/bin/bash
if [ ! -f "/usr/local/mycat/logs/mycat.pid" ]; then
sudo -u mycat /usr/local/mycat/bin/mycat restart
sleep 2
if [ ! -f "/usr/local/mycat/logs/mycat.pid" ]; then
killall -9 keepalived
fi
fi
給腳本文件增加可執(zhí)行權(quán)限:
[centos@CLS-1 ~ ]$ sudo chmod 755 /etc/keepalived/mycat_check.sh
5屯烦、配置 Keepalived 系統(tǒng)服務(wù)。
使用文本編輯器創(chuàng)建配置文件:
[centos@CLS-1 ~ ]$ sudo gedit /usr/lib/systemd/system/keepalived.service
驗(yàn)證或修改文件內(nèi)容并保存如下:
[Unit]
Description=LVS and VRRP High Availability Monitor
After=network-online.target syslog.target
Wants=network-online.target
[Service]
Type=forking
User=root
Group=root
PIDFile=/var/run/keepalived.pid
KillMode=process
EnvironmentFile=-/etc/sysconfig/keepalived
ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
重新加載系統(tǒng)服務(wù)管理器:
[centos@CLS-1 ~ ]$ sudo systemctl daemon-reload
6兔毒、設(shè)置防火墻端口(CentOS8默認(rèn)安裝firewall防火墻)漫贞,允許"112"端口(Keepalived 默認(rèn)端口)訪問服務(wù)器。
[centos@CLS-1 ~ ]$ sudo firewall-cmd --zone=public --add-port=112/tcp --permanent
[centos@CLS-1 ~ ]$ sudo firewall-cmd --reload
7育叁、啟動/重啟 Keepalived 服務(wù)(不建議設(shè)置為開機(jī)自啟動)迅脐。
啟動 Keepalived 服務(wù)之前,應(yīng)確保已正確啟動了各節(jié)點(diǎn)的 MyCat 服務(wù)豪嗽。各節(jié)點(diǎn)的啟動或重啟的順序?yàn)椋孩?啟動 Keepalived 主節(jié)點(diǎn)谴蔑;② 依次啟動 Keepalived 備節(jié)點(diǎn)。
[centos@CLS-1 ~ ]$ sudo systemctl restart keepalived.service
8龟梦、啟動 Keepalived 可能因?yàn)楦鞣N未知的原因失敗隐锭,主要是由于引發(fā)了 SELinux 異常。有關(guān)如何解決 SELinux 引起的異常计贰,請閱讀文章《RedHat/CentOS8【SELinux】引起的安全策略問題解決方案》钦睡,文章地址【http://www.reibang.com/p/a13f974f8bae】。
注意:其他"MyCat + Keepalived 高可用集群"節(jié)點(diǎn)上全部需要按照以上步驟配置躁倒。
6.MyCat 監(jiān)控中間件的安裝和配置
1荞怒、安裝 OpenJDK 1.8 或 OracleJDK 1.8洒琢。
1)使用 YUM 源安裝OpenJDK 1.8。
[centos@Monitor ~]$ sudo dnf install java-1.8.0-openjdk
2)驗(yàn)證Java運(yùn)行環(huán)境褐桌。
[centos@Monitor ~]$ java -vserion
openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-b09)
OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)
2衰抑、打開 MyCat 下載頁面【http://dl.mycat.org.cn/】,下載 MyCat-Web 和 Zookeeper 的編譯程序 tar 包到用戶主目錄中荧嵌。
3呛踊、解壓縮 Zookeeper 編譯程序 tar 包到"/usr/local"目錄中。
[centos@Monitor ~]$ sudo tar xvf zookeeper-3.4.6.tar.gz -C /usr/local
[centos@Monitor ~]$ ll /usr/local
drwxr-xr-x. 10 root root 4096 2月 20 2014 zookeeper-3.4.6
4啦撮、從模板創(chuàng)建 Zookeeper 配置文件谭网。
[centos@Monitor ~]$ sudo cp /usr/local/zookeeper-3.4.6/conf/zoo_sample.cfg /usr/local/zookeeper-3.4.6/conf/zoo.cfg
5、配置 Zookeeper 服務(wù)開機(jī)自啟動逻族。
使用文本編輯器創(chuàng)建配置文件:
[centos@Monitor ~]$ sudo gedit /usr/lib/systemd/system/zookeeper.service
編寫文件內(nèi)容并保存如下:
[Unit]
Description=Zookeeper Server
After=syslog.target network.target
[Service]
Type=forking
User=root
Group=root
ExecStart=/usr/local/zookeeper-3.4.6/bin/zkServer.sh start
ExecStop=/usr/local/zookeeper-3.4.6/bin/zkServer.sh stop
ExecReload=/usr/local/zookeeper-3.4.6/bin/zkServer.sh restart
[Install]
WantedBy=multi-user.target
設(shè)置開機(jī)啟動:
[centos@Monitor ~]$ sudo systemctl daemon-reload
[centos@Monitor ~]$ sudo systemctl enable zookeeper.service
6蜻底、啟動 Zookeeper 服務(wù)骄崩。
[centos@Monitor ~]$ sudo systemctl start zookeeper.service
7聘鳞、設(shè)置防火墻端口(CentOS8默認(rèn)安裝firewall防火墻),允許"2181"端口(Zookeeper 默認(rèn)端口)訪問服務(wù)器要拂。
[centos@Monitor ~ ]$ sudo firewall-cmd --zone=public --add-port=2181/tcp --permanent
[centos@Monitor ~ ]$ sudo firewall-cmd --reload
8抠璃、解壓縮 MyCat-Web 編譯程序 tar 包到"/usr/local"目錄中。
[centos@Monitor ~]$ sudo tar xvf Mycat-web-1.0-SNAPSHOT-20170102153329-linux.tar.gz -C /usr/local
[centos@Monitor ~]$ ll /usr/local
drwxrwxrwx. 5 root root 96 10月 20 2015 mycat-web
9脱惰、設(shè)置 MyCat-Web 配置文件參數(shù)搏嗡。
使用文本編輯器打開配置文件:
[centos@Monitor ~ ]$ sudo gedit /usr/local/mycat-web/mycat-web/WEB-INF/classes/mycat.properties
在文件中編寫以下內(nèi)容并保存:
show.period=3000000
# Zookeeper 服務(wù)器IP和端口號
zookeeper=127.0.0.1:2181
mycat_warn_mail=[{"cc"\:"sohudo@mycat.io","index"\:1,"mangerPort"\:"465","smtpHost"\:"smtp.139.com","smtpPassword"\:"123456","smtpProtocol"\:"smtp","smtpUser"\:"agile_louie@139.com","to"\:"9183838@qq.com"}]
##sql\u4E0A\u7EBF\u76F8\u5173\u914D\u7F6E
# MyCat 服務(wù)器IP地址
sqlonline.server=192.168.0.20
# MyCat 登錄用戶
sqlonline.user=root
# MyCat 登錄用戶口令
sqlonline.passwd=123456a?
10、設(shè)置防火墻端口(CentOS8默認(rèn)安裝firewall防火墻)拉一,允許"8082"端口(MyCat-Web 默認(rèn)端口)訪問服務(wù)器采盒。
[centos@Monitor ~ ]$ sudo firewall-cmd --zone=public --add-port=8082/tcp --permanent
[centos@Monitor ~ ]$ sudo firewall-cmd --reload
11、啟動 MyCat-Web 服務(wù)蔚润。
[centos@Monitor ~]$ cd /usr/local/mycat-web
[centos@Monitor mycat-web]$ ./start.sh
12磅氨、驗(yàn)證 MyCat-Web 服務(wù)正常運(yùn)行。使用瀏覽器客戶端訪問 MyCat-Web 的 Http 服務(wù)接口進(jìn)行測試嫡纠,輸入:http://<IP>:<PORT>/mycat烦租,默認(rèn)端口是【8082】。
13除盏、MyCat Web 運(yùn)維管理
1)啟動 MyCat Web 服務(wù)(任選一種方式)
[centos@Monitor ~]$ cd /usr/local/mycat-web
[centos@Monitor mycat-web]$ ./start.sh
2)停止 MyCat 服務(wù)(任選一種方式)
[centos@Monitor ~]$ sudo netstat -ntap | grep 8082
tcp6 0 0 :::8082 :::* LISTEN 78278/java
[centos@Monitor ~]$ sudo kill -9 78278
3)重啟 MyCat 服務(wù)
[centos@Monitor ~]$ sudo netstat -ntap | grep 8082
tcp6 0 0 :::8082 :::* LISTEN 78278/java
[centos@Monitor ~]$ sudo kill -9 78278
[centos@Monitor ~]$ cd /usr/local/mycat-web
[centos@Monitor mycat-web]$ ./start.sh
4)查看 MyCat 服務(wù)狀態(tài)
[centos@Monitor ~]$ sudo netstat -ntap | grep 8082
tcp6 0 0 :::8082 :::* LISTEN 78278/java