使用docker-compose.yml实现mariadb的读写分离

一、目录分布

 

使用docker-compose.yml实现mariadb的读写分离_第1张图片

二、安装步骤

1.首先安装docker-compose,然后在根目录下执行docker-compose up -d启动3个docker容器,1个主数据库容器,1个从数据库容器,1个代理容器,若想停止并删除容器使用docker-compose down -v即可

2.实现数据库主从配置,具体参见https://blog.csdn.net/CrazyWorkers/article/details/105653326,使用docker-compose exec db-proxy (代理容器名称) maxctrl list servers 查看主从配置

3.测试数据库读写分离,具体参见https://blog.csdn.net/CrazyWorkers/article/details/105653326,连接db-proxy(代理容器),使用select @@host来判断读写分离是否成功。

三、配置文件如下

1.根目录下的docker-compose.yml文件

version: '2'

services:

       db-master:

               image: mariadb#镜像名称

               container_name: db-master#容器名称

               hostname: db-master#容器主机名称

               volumes:#目录映射相当于docker -v

                       - ./master/conf.d/mysql.cnf:/etc/mysql/conf.d/mysql.cnf:ro

                       - ./master/data:/var/lib/mysql:rw#映射数据库存储文件在本地

                       - /data/backup:/data/backup

                       - /etc/localtime:/etc/localtime:ro

               ports:#端口映射相当于docker -p

                       - '33060:3306'

               networks:#自定义网络网段

                 db_net:

                   ipv4_address: 172.18.0.3

               ulimits:

                       nproc: 65535

               mem_limit: 1024m #docker运行内存,使用docker stats db-master 查看内存使用情况,使用docker update -m 4096M --memory-swap 4096M db-master来更改运行的内存(当使用内存过小时)

               restart: always

               environment:

                       MYSQL_ROOT_PASSWORD:*******#数据库root密码

       db-slave:

               image: mariadb#镜像名称

               container_name: db-slave#容器名称

               hostname: db-slave#容器主机名称

               volumes:#目录映射相当于docker -v

                       - ./slave/conf.d/mysql.cnf:/etc/mysql/conf.d/mysql.cnf:ro

                       - ./slave/data:/var/lib/mysql:rw#映射数据库存储文件在本地

                       - /data/backup:/data/backup

                       - /etc/localtime:/etc/localtime:ro

               ports:#端口映射相当于docker -p

                       - '33061:3306'

               networks:#自定义网络网段

                 db_net:

                   ipv4_address: 172.18.0.4

               ulimits:

                       nproc: 65535

               mem_limit: 1024m #docker运行内存,使用docker stats db-slave 查看内存使用情况,使用docker update -m 4096M --memory-swap 4096M db-slave来更改运行的内存(当使用内存过小时)

               restart: always

               environment:

                       MYSQL_ROOT_PASSWORD:******

 db-proxy:

               image: mariadb/maxscale#镜像名称

               container_name: db-proxy#容器名称

               hostname: db-proxy#容器主机名称

               volumes:#目录映射相当于docker -v

                       - ./proxy/maxscale.cnf:/etc/maxscale.cnf:ro

                       - /etc/localtime:/etc/localtime:ro

               ports:#端口映射相当于docker -p

                       - "9090:8989"

                       - "4006:4006"

               networks:#自定义网络网段

                 db_net:

                   ipv4_address: 172.18.0.2

               links:#连通master,slave数据库主机

                       - db-master

                       - db-slave

               ulimits:

                       nproc: 65535

               mem_limit: 1024m#docker运行内存,使用docker stats db-proxy 查看内存使用情况,使用docker update -m 4096M --memory-swap 4096M db-proxy来更改运行的内存(当使用内存过小时)

               restart: always

networks:#自定义网络网段

       db_net:

               driver: bridge

               driver_opts:

                       com.docker.network.enable_ipv6: "false"

               ipam:

                       driver: default

                       config:

                             - subnet: 172.18.0.0/16

                               gateway: 172.18.0.1

 

2.master文件夹下的mysql.cnf文件

[client]

default-character-set=utf8#默认字符集

[mysqld]

character-set-server=utf8#服务器字符集

default-storage-engine=InnoDB#服务器默认引擎

innodb_force_recovery=1#由于版本导致innodb不识别时是否强制恢复

#lower_case_table_names=1

server-id = 10#服务器id,用于主从和读写分离

log-bin=master-bin#开启binlog,文件名称以此开头

binlog-ignore-db=mysql,information_schema#忽略掉的数据库binlog

expire_logs_days=5#到期自动删除binlog

event_scheduler=on#开启任务调度器

default-time_zone = '+8:00'#设置为东8时区

innodb_buffer_pool_size=4G#mysql优化,innodb缓冲池大小

 

3.slave文件夹下的mysql.cnf文件

[client]

default-character-set=utf8#默认字符集

[mysqld]

character-set-server=utf8#服务器字符集

default-storage-engine=InnoDB#服务器默认引擎

innodb_force_recovery=1#由于版本导致innodb不识别时是否强制恢复

server-id = 11#服务器id,用于主从和读写分离

sync_binlog=1#刷新binlog

log_slave_updates = 1#从库配置必须

#lower_case_table_names=1

relay-log = slave-relay-bin#用于记录同步信息

replicate-ignore-db = mysql,information_schema #不需要同步的数据库

read_only = 1#只读

event_scheduler=on#开启任务调度器

default-time_zone = '+8:00'#设置为东8时区

innodb_buffer_pool_size=4G#mysql优化,innodb缓冲池大小

 

4.proxy文件夹下的maxscale.cnf文件

# MaxScale documentation:

# https://mariadb.com/kb/en/mariadb-maxscale-24/

# Global parameters

#

# Complete list of configuration options:

# https://mariadb.com/kb/en/mariadb-maxscale-24-mariadb-maxscale-configuration-guide/

[maxscale]

threads=auto

admin_host=0.0.0.0  #此处为restful api监听需要,默认监听所有网段8989端口

ms_timestamp=1

log_info=1

# Server definitions

#

# Set the address of the server to the network

# address of a MariaDB server.

#

[server1]

type=server

address=172.18.0.3  #主数据库服务器,主要用于数据写入

port=3306

protocol=MariaDBBackend

 

[server2]

type=server

address=172.18.0.4#从数据库服务器,主要用于数据读取

port=3306

protocol=MariaDBBackend

 

# Monitor for the servers

#

# This will keep MaxScale aware of the state of the servers.

# MariaDB Monitor documentation:

# https://mariadb.com/kb/en/mariadb-maxscale-24-mariadb-monitor/

[MariaDB-Monitor]

type=monitor

module=mariadbmon

servers=server1,server2 #需要添加所有数据库服务器

user=root

password=*****#数据库的密码

monitor_interval=1000

detect_stale_master=true #当master数据库挂掉,使用slave数据库

 

# Service definitions

#

# Service Definition for a read-only service and

# a read/write splitting service.

#

# ReadConnRoute documentation:

# https://mariadb.com/kb/en/mariadb-maxscale-24-readconnroute/

#[Read-Only-Service] #此处定义只读服务

#type=service

#router=readconnroute

#servers=server1

#user=myuser

#password=mypwd

#router_options=slave

# ReadWriteSplit documentation:

# https://mariadb.com/kb/en/mariadb-maxscale-24-readwritesplit/

 

[Read-Write-Service]#此处定义读写分离服务

type=service

router=readwritesplit

servers=server1,server2

user=root

password=******#数据库的密码

enable_root_user=1#允许root用户登录

max_slave_connections=100%

max_slave_replication_lag=5

# Listener definitions for the services

#

# These listeners represent the ports the

# services will listen on.

#

 

#[Read-Only-Listener]#只读服务监听

#type=listener

#service=Read-Only-Service

#protocol=MariaDBClient

#port=4008

 

[Read-Write-Listener]#读写服务监听

type=listener

service=Read-Write-Service

protocol=MariaDBClient

port=4006

你可能感兴趣的:(mariadb读写分离)