docker环境下mysql+mycat 搭建数据库集群
1 目的
提供一个高性能的数据服务。前段为一个节点的mycat服务,后段为一主两从的数据库服务集群,其中这三台服务器都参与读服务。 这里只考虑系统的高并发性,不考虑系统的高可用性。
2 环境
这里在三台物理机上实现的。构建在4个容器。 一个mycat的容器,三个mysql的容器。
170.170.0.100 mycat
170.170.0.101 mysql master
170.170.0.102 mysql slave
170.170.0.103 mysql slave
3. 创建跨主机的overlay网络
docker network create -d overlay test
4.搭建mysql的数据库集群
a. pull镜像
docker pull mysql:5.6b. 创建容器的启动的脚本。三个mysql的容器启动和创建方式相同
#!/bin/bash
APP_NAME=mysql1
HOME=/opt/mysql-5.6.41
IP=170.170.0.101
IMAGE=172.19.43.224:5000/mysql5641:20180809
MYSQLPW="Com123456"
echo "restart $APP_NAME..."
docker stop $APP_NAME && echo "停止服务成功!" || echo "停止服务失败!"
docker rm $APP_NAME && echo "销毁服务成功!" || echo "销毁服务失败!"
if [ ! -d "$HOME/conf" ];then
mkdir -p $HOME/conf
fi
if [ ! -d "$HOME/logs" ];then
mkdir -p $HOME/logs
fi
if [ ! -d "$HOME/data" ];then
mkdir -p $HOME/data
fi
docker run -itd --restart=always \
--name $APP_NAME \
--hostname $APP_NAME \
--net test --ip $IP \
--publish 3306:3306 \
--volume $HOME/conf:/etc/mysql/mysql.conf.d \
--volume $HOME/logs:/log \
--volume $HOME/data:/var/lib/mysql \
--volume /etc/localtime:/etc/localtime \
--env MYSQL_ROOT_PASSWORD=$MYSQLPW \
$IMAGE
其中这里吧数据日志,配置文件,数据库数据文件都映射到容器以外。 binlog还保留在容器中。
c. 配置mysql的数据库集群
master节点增加以下数据:
[mysqld]
server_id = 101
log-bin = mysql-bin
binlog-do-db = ger-prd-db
binlog-ignore-db = mysql
binlog-ignore-db = information_schema
binlog_format = mixed
expire_logs_days = 7
salve1节点增加以下数据:
[mysqld]
server-id=102
salve2节点增加以下数据:
[mysqld]
server-id=103
d.重新启动数据库容器(reload新配置)
./start_mysql.sh
e.查看状态,设置master和slave的复制账号和复制起止点
e.1 查看master的状态
MySQL [(none)]> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000005 | 404 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
e.2 在mater上设置复制的账号
GRANT REPLICATION SLAVE ON *.* TO 'admin123'@'170.170.0.%' IDENTIFIED BY 'admin123';
FLUSH PRIVILEGES;
e.3 在两个salve上分别设置复制的数据的其实点(binlog的位置)
CHANGE MASTER TO MASTER_HOST='170.170.0.101', MASTER_PORT=3306, MASTER_USER='admin123', MASTER_PASSWORD='admin123', MASTER_LOG_FILE='mysql-bin.000005', MASTER_LOG_POS=404;
FLUSH PRIVILEGES;
到此数据库主从复制设置完成。
5. 搭建mycat
a. 下载mycat的镜像
docker pull mycatb. 创建容器启动脚本
#!/bin/bash
APP_NAME=mycat
HOME=/opt/mycat
IP=170.170.0.100
IMAGE=172.19.43.224:5000/mycat:20180809
echo "restart $APP_NAME..."
docker stop $APP_NAME && echo "停止服务成功!" || echo "停止服务失败!"
docker rm $APP_NAME && echo "销毁服务成功!" || echo "销毁服务失败!"
if [ ! -d "$HOME/conf" ];then
mkdir -p $HOME/conf
fi
if [ ! -d "$HOME/logs" ];then
mkdir -p $HOME/logs
fi
#if [ ! -d "$HOME/data" ];then
# mkdir -p $HOME/data
#fi
docker run -itd --restart=always \
--name $APP_NAME \
--hostname $APP_NAME \
--net test --ip $IP \
--publish 8066:8066 \
--publish 9066:9066 \
--volume $HOME/conf:/usr/local/mycat/conf \
--volume $HOME/logs:/usr/local/mycat/logs \
--volume /etc/localtime:/etc/localtime \
$IMAGE
启动映射mycat的配置文件和log文件到容器以外。并映射出端口,其中8066端口是对数据进行操作,9066端口是控制端口。c. 配置mycat
这里只是做高并发处理,不做其他设置。所以无需设置server.xml。 只需要配置schema.xml即可。
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn" />
<dataNode name="dn" dataHost="localhost1" database="ger-prd-db" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="2"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="170.170.0.101:3306" user="admin" password="admin">
<!-- can have multi read hosts -->
<readHost host="hostS2" url="170.170.0.102:3306" user="admin" password="admin" />
<readHost host="hostS3" url="170.170.0.103:3306" user="admin" password="admin" />
</writeHost>
<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>
</mycat:schema>
说明:这里不做分库分表。 所有的数据表每个节点都会有的。
c.1 schema标签:设置逻辑库
这里绑定dataNode。针对于所有的表。
c.2 dataNode标签:设置数据节点
database="ger-prd-db" 为绑定的实际数据库的实例名称。我这边的数据库是这么设置的。
c.3 readHost、writeHost标签:设置真实的读、写数据库的信息
balance="2" 这里是设置读操作。将要随机的分配到这台写实例和其他两台读实例上去。
d. 启动容器
./start_mycat.sh
到此mycat 已经配置完成。