首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Docker安装Mysql 5.7主从互备

Docker安装Mysql 5.7主从互备

原创
作者头像
憨批程序员
修改2020-04-30 17:03:39
1.2K0
修改2020-04-30 17:03:39
举报
文章被收录于专栏:小小程序员小小程序员

前言:个人并不建议业务量很大的系统使用docker安装mysql

原因:1.数据安全问题,如果你将数据存贮在容器中,当容器rm后,你就无了,当然你可以使用外挂数据卷的方式,但我在某些大佬的文章上看到,即使你外挂的数据卷,docker volumes的设计是围绕union fs镜像层提供持久化存贮,如果容器异常崩溃,数据库未正常关闭,则可能损坏数据,而且外挂数据卷对物理机硬件损伤较大(这段话是我从大佬文章里抄的,但前面rm数据就不见了是我实践过的)

2.数据库需要专用的和持久的吞吐量,以实现更多的负载,docker容器和宿主机之间有一个隔离层,所以会产生网络问题,而原生安装的则不会存在这个问题(这个也是我抄的)

那数据库就一定不能存在容器中?

答案:并不是,docker适合轻量级或分布式数据库,以及一些不敏感的数据

正题:前面废话较多,大佬请忽略

1.创建外挂数据目录和配置文件目录

mkdir -p ~/test/mysql/conf
mkdir -p ~/test/mysql/data
cd  ~/test/mysql/conf/
touch my.cnf
vi my.cnf

my.cnf内容

[mysqld]
datadir=/var/lib/mysql
server_id = 1 #每个实例不一样,保持唯一
log-bin= mysql-bin
replicate-ignore-db=mysql #设置不需要同步的库
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
relay_log_recovery=on #当slave从库宕机后,假如relay-log损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的relay-log,并且重新从master上获取日志,这样就保证了relay-log的完整性。默认情况下该功能是关闭的,将relay_log_recovery的值设置为 1时,可在slave从库上开启该功能,建议开启。
read-only=0 #1为只读作为从服务器时的中继日志
relay_log=mysql-relay-bin 
sync_binlog=1000 #事务特性,最好设为1,但是插入速度很慢,该参数的有效值为0 、1、N, 默认值:0 查询语句select @@sync_binlog;
innodb_flush_log_at_trx_commit=2 #日志记录到磁盘的配置 默认:1 select @@innodb_flush_log_at_trx_commit;
log-slave-updates=on
auto-increment-offset=1 #自增值
auto-increment-increment=2 #漂移值,也就是步长(也就是你准备搞几个实例)
binlog_cache_size=100M #日志的缓存大小
binlog_format=mixed #设置bin-log日志文件格式为:mixed,防止主键重复
expire_logs_days=7 #设置bin-log日志文件保存的天数
slave_skip_errors=ddl_exist_errors,1032 #slave_skip_errors选项有四个可用值,分别为:off,all,ErorCode,ddl_exist_errors。
master_info_repository=table
relay_log_info_repository=table
slave-parallel-type=LOGICAL_CLOCK #DATABASE:默认值,基于库的并行复制方式 LOGICAL_CLOCK:基于组提交的并行复制方式
slave-parallel-workers=20
max_allowed_packet=1024M
log-bin-trust-function-creators=1
max_connections=1000
max_user_connections=500
wait_timeout=31536000
interactive_timeout=31536000
sql_mode =STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

另外一台实例时,改变server_id和auto-increment-offset

2.拉取docker的mysql镜像,如果太慢的话自己去设置下镜像源,传送门

docker pull mysql:5.7

3.创建并启动容器

docker run --name 249mysql --restart always --privileged=true -p 3306:3306 -e MYSQL_ROOT_PASSWORD=qwert~123 -v ~/test/mysql/data:/var/lib/mysql -v ~/test/mysql/conf/my.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf -d mysql:5.7

4.进入主库容器

docker exec -it 249mysql mysql -u root -pqwert~123
//创建一个用户来同步数据
//这里表示创建一个slave同步账号slave,允许访问的IP地址为%,%表示通配符
GRANT REPLICATION SLAVE ON *.* to 'slave'@'%' identified by '123456';
//刷新权限
flush privileges;
//查看MYSQL数据库中所有用户
SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
//查看状态,记住File、Position的值,在第二台机子中将用到
show master status;

5.进入从库设置

//设置主库链接,master_host即为主库容器IP,master_log_file和master_log_pos即为在主库容器中,通过show master status查出来的值;
change master to master_host='192.168.0.191',master_user='slave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=154,master_port=3306
//启动同步
start slave;
//查看从机状态
show slave status\G;

看到这两个都Yes你就成功了,然后去主库里面建库建表增删改查一番,感受下成功的喜悦

当然你可能会遇到错误,别慌,错的越多,你才能懂得越多,加油,陌生人,解决不了的去 传送门

6.下面是我看到的一些关于主从复制优化的截图,且看且实践

7.最后我也没操作的大招(半同步复制,这是一写多读的情况)

技术索引:

对于异步复制,主库将事务Binlog事件写入到Binlog文件中,此时主库只会通知一下Dump线程发送这些新的Binlog,然后主库就会继续处理提交操作,而此时不会保证这些Binlog传到任何一个从库节点上。

对于全同步复制,当主库提交事务之后,所有的从库节点必须收到,APPLY并且提交这些事务,然后主库线程才能继续做后续操作。这里面有一个很明显的缺点就是,主库完成一个事务的时间被拉长,性能降低。

对于半同步复制,是介于全同步复制和异步复制之间的一种,主库只需要等待至少一个从库节点收到并且Flush Binlog到Relay Log文件即可,主库不需要等待所有从库给主库反馈。同时,这里只是一个收到的反馈,而不是已经完全执行并且提交的反馈,这样就节省了很多时间。

开始搭建前提:主从搭建

master服务器配置

1、安装半同步插件

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

2、进入mysql 动态开启master半同步配置。

mysql> SET GLOBAL rpl_semi_sync_master_enabled=1;

注意,需要将此写到my.cnf配置文件中,才会永久生效:

[mysqld]

plugin-load=rpl_semi_sync_master=semisync_master.so

rpl_semi_sync_master_enabled = 1

rpl_semi_sync_master_timeout = 1000

3、查看半同步运行的配置状态

show variables like 'rpl_semi%';

4. 查看半同步运行情况

mysql> show global status like 'rpl_semi%';

mysql> show status like 'Rpl_semi_sync_master_status';

此时的Rpl_semi_sync_master_status :是off 状态,要等待从配置之后,就会自动变为on。

-----------------------------------华丽分割线------------------------------------------------------------

slave服务器配置

1、安装半同步插件

mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

2、进入 mysql 动态开启slave半同步配置。

mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;

注意,需要将此写到my.cnf配置文件中,才会永久生效:

[mysqld]

plugin-load=rpl_semi_sync_slave=semisync_slave.so

rpl_semi_sync_slave_enabled = 1

3、重启或启动slave

4、查看半同步运行的配置状态

mysql> show variables like 'rpl_semi%';

Rpl_semi_sync_slave_status::Slave上的半同步复制状态,ON表示已经被启用,OFF表示非活动状态。

rpl_semi_sync_slave_trace_level: 32(用于开启半同步复制模式时的调试级别,默认是32)

5、查看半同步运行情况

mysql> show global status like 'rpl_semi%';

Rpl_semi_sync_slave_status:ON是活动状态(半同步),OFF是非活动状态(异步),用于表示主服务器使用的是异步复制模式,还是半同步复制模式。

6. 再进入主查看半同步状态:

mysql> show global status like 'rpl_semi%';

mysql> show status like 'Rpl_semi_sync_slave_status';

PS: 在有的高可用架构下,master和slave需同时启动,以便在切换后能继续使用半同步复制

plugin-load= "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"

rpl-semi-sync-master-enabled = 1

rpl-semi-sync-slave-enabled = 1

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言:个人并不建议业务量很大的系统使用docker安装mysql
  • 那数据库就一定不能存在容器中?
  • 正题:前面废话较多,大佬请忽略
    • 1.创建外挂数据目录和配置文件目录
      • 2.拉取docker的mysql镜像,如果太慢的话自己去设置下镜像源,传送门
        • 3.创建并启动容器
          • 4.进入主库容器
            • 5.进入从库设置
              • 6.下面是我看到的一些关于主从复制优化的截图,且看且实践
                • 7.最后我也没操作的大招(半同步复制,这是一写多读的情况)
                相关产品与服务
                云数据库 SQL Server
                腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档