MySQL_PXC叢集_綜合應用
- 簡述
- 部署
- PXC叢集和主從差別
- 綜合應用
-
- 部署PXC叢集
- 部署主從複制叢集
-
- Master
- Slave
- 部署MyCat
-
- 節點一
- 節點二
- 部署HAProxy
簡述
Percona XtraDB Cluster(簡稱PXC)是針對MySQL使用者的高可用性和擴充性解決方案,基于Percona Server 。其 包括了Write Set REPlication更新檔,使用Galera 2.0庫,這是一個針對事務性應用程式的同步多主機複制插件。
Percona Server是MySQL的改進版本,使用 XtraDB 存儲引擎,在功能和性能上較 MySQL 有着很顯著的提升,如提 升了在高負載情況下的 InnoDB 的性能,為 DBA 提供了一些非常有用的性能診斷工具,另外有更多的參數和指令來 控制伺服器行為。
Percona XtraDB Cluster提供了:
同步複制,事務可以在所有節點上送出。 多主機複制,你可以寫到任何節點。 從(slave)伺服器上的并行應用事件,真正的“并行複制”。 自動節點配置。 資料一緻性,不再有未同步的從伺服器。
官網:https://www.percona.com/software/mysql-database/percona-xtradb-cluster
部署
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuQzMzADNxQTM1IjNwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
#建立資料卷(存儲路徑:/var/lib/docker/volumes)
docker volume create v1
docker volume create v2
docker volume create v3
#拉取鏡像
docker pull percona/percona-xtradb-cluster:5.7
#重命名
docker tag percona/percona-xtradb-cluster:5.7 pxc
#建立網絡
docker network create --subnet=172.30.0.0/24 pxc-network
#建立容器
#第一節點
docker create -p 13306:3306 -v v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=pxc --name=pxc_node1 --net=pxc-network --ip=172.30.0.2 pxc
#第二節點(增加了CLUSTER_JOIN參數)
docker create -p 13307:3306 -v v2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=pxc --name=pxc_node2 -e CLUSTER_JOIN=pxc_node1 --net=pxc-network -ip=172.30.0.3 pxc
#第三節點(增加了CLUSTER_JOIN參數)
docker create -p 13308:3306 -v v3:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=pxc --name=pxc_node3 -e CLUSTER_JOIN=pxc_node1 --net=pxc-network -ip=172.30.0.4 pxc
#檢視叢集節點
show status like 'wsrep_cluster%';
備注:先啟動第一個節點,等到mysql用戶端可以連接配接到服務後再啟動其它節點。
說明
1、盡可能的控制PXC叢集的規模,節點越多,資料同步速度越慢
2、所有PXC節點的硬體配置要一緻,如果不一緻,配置低的節點将拖慢資料同步速度
3、PXC叢集隻支援InnoDB引擎,不支援其他的存儲引擎
PXC叢集和主從差別
1、PXC叢集方案所有節點都是可讀可寫的,Replication從節點不能寫入,因為主從同步是單向的,無法從slave節 點向master點同步。
2、PXC同步機制是同步進行的,這也是它能保證資料強一緻性的根本原因,Replication同步機制是異步進行的, 它如果從節點停止同步,依然可以向主節點插入資料,正确傳回,造成資料主從資料的不一緻性。
3、PXC是用犧牲性能保證資料的一緻性,Replication在性能上是高于PXC的。是以兩者用途也不一緻。PXC是用于 重要資訊的存儲,例如:訂單、使用者資訊等。Replication用于一般資訊的存儲,能夠容忍資料丢失,例如:購 物車,使用者行為日志等。
綜合應用
主從架構、Mycat中間件、HAProxy負載均衡、PXC叢集架構,在實際的項目中,往往不單單是一種架 構,更多的使用的混合架構,下面我們将好客租房項目采用混合架構的方式進行完善資料庫叢集。
1、HAProxy作為負載均衡器
2、部署了2個Mycat節點作為資料庫中間件
3、部署了2個PXC叢集節點,作為2個Mycat分片,每個PXC叢集中有2個節點,作為資料的同步存儲
4、部署了1個主從複制叢集
5、房源資料儲存到PXC分片中,其餘資料儲存到主從架構中
部署PXC叢集
#建立資料卷(存儲路徑:/var/lib/docker/volumes)
docker volume create haoke-v1
docker volume create haoke-v2
docker volume create haoke-v3
docker volume create haoke-v4
#拉取鏡像
docker pull percona/percona-xtradb-cluster:5.7
#建立網絡
docker network create --subnet=172.30.0.0/24 pxc-network
#建立容器
#叢集1,第一節點
docker create -p 13306:3306 -v haoke-v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=pxc --name=pxc_node1 --net=pxc-network --ip=172.30.0.2 pxc
#第二節點(增加了CLUSTER_JOIN參數)
docker create -p 13307:3306 -v haoke-v2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=pxc --name=pxc_node2 -e CLUSTER_JOIN=pxc_node1 --net=pxc-network -ip=172.30.0.3 pxc
#叢集2
#第一節點
docker create -p 13308:3306 -v haoke-v3:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=pxc --name=pxc_node3 --net=pxc-network --ip=172.30.0.4 pxc
#第二節點(增加了CLUSTER_JOIN參數)
docker create -p 13309:3306 -v haoke-v4:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=pxc --name=pxc_node4 -e CLUSTER_JOIN=pxc_node3 --net=pxc-network -ip=172.30.0.5 pxc
#啟動
docker start pxc_node1 && docker logs -f pxc_node1
docker start pxc_node2 && docker logs -f pxc_node2
docker start pxc_node3 && docker logs -f pxc_node3
docker start pxc_node4 && docker logs -f pxc_node4
#檢視叢集節點 show status like 'wsrep_cluster%';
說明:
2個叢集,4個節點,均啟動成功。
分别在2個叢集中建立資料庫以及相關資料表tb_house_resources。
部署主從複制叢集
Master
#建立目錄
mkdir /data/mysql/haoke/master01 -p
cd /data/mysql/haoke/master01
mkdir conf data
chmod 777 * -R
#建立配置檔案
cd /data/mysql/haoke/master01/conf
vim my.cnf
#輸入如下内容
[mysqld]
log-bin=mysql-bin #開啟二進制日志
server-id=1 #服務id,不可重複 sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO ,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
#建立容器
docker create --name percona-haoke-master01 -v /data/mysql/haoke/master01/data:/var/lib/mysql -v /data/mysql/haoke/master01/conf:/etc/my.cnf.d -p 23306:3306 -e MYSQL_ROOT_PASSWORD=root percona:5.7.23
#啟動
docker start percona-haoke-master01 && docker logs -f percona-haoke-master01
#建立同步賬戶以及授權
create user 'itcast'@'%' identified by 'itcast';
grant replication slave on *.* to 'itcast'@'%';
flush privileges;
#檢視master狀态
show master status;
Slave
#建立目錄
mkdir /data/mysql/haoke/slave01 -p
cd /data/mysql/haoke/slave01
mkdir conf data
chmod 777 * -R
#建立配置檔案
cd /data/mysql/haoke/slave01/conf
vim my.cnf
#輸入如下内容
[mysqld]
server-id=2 #服務id,不可重複 sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO ,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
#建立容器
docker create --name percona-haoke-slave01 -v /data/mysql/haoke/slave01/data:/var/lib/mysql -v /data/mysql/haoke/slave01/conf:/etc/my.cnf.d -p 23307:3306 -e MYSQL_ROOT_PASSWORD=root percona:5.7.23
#啟動
docker start percona-haoke-slave01 && docker logs -f percona-haoke-slave01
#設定master相關資訊
CHANGE MASTER TO
master_host='192.168.1.18',
master_user='itcast',
master_password='itcast',
master_port=23306,
master_log_file='mysql-bin.000002',
master_log_pos=648;
#啟動同步
start slave;
#檢視master狀态
show slave status;
建立資料庫以及建立廣告表tb_ad
部署MyCat
節點一
cd /data/
mkdir mycat
cp /haoke/mycat . -R
mv mycat/mycat-node1
配置server.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="nonePasswordLogin">0</property>
<property name="useHandshakeV10">1</property>
<property name="useSqlStat">0</property>
<property name="useGlobleTableCheck">0</property>
<property name="sequnceHandlerType">2</property>
<property name="subqueryRelationshipCheck">false</property>
<property name="processorBufferPoolType">0</property>
<property name="handleDistributedTransactions">0</property>
<property name="useOffHeapForMerge">1</property>
<property name="memoryPageSize">64k</property>
<property name="spillsFileBufferSize">1k</property>
<property name="useStreamOutput">0</property>
<property name="systemReserveMemorySize">384m</property>
<property name="useZKSwitch">false</property>
</system> <!--這裡是設定的itcast使用者和虛拟邏輯庫-->
<user name="itcast" defaultAccount="true">
<property name="password">itcast123</property>
<property name="schemas">haoke</property>
</user>
</mycat:server>
配置schema.xml:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!--配置資料表-->
<schema name="haoke" checkSQLschema="false" sqlMaxLimit="100">
<!-- tb_house_resources表位于dn1和dn2并分片存資料 -->
<table name="tb_house_resources" dataNode="dn1,dn2" rule="mod-long" />
<!-- tb_ad表位于dn3 -->
<table name="tb_ad" dataNode="dn3"/>
</schema>
<!--配置分片關系-->
<dataNode name="dn1" dataHost="cluster1" database="haoke" />
<dataNode name="dn2" dataHost="cluster2" database="haoke" />
<dataNode name="dn3" dataHost="cluster3" database="haoke" />
<!--配置連接配接資訊-->
<dataHost name="cluster1" maxCon="1000" minCon="10" balance="2" writeType="1" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="W1" url="192.168.1.18:13306" user="root" password="root">
<readHost host="W1R1" url="192.168.1.18:13307" user="root" password="root" />
</writeHost>
</dataHost>
<dataHost name="cluster2" maxCon="1000" minCon="10" balance="2" writeType="1" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="W2" url="192.168.1.18:13308" user="root" password="root">
<readHost host="W2R1" url="192.168.1.18:13309" user="root" password="root" />
</writeHost>
</dataHost>
<!-- balance=3 為讀寫分離-->
<dataHost name="cluster3" maxCon="1000" minCon="10" balance="3" writeType="1" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="W3" url="192.168.1.18:23306" user="root" password="root">
<readHost host="W3R1" url="192.168.1.18:23307" user="root" password="root" />
</writeHost>
</dataHost>
</mycat:schema>
配置rule.xml:
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<property name="count">2</property>
</function>
設定端口以及啟動:
vim wrapper.conf
#設定jmx端口
wrapper.java.additional.7=-Dcom.sun.management.jmxremote.port=11985
vim server.xml
#設定服務端口以及管理端口
<property name="serverPort">18067</property>
<property name="managerPort">19067</property>
./startup_nowrap.sh && tail -f ../logs/mycat.log
測試插入資料
tb_house_resources表插入兩條資料,node1/node2和node3/node4分片接受資料
節點二
cp mycat-node1/ mycat-node2 -R
vim wrapper.conf
#設定jmx端口
wrapper.java.additional.7=-Dcom.sun.management.jmxremote.port=11986
vim server.xml
#設定服務端口以及管理端口
<property name="serverPort">18068</property>
<property name="managerPort">19068</property>
./startup_nowrap.sh && tail -f ../logs/mycat.log
部署HAProxy
#修改檔案
vim /haoke/haproxy/haproxy.cfg
#輸入如下内容 global
log 127.0.0.1 local2
maxconn 4000
daemon
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
listen admin_stats
bind 0.0.0.0:4001
mode http
stats uri /dbs
stats realm Global\ statistics
stats auth admin:admin123
listen proxy-mysql
bind 0.0.0.0:4002
mode tcp
balance roundrobin
option tcplog
#代理mycat服務
server mycat_1 192.168.1.18:18067 check port 18067 maxconn 2000
server mycat_2 192.168.1.18:18068 check port 18068 maxconn 2000
#啟動容器
docker start haproxy && docker logs -f haproxy
通路: