关于这个问题我只是来浑水的,随便写下防止以后忘记了,原理网上有,这里我只记录步骤
为了简单方便我们直接使用mysql的docker-compose文件启动就好了
clone 下面这个项目
git clone https://github.com/bboysoulcn/awesome-dockercompose.git
欢迎star fork follow这个项目
cd awesome-dockercompose/mariadb
之后我们修改相关配置
master节点的配置
mkdir master
cd master
vim docker-compose-master.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | version: "3" services: mariadb-master: image: "mariadb:10.3.14" container_name: "mariadb-master" restart: "always" environment: - "MYSQL_ROOT_PASSWORD=mariadb" ports: - "3306:3306" volumes: - "mariadb-data:/var/lib/mysql" - "mariadb-etc:/etc/mysql/conf.d" - "/etc/localtime:/etc/localtime" volumes: mariadb-data: mariadb-etc: |
slave节点的配置
cd ..
mkdir slave
cd slave
vim docker-compose-slave.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | version: "3" services: mariadb-slave: image: "mariadb:10.3.14" container_name: "mariadb-slave" restart: "always" environment: - "MYSQL_ROOT_PASSWORD=mariadb" ports: - "3307:3306" volumes: - "mariadb-data:/var/lib/mysql" - "mariadb-etc:/etc/mysql/conf.d" - "/etc/localtime:/etc/localtime" volumes: mariadb-data: mariadb-etc: |
之后使用docker-compose直接启动
cd ..
cd master && docker-compose -f docker-compose-master.yaml up -d
cd ..
cd slave/ && docker-compose -f docker-compose-slave.yaml up -d
到此为止mysql搭建成功
解释下docker-compose的配置参数
首先两个compose文件的目录不能相同,不然创建爹volume的名字都是一样了
之后service和container_name自己可以稍微修改一下
还有因为我是在同一台电脑上的所以我只能分端口去启动两个数据库,主库3306端口,从库3307端口
修改master的配置文件
cd /var/lib/docker/volumes/master_mariadb-etc/_data
修改配置文件为下面
vim docker.cnf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | [mysqld] pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 # 默认数据库编码 character_set_server = utf8mb4 collation_server = utf8mb4_general_ci #错误日志 log-error = /var/log/mysql-error.log #logbin log-bin = /var/lib/mysql/mysql-bin binlog_format = mixed expire_logs_days = 180 server-id = 1 # 时区 default-time-zone = '+8:00' # 最大连接数 max_connections = 1000 # 慢日志 slow_query_log = 1 long_query_time = 3 slow_query_log_file = /var/lib/mysql/mysql-slow.log # 区分大小写 lower_case_table_names = 1 # 默认的数据库引擎 default-storage-engine = InnoDB |
重启数据库
docker restart mariadb-master
修改slave的配置文件
cd /var/lib/docker/volumes/slave_mariadb-etc/_data/
vim docker.cnf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | [mysqld] pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 # 默认数据库编码 character_set_server = utf8mb4 collation_server = utf8mb4_general_ci #错误日志 log-error = /var/log/mysql-error.log #logbin log-bin = /var/lib/mysql/mysql-bin binlog_format = mixed expire_logs_days = 180 server-id = 2 # 时区 default-time-zone = '+8:00' # 最大连接数 max_connections = 1000 # 慢日志 slow_query_log = 1 long_query_time = 3 slow_query_log_file = /var/lib/mysql/mysql-slow.log # 区分大小写 lower_case_table_names = 0 # 默认的数据库引擎 default-storage-engine = InnoDB |
重启数据库
docker restart mariadb-slave
解释下关键的配置文件
首先就是开起来logbin
1 2 3 4 | log-bin = /var/lib/mysql/mysql-bin binlog_format = mixed expire_logs_days = 180 server-id = 2 |
两台机器的logbin的配置文件都是一样的,但是serverid不能一样不然会有冲突
其他的自己按需配置,还有数据库时区也要自己指定一下不然会导致数据库时间不是东八区的可能
这里我使用的是dbeaver,连接的时候只要注意端口不一样就好了
之后创建主从复制要使用到的用户
1 2 3 4 | CREATE USER 'bboysoul'@'%'; ALTER USER 'bboysoul'@'%' IDENTIFIED BY 'mariadb' ; GRANT Replication slave ON *.* TO 'bboysoul'@'%'; FLUSH PRIVILEGES; |
注意要在主库中配置,之后再主库中查看master信息
show master status
几下下面两个信息
mysql-bin.000001 1560
之后我们在从库中配置它所属的主库信息
1 2 3 4 5 6 | CHANGE master to MASTER_HOST="10.10.10.36", MASTER_USER="bboysoul", MASTER_PASSWORD="mariadb", MASTER_LOG_FILE="mysql-bin.000001", MASTER_LOG_POS=1560 |
开启主从
start slave
之后你就可以在从库中执行
SHOW slave status
来查看从库主从同步状态信息了
之后就是验证主从复制可靠性了,在主库中执行增删改查操作来观看从库的状态即可,还有观察Position
和Read_Master_Log_Pos
这两个值是否一致
主从复制最常用来做的就是读写分离,主库用来写,从库用来读,来降低主库的压力,但是这个是需要应用程序支持的
还有一种场景就是设置主从复制的延迟CHANGE MASTER TO MASTER_DELAY = 600;
比如设置10分钟的延迟,主库因为某个项目经理删除了大量的数据之后,在没有同步的情况下,可以直接从从库去获取数据降低损失