mysql主从复制

简介

关于这个问题我只是来浑水的,随便写下防止以后忘记了,原理网上有,这里我只记录步骤

  1. 安装mysql
  2. 配置mysql
  3. 配置mysql主从复制
  4. 主从验证

安装mysql

为了简单方便我们直接使用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端口

修改mysql配置

修改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不能一样不然会有冲突

其他的自己按需配置,还有数据库时区也要自己指定一下不然会导致数据库时间不是东八区的可能

配置mysql主从复制

这里我使用的是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

来查看从库主从同步状态信息了

主从验证

之后就是验证主从复制可靠性了,在主库中执行增删改查操作来观看从库的状态即可,还有观察PositionRead_Master_Log_Pos这两个值是否一致

关于主从复制的意义

主从复制最常用来做的就是读写分离,主库用来写,从库用来读,来降低主库的压力,但是这个是需要应用程序支持的
还有一种场景就是设置主从复制的延迟
CHANGE MASTER TO MASTER_DELAY = 600;
比如设置10分钟的延迟,主库因为某个项目经理删除了大量的数据之后,在没有同步的情况下,可以直接从从库去获取数据降低损失

欢迎关注Bboysoul的博客www.bboy.app

Have Fun

欢迎关注我的其它发布渠道