国内网站建设推荐,手工做的网站,wordpress的app,为什么asp.net做的网站上传后不显示照片文章目录 1.Mycat读写分离分布式架构规划2.在两台服务器中搭建八个MySQL实例2.1.安装MySQL软件2.2.创建每个MySQL实例的数据目录并初始化2.3.准备每个实例的配置文件2.4.准备每个实例的启动脚本2.6启动每台机器的MySQL多实例2.7.为每个MySQL实例设置密码2.8.查看每个MySQL实例的… 文章目录 1.Mycat读写分离分布式架构规划2.在两台服务器中搭建八个MySQL实例2.1.安装MySQL软件2.2.创建每个MySQL实例的数据目录并初始化2.3.准备每个实例的配置文件2.4.准备每个实例的启动脚本2.6启动每台机器的MySQL多实例2.7.为每个MySQL实例设置密码2.8.查看每个MySQL实例的server-id 3.将八个MySQL实例配置成主从复制集群3.1.复制规划3.2.配置mysql-1服务器中的主从复制集群3.3.配置mysql-2服务器中的主从复制集群3.4.双主复制3.5.检查各个实例的主从状态 4.部署Mycat4.1.部署Mycat4.2.Mycat文件介绍4.3.Mycat主配置文件简单介绍 5.在mysql-1的3306主库中写入一些数据6.使用Mycat实现读写分离以及高可用架构6.1.架构规划6.2.使用Mycat实现读写分离集群6.2.1.配置Mycat对主从复制集群实现读写分离6.2.1.测试Mycat实现的读写分离集群 6.3.使用Mycat实现读写分离高可用集群6.3.1.Mycat读写分离高可用架构集群概念6.3.2.配置Mycat读写分离高可用集群6.3.3.测试高可用的读写分离集群 1.Mycat读写分离分布式架构规划
基于Mycat的读写分离主从复制高可用架构图如下
由于服务器数量有限高可用集群由2台服务器实现如果服务器数量很充足那么准备8台服务器部署8个数据库实例配置成4套MySQL主从复制集群然后再将4套主从复制集群配置成双主双从集群最终呈现出2套双主双从的复制集群。
双主双从集群可以通过Mycat实现高可用功能将双主双从配置到Mycat的数据主机里双主双从两套主从配置成两组读写分离两个从库同时处理读操作两个主库其中一个主库承担所有的写操作另一个主库处于备用状态当主库挂了备用的从库接替其工作实现高可用。
基于Mycat打造读写分离主从复制高可用的分布式架构通过一套双主双从即可实现本次搭建两套双主双从是为了后期通过Mycat分库分表提供准备。 如果想在分布式架构中引入MHA可以准备12台服务器或者是12个实例3个为1组配置成MHA高可用集群然后由Mycat统一管理。
由于服务器数量有限我们使用2台服务器搭建基于Mycat的MySQL分布式架构。
IP端口号角色搭建的服务192.168.20.113306MasterMySQL192.168.20.113307MasterMySQL192.168.20.113308SlaveMySQL192.168.20.113309SlaveMySQL192.168.20.123306MasterMySQL192.168.20.123307MasterMySQL192.168.20.123308SlaveMySQL192.168.20.123309SlaveMySQL
2.在两台服务器中搭建八个MySQL实例
2.1.安装MySQL软件
两台服务器都操作先将MySQL软件安装在服务器上。
tar xf mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz -C /usr/local/
mv /usr/local/mysql-5.7.36-linux-glibc2.12-x86_64 /usr/local/mysql2.2.创建每个MySQL实例的数据目录并初始化
由于两台服务器中的MySQL端口都一样路径也保持一样相同的命令在两台服务器中都执行。
1.创建每个实例的数据目录
mkdir /data/mysql{3306,3307,3308,3309}2.初始化每个实例
mysqld --initialize-insecure --usermysql --datadir/data/mysql3306 --basedir/usr/local/mysql
mysqld --initialize-insecure --usermysql --datadir/data/mysql3307 --basedir/usr/local/mysql
mysqld --initialize-insecure --usermysql --datadir/data/mysql3308 --basedir/usr/local/mysql
mysqld --initialize-insecure --usermysql --datadir/data/mysql3309 --basedir/usr/local/mysql3.授权
chown -R mysql.mysql /data/mysql330*2.3.准备每个实例的配置文件
13306实例
[rootmysql-1 ~]# vim /etc/my3306.cnf
[mysqld]
basedir/usr/local/mysql
datadir/data/mysql3306
socket/data/mysql3306/mysql.sock
port3306
log-error/data/mysql3306/mysql.log
log_bin/data/mysql3306/mysql-bin
binlog_formatrow
skip-name-resolve
server-id6
gtid-modeon
enforce-gtid-consistencytrue
log-slave-updates123307实例
# vim /etc/my3307.cnf
[mysqld]
basedir/usr/local/mysql
datadir/data/mysql3307
socket/data/mysql3307/mysql.sock
port3307
log-error/data/mysql3307/mysql.log
log_bin/data/mysql3307/mysql-bin
binlog_formatrow
skip-name-resolve
server-id7
gtid-modeon
enforce-gtid-consistencytrue
log-slave-updates133308实例
# vim /etc/my3308.cnf
[mysqld]
basedir/usr/local/mysql
datadir/data/mysql3308
socket/data/mysql3308/mysql.sock
port3308
log-error/data/mysql3308/mysql.log
log_bin/data/mysql3308/mysql-bin
binlog_formatrow
skip-name-resolve
server-id8
gtid-modeon
enforce-gtid-consistencytrue
log-slave-updates143309实例
# vim /etc/my3309.cnf
[mysqld]
basedir/usr/local/mysql
datadir/data/mysql3309
socket/data/mysql3309/mysql.sock
port3309
log-error/data/mysql3309/mysql.log
log_bin/data/mysql3309/mysql-bin
binlog_formatrow
skip-name-resolve
server-id9
gtid-modeon
enforce-gtid-consistencytrue
log-slave-updates1注意第二个服务器配置的时候要修改server-id一个集群内的server-id是不允许冲突的。 2.4.准备每个实例的启动脚本
13306实例
# vim /etc/systemd/system/mysqld3306.service
[Unit]
DescriptionMySQL Server
Documentationman:mysqld(8)
Documentationhttp://dev.mysql.com/doc/refman/en/using-systemd.html
Afternetwork.target
Aftersyslog.target
[Install]
WantedBymulti-user.target
[Service]
Usermysql
Groupmysql
ExecStart/usr/local/mysql/bin/mysqld --defaults-file/etc/my3306.cnf
LimitNOFILE 500023307实例
# vim /etc/systemd/system/mysqld3307.service
[Unit]
DescriptionMySQL Server
Documentationman:mysqld(8)
Documentationhttp://dev.mysql.com/doc/refman/en/using-systemd.html
Afternetwork.target
Aftersyslog.target
[Install]
WantedBymulti-user.target
[Service]
Usermysql
Groupmysql
ExecStart/usr/local/mysql/bin/mysqld --defaults-file/etc/my3307.cnf
LimitNOFILE 500033308实例
# cat /etc/systemd/system/mysqld3308.service
[Unit]
DescriptionMySQL Server
Documentationman:mysqld(8)
Documentationhttp://dev.mysql.com/doc/refman/en/using-systemd.html
Afternetwork.target
Aftersyslog.target
[Install]
WantedBymulti-user.target
[Service]
Usermysql
Groupmysql
ExecStart/usr/local/mysql/bin/mysqld --defaults-file/etc/my3308.cnf
LimitNOFILE 500043309实例
# vim /etc/systemd/system/mysqld3309.service
[Unit]
DescriptionMySQL Server
Documentationman:mysqld(8)
Documentationhttp://dev.mysql.com/doc/refman/en/using-systemd.html
Afternetwork.target
Aftersyslog.target
[Install]
WantedBymulti-user.target
[Service]
Usermysql
Groupmysql
ExecStart/usr/local/mysql/bin/mysqld --defaults-file/etc/my3309.cnf
LimitNOFILE 50002.6启动每台机器的MySQL多实例
systemctl start mysqld3306 mysqld3307 mysqld3308 mysqld3309
systemctl enable mysqld3306 mysqld3307 mysqld3308 mysqld3309
systemctl status mysqld3306 mysqld3307 mysqld3308 mysqld33092.7.为每个MySQL实例设置密码
mysqladmin -uroot -P3306 password 123456 -S /data/mysql3306/mysql.sock
mysqladmin -uroot -P3307 password 123456 -S /data/mysql3307/mysql.sock
mysqladmin -uroot -P3308 password 123456 -S /data/mysql3308/mysql.sock
mysqladmin -uroot -P3309 password 123456 -S /data/mysql3309/mysql.sock2.8.查看每个MySQL实例的server-id
#第一台服务器上的四个实例
[rootmysql-1 ~]# mysql -uroot -P3306 -p123456 -S /data/mysql3306/mysql.sock -e select server_id;
-------------
| server_id |
-------------
| 6 |
-------------
[rootmysql-1 ~]# mysql -uroot -P3307 -p123456 -S /data/mysql3307/mysql.sock -e select server_id;
-------------
| server_id |
-------------
| 7 |
-------------
[rootmysql-1 ~]# mysql -uroot -P3308 -p123456 -S /data/mysql3308/mysql.sock -e select server_id;
-------------
| server_id |
-------------
| 8 |
-------------
[rootmysql-1 ~]# mysql -uroot -P3309 -p123456 -S /data/mysql3309/mysql.sock -e select server_id;
-------------
| server_id |
-------------
| 9 |
-------------#第二台服务器上的四个实例
[rootmysql-2 ~]# mysql -uroot -P3306 -p123456 -S /data/mysql3306/mysql.sock -e select server_id
-------------
| server_id |
-------------
| 16 |
-------------
[rootmysql-2 ~]# mysql -uroot -P3306 -p123456 -S /data/mysql3306/mysql.sock -e select server_id;
-------------
| server_id |
-------------
| 16 |
-------------
[rootmysql-2 ~]# mysql -uroot -P3307 -p123456 -S /data/mysql3307/mysql.sock -e select server_id;
-------------
| server_id |
-------------
| 17 |
-------------
[rootmysql-2 ~]# mysql -uroot -P3308 -p123456 -S /data/mysql3308/mysql.sock -e select server_id;
-------------
| server_id |
-------------
| 18 |
-------------
[rootmysql-2 ~]# mysql -uroot -P3309 -p123456 -S /data/mysql3309/mysql.sock -e select server_id;
-------------
| server_id |
-------------
| 19 |
-------------3.将八个MySQL实例配置成主从复制集群
3.1.复制规划 mysql-1服务器上的实例 13306端口为主库3308端口为3306端口的从库。192.168.20.11:3306-----192.168.20.11:3308 23307端口为主库3309端口为3307端口的从库。192.168.20.11:3307-----192.168.20.11:3309 mysql-2服务器上的实例 13306端口为主库3308端口为3306端口的从库。192.168.20.12:3306-----192.168.20.12:3308 23307端口为主库3309端口为3307端口的从库。192.168.20.12:3307-----192.168.20.12:3309 双主复制 1mysql-1的3306端口与mysql-2的3306端口互相复制。 2mysql-1的3307端口与mysql-2的3307端口互相复制。 如下图所示共6对主从集群。 3.2.配置mysql-1服务器中的主从复制集群
13306端口为主库3308端口为3306端口的从库。192.168.20.11:3306-----192.168.20.11:3308
1.在192.168.20.11:3306主库上创建复制用户
[rootmysql-1 ~]# mysql -uroot -P3306 -p123456 -S /data/mysql3306/mysql.sock -e grant replication slave on *.* to repl192.168.20.% identified by 123456;
[rootmysql-11 ~]# mysql -uroot -P3306 -p123456 -S /data/mysql3306/mysql.sock -e grant all on *.* to root192.168.20.% identified by 123456 with grant option;2.配置192.168.20.11:3308为192.168.20.11:3306的从库
[rootmysql-1 ~]# mysql -uroot -P3308 -p123456 -S /data/mysql3308/mysql.sock -e CHANGE MASTER TO MASTER_HOST192.168.20.11, MASTER_PORT3306, MASTER_AUTO_POSITION1, MASTER_USERrepl, MASTER_PASSWORD123456;
[rootmysql-1 ~]# mysql -uroot -P3308 -p123456 -S /data/mysql3308/mysql.sock -e start slave;
[rootmysql-1 ~]# mysql -uroot -P3308 -p123456 -S /data/mysql3308/mysql.sock -e show slave status\G23307端口为主库3309端口为3307端口的从库。192.168.20.11:3307-----192.168.20.11:3309
1.在192.168.20.11:3307主库上创建复制用户
[rootmysql-1 ~]# mysql -uroot -P3307 -p123456 -S /data/mysql3307/mysql.sock -e grant replication slave on *.* to repl192.168.20.% identified by 123456;
[rootmysql-1 ~]# mysql -uroot -P3307 -p123456 -S /data/mysql3307/mysql.sock -e grant all on *.* to root192.168.20.% identified by 123456 with grant option;2.配置192.168.20.11:3309为192.168.20.11:3307的从库
[rootmysql-1 ~]# mysql -uroot -P3309 -p123456 -S /data/mysql3309/mysql.sock -e CHANGE MASTER TO MASTER_HOST192.168.20.11, MASTER_PORT3307, MASTER_AUTO_POSITION1, MASTER_USERrepl, MASTER_PASSWORD123456;
[rootmysql-1 ~]# mysql -uroot -P3309 -p123456 -S /data/mysql3309/mysql.sock -e start slave;
[rootmysql-1 ~]# mysql -uroot -P3309 -p123456 -S /data/mysql3309/mysql.sock -e show slave status\G3.3.配置mysql-2服务器中的主从复制集群
13306端口为主库3308端口为3306端口的从库。192.168.20.12:3306-----192.168.20.12:3308
1.在192.168.20.12:3306主库上创建复制用户
[rootmysql-2 ~]# mysql -uroot -P3306 -p123456 -S /data/mysql3306/mysql.sock -e grant replication slave on *.* to repl192.168.20.% identified by 123456;
[rootmysql-2 ~]# mysql -uroot -P3306 -p123456 -S /data/mysql3306/mysql.sock -e grant all on *.* to root192.168.20.% identified by 123456 with grant option;2.配置192.168.20.12:3308为192.168.20.12:3306的从库
[rootmysql-2 ~]# mysql -uroot -P3308 -p123456 -S /data/mysql3308/mysql.sock -e CHANGE MASTER TO MASTER_HOST192.168.20.12, MASTER_PORT3306, MASTER_AUTO_POSITION1, MASTER_USERrepl, MASTER_PASSWORD123456;
[rootmysql-2 ~]# mysql -uroot -P3308 -p123456 -S /data/mysql3308/mysql.sock -e start slave;
[rootmysql-2 ~]# mysql -uroot -P3308 -p123456 -S /data/mysql3308/mysql.sock -e show slave status\G23307端口为主库3309端口为3307端口的从库。192.168.20.12:3307-----192.168.20.12:3309
1.在192.168.20.12:3307主库上创建复制用户
[rootmysql-2 ~]# mysql -uroot -P3307 -p123456 -S /data/mysql3307/mysql.sock -e grant replication slave on *.* to repl192.168.20.% identified by 123456;
[rootmysql-2 ~]# mysql -uroot -P3307 -p123456 -S /data/mysql3307/mysql.sock -e grant all on *.* to root192.168.20.% identified by 123456 with grant option;2.配置192.168.20.12:3309为192.168.20.12:3307的从库
[rootmysql-2 ~]# mysql -uroot -P3309 -p123456 -S /data/mysql3309/mysql.sock -e CHANGE MASTER TO MASTER_HOST192.168.20.12, MASTER_PORT3307, MASTER_AUTO_POSITION1, MASTER_USERrepl, MASTER_PASSWORD123456;
[rootmysql-2 ~]# mysql -uroot -P3309 -p123456 -S /data/mysql3309/mysql.sock -e start slave;
[rootmysql-2 ~]# mysql -uroot -P3309 -p123456 -S /data/mysql3309/mysql.sock -e show slave status\G3.4.双主复制
1mysql-1的3306端口与mysql-2的3306端口互相复制。192.168.20.11:3306-----192.168.20.12:3306
1.mysql-1的3306成为mysql-2的3306的从库
[rootmysql-1 ~]# mysql -uroot -P3306 -p123456 -S /data/mysql3306/mysql.sock -e CHANGE MASTER TO MASTER_HOST192.168.20.12, MASTER_PORT3306, MASTER_AUTO_POSITION1, MASTER_USERrepl, MASTER_PASSWORD123456;
[rootmysql-1 ~]# mysql -uroot -P3306 -p123456 -S /data/mysql3306/mysql.sock -e start slave;
[rootmysql-1 ~]# mysql -uroot -P3306 -p123456 -S /data/mysql3306/mysql.sock -e show slave status\G2.mysql-2的3306成为mysql-1的3306的从库
[rootmysql-2 ~]# mysql -uroot -P3306 -p123456 -S /data/mysql3306/mysql.sock -e CHANGE MASTER TO MASTER_HOST192.168.20.11, MASTER_PORT3306, MASTER_AUTO_POSITION1, MASTER_USERrepl, MASTER_PASSWORD123456;
[rootmysql-2 ~]# mysql -uroot -P3306 -p123456 -S /data/mysql3306/mysql.sock -e start slave;
[rootmysql-2 ~]# mysql -uroot -P3306 -p123456 -S /data/mysql3306/mysql.sock -e show slave status\Gmysql-1的3306成为mysql-2的3306的从库。 mysql-2的3306成为mysql-1的3306的从库。 即使主库又是从库的数据库实例线程中包含主库线程又包含从库线程。 2mysql-1的3307端口与mysql-2的3307端口互相复制。192.168.20.11:3307-----192.168.20.12:3307
1.mysql-1的3307成为mysql-2的3307的从库
[rootmysql-1 ~]# mysql -uroot -P3307 -p123456 -S /data/mysql3307/mysql.sock -e CHANGE MASTER TO MASTER_HOST192.168.20.12, MASTER_PORT3307, MASTER_AUTO_POSITION1, MASTER_USERrepl, MASTER_PASSWORD123456;
[rootmysql-1 ~]# mysql -uroot -P3307 -p123456 -S /data/mysql3307/mysql.sock -e start slave;
[rootmysql-1 ~]# mysql -uroot -P3307 -p123456 -S /data/mysql3307/mysql.sock -e show slave status\G2.mysql-2的3307成为mysql-1的3307的从库
[rootmysql-2 ~]# mysql -uroot -P3307 -p123456 -S /data/mysql3307/mysql.sock -e CHANGE MASTER TO MASTER_HOST192.168.20.11, MASTER_PORT3307, MASTER_AUTO_POSITION1, MASTER_USERrepl, MASTER_PASSWORD123456;
[rootmysql-2 ~]# mysql -uroot -P3307 -p123456 -S /data/mysql3307/mysql.sock -e start slave;
[rootmysql-2 ~]# mysql -uroot -P3307 -p123456 -S /data/mysql3307/mysql.sock -e show slave status\Gmysql-1的3307成为mysql-2的3307的从库。 mysql-2的3307成为mysql-1的3307的从库。 3.5.检查各个实例的主从状态
mysql -uroot -P3306 -p123456 -S /data/mysql3306/mysql.sock -e show slave status\G;| egrep Host|Yes
mysql -uroot -P3307 -p123456 -S /data/mysql3307/mysql.sock -e show slave status\G;| egrep Host|Yes
mysql -uroot -P3308 -p123456 -S /data/mysql3308/mysql.sock -e show slave status\G;| egrep Host|Yes
mysql -uroot -P3309 -p123456 -S /data/mysql3309/mysql.sock -e show slave status\G;| egrep Host|Yes4.部署Mycat
4.1.部署Mycat
1.安装java环境
[rootmysql-1 ~]# yum -y install java2.安装mycat
[rootmysql-1 ~]# tar xf Mycat-server-1.6.5-release-20180117003034-linux.tar.gz -C /data/
[rootmysql-1 ~]# ll /data/mycat/
总用量 12
drwxr-xr-x 2 root root 190 7月 11 22:14 bin
drwxrwxrwx 2 root root 6 3月 1 2016 catlet
drwxrwxrwx 4 root root 4096 7月 11 22:14 conf
drwxr-xr-x 2 root root 4096 7月 11 22:14 lib
drwxrwxrwx 2 root root 6 1月 17 2018 logs
-rwxrwxrwx 1 root root 219 1月 17 2018 version.txt3.配置环境变量
[rootmysql-1 ~]# vim /etc/profile
export MYCAT_HOME/data/mycat
export PATH$MYCAT_HOME/bin:$PATH
[rootmysql-1 ~]# source /etc/profile4.2.Mycat文件介绍
logs目录:wrapper.log #mycat启动日志mycat.log #mycat详细工作日志
conf目录:schema.xml #主配置文件读写分离、高可用、分布式策略定制、节点控制server.xml #mycat软件本身相关的配置rule.xml #分片规则配置文件,记录分片规则列表、使用方法等4.3.Mycat主配置文件简单介绍
定义一个逻辑库一般都和真实的数据库库名保持一致在配置文件中定义了几个schema逻辑库通过mycat连接之后就只能看见定义的这些逻辑库其他未定义的数据库将看不到。
schema name库名 checkSQLschemafalse sqlMaxLimit100 dataNode数据节点名
/schema 定义一个数据节点在数据库节点中会定义数据库的主机以及对应的数据库库名。
dataNode name主机节点名称 dataHost数据库主机 database 真实的数据库名称 / 定义一个数据主机在这里面主要是声明数据库的服务器IP、端口号、连接数据库的用户名密码等等信息并且读写分离这种配置也是在数据主机中定义的。 dataHost name数据主机名称 maxCon1000 minCon10 balance1 writeType0 dbTypemysql dbDrivernative switchType1 heartbeatselect user()/heartbeat writeHost host主机名称 urlIP:端口号 user用户名 password密码 readHost host主机名称 urlIP:端口号 user用户名 password密码 / /writeHost /dataHost5.在mysql-1的3306主库中写入一些数据
四套MySQL主从双主的集群我们已经准备完毕了接下来写入一些数据然后实现使用Mycat完成读写分离以及高可用等操作。
我们在mysql-1的3306主库上写入数据后会同步到mysql-2的3306主库上并且分别同步到各自主库关联的3308从库上这是一套双主双从的复制集群写入数据后方便我们后面实现读写分离和高可用。
[rootmysql-1 ~]# mysql -uroot -P3306 -p123456 -S /data/mysql3306/mysql.sock
create database db_1 character set utf8mb4;
use db_1;
create table bmxxb (id int primary key auto_increment comment 部门ID,bmmc varchar(10) not null comment 部门名称
) comment 部门信息表;
INSERT INTO bmxxb (id, bmmc) VALUES (1, 平台研发部), (2, 技术运维部),(3, 技术测试部), (4, 销售部), (5, 市场部), (6, 人事部);6.使用Mycat实现读写分离以及高可用架构
6.1.架构规划
首先我们来实现一个简单的读写分离集群使用mysql-1中的3306和3308这一对主从复制集群基于Mycat实现读写分离集群。
mysql-1的3306和mysql-2的3306是双主双从的复制集群双主双从也就意味着数据是一样的我们可以通过这个双主双从来实现一个高可用的读写分离集群但是在高可用环境中只会有一个主库在提供工作另一个主库充当备用状态当一个主库挂掉之后备用主库接替故障主库的工作当故障主库恢复后处于备用状态。 6.2.使用Mycat实现读写分离集群
读写分离目前只使用mysql-1的3306和3308组成的主从复制集群所有的写操作由3306主库进行处理所有的读操作由3308从库进行处理。
6.2.1.配置Mycat对主从复制集群实现读写分离
1编写Mycat读写分离配置文件
[rootmysql-1 ~]# vim /data/mycat/conf/schema.xml
?xml version1.0?
!DOCTYPE mycat:schema SYSTEM schema.dtd
mycat:schema xmlns:mycathttp://io.mycat/schema nameTESTDB checkSQLschemafalse sqlMaxLimit100 dataNodesh1/schemadataNode namesh1 dataHostmysql-1 database db_1 / dataHost namemysql-1 maxCon1000 minCon10 balance1 writeType0 dbTypemysql dbDrivernative switchType1 heartbeatselect user()/heartbeat writeHost hostdb1 url192.168.20.11:3306 userroot password123456readHost hostdb2 url192.168.20.11:3308 userroot password123456 //writeHost /dataHost /mycat:schema2配置文件解释 //定义一个逻辑库库名叫TESTDB关联的dataNode为sh1schema nameTESTDB checkSQLschemafalse sqlMaxLimit100 dataNodesh1/schema //定义一个主机节点名称为sh1关联的dataHost为mysql-1关联的数据库是db_1关联的数据库要真实存在dataNode namesh1 dataHostmysql-1 database db_1 / //定义一个数据主机名称为mysql-1被主机节点关联dataHost namemysql-1 maxCon1000 minCon10 balance1 writeType0 dbTypemysql dbDrivernative switchType1 heartbeatselect user()/heartbeat //定义一个写主机所有的写操作都路由到这个数据库节点上处理对应的是主从复制中的主库writeHost hostdb1 url192.168.20.11:3306 userroot password123456//定义一个读主机所有的读操作都路由到这个数据库节点上处理对应的是主从复制中的从库readHost hostdb2 url192.168.20.11:3308 userroot password123456 //writeHost /dataHost 3启动Mycat
[rootmysql-1 ~]# mycat start
Starting Mycat-server...[rootmysql-1 conf]# netstat -lnpt | grep java
tcp 0 0 127.0.0.1:32000 0.0.0.0:* LISTEN 6508/java
tcp6 0 0 :::1984 :::* LISTEN 6508/java
tcp6 0 0 :::8066 :::* LISTEN 6508/java
tcp6 0 0 :::37891 :::* LISTEN 6508/java
tcp6 0 0 :::9066 :::* LISTEN 6508/java
tcp6 0 0 :::35853 :::* LISTEN 6508/java
Mycat启动成功Mycat的8066端口是程序连接的端口9066端口是管理端口。
6.2.1.测试Mycat实现的读写分离集群
通过Mycat连接数据库。
1读操作
读操作会落在从库db2上server_id为8。
[rootmysql-1 ~]# mysql -uroot -p123456 -h 192.168.20.11 -P 8066
mysql select server_id;
-------------
| server_id |
-------------
| 8 |
-------------
1 row in set (0.13 sec)2写操作
读操作会落在主库db1上server_id为6。
mysql begin; select server_id;
Query OK, 0 rows affected (0.00 sec)-------------
| server_id |
-------------
| 6 |
-------------
1 row in set (0.00 sec)6.3.使用Mycat实现读写分离高可用集群
6.3.1.Mycat读写分离高可用架构集群概念
在上面我们通过Mycat实现了读写分离但是当主库挂掉了从库也就无法进行读操作了因为读写分离集群要保证读和写对应的数据库都是正常的否则都不能操作为了避免主库宕机造成系统崩溃接下来我们去实现Mycat读写分离的高可用架构。 Mycat读写分离高可用架构其实就是双主的架构双主复制集群中最少需要4台服务器4个MySQL实例每个主从集群中最少包含一主一从然后两个主之间相互复制双主复制就可以保证4个MySQL实例中的数据几乎都是一样的。
在高可用模式下多主只会有其中一个主在提供工作另一个主充当备用主库的角色当主库故障后备用主库会自动切换为主库进行工作当主库故障后该主库对应的从库也将停止工作此时正在工作的也就是备用主库和对应的从库在高可用架构中双主对应的所有从库都会工作主库只有一个在工作。
高可用模式下当主库故障修复后会充当备用角色。
双主模式下在mycat的配置文件中哪一对主从先书写的顺序从上到下最上面的将会成为提供服务的主库下面的主库充当备用角色。
6.3.2.配置Mycat读写分离高可用集群
高可用集群其实就是多加了一组读写主机而已但是多组读写主机的数据一定要保证是一致的也就是互为主从的架构多组读写中只要主库不故障从库将会从始至终的提供服务如果对应的主库故障了从库也就不会提供服务了。
[rootmysql-1 ~]# vim /data/mycat/conf/schema.xml
?xml version1.0?
!DOCTYPE mycat:schema SYSTEM schema.dtd
mycat:schema xmlns:mycathttp://io.mycat/schema nameTESTDB checkSQLschemafalse sqlMaxLimit100 dataNodesh1/schemadataNode namesh1 dataHostmysql-1 database db_1 /dataHost namemysql-1 maxCon1000 minCon10 balance1 writeType0 dbTypemysql dbDrivernative switchType1heartbeatselect user()/heartbeatwriteHost hostdb1 url192.168.20.11:3306 userroot password123456readHost hostdb2 url192.168.20.11:3308 userroot password123456 //writeHost !--备用主库db3 主库db1故障后 开始提供写操作--writeHost hostdb3 url192.168.20.12:3306 userroot password123456!--备用主库的从库 从始至终 只要备用主库不故障 会一直提供读服务--readHost hostdb4 url192.168.20.12:3308 userroot password123456 //writeHost /dataHost /mycat:schema 重启mycat。
[rootmysql-1 ~]# mycat restart
Stopping Mycat-server...
Stopped Mycat-server.
Starting Mycat-server...6.3.3.测试高可用的读写分离集群
1读操作
两个从库都负责读的操作只要这两个从库对应的主库不故障这两个从库会从始至终的提供读操作可以看到路由的很均衡几乎一次是db2从库处理数据一次是db4从库处理数据。
[rootmysql-1 ~]# mysql -uroot -p123456 -h 192.168.20.11 -P 8066
mysql select server_id;
-------------
| server_id |
-------------
| 18 |
-------------
1 row in set (0.13 sec)mysql select server_id;
-------------
| server_id |
-------------
| 6 |
-------------
1 row in set (0.01 sec)2写操作
正常情况下db1数据库在配置文件的最上方只要db1不故障所有的写操作都有db1处理db3主库会一直处于备用状态。
mysql begin; select server_id;
Query OK, 0 rows affected (0.00 sec)-------------
| server_id |
-------------
| 6 |
-------------
1 row in set (0.00 sec)3db1主库故障无法承担写的操作 此时db3主库切换为主库 承担写操作
1.db1主库故障
[rootmysql-1 ~]# systemctl stop mysqld33062.此时db3会去处理所有的读操作保证服务不中断
mysql begin; select server_id;
Query OK, 0 rows affected (0.00 sec)-------------
| server_id |
-------------
| 16 |
-------------
1 row in set (0.00 sec)当db1修复后不会抢占db3成为正在工作的主库而是处于备用状态。
1.修复db1
[rootmysql-1 ~]# systemctl start mysqld33062.提供工作的依旧是db3
mysql begin; select server_id;
Query OK, 0 rows affected (0.00 sec)-------------
| server_id |
-------------
| 16 |
-------------
1 row in set (0.00 sec)3.读操作也会均匀的分配到两个从库上
mysql select server_id;
-------------
| server_id |
-------------
| 6 |
-------------
1 row in set (0.00 sec)mysql select server_id;
-------------
| server_id |
-------------
| 18 |
-------------
1 row in set (0.00 sec)