基于Docker和Ubuntu配置Mysql+haproxy+mycat+pxc+zookeeper实现高可用负载均衡集群
一、整体架构图
1.应用程序通过HaProxy访问Mycat
2.Mycat实现分库分表以及根据访问的表选择不同的数据库
3.读写user表时通过Mycat节点1访问数据库并使用Percona-xtraDB-Cluster(pxc)实现强同步
4.读写ordertest表时则通过Mycat节点2访问数据库,两个数据库之间一主一从实现读写分离
5.user表引入了zookeeper工具,利用zkID生成器保证ID不会重复。
6.服务器ip地址:192.168.187.129
7.教程中展示了基于docker搭建master01和slave01,请仿照搭建master02和slave02,作为上图最后前4台mysql节点,后2台主从节点教程中会给出步骤。
8.请自行在mysql节点中建立M2Test数据库以及user表和ordertest表。
9.最终效果图及端口配置请拉至底部
10.关闭防火墙或者开启相应端口
11.关于各个工具的详细作用请自行查阅。
1)user表
2)ordertest表
—1.docker上配置master和slave—
1)docker创建master
mkdir /data/mysql/master01 -p
cd /data/mysql/master01/
mkdir conf data
chmod 777 * -R
cd conf/
vim my.cnf
[mysqld]
server-id = 21
binlog-format = row
log-bin=mysql-bin
2)创建名为percona-masetr01的容器并搭建Master
|root@Node_Slave:~# docker create --name percona-master01 -v /data/mysql/master01/data:/var/lib/mysql -v /data/mysql/master01/conf:/etc/mysql/conf.d/ -p 3306:3306 -e MYSQL_ROOT_PASSWORD=666666 percona:5.7.22
命令说明:
注意:务必确认主机目录和容器目录存在,否则my.cnf配置无法生效,可通过先创建容器里的mysql去查看路径再回来修改。
-p 3306:3306:将容器的 3306 端口映射到主机的 3306 端口。
-v /data/mysql/master01/data:/var/lib/mysql :将主机当前目录/data/mysql/master01/data目录挂载到容器目录/var/lib/mysql。
-v /data/mysql/master01/conf:/etc/mysql/conf.d/:将主机当前目录下的 data/mysql/master01/conf挂载到容器的 /etc/mysql/conf.d/。
-e MYSQL_ROOT_PASSWORD=666666:初始化 root 用户的密码。
3)启动并进入创建的容器
root@Node_Slave:~# docker start percona-master01 && docker logs -f percona-master01
root@Node_Slave:~#docker exec -it percona-master01 bash
4)在容器里启动mysql
root@e1603b0f6621:/# mysql -u root -p
5)创建用户并授予权限
mysql> create user 'itcast'@'%' identified by '666666';
Query OK, 0 rows affected (0.00 sec)
mysql> grant replication slave on *.* to 'itcast'@'%';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
6)查看master status,为slave做准备
mysql> show master status;
*7)搭建Slave01
root@Node_Slave:~# mkdir /data/mysql/slave01
root@Node_Slave:~# cd /data/mysql/slave01/
root@Node_Slave:/data/mysql/slave01# mkdir conf data
root@Node_Slave:/data/mysql/slave01# chmod 777 * -R
root@Node_Slave:/data/mysql/slave01# cd /data/mysql/slave01/conf/
vim my.cnf
[mysqld]
server-id = 22
8)创建slave容器并进入
root@Node_Slave:~# docker create --name percona-slave01 -v /data/mysql/slave01/data:/var/lib/mysql -v /data/mysql/slave01/conf:/etc/mysql/conf.d/ -p 3307:3306 -e MYSQL_ROOT_PASSWORD=666666 percona:5.7.22
root@Node_Slave:~# docker start percona-slave01 && docker logs -f percona-slave01
root@Node_Slave:~#docker exec -it percona-slave01 bash
root@e1603b0f6621:/# mysql -u root -p
9)配置Slave指向Master
如果配置集群,记得master非3306的,指定master_port=xxxx
mysql> change master to master_host='192.168.187.129',master_user='itcast',master_password='666666',master_log_file='mysql-bin.000001',master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.10 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
—2.配置mycat中间件实现读写分离和分库分表—
注意: Linux下部署安装MySQL,默认不忽略表名大小写,需要手动到/etc/my.cnf 下配置
lower_case_table_names=1
使Linux环境下MySQL忽略表名大小写,否则使用MyCAT的时候会提示找不到表的错误!如果一开始是区分大小写建的数据库和表
则需要导出再重建导入了。切记:数据库表名不要引用mysql关键字比如order,否则mycat端会打不开。
1)安装mycat
-
创建mycat配置文件夹
mkdir /usr/local/mycat mkdir /usr/local/mycat/conf
-
创建docker文件夹
mkdir /usr/local/docker/mycat/ cd /usr/local/docker/mycat
-
下载mycat安装包
wget http://dl.mycat.io/1.6.6.1/Mycat-server-1.6.6.1-release- 20181031195535-linux.tar.gz mv Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz mycat.tar.gz
-
解压并复制文件
tar -zxvf mycat.tar.gz cp -r mycat/conf/ /usr/local/mycat/conf/
-
创建Dockerfile文件
touch Dockerfile vim Dockerfile #基于opjdk8创建镜像,可自行替换centos等 FROM openjdk:8 ADD mycat.tar.gz /usr/local/ VOLUME /usr/local/mycat/conf ENV MYCAT_HOME=/usr/local/mycat EXPOSE 8066 9066 CMD ["/usr/local/mycat/bin/mycat", "console","&"]
### 说明 ####
将mycat解压到/usr/local目录中,得到 /usr/local/mycat
#将mycat的配置文件的地址暴露出映射地址,启动时直接映射宿主机的文件夹
#设置MYCAT_HOME
#暴露出MyCat的所需端口
#以前台进程的方式启动MyCat服务
-
构建镜像
docker build -t mycat-1.6.6.1 .
-
启动容器
docker run --name mycat -p 8066:8066 -p 9066:9066 -v /usr/local/ mycat/conf/:/usr/local/mycat/conf/ -d mycat-1.6.6.1
补充:
2)Mycat配置相关参数:
vim server.xml
<user name=”root” defaultAccount=”true”>
<property name=”password”>666666</property>
<property name=”schemas”>M2Test</property>
</user>
<user name=”root”>
<property name=”password”>666666</property>
<property name=”schemas”>M2Test</property>
<property name=”readOnly”>true</property>
</user>
3)vim schema.xml
schema.xml记得xml文件首行不能有空格 首字符顶到头
schema、dataNode、dataHost标签在schema.xml文件中,必须按照顺序书写。
<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed