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