原因:1.数据安全问题,如果你将数据存贮在容器中,当容器rm后,你就无了,当然你可以使用外挂数据卷的方式,但我在某些大佬的文章上看到,即使你外挂的数据卷,docker volumes的设计是围绕union fs镜像层提供持久化存贮,如果容器异常崩溃,数据库未正常关闭,则可能损坏数据,而且外挂数据卷对物理机硬件损伤较大(这段话是我从大佬文章里抄的,但前面rm数据就不见了是我实践过的)
2.数据库需要专用的和持久的吞吐量,以实现更多的负载,docker容器和宿主机之间有一个隔离层,所以会产生网络问题,而原生安装的则不会存在这个问题(这个也是我抄的)
答案:并不是,docker适合轻量级或分布式数据库,以及一些不敏感的数据
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
docker pull mysql:5.7
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
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;
//设置主库链接,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你就成功了,然后去主库里面建库建表增删改查一番,感受下成功的喜悦
当然你可能会遇到错误,别慌,错的越多,你才能懂得越多,加油,陌生人,解决不了的去 传送门
技术索引:
对于异步复制,主库将事务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 删除。