Docker(7) mysql+mycat 搭建数据库集群

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)

扫描二维码关注公众号,回复: 2968623 查看本文章

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 已经配置完成。 

猜你喜欢

转载自blog.csdn.net/shgh_2004/article/details/81665258