主从复制

流程图

所用到的软件
Docker+haproxy(负载均衡)+MySQL

启动三台MySQL服务器

拉取 MySQL 镜像:

1
docker pull mysql:5.7

启动三个容器,并同时修改它们的MySQL配置文件,修改配置文件中的四项:

  1. –server-id:设置一个唯一的id(正整数就行,集群中id不能重复)
  2. –log-bin:启动二进制日志并设置二进制日志文件的名字
  3. –character-set-server:设置编码
  4. –collation-server:设置效验规则
    1
    2
    3
    4
    5
    docker run --name mysql13306 -d -p 13306:3306  -e MYSQL_ROOT_PASSWORD=123123 mysql:5.7.24 --server-id=1 --log-bin=mysql-bin --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

    docker run --name mysql13307 --link mysql13306:mysqlmaster -d -p 13307:3306 -e MYSQL_ROOT_PASSWORD=123123 mysql:5.7.24 --server-id=2 --log-bin=mysql-bin --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

    docker run --name mysql13308 --link mysql13306:mysqlmaster -d -p 13308:3306 -e MYSQL_ROOT_PASSWORD=123123 mysql:5.7.24 --server-id=3 --log-bin=mysql-bin --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

设置主服务器

创建好服务器之后,我们需要首先连接主服务器并做以下设置:

1、创建复制用的账号

我们需要在主服务器上创建一个账号,然后从服务器就可以使用这个账号连接到主服务器并读取二进制文件实现数据同步。

在主服务器上执行以下 SQL 语句

1
GRANT replication slave ON *.* TO 'slave'@'%' IDENTIFIED BY '111111';

2、查看主服务器状态
创建好账号之后,我们还需要查看一下当前主服务器上二进制日志的状态,在后面配置从服务器时需要使用。

执行以下 SQL 语句查看:

1
show master status

注意 : 得到这两个值之后,不要再对主服务器有任何 SQL 的写操作(否则这两个值还会变)直到从服务器配置成功。

到此主服务器配置完成,接下来我们需要配置两个从服务器。

设置从服务器

在两个从服务器上执行以下三条 SQL 语句:

1
2
3
4
5
6
7
8
9
10
11
12
stop slave;       # 先停止复制功能

# 设置主服务器IP、账号、密码、二日志状态
change master to
master_host="mysqlmaster",
master_user="slave",
master_password="111111",
master_log_file="mysql-bin.000003", # 这个值修改为前面主服务器的 File 值
master_log_pos=154; # 这个值修改为前面主服务器的 Position 值

# 启动复制功能
start slave;

查看主从状态

到此已经配置成功了,我们需要在两个从服务器上执行以下 SQL 查看是否成功

1
show slave status;

成功时以下两项都为 Yes :

到此就配置完成了,现在我们向主服务器上的所有写操作都会自动同步到从服务器上。

测试

配置完之后,在主服务器上新建数据库

1
create database test_master_slave

然后到两个从服务器上查看会发现同样都有这个数据库:

负载均衡

接下来我们需要安装并配置一个负载均衡服务器,对两台从服务器进行请求的转发。

拉取haproxy镜像

首先我们要下载 haproxy 的镜像:

1
docker pull haproxy:1.5.19-alpine

运行容器

创建负载均衡容器

1
docker run --name haproxy -d -p 13333:3306 --link mysql13307:mysql1 --link mysql13308:mysql2 haproxy:1.5.19-alpine

创建之后,发现该容器无法启动,这是因为我们还没有为它编写好配置文件,所以我们需要编写负载均衡配置文件。

配置

先在本机中创建一个配置文件,文件名为 haproxy.cfg 。

1、编写配置文件

haproxy.cfg

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
global
daemon
nbproc 1
pidfile /usr/local/haproxy/conf/haproxy.pid

defaults
mode tcp
retries 2
option redispatch
option abortonclose
maxconn 4096

listen test1
bind 0.0.0.0:3306 # 监听的端口号
mode tcp # 负载均衡时使用的协议 tcp(数据库) http(web服务器)
server s1 mysql1:3306 # 配置后端要转发服务器
server s2 mysql2:3306

2、复制配置文件到容器中

编写好配置文件之后,我们需要把配置文件复制到容器中:

1
docker cp 本地路径/haproxy.cfg  haproxy:/usr/local/etc/haproxy/haproxy.cfg

3、启动容器

有了配置文件之后,我们就可以启动负载均衡的容器了。

1
docker start haproxy

现在就可以通过 127.0.0.1:13333 端口连接负载均衡了。

Laravel 中配置主从

接下来,我们将京西商城的 api 接口项目和数据库集群结合实现程序上的 读、写分离

1、导入商城数据库

在主服务器上创建 jxshop 商城,并将项目中的 jxshop.sql 到主服务器执行一遍以导入商城数据库结构。

2、修改 Laravel 中的配置文件

在 mysql 中添加 read 和 write 两个数组,在这两个数组中分别设置读、写服务器的账号信息,相同的配置项可以写到数组的外面。

config/database.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
'mysql' => [
'read' => [
'port' => '13307',
],
'write' => [
'port' => '13306',
],
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
// 'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => 123123,
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
],

[mark] (参考自我的上课讲义) 未完待续!

 评论



本站使用 Material X 作为主题 , 总访问量为 次 。
隐藏