cm集群上安装mysql_Docker安装Mysql,并搭建一主一从复制集群,一主双从,双主双从集群...

1.搜索mysql镜像,拉取指定版本

59eb9c19fcb906b03ede59eca24b0d2b.png

docker search mysql 实际上是去https://hub.docker.com/ 搜索的,

如果直接用命令直接拉取搜索的镜像名称,如docker pull mysql,则下载的是最新版的。

如果要安装指定版本,则拉取时就需要指定版本,先到https://hub.docker.com/ ,搜索mysql,查看所有发布的版本

c3b217727110492108b492b780099a22.png

切换到tag标签,可以看到列出的mysql各个版本

6d1df9b5c6705ee379d52131a8f15250.png

我这里选择5.7版本的,拉取命令就是:docker pull mysql:5.7

mysql 镜像下载完成后,可以查看一下

f356c6a7909d5aaa0ab7903b7f37bb2c.png

2.安装mysql镜像

在https://hub.docker.com/_/mysql 有介绍怎么安装mysql镜像

1d0d7517ad991fe8c4f23481744d242a.png

我这里选择上面的两种分别介绍一下:

1.挂载自定义配置的方式,这种的好处时,我们可以直接在宿主机配置mysql

使用自定义MySQL配置文件启动mysql

默认情况下,MySQL的启动配置文件是/etc/mysql/my.cnf,而/etc/mysql/conf.d目录下的存在任何.cnf格式的文件时,都会使用该文件中配置项替换默认配置。

因此,如果要使用自定义配置,可以在宿主机创建一个配置文件,然后在创建容器时通过-v参数,以数据卷的方式将自定义配置挂载到mysql容器的/etc/mysql/conf.d目录下。

如,在宿主机中存在/my/mysql/conf/config-file.cnf配置文件,这时就可以通过以下方式启动MySQL容器:

举例:

docker run --name mysql5.7 -p 3306:3306 -v /my/mysql/data:/var/lib/mysql -v /my/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

2. 直接安装命令后面跟参数的方式,这种方式比较简单直接

docker run --name mysql5.7_1 -e MYSQL_ROOT_PASSWORD=123456 -p 3307:3306 -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

我这里采取第2种方式,快速安装两台mysql

#安装第1台

docker run --name mysql5.7_1 -e MYSQL_ROOT_PASSWORD=123456 -p 3307:3306 -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

#安装第2台

docker run --name mysql5.7_2 -e MYSQL_ROOT_PASSWORD=123456 -p 3308:3306 -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

查看安装后的容器,可以看到mysql状态为up,正在运行

d519c12f2421f2c70bd69721d100d6d2.png

可以在远程用命令或客户端链接任意一台,检查是否能正常连上。

用windows的命令行来连接测试,登录命令:mysql -uroot -p123456 -h 192.168.220.102 -P 3307

5a8ffe83f4634ccd5488b16f92a11bb0.png

用Navicat客户端连接测试

9c0ac3692ebbfb8dc4b8ce08398729c1.png

至此,安装完成。

3.搭建一主一从集群

配置主从就需要修改mysql的配置文件,就需要进入mysql容器内修改配置文件

配置主机

这里把mysql_5.7_1这台做M主机,先进入配置它

通过docker exec -it a1c7de8adce4 /bin/bash命令进入到Master容器内部,也可以通过docker exec -it mysql_5.7_1 /bin/bash命令进入。a1c7de8adce4 是容器的id,而mysql_5.7_1是容器的名称。

[root@localhost ~]# docker exec -it a1c7de8adce4 /bin/bash

继续进入mysql配置目录

root@a1c7de8adce4:/# cd /etc/mysql

查看配置文件ls -l

d00aa945a37d0151aaa3bbebfe0ac9f7.png

会看到有两个配置文件my.cnf和mysql.cnf,这个两个的关系是my.cnf是mysql.cnf的软链接,下图给予证实。所以编辑任意一个都行

2996fd9f9875bdf80cfdfcab80e5cccd.png

但是我们在用vim时,发现容器中并没有安装,所以如果要用vim编辑,需要先安装

66fedbfb6b12689793a064e731f2274f.png

使用apt-get install vim命令安装vim,又会出现如下问题

9b7d3387a1865d6c3fb4a66e70ea5c7c.png

执行apt-get update,然后再次执行apt-get install vim即可成功安装vim。

然后vim my.cnf,增加以下配置,保存退出。

[mysqld] #这行很重要,如果my.cnf有这行则不用再重复写,如果没有则添加。

server-id=1 #服务器唯一ID

log-bin=mysql-bin #开启二进制日志,主从复制的数据文件

binlog-do-db=mycat-m-s #需要同步的数据库名字

binlog_format=STATEMEN #设置logbin格式

89da88f5ea4ae0403573dd9d5196b363.png

补充一下:上面是在mysql容器中修改mysql的配置文件,需要安装vim。

其实完全可以把mysql的配置文件从容器中拷贝的宿主机,修改完成后再拷贝回mysql容器,这样更方便写。

具体步骤为:

因为进入mysql容器,我们发现真正的配置文件是 /etc/mysql/mysql.cnf,所以我们先在宿主机把此文件拷贝下来:

docker cp a1c7de8adce4:/etc/mysql/mysql.cnf /usr/local/

然后vim编辑拷贝下来的mysql.cnf:

!includedir /etc/mysql/conf.d/

!includedir /etc/mysql/mysql.conf.d/

#新增如下配置

[mysqld]

server-id=1

log-bin=mysql-bin

binlog-do-db=mycat_m_s

binlog_format=STATEMEN

编辑保存后,再拷贝回mysql容器中,进行覆盖

docker cp mysql.cnf a1c7de8adce4:/etc/mysql/

配置从机

同样的方式进入从机mysql5.7_2,修改my.cnf,增加以下配置,保存退出。退出容器。

[mysqld]

server-id=2 #服务器唯一ID

relay-log=mysql-relay #启用

重启两台mysql容器,命令:docker restart 容器id或名称

5ae169bee59d43d12a80680afba3808c.png

登录主机mysql5.7_1,建立授权账户 slave

#在主机MySQL里执行授权命令 GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456';

执行完后,登录Matater查看一下用户信息:mysql> select user,host from user; 看到slave用户已经创建成功。

f47d096ac1530c2d81063194b729a933.png

Master(主)和Slave(从)建立链接

登录Master,执行show master status;查看主从复制需要的配置信息

c6482fb32e454cd930ac78016d1ce1f0.png

File和Position字段的值在接下来配置从机复制主机信息时会用到,所以在后面的操作完成之前,需要保证Master库不能做任何操作,否则将会引起File和Position字段的值变化。

登录slave,执行链接master配置命令

change master to master_host='主机的ip地址',

master_port=端口号,

master_user='slave',

master_password='123456',

master_log_file='mysql-bin.具体数字',

master_log_pos=位置具体值,

master_connect_retry=60;

-------------------------------------------------------------------------

详细解释:

master to master_host: Master的ip

master_port:Master的端口号,因为用的是docker中的mysql,所以这里指的是宿主机映射到到mysql容器的端口

master_user:用于数据同步的用户

master_password:用于同步的用户的密码

master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值

master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值

master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒

具体执行命令如下:

change master to master_host='192.168.220.102',

master_port=3307,

master_user='slave',

master_password='123456',

master_log_file='mysql-bin.000003',

master_log_pos=1821,

master_connect_retry=60;

将上面的命令复制到从mysql命令窗口执行。

查看从机状态 mysql> show slave status\G;

mysql> change master to master_host='192.168.220.102',

-> master_port=3307,

-> master_user='slave',

-> master_password='123456',

-> master_log_file='mysql-bin.000003',

-> master_log_pos=1821,

-> master_connect_retry=60;

Query OK, 0 rows affected, 2 warnings (0.00 sec)

mysql> show slave status \G;

*************************** 1. row ***************************

Slave_IO_State:

Master_Host: 192.168.220.102

Master_User: slave

Master_Port: 3307

Connect_Retry: 60

Master_Log_File: mysql-bin.000003

Read_Master_Log_Pos: 1821

Relay_Log_File: mysql-relay.000005

Relay_Log_Pos: 320

Relay_Master_Log_File: mysql-bin.000003

Slave_IO_Running: No

Slave_SQL_Running: No

Replicate_Do_DB:

Replicate_Ignore_DB:

Replicate_Do_Table:

Replicate_Ignore_Table:

Replicate_Wild_Do_Table:

Replicate_Wild_Ignore_Table:

Last_Errno: 0

Last_Error:

Skip_Counter: 0

Exec_Master_Log_Pos: 1281

Relay_Log_Space: 523

Until_Condition: None

Until_Log_File:

Until_Log_Pos: 0

Master_SSL_Allowed: No

Master_SSL_CA_File:

Master_SSL_CA_Path:

Master_SSL_Cert:

Master_SSL_Cipher:

Master_SSL_Key:

Seconds_Behind_Master: 0

Master_SSL_Verify_Server_Cert: No

Last_IO_Errno: 1236

Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'log event entry exceeded max_allowed_packet; Increase max_allowed_packet on master; the first event 'mysql-bin.000003' at 1281, the last event read from './mysql-bin.000003' at 123, the last byte read from './mysql-bin.000003' at 1300.'

Last_SQL_Errno: 0

Last_SQL_Error:

Replicate_Ignore_Server_Ids:

Master_Server_Id: 1

Master_UUID: 16d94e7b-7f17-11ea-bb5e-0242ac110003

Master_Info_File: /var/lib/mysql/master.info

SQL_Delay: 0

SQL_Remaining_Delay: NULL

Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates

Master_Retry_Count: 86400

Master_Bind:

Last_IO_Error_Timestamp: 200417 06:26:09

Last_SQL_Error_Timestamp:

Master_SSL_Crl:

Master_SSL_Crlpath:

Retrieved_Gtid_Set:

Executed_Gtid_Set:

Auto_Position: 0

Replicate_Rewrite_DB:

Channel_Name:

Master_TLS_Version:

1 row in set (0.00 sec)

可以看到从机进行主从同步的两个主要线程SlaveIORunning 和 SlaveSQLRunning 都是No,正常应该是yes才对。这是因为我们还没有开启从服务器的复制功能。

使用start slave开启主从复制,然后再次查询主从同步状态show slave status \G;。

70ef69e1f57d8b71e2222ad8dc0294b5.png

至此,主从复制搭建完成。

验证主从复制

截图如下:

904ed0dfa1e277eb5ab35d087f75d49e.png

4.一主双从搭建

用docker构建一台mysql容器,作为第二台从机mysql5.7_2_3

77fd52055290391ab5a6ca874019c178.png

修改容器mysql5.7_2_3的配置文件 /etc/mysql/mysql.cnf,增加以下内容

[mysqld]

server-id=5

relay-log=mysql-relay

然后重启该容器服务。

查看要要挂载主机mysql5.7_1的binlog日志信息

mysql> show master status;

+------------------+----------+--------------+------------------+-------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+------------------+----------+--------------+------------------+-------------------+

| mysql-bin.000006 | 5625 | mycat_m_s | | |

+------------------+----------+--------------+------------------+-------------------+

进入容器mysql5.7_2_3,且进入mysql客户端,在命令行执行如下链接复制主机的命令

change master to master_host='192.168.220.102',

master_port=3307,

master_user='slave',

master_password='123456',

master_log_file='mysql-bin.000006',

master_log_pos=5625,

master_connect_retry=60;

启动从机功能 start  slave;

查看从机状态 show slave status \G;

mysql> show slave status \G;

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.220.102

Master_User: slave

Master_Port: 3307

Connect_Retry: 60

Master_Log_File: mysql-bin.000006

Read_Master_Log_Pos: 6356

Relay_Log_File: mysql-relay.000002

Relay_Log_Pos: 1051

Relay_Master_Log_File: mysql-bin.000006

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Replicate_Do_DB:

Replicate_Ignore_DB:

Replicate_Do_Table:

Replicate_Ignore_Table:

Replicate_Wild_Do_Table:

Replicate_Wild_Ignore_Table:

Last_Errno: 0

Last_Error:

Skip_Counter: 0

Exec_Master_Log_Pos: 6356

Relay_Log_Space: 1254

Until_Condition: None

Until_Log_File:

Until_Log_Pos: 0

Master_SSL_Allowed: No

Master_SSL_CA_File:

Master_SSL_CA_Path:

Master_SSL_Cert:

Master_SSL_Cipher:

Master_SSL_Key:

Seconds_Behind_Master: 0

Master_SSL_Verify_Server_Cert: No

Last_IO_Errno: 0

Last_IO_Error:

Last_SQL_Errno: 0

Last_SQL_Error:

Replicate_Ignore_Server_Ids:

Master_Server_Id: 1

Master_UUID: 16d94e7b-7f17-11ea-bb5e-0242ac110003

Master_Info_File: /var/lib/mysql/master.info

SQL_Delay: 0

SQL_Remaining_Delay: NULL

Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates

Master_Retry_Count: 86400

Master_Bind:

Last_IO_Error_Timestamp:

Last_SQL_Error_Timestamp:

Master_SSL_Crl:

Master_SSL_Crlpath:

Retrieved_Gtid_Set:

Executed_Gtid_Set:

Auto_Position: 0

Replicate_Rewrite_DB:

Channel_Name:

Master_TLS_Version:

1 row in set (0.00 sec)

说明挂载成功,一主mysql5.7_1双从mysql5.7_2和mysql5.7_2_3 搭载完成。

5.双主双从搭建

再创建两个mysql容器,分别做备主备从

ef03f87be0a3cd22ee03f173580a493d.png

修改双主双从的配置文件

修改Master1(mysql5.7_1)的配置文件mysql.cnf

[mysqld]

server-id=1

log-bin=mysql-bin

binlog-do-db=mycat_m_s

binlog_format=STATEMEN

log-slave-updates

auto-increment-increment=2

auto-increment-offset=1

修改Master2(mysql5.7_1_1)的配置文件mysql.cnf

[mysqld]

server-id=3

log-bin=mysql-bin

binlog-do-db=mycat_m_s

binlog_format=STATEMEN

log-slave-updates

auto-increment-increment=2

auto-increment-offset=2

修改Slave1(mysql5.7_2)的配置文件mysql.cnf

[mysqld]

server-id=2

relay-log=mysql-relay

修改Slave2(mysql5.7_2_2)的配置文件mysql.cnf

[mysqld]

server-id=4

relay-log=mysql-relay

修改完成后,重启4台mysql容器。

[root@localhost local]# docker restart 16ac52f8e7a5

16ac52f8e7a5

[root@localhost local]# docker restart a1c7de8adce4

a1c7de8adce4

[root@localhost local]# docker restart 0bea5a5c10b3

0bea5a5c10b3

[root@localhost local]# docker restart 9269c1b9802f

9269c1b9802f

分别登录各个mysql服务器

fc98d574a62de73ae83e66ee7ceaeed6.png

在两台主机Master1(mysql5.7_1),Master2(mysql5.7_1_1)的mysql命令窗口,建立帐户并授权 slave

#在主机MySQL里执行授权命令 GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456';

2253e5607d0a46e1e1331f18bcae899d.png

查询Master1的状态  和 Master2的状态,分别记录下File和Position的值,为后面配置从机复制主机信息做准备

41e00ab78f0eb974719862716e72ce2b.png

因为Slave1(mysql5.7_2) 之前设置过属于Master1(mysql5.7_1)的从机,所以这里需要重置一下,以便重新设置

执行命令:

mysql> stop slave;

Query OK, 0 rows affected (0.07 sec)

mysql> reset master;

Query OK, 0 rows affected (0.01 sec)

两台从机上执行配置需要复制主机的命令

Slava1 复制 Master1,Slava2 复制 Master2 ,具体命令如下:

#Slava1 复制 Master1命令

change master to master_host='192.168.220.102',

master_port=3307,

master_user='slave',

master_password='123456',

master_log_file='mysql-bin.000005',

master_log_pos=333,

master_connect_retry=60;

#Slava2复制Master2命令

change master to master_host='192.168.220.102',

master_port=3309,

master_user='slave',

master_password='123456',

master_log_file='mysql-bin.000002',

master_log_pos=443,

master_connect_retry=60;

执行效果图:

082d992de70884ab74ec3aabdf4a1794.png

启动两台从服务器的复制功能 start slave;并查看从服务器状态 show slave status\G;

d2b674d730c8cfc212b4479fd88a3bdd.png

两个参数# Slave_IO_Running: Yes ,Slave_SQL_Running: Yes 都是Yes,则说明主从配置成功!

两个主机互相复制

Master1 复制 Master2 ,Master2 复制 Master1

#主机2复制主机1命令

change master to master_host='192.168.220.102',

master_port=3307,

master_user='slave',

master_password='123456',

master_log_file='mysql-bin.000005',

master_log_pos=333,

master_connect_retry=60;

#主机1复制主机2命令

change master to master_host='192.168.220.102',

master_port=3309,

master_user='slave',

master_password='123456',

master_log_file='mysql-bin.000002',

master_log_pos=443,

master_connect_retry=60;

执行效果图:

ecfcf2d367a4064b8519ac9c0480bcdc.png

启动两台主服务器的复制功能 start slave;并查看从服务器状态 show slave status\G;

7fe8dce0a11f55965c7e45bfa7471d4b.png

两个参数# Slave_IO_Running: Yes ,Slave_SQL_Running: Yes 都是Yes,则说明主从配置成功!

验证双主双从复制

2b162c80c32c78ef9516e73b18490954.png

5f2ba8d0710478285f3d8b94a1253012.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值